enable snippet in searching records 29/62129/32
authorJeesun Kim <iamjs.kim@samsung.com>
Mon, 14 Mar 2016 12:01:05 +0000 (21:01 +0900)
committerJeesun Kim <iamjs.kim@samsung.com>
Thu, 12 May 2016 04:34:31 +0000 (13:34 +0900)
Change-Id: I014f305bb14ddc0201b9f86bc053c83d4dd66120

70 files changed:
client/ctsvc_client_db.c
client/ctsvc_client_db_helper.c
client/ctsvc_client_db_helper.h
client/ctsvc_client_phonelog_helper.h
common/ctsvc_query.c
common/ctsvc_record_person.c
common/ctsvc_struct.h
common/ctsvc_view.c
common/ctsvc_view.h
common/ipc/ctsvc_ipc_define.h
common/ipc/ctsvc_ipc_marshal.c
common/ipc/ctsvc_ipc_person.c
include/contacts_db.h
include/contacts_types.h
include/contacts_views.h
packaging/contacts-service.spec
server/CMakeLists.txt
server/ctsvc_ipc_server.c
server/ctsvc_ipc_server.h
server/ctsvc_notification.c
server/ctsvc_server.c
server/ctsvc_server_person.c
server/ctsvc_server_phonelog.c
server/ctsvc_server_sqlite.c
server/ctsvc_server_update.c
server/ctsvc_utils_string.c [new file with mode: 0644]
server/ctsvc_utils_string.h [new file with mode: 0644]
server/db/ctsvc_db_init.c
server/db/ctsvc_db_plugin_address.c
server/db/ctsvc_db_plugin_address_helper.c
server/db/ctsvc_db_plugin_company.c
server/db/ctsvc_db_plugin_company_helper.c
server/db/ctsvc_db_plugin_contact.c
server/db/ctsvc_db_plugin_email.c
server/db/ctsvc_db_plugin_email_helper.c
server/db/ctsvc_db_plugin_event.c
server/db/ctsvc_db_plugin_event_helper.c
server/db/ctsvc_db_plugin_extension.c
server/db/ctsvc_db_plugin_extension_helper.c
server/db/ctsvc_db_plugin_image.c
server/db/ctsvc_db_plugin_image_helper.c
server/db/ctsvc_db_plugin_messenger.c
server/db/ctsvc_db_plugin_messenger_helper.c
server/db/ctsvc_db_plugin_my_profile.c
server/db/ctsvc_db_plugin_name.c
server/db/ctsvc_db_plugin_name_helper.c
server/db/ctsvc_db_plugin_nickname.c
server/db/ctsvc_db_plugin_nickname_helper.c
server/db/ctsvc_db_plugin_note.c
server/db/ctsvc_db_plugin_note_helper.c
server/db/ctsvc_db_plugin_number.c
server/db/ctsvc_db_plugin_number_helper.c
server/db/ctsvc_db_plugin_person_helper.c
server/db/ctsvc_db_plugin_person_helper.h
server/db/ctsvc_db_plugin_profile.c
server/db/ctsvc_db_plugin_profile_helper.c
server/db/ctsvc_db_plugin_relationship.c
server/db/ctsvc_db_plugin_relationship_helper.c
server/db/ctsvc_db_plugin_sip.c
server/db/ctsvc_db_plugin_sip_helper.c
server/db/ctsvc_db_plugin_speeddial.c
server/db/ctsvc_db_plugin_url.c
server/db/ctsvc_db_plugin_url_helper.c
server/db/ctsvc_db_query.c
server/db/ctsvc_db_query.h
test/test_main.c
test/test_query.c
test/test_query.h
test/test_utils.c [new file with mode: 0644]
test/test_utils.h [new file with mode: 0644]

index 01a0c09..0eceb41 100644 (file)
@@ -264,6 +264,70 @@ API int contacts_db_search_records_with_query(contacts_query_h query, const char
        return ret;
 }
 
+API int contacts_db_search_records_for_snippet(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret;
+       contacts_h contact = NULL;
+
+       ret = ctsvc_client_handle_get_p(&contact);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_client_handle_get_p() Fail(%d)", ret);
+
+       ret = ctsvc_client_db_search_records_for_snippet(contact, view_uri, keyword,
+                       offset, limit, start_match, end_match, token_number, out_list);
+
+       return ret;
+}
+
+API int contacts_db_search_records_with_range_for_snippet(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret;
+       contacts_h contact = NULL;
+
+       ret = ctsvc_client_handle_get_p(&contact);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_client_handle_get_p() Fail(%d)", ret);
+
+       ret = ctsvc_client_db_search_records_with_range_for_snippet(contact, view_uri,
+                       keyword, offset, limit, range, start_match, end_match, token_number, out_list);
+
+       return ret;
+}
+
+API int contacts_db_search_records_with_query_for_snippet(contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret;
+       contacts_h contact = NULL;
+
+       ret = ctsvc_client_handle_get_p(&contact);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_client_handle_get_p() Fail(%d)", ret);
+
+       ret = ctsvc_client_db_search_records_with_query_for_snippet(contact, query, keyword,
+                       offset, limit, start_match, end_match, token_number, out_list);
+
+       return ret;
+}
+
 API int contacts_db_get_last_change_version(int *last_version)
 {
        int ret;
index 1b188ae..0bf9307 100644 (file)
@@ -35,6 +35,9 @@
 #include "ctsvc_handle.h"
 #include "ctsvc_client_db_helper.h"
 
+#define CTSVC_DEFAULT_START_MATCH "["
+#define CTSVC_DEFAULT_END_MATCH "]"
+
 int ctsvc_client_db_insert_record(contacts_h contact, contacts_record_h record, int *id)
 {
        int ret = CONTACTS_ERROR_NONE;
@@ -1083,6 +1086,328 @@ int ctsvc_client_db_get_current_version(contacts_h contact, int *contacts_db_ver
        return ret;
 }
 
+int ctsvc_client_db_search_records_for_snippet(contacts_h contact,
+               const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETV_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+
+       /* make indata */
+       indata = pims_ipc_data_create(0);
+       if (indata == NULL) {
+               ERR("pims_ipc_data_create() Fail");
+               return CONTACTS_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = ctsvc_ipc_marshal_handle(contact, indata);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("ctsvc_ipc_marshal_handle() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(view_uri, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(keyword, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(offset, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(limit, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(start_match ? start_match : CTSVC_DEFAULT_START_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(end_match ? end_match : CTSVC_DEFAULT_END_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(token_number, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+
+       /* ipc call */
+       if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE,
+                               CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_FOR_SNIPPET,
+                               indata, &outdata) != 0) {
+               ERR("ctsvc_ipc_call() Fail");
+               pims_ipc_data_destroy(indata);
+               return CONTACTS_ERROR_IPC;
+       }
+
+       pims_ipc_data_destroy(indata);
+
+       if (outdata) {
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_int(outdata, &ret)) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       pims_ipc_data_destroy(outdata);
+                       return CONTACTS_ERROR_IPC;
+               }
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_list(outdata, out_list)) {
+                               ERR("ctsvc_ipc_unmarshal_list() Fail");
+                               pims_ipc_data_destroy(outdata);
+                               return CONTACTS_ERROR_IPC;
+                       }
+               }
+
+               pims_ipc_data_destroy(outdata);
+       }
+
+       return ret;
+}
+
+int ctsvc_client_db_search_records_with_range_for_snippet(contacts_h contact,
+               const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETV_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(0 == range, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+
+       indata = pims_ipc_data_create(0);
+       if (indata == NULL) {
+               ERR("pims_ipc_data_create() Fail");
+               return CONTACTS_ERROR_OUT_OF_MEMORY;
+       }
+       ret = ctsvc_ipc_marshal_handle(contact, indata);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("ctsvc_ipc_marshal_handle() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+
+       ret = ctsvc_ipc_marshal_string(view_uri, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(keyword, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(offset, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(limit, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(range, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(start_match ? start_match : CTSVC_DEFAULT_START_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(end_match ? end_match : CTSVC_DEFAULT_END_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(token_number, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+
+       if (0 != ctsvc_ipc_call(CTSVC_IPC_DB_MODULE,
+                               CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE_FOR_SNIPPET,
+                               indata, &outdata)) {
+               ERR("ctsvc_ipc_call() Fail");
+               pims_ipc_data_destroy(indata);
+               return CONTACTS_ERROR_IPC;
+       }
+
+       pims_ipc_data_destroy(indata);
+
+       if (outdata) {
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_int(outdata, &ret)) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       pims_ipc_data_destroy(outdata);
+                       return CONTACTS_ERROR_IPC;
+               }
+               if (CONTACTS_ERROR_NONE == ret) {
+                       if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_list(outdata, out_list)) {
+                               ERR("ctsvc_ipc_unmarshal_list() Fail");
+                               pims_ipc_data_destroy(outdata);
+                               return CONTACTS_ERROR_IPC;
+                       }
+               }
+               pims_ipc_data_destroy(outdata);
+       }
+
+       return ret;
+}
+
+int ctsvc_client_db_search_records_with_query_for_snippet(contacts_h contact,
+               contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETV_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+
+       /* make indata */
+       indata = pims_ipc_data_create(0);
+       if (indata == NULL) {
+               ERR("pims_ipc_data_create() Fail");
+               return CONTACTS_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = ctsvc_ipc_marshal_handle(contact, indata);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("ctsvc_ipc_marshal_handle() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_query(query, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_query() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(keyword, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(offset, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(limit, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(start_match ? start_match : CTSVC_DEFAULT_START_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_string(end_match ? end_match : CTSVC_DEFAULT_END_MATCH, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_string() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int(token_number, indata);
+       if (ret != CONTACTS_ERROR_NONE) {
+               ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+
+       /* ipc call */
+       if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE,
+                               CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY_FOR_SNIPPET,
+                               indata, &outdata) != 0) {
+               ERR("ctsvc_ipc_call() Fail");
+               pims_ipc_data_destroy(indata);
+               return CONTACTS_ERROR_IPC;
+       }
+
+       pims_ipc_data_destroy(indata);
+
+       if (outdata) {
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_int(outdata, &ret)) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       pims_ipc_data_destroy(outdata);
+                       return CONTACTS_ERROR_IPC;
+               }
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_list(outdata, out_list)) {
+                               ERR("ctsvc_ipc_unmarshal_list() Fail");
+                               pims_ipc_data_destroy(outdata);
+                               return CONTACTS_ERROR_IPC;
+                       }
+               }
+
+               pims_ipc_data_destroy(outdata);
+       }
+
+       return ret;
+}
+
 int ctsvc_client_db_search_records(contacts_h contact, const char *view_uri, const char *keyword,
                int offset, int limit, contacts_list_h *out_list)
 {
index 42dabd7..f7609a6 100644 (file)
@@ -40,6 +40,34 @@ int ctsvc_client_db_get_current_version(contacts_h contact, int *ctsvc_client_db
 int ctsvc_client_db_search_records(contacts_h contact, const char *view_uri, const char *keyword, int offset, int limit, contacts_list_h *out_list);
 int ctsvc_client_db_search_records_with_range(contacts_h contact, const char *view_uri, const char *keyword, int offset, int limit, int range, contacts_list_h *out_list);
 int ctsvc_client_db_search_records_with_query(contacts_h contact, contacts_query_h query, const char *keyword, int offset, int limit, contacts_list_h *out_list);
+int ctsvc_client_db_search_records_for_snippet(contacts_h contact,
+               const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
+int ctsvc_client_db_search_records_with_range_for_snippet(contacts_h contact,
+               const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
+int ctsvc_client_db_search_records_with_query_for_snippet(contacts_h contact,
+               contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
 int ctsvc_client_db_get_last_change_version(contacts_h contact, int *last_version);
 int ctsvc_client_db_get_status(contacts_h contact, contacts_db_status_e *status);
 int ctsvc_client_db_add_status_changed_cb(contacts_h contact, contacts_db_status_changed_cb cb, void *user_data);
index 1f7fca0..ddb3fa5 100644 (file)
@@ -26,5 +26,5 @@ int ctsvc_client_phone_log_reset_statistics(contacts_h contact);
 int ctsvc_client_phone_log_reset_statistics_by_sim(contacts_h contact, int sim_slot_no);
 int ctsvc_client_phone_log_delete(contacts_h contact, contacts_phone_log_delete_e op, va_list args);
 
-
 #endif /* __CTSVC_CLIENT_PHONELOG_HELPER_H__ */
+
index 78f6246..3a9289c 100644 (file)
@@ -35,7 +35,8 @@ static bool __ctsvc_query_property_check(const property_info_s *properties,
                property_info_s *p = (property_info_s*)&(properties[i]);
                if (property_id == p->property_id) {
                        if (property_type == QUERY_PROJECTION) {
-                               if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL || p->property_type == CTSVC_SEARCH_PROPERTY_PROJECTION)
+                               if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL ||
+                                               p->property_type == CTSVC_SEARCH_PROPERTY_PROJECTION)
                                        return true;
                                else
                                        return false;
@@ -76,7 +77,8 @@ API int contacts_query_set_projection(contacts_query_h query, unsigned int prope
        query_s = (ctsvc_query_s*)query;
 
        for (i = 0; i < count; i++) {
-               find = __ctsvc_query_property_check(query_s->properties, query_s->property_count, QUERY_PROJECTION, property_ids[i]);
+               find = __ctsvc_query_property_check(query_s->properties, query_s->property_count,
+                               QUERY_PROJECTION, property_ids[i]);
                RETVM_IF(false == find, CONTACTS_ERROR_INVALID_PARAMETER,
                                "property_id(%d) is not supported on view_uri(%s)", property_ids[i], query_s->view_uri);
        }
index 4f8ebab..f98e404 100644 (file)
@@ -81,6 +81,7 @@ static int __ctsvc_person_destroy(contacts_record_h record, bool delete_child)
        free(person->image_thumbnail_path);
        free(person->status);
        free(person->addressbook_ids);
+       free(person->snippet_string);
        free(person);
 
        return CONTACTS_ERROR_NONE;
@@ -109,6 +110,8 @@ static int __ctsvc_person_clone(contacts_record_h record, contacts_record_h *out
        out_data->vibration = SAFE_STRDUP(src_data->vibration);
        out_data->message_alert = SAFE_STRDUP(src_data->message_alert);
        out_data->status = SAFE_STRDUP(src_data->status);
+       out_data->snippet_type = src_data->snippet_type;
+       out_data->snippet_string = SAFE_STRDUP(src_data->snippet_string);
 
        int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
        if (CONTACTS_ERROR_NONE != ret) {
@@ -135,6 +138,9 @@ static int __ctsvc_person_get_int(contacts_record_h record, unsigned int propert
        case CTSVC_PROPERTY_PERSON_LINK_COUNT:
                *out = person->link_count;
                break;
+       case CTSVC_PROPERTY_PERSON_SNIPPET_TYPE:
+               *out = person->snippet_type;
+               break;
        default:
                ERR("This field(%d) is not supported in value(person)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -171,6 +177,9 @@ static int __ctsvc_person_get_str_real(contacts_record_h record, unsigned int pr
        case CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS:
                *out_str = GET_STR(copy, person->addressbook_ids);
                break;
+       case CTSVC_PROPERTY_PERSON_SNIPPET_STRING:
+               *out_str = GET_STR(copy, person->snippet_string);
+               break;
        default:
                ERR("This field(%d) is not supported in value(person)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -229,6 +238,10 @@ static int __ctsvc_person_set_int(contacts_record_h record, unsigned int propert
                CHECK_DIRTY_VAL(person->link_count, value, is_dirty);
                person->link_count = value;
                break;
+       case CTSVC_PROPERTY_PERSON_SNIPPET_TYPE:
+               CHECK_DIRTY_VAL(person->snippet_type, value, is_dirty);
+               person->snippet_type = value;
+               break;
        default:
                ERR("This field(0x%0x) is not supported in value(person)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -266,6 +279,10 @@ static int __ctsvc_person_set_str(contacts_record_h record, unsigned int propert
                CHECK_DIRTY_STR(person->message_alert, str, is_dirty);
                FREEandSTRDUP(person->message_alert, str);
                break;
+       case CTSVC_PROPERTY_PERSON_SNIPPET_STRING:
+               CHECK_DIRTY_STR(person->snippet_string, str, is_dirty);
+               FREEandSTRDUP(person->snippet_string, str);
+               break;
        default:
                ERR("This field(%d) is not supported in value(person)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
index a2cb845..1e6ce38 100644 (file)
        } while (0)
 
 enum {
-       CTSVC_DATA_NAME = 1,
-       CTSVC_DATA_POSTAL = 2,
-       CTSVC_DATA_MESSENGER = 3,
-       CTSVC_DATA_URL = 4,
-       CTSVC_DATA_EVENT = 5,
-       CTSVC_DATA_COMPANY = 6,
-       CTSVC_DATA_NICKNAME = 7,
-       CTSVC_DATA_NUMBER = 8,
-       CTSVC_DATA_EMAIL = 9,
-       CTSVC_DATA_PROFILE = 10,
-       CTSVC_DATA_RELATIONSHIP = 11,
-       CTSVC_DATA_NOTE = 12,
-       CTSVC_DATA_IMAGE = 13,
-       CTSVC_DATA_SIP = 14,
-       CTSVC_DATA_EXTENSION = 100
-};
-
-enum {
        CTSVC_PERMISSION_CONTACT_NONE = 0x0,
        CTSVC_PERMISSION_CONTACT_READ = 0x1,
        CTSVC_PERMISSION_CONTACT_WRITE = 0x2,
@@ -270,6 +252,8 @@ typedef struct {
        char *status;
        int link_count;
        char *addressbook_ids;
+       int snippet_type;
+       char *snippet_string;
 } ctsvc_person_s;
 
 typedef struct {
index f079469..46121a3 100644 (file)
@@ -59,6 +59,8 @@ API const _contacts_person_property_ids _contacts_person = {
        .addressbook_ids                = CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS,
        .has_phonenumber                = CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,
        .has_email                              = CTSVC_PROPERTY_PERSON_HAS_EMAIL,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_contact_property_ids _contacts_contact = {
@@ -93,7 +95,7 @@ API const _contacts_contact_property_ids _contacts_contact = {
        .image                                  = CTSVC_PROPERTY_CONTACT_IMAGE,
        .group_relation                 = CTSVC_PROPERTY_CONTACT_GROUP_RELATION,
        .extension                              = CTSVC_PROPERTY_CONTACT_EXTENSION,
-       .sip                                    = CTSVC_PROPERTY_CONTACT_SIP,
+       .sip                                    = CTSVC_PROPERTY_CONTACT_SIP
 };
 
 API const _contacts_my_profile_property_ids _contacts_my_profile = {
@@ -118,7 +120,7 @@ API const _contacts_my_profile_property_ids _contacts_my_profile = {
        .relationship                   = CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP,
        .image                                  = CTSVC_PROPERTY_MY_PROFILE_IMAGE,
        .extension                              = CTSVC_PROPERTY_MY_PROFILE_EXTENSION,
-       .sip                                    = CTSVC_PROPERTY_MY_PROFILE_SIP,
+       .sip                                    = CTSVC_PROPERTY_MY_PROFILE_SIP
 };
 
 API const _contacts_simple_contact_property_ids _contacts_simple_contact = {
@@ -135,8 +137,8 @@ API const _contacts_simple_contact_property_ids _contacts_simple_contact = {
        .has_email                              = CTSVC_PROPERTY_CONTACT_HAS_EMAIL,
        .uid                                    = CTSVC_PROPERTY_CONTACT_UID,
        .vibration                              = CTSVC_PROPERTY_CONTACT_VIBRATION,
-       .message_alert          = CTSVC_PROPERTY_CONTACT_MESSAGE_ALERT,
-       .changed_time                   = CTSVC_PROPERTY_CONTACT_CHANGED_TIME,
+       .message_alert          = CTSVC_PROPERTY_CONTACT_MESSAGE_ALERT,
+       .changed_time                   = CTSVC_PROPERTY_CONTACT_CHANGED_TIME
 };
 
 API const _contacts_name_property_ids _contacts_name = {
@@ -431,7 +433,9 @@ API const _contacts_person_contact_property_ids _contacts_person_contact = {
        .contact_id                             = CTSVC_PROPERTY_CONTACT_ID,
        .address_book_id                = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,
        .address_book_name              = CTSVC_PROPERTY_ADDRESSBOOK_NAME,
-       .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE
+       .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_person_number_property_ids _contacts_person_number = {
@@ -454,7 +458,9 @@ API const _contacts_person_number_property_ids _contacts_person_number = {
        .number                         = CTSVC_PROPERTY_NUMBER_NUMBER,
        .number_filter          = CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,
        .normalized_number = CTSVC_PROPERTY_NUMBER_NORMALIZED_NUMBER,
-       .cleaned_number = CTSVC_PROPERTY_NUMBER_CLEANED_NUMBER
+       .cleaned_number = CTSVC_PROPERTY_NUMBER_CLEANED_NUMBER,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_person_email_property_ids _contacts_person_email = {
@@ -474,7 +480,9 @@ API const _contacts_person_email_property_ids _contacts_person_email = {
        .type                           = CTSVC_PROPERTY_EMAIL_TYPE,
        .label                          = CTSVC_PROPERTY_EMAIL_LABEL,
        .is_primary_default     = CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT,
-       .email                          = CTSVC_PROPERTY_EMAIL_EMAIL
+       .email                          = CTSVC_PROPERTY_EMAIL_EMAIL,
+       .snippet_type           = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string         = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_person_usage_property_ids _contacts_person_usage = {
@@ -514,7 +522,9 @@ API const _contacts_person_grouprel_property_ids _contacts_person_grouprel = {
        .group_id               = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,
        .address_book_name              = CTSVC_PROPERTY_ADDRESSBOOK_NAME,
        .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE,
-       .contact_id                             = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID
+       .contact_id                             = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_person_group_not_assigned_property_ids _contacts_person_group_not_assigned = {
@@ -535,7 +545,9 @@ API const _contacts_person_group_not_assigned_property_ids _contacts_person_grou
        .linked_address_book_ids        = CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS,
        .contact_id                             = CTSVC_PROPERTY_CONTACT_ID,
        .address_book_id                        = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,
-       .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE
+       .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 API const _contacts_person_group_assigned_property_ids _contacts_person_group_assigned = {
@@ -557,7 +569,9 @@ API const _contacts_person_group_assigned_property_ids _contacts_person_group_as
        .address_book_id                = CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,
        .group_id                               = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,
        .address_book_mode              = CTSVC_PROPERTY_ADDRESSBOOK_MODE,
-       .contact_id                             = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID
+       .contact_id                             = CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,
+       .snippet_type                   = CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,
+       .snippet_string                 = CTSVC_PROPERTY_PERSON_SNIPPET_STRING
 };
 
 #ifdef ENABLE_LOG_FEATURE
@@ -706,6 +720,8 @@ const property_info_s __property_person[] = {
        {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_SEARCH_PROPERTY_PROJECTION,       "addressbook_ids"},
        {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER, CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
        {CTSVC_PROPERTY_PERSON_HAS_EMAIL,               CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_simple_contact[] = {
@@ -1018,6 +1034,8 @@ const property_info_s __property_person_contact[] = {   /* _contacts_person_cont
        /* addressbook */
        {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
        {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_person_number[] = {   /* _contacts_person_number */
@@ -1041,6 +1059,8 @@ const property_info_s __property_person_number[] = {   /* _contacts_person_numbe
        {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,                   CTSVC_SEARCH_PROPERTY_FILTER,   "minmatch"},
        {CTSVC_PROPERTY_NUMBER_NORMALIZED_NUMBER,       CTSVC_SEARCH_PROPERTY_FILTER,   "normalized_number"},
        {CTSVC_PROPERTY_NUMBER_CLEANED_NUMBER,  CTSVC_SEARCH_PROPERTY_FILTER,   "cleaned_number"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_person_email[] = {   /* _contacts_person_email */
@@ -1061,6 +1081,8 @@ const property_info_s __property_person_email[] = {   /* _contacts_person_email
        {CTSVC_PROPERTY_EMAIL_LABEL,                                    CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
        {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT,                CTSVC_SEARCH_PROPERTY_ALL,      "is_primary_default"},
        {CTSVC_PROPERTY_EMAIL_EMAIL,                                    CTSVC_SEARCH_PROPERTY_ALL,      "email"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_person_grouprel[] = {   /* _contacts_person_grouprel */
@@ -1086,6 +1108,8 @@ const property_info_s __property_person_grouprel[] = {   /* _contacts_person_gro
        /* addressbook */
        {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
        {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_person_group_assigned[] = {   /* _contacts_person_group_assigned */
@@ -1110,6 +1134,8 @@ const property_info_s __property_person_group_assigned[] = {   /* _contacts_pers
        {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,                      CTSVC_SEARCH_PROPERTY_PROJECTION,       "contact_id"},
        /* addressbook */
        {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_person_group_not_assigned[] = {   /* _contacts_person_group_not_assigned */
@@ -1132,6 +1158,8 @@ const property_info_s __property_person_group_not_assigned[] = {   /* _contacts_
        {CTSVC_PROPERTY_CONTACT_ID,                                                     CTSVC_SEARCH_PROPERTY_PROJECTION,       "contact_id"},
        /* addressbook */
        {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,             CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,             CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 #ifdef ENABLE_LOG_FEATURE
@@ -1217,6 +1245,8 @@ const property_info_s __property_contact_grouprel[] = {   /* _contacts_contact_g
        /* group relation */
        {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,                CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
        {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "group_name"},
+       {CTSVC_PROPERTY_PERSON_SNIPPET_TYPE,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data type */
+       {CTSVC_PROPERTY_PERSON_SNIPPET_STRING,     CTSVC_SEARCH_PROPERTY_ALL,  NULL}, /* data string */
 };
 
 const property_info_s __property_contact_activity[] = {   /* _contacts_contact_activity */
index 8519786..9e3f8bb 100644 (file)
@@ -177,6 +177,8 @@ typedef enum {
        CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +12,
        CTSVC_PROPERTY_PERSON_STATUS = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +13,
        CTSVC_PROPERTY_PERSON_MESSAGE_ALERT = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +14,
+       CTSVC_PROPERTY_PERSON_SNIPPET_TYPE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +15,
+       CTSVC_PROPERTY_PERSON_SNIPPET_STRING = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +16,
 
        /* person-stat */
        CTSVC_PROPERTY_PERSON_USAGE_TYPE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT) +100,
index fbabf21..6fdcb37 100644 (file)
@@ -54,6 +54,9 @@
 #define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS            "search_records"
 #define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE          "search_records_with_range"
 #define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY    "search_records_with_query"
+#define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_FOR_SNIPPET            "search_records_for_snippet"
+#define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE_FOR_SNIPPET "search_records_with_range_for_snippet"
+#define CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY_FOR_SNIPPET "search_records_with_query_for_snippet"
 #define CTSVC_IPC_SERVER_DB_GET_STATUS                                 "get_db_status"
 #define CTSVC_IPC_SERVER_DB_STATUS_CHANGED                     "db_status_changed"
 
index 6284f05..945abfd 100644 (file)
@@ -516,7 +516,6 @@ int ctsvc_ipc_unmarshal_string(const pims_ipc_data_h ipc_data, char **ppbufchar)
        length = *(int*)tmp;
 
        if (length == -1) {
-               DBG("string is null");
                ret = CONTACTS_ERROR_NONE;
                *ppbufchar = NULL;
                return ret;
index 06cc761..f73c07d 100644 (file)
@@ -59,6 +59,10 @@ static int __ctsvc_ipc_unmarshal_person(pims_ipc_data_h ipc_data, const char *vi
                        break;
                if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->addressbook_ids) != CONTACTS_ERROR_NONE)
                        break;
+               if (ctsvc_ipc_unmarshal_int(ipc_data, &person_p->snippet_type) != CONTACTS_ERROR_NONE)
+                       break;
+               if (ctsvc_ipc_unmarshal_string(ipc_data, &person_p->snippet_string) != CONTACTS_ERROR_NONE)
+                       break;
 
                return CONTACTS_ERROR_NONE;
        } while (0);
@@ -105,6 +109,10 @@ static int __ctsvc_ipc_marshal_person(const contacts_record_h record,
                        break;
                if (ctsvc_ipc_marshal_string((person_p->addressbook_ids), ipc_data) != CONTACTS_ERROR_NONE)
                        break;
+               if (ctsvc_ipc_marshal_int((person_p->snippet_type), ipc_data) != CONTACTS_ERROR_NONE)
+                       break;
+               if (ctsvc_ipc_marshal_string((person_p->snippet_string), ipc_data) != CONTACTS_ERROR_NONE)
+                       break;
 
                return CONTACTS_ERROR_NONE;
        } while (0);
index 3345869..e052744 100644 (file)
@@ -779,6 +779,128 @@ int contacts_db_search_records_with_query(contacts_query_h query, const char *ke
 int contacts_db_search_records_with_range(const char *view_uri, const char *keyword, int offset, int limit, int range, contacts_list_h *record_list);
 
 /**
+ * @brief Finds records based on a given keyword for snippet.
+ *
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/contact.read
+ *
+ * @remarks You must release @a record_list using contacts_list_destroy(). \n
+ * This API works only for @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_contact, \n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_assigned \n
+ * and @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_not_assigned
+ *
+ * @param[in]   view_uri        The view URI to get records
+ * @param[in]   keyword         The keyword
+ * @param[in]   offset          The index from which to get results
+ * @param[in]   limit           The number to limit results(value 0 used for get all records)
+ * @param[in]   start_match     The text which is inserted into the fragment before the keyword(If NULL, default is "[")
+ * @param[in]   end_match       The text which is inserted into the fragment after the keyword(If NULL, default is "]")
+ * @param[in]   token_number    The one side extra number of tokens near keyword(If negative value, full sentence is printed. e.g. if token number is 3 with 'abc' keyword, "my name is [abc]de and my home")
+ * @param[out]  record_list     The record list
+ *
+ * @return  @c 0 on success,
+ *          otherwise a negative error value
+ *
+ * @retval  #CONTACTS_ERROR_NONE                Successful
+ * @retval  #CONTACTS_ERROR_OUT_OF_MEMORY       Out of memory
+ * @retval  #CONTACTS_ERROR_INVALID_PARAMETER   Invalid parameter
+ * @retval  #CONTACTS_ERROR_PERMISSION_DENIED   Permission denied. This application does not have the privilege to call this method.
+ * @retval  #CONTACTS_ERROR_NOT_SUPPORTED       Not supported
+ * @retval  #CONTACTS_ERROR_DB                  Database operation failure
+ * @retval  #CONTACTS_ERROR_IPC                 IPC error
+ *
+ * @pre    contacts_connect() should be called to open a connection to the contacts service.
+ *
+ * @see contacts_connect()
+ * @see contacts_list_destroy()
+ */
+int contacts_db_search_records_for_snippet(const char *view_uri, const char *keyword, int offset, int limit, const char *start_match, const char *end_match, int token_number, contacts_list_h *record_list);
+
+/**
+ * @brief Finds records based on given query and keyword for snippet.
+ *
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/contact.read
+ *
+ * @remarks You must release @a record_list using contacts_list_destroy(). \n
+ * This API works only for @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_contact, \n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_assigned \n
+ * and @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_not_assigned
+ *
+ * @param[in]   query           The query handle to filter
+ * @param[in]   keyword         The keyword
+ * @param[in]   offset          The index from which to get results
+ * @param[in]   limit           The number to limit results(value 0 used for get all records)
+ * @param[in]   start_match     The text which is inserted into the fragment before the keyword(If NULL, default is "[")
+ * @param[in]   end_match       The text which is inserted into the fragment after the keyword(If NULL, default is "]")
+ * @param[in]   token_number    The one side extra number of tokens near keyword(If negative value, full sentence is printed. e.g. if token number is 3 with 'abc' keyword, "my name is [abc]de and my home")
+ * @param[out]  record_list     The record list
+ *
+ * @return  @c 0 on success,
+ *          otherwise a negative error value
+ *
+ * @retval  #CONTACTS_ERROR_NONE                Successful
+ * @retval  #CONTACTS_ERROR_OUT_OF_MEMORY       Out of memory
+ * @retval  #CONTACTS_ERROR_INVALID_PARAMETER   Invalid parameter
+ * @retval  #CONTACTS_ERROR_FILE_NO_SPACE       FS Full
+ * @retval  #CONTACTS_ERROR_PERMISSION_DENIED   Permission denied. This application does not have the privilege to call this method.
+ * @retval  #CONTACTS_ERROR_NOT_SUPPORTED       Not supported
+ * @retval  #CONTACTS_ERROR_DB                  Database operation failure
+ * @retval  #CONTACTS_ERROR_IPC                 IPC error
+ *
+ * @pre    contacts_connect() should be called to open a connection to the contacts service.
+ *
+ * @see contacts_connect()
+ * @see contacts_list_destroy()
+ */
+
+int contacts_db_search_records_with_query_for_snippet(contacts_query_h query, const char *keyword, int offset, int limit, const char *start_match, const char *end_match, int token_number, contacts_list_h *record_list);
+
+/**
+ * @brief Finds records based on a keyword and range for snippet.
+ *
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/contact.read
+ *
+ * @remarks You must release @a record_list using contacts_list_destroy(). \n
+ * This API works only for @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_contact, \n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_grouprel, @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_assigned, \n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_group_not_assigned. These views can search records with range @ref CONTACTS_SEARCH_RANGE_NAME, @ref CONTACTS_SEARCH_RANGE_NUMBER, @ref CONTACTS_SEARCH_RANGE_DATA. \n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_number can search records with @ref CONTACTS_SEARCH_RANGE_NAME and @ref CONTACTS_SEARCH_RANGE_NUMBER.\n
+ * @ref CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_email can search records with @ref CONTACTS_SEARCH_RANGE_NAME and @ref CONTACTS_SEARCH_RANGE_EMAIL. \n
+ *
+ * @param[in]   view_uri        The view URI
+ * @param[in]   keyword         The keyword
+ * @param[in]   offset          The index from which to get results
+ * @param[in]   limit           The number to limit results(value 0 is used for get all records)
+ * @param[in]   range           The search range
+ * @param[in]   start_match     The text which is inserted into the fragment before the keyword(If NULL, default is "[")
+ * @param[in]   end_match       The text which is inserted into the fragment after the keyword(If NULL, default is "]")
+ * @param[in]   token_number    The one side extra number of tokens near keyword(If negative value, full sentence is printed. e.g. if token number is 3 with 'abc' keyword, "my name is [abc]de and my home")
+ * @param[out]  record_list     The record list
+ *
+ * @return  @c 0 on success,
+ *          otherwise a negative error value
+ *
+ * @retval  #CONTACTS_ERROR_NONE                Successful
+ * @retval  #CONTACTS_ERROR_OUT_OF_MEMORY       Out of memory
+ * @retval  #CONTACTS_ERROR_INVALID_PARAMETER   Invalid parameter
+ * @retval  #CONTACTS_ERROR_PERMISSION_DENIED   Permission denied. This application does not have the privilege to call this method.
+ * @retval  #CONTACTS_ERROR_NOT_SUPPORTED       Not supported
+ * @retval  #CONTACTS_ERROR_DB                  Database operation failure
+ * @retval  #CONTACTS_ERROR_IPC                 IPC error
+ *
+ * @pre    contacts_connect() should be called to open a connection to the contacts service.
+ *
+ * @see contacts_connect()
+ * @see contacts_list_destroy()
+ */
+int contacts_db_search_records_with_range_for_snippet(const char *view_uri, const char *keyword, int offset, int limit, int range, const char *start_match, const char *end_match, int token_number, contacts_list_h *record_list);
+
+/**
  * @brief Gets the number of records in a specific view.
  *
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 3.0 @endif
index 6417b51..590b686 100644 (file)
@@ -72,6 +72,30 @@ _CONTACTS_HANDLE(contacts_h)
  */
 
 /**
+ * @brief Enumeration for contacts data type.
+ *
+ * @since_tizen 3.0
+ *
+ */
+typedef enum {
+       CONTACTS_DATA_TYPE_NAME = 1,
+       CONTACTS_DATA_TYPE_POSTAL = 2,
+       CONTACTS_DATA_TYPE_MESSENGER = 3,
+       CONTACTS_DATA_TYPE_URL = 4,
+       CONTACTS_DATA_TYPE_EVENT = 5,
+       CONTACTS_DATA_TYPE_COMPANY = 6,
+       CONTACTS_DATA_TYPE_NICKNAME = 7,
+       CONTACTS_DATA_TYPE_NUMBER = 8,
+       CONTACTS_DATA_TYPE_EMAIL = 9,
+       CONTACTS_DATA_TYPE_PROFILE = 10,
+       CONTACTS_DATA_TYPE_RELATIONSHIP = 11,
+       CONTACTS_DATA_TYPE_NOTE = 12,
+       CONTACTS_DATA_TYPE_IMAGE = 13,
+       CONTACTS_DATA_TYPE_SIP = 14,
+       CONTACTS_DATA_TYPE_EXTENSION = 100
+} contacts_data_type_e;
+
+/**
  * @brief Enumeration for contacts number type.
  *
  * @details The number can be made with a set of values by specifying one or more values.
index 7d7062c..9cca45f 100644 (file)
@@ -186,6 +186,8 @@ _CONTACTS_END_VIEW(_contacts_group)
  * <tr><td>string</td><td> addressbook_ids </td><td>read only</td><td> Addressbook IDs that the person belongs to (projection) </td></tr>
  * <tr><td>boolean</td><td> has_phonenumber </td><td>read only</td><td> The person has phone number or not </td></tr>
  * <tr><td>boolean</td><td> has_email </td><td>read only</td><td> The person has email or not </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_VIEW()
@@ -204,6 +206,8 @@ _CONTACTS_BEGIN_VIEW()
        _CONTACTS_PROPERTY_BOOL(has_phonenumber)      /* read only */
        _CONTACTS_PROPERTY_BOOL(has_email)            /* read only */
        _CONTACTS_PROPERTY_STR(message_alert)         /* read, write */
+       _CONTACTS_PROPERTY_INT(snippet_type)          /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)        /* read only (Since 3.0) */
 _CONTACTS_END_VIEW(_contacts_person)
 
 /**
@@ -619,6 +623,8 @@ _CONTACTS_END_VIEW(_contacts_event)
  * <tr><td>integer</td><td> group_id </td><td>read, write once</td><td> DB record ID of the group </td></tr>
  * <tr><td>integer</td><td> contact_id </td><td>read, write once</td><td> DB record ID of the contact </td></tr>
  * <tr><td>string</td><td> name </td><td>read only</td><td> Group name </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_VIEW()
@@ -626,6 +632,8 @@ _CONTACTS_BEGIN_VIEW()
        _CONTACTS_PROPERTY_INT(group_id)          /* read, write once */
        _CONTACTS_PROPERTY_INT(contact_id)        /* read, write once */
        _CONTACTS_PROPERTY_STR(name)              /* read only */
+       _CONTACTS_PROPERTY_INT(snippet_type)      /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)    /* read only (Since 3.0) */
 _CONTACTS_END_VIEW(_contacts_group_relation)
 
 /**
@@ -1154,6 +1162,8 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_grouprel_updated_info)
  * <tr><td>integer</td><td> address_book_id </td><td> Addressbook ID that the person belongs to </td></tr>
  * <tr><td>integer</td><td> address_book_mode </td><td> Addressbook mode, refer to the @ref contacts_address_book_mode_e </td></tr>
  * <tr><td>string</td><td> address_book_name </td><td> Addressbook name that the person belongs to </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
@@ -1175,6 +1185,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_STR(address_book_name)
        _CONTACTS_PROPERTY_INT(address_book_mode)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
+       _CONTACTS_PROPERTY_INT(snippet_type)          /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)        /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_contact)
 
 /**
@@ -1206,6 +1218,8 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_contact)
  * <tr><td>string</td><td> number_filter </td><td> If you add filter with this property, the string will be normalized as minmatch length internally and the match rule will be applied CONTACTS_MATCH_EXACTLY </td></tr>
  * <tr><td>string</td><td> normalized_number </td><td> You can only use this property for search filter</td></tr>
  * <tr><td>string</td><td> cleaned_number </td><td>You can only use this property for search filter </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
 
  */
@@ -1229,6 +1243,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_FILTER_STR(normalized_number)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
        _CONTACTS_PROPERTY_FILTER_STR(cleaned_number)
+       _CONTACTS_PROPERTY_INT(snippet_type)          /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)        /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_number)
 
 /**
@@ -1257,6 +1273,8 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_number)
  * <tr><td>string</td><td> label </td><td> Custom mail type label, when the email type is #CONTACTS_EMAIL_TYPE_CUSTOM (projection) </td></tr>
  * <tr><td>boolean</td><td> is_primary_default </td><td> The email is default email or not </td></tr>
  * <tr><td>string</td><td> email </td><td> Email address</td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
@@ -1276,6 +1294,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_BOOL(is_primary_default)
        _CONTACTS_PROPERTY_STR(email)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
+       _CONTACTS_PROPERTY_INT(snippet_type)               /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)             /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_email)
 
 /**
@@ -1307,6 +1327,8 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_email)
  * <tr><td>string</td><td> address_book_name </td><td> Addressbook name that the person belongs to </td></tr>
  * <tr><td>integer</td><td> group_id </td><td> Group ID that the person belongs to </td></tr>
  * <tr><td>integer</td><td> contact_id </td><td> Contact ID that the person belongs to (projection) </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
@@ -1329,6 +1351,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_INT(address_book_mode)
        _CONTACTS_PROPERTY_PROJECTION_INT(contact_id)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
+       _CONTACTS_PROPERTY_INT(snippet_type)               /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)             /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_grouprel)
 
 /**
@@ -1358,7 +1382,9 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_grouprel)
  * <tr><td>integer</td><td> address_book_id </td><td> Addressbook ID that the person belongs to </td></tr>
  * <tr><td>integer</td><td> address_book_mode </td><td> Addressbook mode, refer to the @ref contacts_address_book_mode_e </td></tr>
  * <tr><td>integer</td><td> group_id </td><td> Group ID that the person belongs to </td></tr>
- * <tr><td>integer</td><td> contact_id </td><td> Contact ID that the person belongs to (projection) </td></tr>
+ * <tr><td>integer<dtd><td> contact_id </td><td> Contact ID that the person belongs to (projection) </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
@@ -1380,6 +1406,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_INT(address_book_mode)
        _CONTACTS_PROPERTY_PROJECTION_INT(contact_id)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
+       _CONTACTS_PROPERTY_INT(snippet_type)               /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)             /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_group_assigned)
 
 /**
@@ -1409,6 +1437,8 @@ _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_group_assigned)
  * <tr><td>integer</td><td> address_book_id </td><td> Addressbook ID that the person belongs to </td></tr>
  * <tr><td>integer</td><td> address_book_mode </td><td> Addressbook mode, refer to the @ref contacts_address_book_mode_e </td></tr>
  * <tr><td>integer</td><td> contact_id </td><td> Contact ID that the person belongs to (projection) </td></tr>
+ * <tr><td>integer</td><td> snippet_type </td><td>read only</td><td> kerword matched data type, refer to they @ref contacts_data_type_e (Since 3.0) </td></tr>
+ * <tr><td>string</td><td> snippet_string </td><td>read only</td><td> keyword matched data string (Since 3.0) </td></tr>
  * </table>
  */
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
@@ -1429,6 +1459,8 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_INT(address_book_mode)
        _CONTACTS_PROPERTY_PROJECTION_INT(contact_id)
        _CONTACTS_PROPERTY_PROJECTION_STR(message_alert)
+       _CONTACTS_PROPERTY_INT(snippet_type)               /* read only (Since 3.0) */
+       _CONTACTS_PROPERTY_STR(snippet_string)             /* read only (Since 3.0) */
 _CONTACTS_END_READ_ONLY_VIEW(_contacts_person_group_not_assigned)
 
 /**
index fd86128..480ac28 100644 (file)
@@ -1,6 +1,6 @@
 Name:       contacts-service
 Summary:    Contacts Service
-Version:    0.13.50
+Version:    0.13.51
 Release:    0
 Group:      Social & Content/Service
 License:    Apache-2.0
index 654009e..5652cb6 100644 (file)
@@ -138,6 +138,7 @@ SET(SRCS
        ctsvc_server_bg.c
        ctsvc_server.c
        ctsvc_server_sim.c
+       ctsvc_utils_string.c
 )
 
 IF(ENABLE_LOG_FEATURE)
index f7316aa..0fb14db 100644 (file)
@@ -1557,6 +1557,376 @@ DATA_FREE:
        return;
 }
 
+void ctsvc_ipc_server_db_search_records_for_snippet(pims_ipc_h ipc,
+               pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       char *view_uri = NULL;
+       char *keyword = NULL;
+       int offset = 0;
+       int limit = 0;
+       contacts_list_h list = NULL;
+       contacts_h contact = NULL;
+       char *start_match = NULL;
+       char *end_match = NULL;
+       int token_number = 0;
+
+       if (indata) {
+               ret = ctsvc_ipc_unmarshal_handle(indata, &contact);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_ipc_unmarshal_handle() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &view_uri);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &keyword);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &offset);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &limit);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &start_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &end_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &token_number);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+       } else {
+               ERR("ctsvc_ipc_server_db_insert_record() Fail");
+               goto ERROR_RETURN;
+       }
+
+       if (!ctsvc_have_permission(ipc, ctsvc_required_read_permission(view_uri))) {
+               ret = CONTACTS_ERROR_PERMISSION_DENIED;
+               goto ERROR_RETURN;
+       }
+
+       ret = ctsvc_db_search_records_for_snippet(view_uri, keyword, offset, limit,
+                       start_match, end_match, token_number, &list);
+
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+
+               if (CONTACTS_ERROR_NO_DATA == ret) {
+                       DBG("no data");
+               } else if (CONTACTS_ERROR_NONE == ret) {
+                       ret = ctsvc_ipc_marshal_list(list, *outdata);
+
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               ERR("ctsvc_ipc_unmarshal_int() Fail");
+                               goto DATA_FREE;
+                       }
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+       goto DATA_FREE;
+
+ERROR_RETURN:
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+DATA_FREE:
+       ctsvc_handle_destroy(contact);
+       contacts_list_destroy(list, true);
+       free(view_uri);
+       free(keyword);
+       ctsvc_server_start_timeout();
+       return;
+}
+
+void ctsvc_ipc_server_db_search_records_with_range_for_snippet(pims_ipc_h ipc,
+               pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       char *view_uri = NULL;
+       char *keyword = NULL;
+       int offset = 0;
+       int limit = 0;
+       int range = 0;
+       contacts_list_h list = NULL;
+       contacts_h contact = NULL;
+       char *start_match = NULL;
+       char *end_match = NULL;
+       int token_number = 0;
+
+       if (indata) {
+               ret = ctsvc_ipc_unmarshal_handle(indata, &contact);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_ipc_unmarshal_handle() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &view_uri);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &keyword);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &offset);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &limit);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &range);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &start_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &end_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &token_number);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+       } else {
+               ERR("ctsvc_ipc_server_db_insert_record() Fail");
+               goto ERROR_RETURN;
+       }
+
+       if (!ctsvc_have_permission(ipc, ctsvc_required_read_permission(view_uri))) {
+               ret = CONTACTS_ERROR_PERMISSION_DENIED;
+               goto ERROR_RETURN;
+       }
+
+       ret = ctsvc_db_search_records_with_range_for_snippet(view_uri, keyword, offset,
+                       limit, range, start_match, end_match, token_number, &list);
+
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+
+               if (CONTACTS_ERROR_NO_DATA == ret) {
+                       DBG("no data");
+               } else if (CONTACTS_ERROR_NONE == ret) {
+                       ret = ctsvc_ipc_marshal_list(list, *outdata);
+
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               ERR("ctsvc_ipc_unmarshal_int() Fail");
+                               goto DATA_FREE;
+                       }
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+       goto DATA_FREE;
+
+ERROR_RETURN:
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+
+DATA_FREE:
+       ctsvc_handle_destroy(contact);
+       contacts_list_destroy(list, true);
+       free(view_uri);
+       free(keyword);
+       ctsvc_server_start_timeout();
+       return;
+}
+
+void ctsvc_ipc_server_db_search_records_with_query_for_snippet(pims_ipc_h ipc,
+               pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       contacts_query_h query = NULL;
+       char *keyword = NULL;
+       int offset = 0;
+       int limit = 0;
+       contacts_list_h list = NULL;
+       contacts_h contact = NULL;
+       char *start_match = NULL;
+       char *end_match = NULL;
+       int token_number = 0;
+
+       if (indata) {
+               ret = ctsvc_ipc_unmarshal_handle(indata, &contact);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       ERR("ctsvc_ipc_unmarshal_handle() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_query(indata, &query);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &keyword);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &offset);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &limit);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &start_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_string(indata, &end_match);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_record() Fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &token_number);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+                       goto ERROR_RETURN;
+               }
+       } else {
+               ERR("ctsvc_ipc_server_db_insert_record() Fail");
+               goto ERROR_RETURN;
+       }
+
+       if (!ctsvc_have_permission(ipc, ctsvc_required_read_permission(((ctsvc_query_s*)query)->view_uri))) {
+               ret = CONTACTS_ERROR_PERMISSION_DENIED;
+               goto ERROR_RETURN;
+       }
+
+       ret = ctsvc_db_search_records_with_query_for_snippet(query, keyword, offset, limit,
+                       start_match, end_match, token_number, &list);
+
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+
+               if (CONTACTS_ERROR_NO_DATA == ret) {
+                       DBG("no data");
+               } else if (CONTACTS_ERROR_NONE == ret) {
+                       ret = ctsvc_ipc_marshal_list(list, *outdata);
+
+                       if (ret != CONTACTS_ERROR_NONE) {
+                               ERR("ctsvc_ipc_marshal_list Fail");
+                               goto DATA_FREE;
+                       }
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+       goto DATA_FREE;
+
+ERROR_RETURN:
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (NULL == *outdata) {
+                       ERR("pims_ipc_data_create() Fail");
+                       goto DATA_FREE;
+               }
+               if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("ctsvc_ipc_marshal_int() Fail");
+                       goto DATA_FREE;
+               }
+       } else {
+               ERR("outdata is NULL");
+       }
+DATA_FREE:
+       ctsvc_handle_destroy(contact);
+       contacts_list_destroy(list, true);
+       contacts_query_destroy(query);
+       free(keyword);
+       ctsvc_server_start_timeout();
+       return;
+}
+
 void ctsvc_ipc_server_db_search_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                pims_ipc_data_h *outdata, void *userdata)
 {
index 3f2b870..9b7a881 100644 (file)
@@ -49,6 +49,9 @@ void ctsvc_ipc_server_db_get_current_version(pims_ipc_h ipc, pims_ipc_data_h ind
 void ctsvc_ipc_server_db_search_records(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 void ctsvc_ipc_server_db_search_records_with_range(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 void ctsvc_ipc_server_db_search_records_with_query(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
+void ctsvc_ipc_server_db_search_records_for_snippet(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
+void ctsvc_ipc_server_db_search_records_with_range_for_snippet(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
+void ctsvc_ipc_server_db_search_records_with_query_for_snippet(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 
 void ctsvc_ipc_server_db_get_status(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 
index 513b831..2c9fb1e 100644 (file)
@@ -504,49 +504,49 @@ void ctsvc_db_data_delete_callback(sqlite3_context  *context,
        datatype = sqlite3_value_int(argv[1]);
 
        switch (datatype) {
-       case CTSVC_DATA_NAME:
+       case CONTACTS_DATA_TYPE_NAME:
                ctsvc_set_name_noti();
                break;
-       case CTSVC_DATA_POSTAL:
+       case CONTACTS_DATA_TYPE_POSTAL:
                ctsvc_set_address_noti();
                break;
-       case CTSVC_DATA_MESSENGER:
+       case CONTACTS_DATA_TYPE_MESSENGER:
                ctsvc_set_messenger_noti();
                break;
-       case CTSVC_DATA_URL:
+       case CONTACTS_DATA_TYPE_URL:
                ctsvc_set_url_noti();
                break;
-       case CTSVC_DATA_EVENT:
+       case CONTACTS_DATA_TYPE_EVENT:
                ctsvc_set_event_noti();
                break;
-       case CTSVC_DATA_COMPANY:
+       case CONTACTS_DATA_TYPE_COMPANY:
                ctsvc_set_company_noti();
                break;
-       case CTSVC_DATA_NICKNAME:
+       case CONTACTS_DATA_TYPE_NICKNAME:
                ctsvc_set_nickname_noti();
                break;
-       case CTSVC_DATA_NUMBER:
+       case CONTACTS_DATA_TYPE_NUMBER:
                ctsvc_set_number_noti();
                break;
-       case CTSVC_DATA_EMAIL:
+       case CONTACTS_DATA_TYPE_EMAIL:
                ctsvc_set_email_noti();
                break;
-       case CTSVC_DATA_PROFILE:
+       case CONTACTS_DATA_TYPE_PROFILE:
                ctsvc_set_profile_noti();
                break;
-       case CTSVC_DATA_RELATIONSHIP:
+       case CONTACTS_DATA_TYPE_RELATIONSHIP:
                ctsvc_set_relationship_noti();
                break;
-       case CTSVC_DATA_NOTE:
+       case CONTACTS_DATA_TYPE_NOTE:
                ctsvc_set_note_noti();
                break;
-       case CTSVC_DATA_IMAGE:
+       case CONTACTS_DATA_TYPE_IMAGE:
                ctsvc_set_image_noti();
                break;
-       case CTSVC_DATA_EXTENSION:
+       case CONTACTS_DATA_TYPE_EXTENSION:
                ctsvc_set_data_noti();
                break;
-       case CTSVC_DATA_SIP:
+       case CONTACTS_DATA_TYPE_SIP:
                ctsvc_set_sip_noti();
                break;
        default:
index ae17462..e6fda6c 100644 (file)
@@ -63,55 +63,182 @@ static int __server_main(void)
                 * These functions will be called when requesting from client module depends on module name and function name (pims_ipc_call, ctsvc_ipc_call)
                 * pims_ipc_svc_register(MODULE_NAME, FUNCTION_NAME ...);
                 */
-               if (pims_ipc_svc_register(CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, ctsvc_ipc_server_connect, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, ctsvc_ipc_server_disconnect, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CHECK_PERMISSION, ctsvc_ipc_server_check_permission, NULL) != 0) break;
-
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORD, ctsvc_ipc_server_db_insert_record, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORD, ctsvc_ipc_server_db_get_record, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORD, ctsvc_ipc_server_db_update_record, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORD, ctsvc_ipc_server_db_delete_record, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORD, ctsvc_ipc_server_db_replace_record, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS, ctsvc_ipc_server_db_get_all_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY, ctsvc_ipc_server_db_get_records_with_query, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT, ctsvc_ipc_server_db_get_count, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY, ctsvc_ipc_server_db_get_count_with_query, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS, ctsvc_ipc_server_db_insert_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORDS, ctsvc_ipc_server_db_update_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORDS, ctsvc_ipc_server_db_delete_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS, ctsvc_ipc_server_db_replace_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION, ctsvc_ipc_server_db_get_changes_by_version, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION, ctsvc_ipc_server_db_get_current_version, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS, ctsvc_ipc_server_db_search_records, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE, ctsvc_ipc_server_db_search_records_with_range, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY, ctsvc_ipc_server_db_search_records_with_query, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_STATUS, ctsvc_ipc_server_db_get_status, NULL) != 0) break;
-
-               if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID, ctsvc_ipc_activity_delete_by_contact_id, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID, ctsvc_ipc_activity_delete_by_account_id, NULL) != 0) break;
-
-               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_ADD_CONTACT, ctsvc_ipc_group_add_contact, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT, ctsvc_ipc_group_remove_contact, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_SET_GROUP_ORDER, ctsvc_ipc_group_set_group_order, NULL) != 0) break;
-
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_LINK_PERSON, ctsvc_ipc_person_link_person, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT, ctsvc_ipc_person_unlink_contact, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_RESET_USAGE, ctsvc_ipc_person_reset_usage, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER, ctsvc_ipc_person_set_favorite_order, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY, ctsvc_ipc_person_set_default_property, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY, ctsvc_ipc_person_get_default_property, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_GET_AGGREGATION_SUGGESTIONS, ctsvc_ipc_person_get_aggregation_suggestions, NULL) != 0) break;
-
+               if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
+                                       CTSVC_IPC_SERVER_CONNECT,
+                                       ctsvc_ipc_server_connect, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
+                                       CTSVC_IPC_SERVER_DISCONNECT,
+                                       ctsvc_ipc_server_disconnect, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_MODULE,
+                                       CTSVC_IPC_SERVER_CHECK_PERMISSION,
+                                       ctsvc_ipc_server_check_permission, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_INSERT_RECORD,
+                                       ctsvc_ipc_server_db_insert_record, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_RECORD,
+                                       ctsvc_ipc_server_db_get_record, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_UPDATE_RECORD,
+                                       ctsvc_ipc_server_db_update_record, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_DELETE_RECORD,
+                                       ctsvc_ipc_server_db_delete_record, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_REPLACE_RECORD,
+                                       ctsvc_ipc_server_db_replace_record, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS,
+                                       ctsvc_ipc_server_db_get_all_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY,
+                                       ctsvc_ipc_server_db_get_records_with_query, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_COUNT,
+                                       ctsvc_ipc_server_db_get_count, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY,
+                                       ctsvc_ipc_server_db_get_count_with_query, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_INSERT_RECORDS,
+                                       ctsvc_ipc_server_db_insert_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_UPDATE_RECORDS,
+                                       ctsvc_ipc_server_db_update_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_DELETE_RECORDS,
+                                       ctsvc_ipc_server_db_delete_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_REPLACE_RECORDS,
+                                       ctsvc_ipc_server_db_replace_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION,
+                                       ctsvc_ipc_server_db_get_changes_by_version, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION,
+                                       ctsvc_ipc_server_db_get_current_version, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS,
+                                       ctsvc_ipc_server_db_search_records, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE,
+                                       ctsvc_ipc_server_db_search_records_with_range, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY,
+                                       ctsvc_ipc_server_db_search_records_with_query, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_FOR_SNIPPET,
+                                       ctsvc_ipc_server_db_search_records_for_snippet, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_RANGE_FOR_SNIPPET,
+                                       ctsvc_ipc_server_db_search_records_with_range_for_snippet, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY_FOR_SNIPPET,
+                                       ctsvc_ipc_server_db_search_records_with_query_for_snippet, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_DB_MODULE,
+                                       CTSVC_IPC_SERVER_DB_GET_STATUS,
+                                       ctsvc_ipc_server_db_get_status, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE,
+                                       CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID,
+                                       ctsvc_ipc_activity_delete_by_contact_id, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_ACTIVITY_MODULE,
+                                       CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID,
+                                       ctsvc_ipc_activity_delete_by_account_id, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
+                                       CTSVC_IPC_SERVER_GROUP_ADD_CONTACT,
+                                       ctsvc_ipc_group_add_contact, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
+                                       CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT,
+                                       ctsvc_ipc_group_remove_contact, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_GROUP_MODULE,
+                                       CTSVC_IPC_SERVER_GROUP_SET_GROUP_ORDER,
+                                       ctsvc_ipc_group_set_group_order, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_LINK_PERSON,
+                                       ctsvc_ipc_person_link_person, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT,
+                                       ctsvc_ipc_person_unlink_contact, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_RESET_USAGE,
+                                       ctsvc_ipc_person_reset_usage, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER,
+                                       ctsvc_ipc_person_set_favorite_order, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY,
+                                       ctsvc_ipc_person_set_default_property, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY,
+                                       ctsvc_ipc_person_get_default_property, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PERSON_MODULE,
+                                       CTSVC_IPC_SERVER_PERSON_GET_AGGREGATION_SUGGESTIONS,
+                                       ctsvc_ipc_person_get_aggregation_suggestions, NULL) != 0)
+                       break;
 #ifdef ENABLE_LOG_FEATURE
-               if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS, ctsvc_ipc_phone_log_reset_statistics, NULL) != 0) break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
+                                       CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS,
+                                       ctsvc_ipc_phone_log_reset_statistics, NULL) != 0)
+                       break;
                if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM, ctsvc_ipc_phone_log_reset_statistics_by_sim, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_DELETE, ctsvc_ipc_phone_log_delete, NULL) != 0) break;
-#endif /* ENABLE_LOG_FEATURE */
 
-               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE, CTSVC_IPC_SERVER_SETTING_GET_NAME_DISPLAY_ORDER, ctsvc_ipc_setting_get_name_display_order, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE, CTSVC_IPC_SERVER_SETTING_SET_NAME_DISPLAY_ORDER, ctsvc_ipc_setting_set_name_display_order, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE, CTSVC_IPC_SERVER_SETTING_GET_NAME_SORTING_ORDER, ctsvc_ipc_setting_get_name_sorting_order, NULL) != 0) break;
-               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE, CTSVC_IPC_SERVER_SETTING_SET_NAME_SORTING_ORDER, ctsvc_ipc_setting_set_name_sorting_order, NULL) != 0) break;
+               if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE,
+                                       CTSVC_IPC_SERVER_PHONELOG_DELETE,
+                                       ctsvc_ipc_phone_log_delete, NULL) != 0)
+                       break;
+#endif /* ENABLE_LOG_FEATURE */
+               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
+                                       CTSVC_IPC_SERVER_SETTING_GET_NAME_DISPLAY_ORDER,
+                                       ctsvc_ipc_setting_get_name_display_order, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
+                                       CTSVC_IPC_SERVER_SETTING_SET_NAME_DISPLAY_ORDER,
+                                       ctsvc_ipc_setting_set_name_display_order, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
+                                       CTSVC_IPC_SERVER_SETTING_GET_NAME_SORTING_ORDER,
+                                       ctsvc_ipc_setting_get_name_sorting_order, NULL) != 0)
+                       break;
+               if (pims_ipc_svc_register(CTSVC_IPC_SETTING_MODULE,
+                                       CTSVC_IPC_SERVER_SETTING_SET_NAME_SORTING_ORDER,
+                                       ctsvc_ipc_setting_set_name_sorting_order, NULL) != 0)
+                       break;
 
                snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/.%s_for_subscribe",
                                getuid(), CTSVC_IPC_SERVICE);
index f8863ac..afc0bc3 100644 (file)
@@ -62,7 +62,7 @@ static inline int __ctsvc_get_person_default_number_value(int id, contacts_recor
                        "FROM %s, %s ON data.is_primary_default=1 AND data.datatype=%d "
                        "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 "
                        "WHERE contacts.person_id = %d",
-                       CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CTSVC_DATA_NUMBER, id);
+                       CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CONTACTS_DATA_TYPE_NUMBER, id);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -112,7 +112,7 @@ static inline int __ctsvc_get_person_default_email_value(int id, contacts_record
                        "FROM %s, %s ON data.is_primary_default=1 AND data.datatype=%d "
                        "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 "
                        "WHERE contacts.person_id = %d",
-                       CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CTSVC_DATA_EMAIL, id);
+                       CTS_TABLE_CONTACTS, CTS_TABLE_DATA, CONTACTS_DATA_TYPE_EMAIL, id);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -161,7 +161,7 @@ static inline int __ctsvc_get_person_default_image_value(int id, contacts_record
                        "ON data.is_primary_default=1 AND data.datatype=%d AND data.is_my_profile = 0 "
                        "AND data.contact_id = contacts.contact_id AND contacts.deleted = 0 "
                        "WHERE contacts.person_id = %d",
-                       CTSVC_DATA_IMAGE, id);
+                       CONTACTS_DATA_TYPE_IMAGE, id);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -287,7 +287,7 @@ static inline int __ctsvc_put_person_default_image(int person_id, int id)
                        "FROM "CTS_TABLE_DATA" D, "CTS_TABLE_CONTACTS" C "
                        "ON D.contact_id = C.contact_id AND C.deleted = 0 "
                        "WHERE D.datatype=%d AND D.is_my_profile = 0 AND C.person_id=%d AND D.id=%d",
-                       CTSVC_DATA_IMAGE, person_id, id);
+                       CONTACTS_DATA_TYPE_IMAGE, person_id, id);
        ret = ctsvc_query_prepare(query, &stmt);
        if (NULL == stmt) {
                ERR("ctsvc_query_prepare Fail(%d)", ret);
@@ -312,7 +312,7 @@ static inline int __ctsvc_put_person_default_image(int person_id, int id)
                        "UPDATE "CTS_TABLE_DATA" SET is_primary_default=0 WHERE datatype=%d AND is_my_profile = 0 "
                        "AND contact_id IN (SELECT contact_id FROM "CTS_TABLE_CONTACTS" "
                        "WHERE person_id=%d AND deleted = 0) ",
-                       CTSVC_DATA_IMAGE, person_id);
+                       CONTACTS_DATA_TYPE_IMAGE, person_id);
        ret = ctsvc_query_exec(query);
        if (ret < CONTACTS_ERROR_NONE) {
                ERR("ctsvc_query_exec() Fail(%d)", ret);
@@ -326,7 +326,7 @@ static inline int __ctsvc_put_person_default_image(int person_id, int id)
                snprintf(query, sizeof(query),
                                "UPDATE "CTS_TABLE_DATA" SET is_default=0 WHERE datatype=%d  AND is_my_profile = 0 "
                                "AND contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id=%d) ",
-                               CTSVC_DATA_IMAGE, id);
+                               CONTACTS_DATA_TYPE_IMAGE, id);
 
                ret = ctsvc_query_exec(query);
                if (CONTACTS_ERROR_NONE != ret) {
@@ -472,9 +472,9 @@ static inline int __ctsvc_put_person_default_data(int person_id, int id, int dat
                return ret;
        }
 
-       if (datatype == CTSVC_DATA_NUMBER)
+       if (datatype == CONTACTS_DATA_TYPE_NUMBER)
                source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER;
-       else if (datatype == CTSVC_DATA_EMAIL)
+       else if (datatype == CONTACTS_DATA_TYPE_EMAIL)
                source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL;
 
        if (CONTACTS_DISPLAY_NAME_SOURCE_TYPE_INVALID != source_type)
@@ -629,7 +629,7 @@ int ctsvc_person_aggregate(int person_id)
                                "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D "
                                "WHERE C.person_id=%d AND C.contact_id=D.contact_id AND C.deleted = 0 "
                                "AND D.datatype=%d AND D.is_primary_default = 1 AND D.data3='%s'",
-                               person->person_id, CTSVC_DATA_IMAGE, temp);
+                               person->person_id, CONTACTS_DATA_TYPE_IMAGE, temp);
                ret = ctsvc_query_get_first_int_result(query, &id);
                if (ret == CONTACTS_ERROR_NONE)
                        image_thumbnail_path = SAFE_STRDUP(temp);
@@ -981,10 +981,10 @@ int ctsvc_person_link_person(int base_person_id, int person_id)
        ctsvc_person_aggregate(base_person_id);
 
        if (default_number_id)
-               __ctsvc_put_person_default_data(base_person_id, default_number_id, CTSVC_DATA_NUMBER);
+               __ctsvc_put_person_default_data(base_person_id, default_number_id, CONTACTS_DATA_TYPE_NUMBER);
 
        if (default_email_id)
-               __ctsvc_put_person_default_data(base_person_id, default_email_id, CTSVC_DATA_EMAIL);
+               __ctsvc_put_person_default_data(base_person_id, default_email_id, CONTACTS_DATA_TYPE_EMAIL);
 
        if (default_image_id)
                __ctsvc_put_person_default_image(base_person_id, default_image_id);
@@ -1060,7 +1060,7 @@ static int __ctsvc_update_primary_default_data(int person_id)
                        snprintf(query, sizeof(query),
                                        "SELECT id, is_default FROM %s "
                                        "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0",
-                                       CTS_TABLE_DATA, contact_id, CTSVC_DATA_NUMBER);
+                                       CTS_TABLE_DATA, contact_id, CONTACTS_DATA_TYPE_NUMBER);
 
                        ret = ctsvc_query_prepare(query, &stmt_number);
                        if (NULL == stmt_number) {
@@ -1071,7 +1071,7 @@ static int __ctsvc_update_primary_default_data(int person_id)
 
                        if (1 == ctsvc_stmt_step(stmt_number)) {
                                int default_number_id = ctsvc_stmt_get_int(stmt_number, 0);
-                               __ctsvc_put_person_default_data(person_id, default_number_id, CTSVC_DATA_NUMBER);
+                               __ctsvc_put_person_default_data(person_id, default_number_id, CONTACTS_DATA_TYPE_NUMBER);
                                ctsvc_stmt_finalize(stmt_number);
                                break;
                        }
@@ -1100,7 +1100,7 @@ static int __ctsvc_update_primary_default_data(int person_id)
                        snprintf(query, sizeof(query),
                                        "SELECT id, is_default FROM %s "
                                        "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0",
-                                       CTS_TABLE_DATA, contact_id, CTSVC_DATA_EMAIL);
+                                       CTS_TABLE_DATA, contact_id, CONTACTS_DATA_TYPE_EMAIL);
 
                        ret = ctsvc_query_prepare(query, &stmt_email);
                        if (NULL == stmt_email) {
@@ -1111,7 +1111,7 @@ static int __ctsvc_update_primary_default_data(int person_id)
 
                        if (1 == ctsvc_stmt_step(stmt_email)) {
                                int default_email_id = ctsvc_stmt_get_int(stmt_email, 0);
-                               __ctsvc_put_person_default_data(person_id, default_email_id, CTSVC_DATA_EMAIL);
+                               __ctsvc_put_person_default_data(person_id, default_email_id, CONTACTS_DATA_TYPE_EMAIL);
                                ctsvc_stmt_finalize(stmt_email);
                                break;
                        }
@@ -1140,7 +1140,7 @@ static int __ctsvc_update_primary_default_data(int person_id)
                        snprintf(query, sizeof(query),
                                        "SELECT id, is_default FROM %s "
                                        "WHERE contact_id = %d AND datatype = %d AND is_default = 1 AND is_my_profile = 0",
-                                       CTS_TABLE_DATA, contact_id, CTSVC_DATA_IMAGE);
+                                       CTS_TABLE_DATA, contact_id, CONTACTS_DATA_TYPE_IMAGE);
 
                        ret = ctsvc_query_prepare(query, &stmt_image);
                        if (NULL == stmt_image) {
@@ -1408,10 +1408,10 @@ int ctsvc_person_set_default_property(contacts_person_property_e property, int p
                ret = __ctsvc_put_person_default_name(person_id, id);           /* contact id */
                break;
        case CONTACTS_PERSON_PROPERTY_NUMBER:
-               ret = __ctsvc_put_person_default_data(person_id, id, CTSVC_DATA_NUMBER);        /* number id */
+               ret = __ctsvc_put_person_default_data(person_id, id, CONTACTS_DATA_TYPE_NUMBER);        /* number id */
                break;
        case CONTACTS_PERSON_PROPERTY_EMAIL:
-               ret = __ctsvc_put_person_default_data(person_id, id, CTSVC_DATA_EMAIL);         /* email id */
+               ret = __ctsvc_put_person_default_data(person_id, id, CONTACTS_DATA_TYPE_EMAIL);         /* email id */
                break;
        case CONTACTS_PERSON_PROPERTY_IMAGE:
                ret = __ctsvc_put_person_default_image(person_id, id);          /* image id */
@@ -1455,21 +1455,21 @@ int ctsvc_person_get_default_property(contacts_person_property_e property, int p
                                "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND "
                                "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" "
                                "WHERE person_id = %d AND deleted = 0)",
-                               CTSVC_DATA_NUMBER, person_id);
+                               CONTACTS_DATA_TYPE_NUMBER, person_id);
                break;
        case CONTACTS_PERSON_PROPERTY_EMAIL:
                snprintf(query, sizeof(query),
                                "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND "
                                "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" "
                                "WHERE person_id = %d AND deleted = 0)",
-                               CTSVC_DATA_EMAIL, person_id);
+                               CONTACTS_DATA_TYPE_EMAIL, person_id);
                break;
        case CONTACTS_PERSON_PROPERTY_IMAGE:
                snprintf(query, sizeof(query),
                                "SELECT id FROM "CTS_TABLE_DATA" WHERE is_primary_default = 1 AND datatype = %d AND is_my_profile = 0 AND "
                                "contact_id in (SELECT contact_id FROM "CTS_TABLE_CONTACTS" "
                                "WHERE person_id = %d AND deleted = 0)",
-                               CTSVC_DATA_IMAGE, person_id);
+                               CONTACTS_DATA_TYPE_IMAGE, person_id);
                break;
        default:
                ret = CONTACTS_ERROR_INVALID_PARAMETER;
@@ -1637,7 +1637,7 @@ static void __ctsvc_make_sub_query_by_num(GSList *nums, int person_id,
                        "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 "
                        "AND C.person_id <> %d AND D.is_my_profile = 0 "
                        "WHERE D.data4 = '",
-                       CTSVC_DATA_NUMBER, person_id);
+                       CONTACTS_DATA_TYPE_NUMBER, person_id);
 
        for (cursor = nums; cursor; cursor = cursor->next) {
                char *minmatch = cursor->data;
@@ -1665,7 +1665,7 @@ static void __ctsvc_make_sub_query_by_email(GSList *emails, int person_id,
                        "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 "
                        "AND C.person_id <> %d AND D.is_my_profile = 0 "
                        "WHERE D.data3 LIKE '",
-                       CTSVC_DATA_EMAIL, person_id);
+                       CONTACTS_DATA_TYPE_EMAIL, person_id);
 
        for (cursor = emails; cursor; cursor = cursor->next) {
                char *local_part = cursor->data;
index 89c2872..c927f4a 100644 (file)
@@ -149,7 +149,7 @@ static int __ctsvc_db_phone_log_find_person_id(char *number, char *normal_num,
                                "ON "CTS_TABLE_CONTACTS".contact_id = "CTS_TABLE_DATA".contact_id "
                                "AND datatype = %d AND is_my_profile = 0 AND deleted = 0 "
                                "WHERE data4 = ? AND _NUMBER_COMPARE_(data5, ?, NULL, NULL)",
-                               CTSVC_DATA_NUMBER);
+                               CONTACTS_DATA_TYPE_NUMBER);
                bind_text = g_slist_append(bind_text, strdup(minmatch));
                bind_text = g_slist_append(bind_text, strdup(normal_num));
        }
index cab8136..c4c3cf2 100644 (file)
@@ -552,19 +552,19 @@ static int __ctsvc_server_db_get_contact_data(sqlite3 *db, int id, ctsvc_contact
        do {
                datatype = ctsvc_stmt_get_int(stmt, 0);
                switch (datatype) {
-               case CTSVC_DATA_NAME:
+               case CONTACTS_DATA_TYPE_NAME:
                        ctsvc_get_data_info_name(stmt, (contacts_list_h)contact->name);
                        break;
-               case CTSVC_DATA_NICKNAME:
+               case CONTACTS_DATA_TYPE_NICKNAME:
                        ctsvc_get_data_info_nickname(stmt, (contacts_list_h)contact->nicknames);
                        break;
-               case CTSVC_DATA_NUMBER:
+               case CONTACTS_DATA_TYPE_NUMBER:
                        ctsvc_get_data_info_number(stmt, (contacts_list_h)contact->numbers);
                        break;
-               case CTSVC_DATA_EMAIL:
+               case CONTACTS_DATA_TYPE_EMAIL:
                        ctsvc_get_data_info_email(stmt, (contacts_list_h)contact->emails);
                        break;
-               case CTSVC_DATA_COMPANY:
+               case CONTACTS_DATA_TYPE_COMPANY:
                        ctsvc_get_data_info_company(stmt, (contacts_list_h)contact->company);
                        break;
                default:
index c5c4971..a8810ce 100644 (file)
@@ -57,7 +57,7 @@ static int __ctsvc_server_find_person_id_of_phonelog(sqlite3 *__db, char *normal
                        "ON "CTS_TABLE_CONTACTS".contact_id = "CTS_TABLE_DATA".contact_id "
                        "AND datatype = %d AND is_my_profile = 0 AND deleted = 0 "
                        "WHERE data4 = ? AND _NUMBER_COMPARE_(data5, ?, NULL, NULL)",
-                       CTSVC_DATA_NUMBER);
+                       CONTACTS_DATA_TYPE_NUMBER);
 
        bind_text = g_slist_append(bind_text, strdup(minmatch));
        bind_text = g_slist_append(bind_text, strdup(normal_num));
@@ -181,7 +181,7 @@ static void __ctsvc_server_number_info_update(sqlite3 *__db)
        /* update number of data table */
        snprintf(query, sizeof(query),
                        "SELECT id, data3 FROM "CTS_TABLE_DATA" "
-                       "WHERE datatype = %d", CTSVC_DATA_NUMBER);
+                       "WHERE datatype = %d", CONTACTS_DATA_TYPE_NUMBER);
        ret = sqlite3_prepare_v2(__db, query, strlen(query), &stmt, NULL);
        if (SQLITE_OK != ret) {
                ERR("sqlite3_prepare_v2() Fail(%s)", sqlite3_errmsg(__db));
diff --git a/server/ctsvc_utils_string.c b/server/ctsvc_utils_string.c
new file mode 100644 (file)
index 0000000..423e1bb
--- /dev/null
@@ -0,0 +1,612 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <ctype.h>
+#include <unicode/ulocdata.h>
+#include <unicode/ustring.h>
+#include <unicode/unorm.h>
+#include <unicode/ucol.h>
+#include <unicode/uset.h>
+
+#include "contacts.h"
+#include "ctsvc_internal.h"
+#include "ctsvc_struct.h"
+#include "ctsvc_record.h"
+#include "ctsvc_view.h"
+#include "ctsvc_normalize.h"
+#include "ctsvc_localize.h"
+#include "ctsvc_localize_utils.h"
+#include "ctsvc_localize_ch.h"
+#include "ctsvc_localize_jp.h"
+
+#define CTSVC_COMBINING_DIACRITICAL_MARKS_START 0x0300
+#define CTSVC_COMBINING_DIACRITICAL_MARKS_END  0x036f
+#define CTSVC_SNIPPET_DEFAULT_START_MATCH "["
+#define CTSVC_SNIPPET_DEFAULT_END_MATCH "]"
+
+static inline bool __ctsvc_is_choseong(const char *src)
+{
+       unsigned short tmp;
+
+       tmp = (src[1] << 8) | src[2];
+       if (((char)0xE1 == src[0] && CTSVC_COMPARE_BETWEEN(0x8480, tmp, 0x859F)) /* korean -Hangul Jamo*/
+                       || ((char)0xEA == src[0] && CTSVC_COMPARE_BETWEEN(0xA5A0, tmp, 0xA5BC))) /* korean -Hangul Jamo extended A*/
+       {
+               return true;
+       }
+       return false;
+}
+
+static inline bool __ctsvc_is_diacritical(const char *src)
+{
+       unsigned short tmp;
+
+       if (!src || !*src || !*(src+1))
+               return false;
+
+       tmp = (src[0] << 8) | src[1];
+       if (CTSVC_COMPARE_BETWEEN(0xCC80, tmp, 0xCCBF)
+                       || CTSVC_COMPARE_BETWEEN(0xCD80, tmp, 0xCDAF))
+       {
+               return true;
+       }
+       return false;
+}
+
+static inline bool __ctsvc_compare_utf8(const char *str1, const char *str2, int str2_len)
+{
+       int k;
+       for (k=0; k<str2_len;k++)
+               if (!str1[k] || !str2[k] || str1[k] != str2[k])
+                       return false;
+       return true;
+}
+
+static int __ctsvc_copy_and_remove_special_char(const char *src, char *dest, int dest_size)
+{
+       int s_pos=0, d_pos=0, char_type, src_size;
+
+       if (NULL == src) {
+               ERR("The parameter(src) is NULL");
+               dest[d_pos] = '\0';
+               return 0;
+       }
+       src_size = strlen(src);
+
+       while (src[s_pos] != 0) {
+               char_type = ctsvc_check_utf8(src[s_pos]);
+
+               if (0 < char_type && char_type < dest_size - d_pos && char_type <= src_size - s_pos) {
+                       memcpy(dest+d_pos, src+s_pos, char_type);
+                       d_pos += char_type;
+                       s_pos += char_type;
+               }
+               else {
+                       ERR("The parameter(src:%s) has invalid character set", src);
+                       dest[d_pos] = '\0';
+                       return CONTACTS_ERROR_INVALID_PARAMETER;
+               }
+       }
+
+       dest[d_pos] = '\0';
+       return d_pos;
+}
+
+#define array_sizeof(a) (sizeof(a) / sizeof(a[0]))
+
+static int __ctsvc_normalize_str_to_unicode(const char *src, int src_size, UChar *dest, int dest_size)
+{
+       int ret;
+       int32_t size = dest_size;
+       UErrorCode status = 0;
+       UChar tmp_result[dest_size];
+
+       u_strFromUTF8(tmp_result, dest_size, &size, src, src_size, &status);
+
+       if (U_FAILURE(status)) {
+               ERR("u_strFromUTF8() Failed(%s)", u_errorName(status));
+               return CONTACTS_ERROR_SYSTEM;
+       }
+
+       u_strToUpper(tmp_result, dest_size, tmp_result, -1, NULL, &status);
+       if (U_FAILURE(status)) {
+               ERR("u_strToUpper() Failed(%s)", u_errorName(status));
+               return CONTACTS_ERROR_SYSTEM;
+       }
+
+       size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0,
+                       (UChar *)dest, dest_size, &status);
+       if (U_FAILURE(status)) {
+               ERR("unorm_normalize() Failed(%s)", u_errorName(status));
+               return CONTACTS_ERROR_SYSTEM;
+       }
+
+       ret = ctsvc_check_language(dest);
+       ctsvc_extra_normalize(dest, size);
+
+       dest[size] = 0x00;
+
+       return ret;
+}
+
+#define SMALL_BUFFER_SIZE 10
+
+static bool __ctsvc_compare_pinyin_letter(const char *haystack, int haystack_lang, const char *needle, int needle_lang, int *h_len, int *n_len)
+{
+       pinyin_name_s *pinyinname = NULL;
+       int size, ret = false;
+       int len, i, j, k;
+       char temp_needle[strlen(needle) + 1];
+       char temp[SMALL_BUFFER_SIZE];
+       bool match = false, initial_match = false;
+
+       if (haystack_lang != CTSVC_LANG_CHINESE || needle_lang != CTSVC_LANG_ENGLISH)
+               return false;
+
+       for(i=0, k=0; i < sizeof(temp_needle); i++)
+       {
+               if (isupper(needle[i]))
+                       temp_needle[i] = tolower(needle[i]);
+               else
+                       temp_needle[i] = needle[i];
+       }
+
+       for(i=0, j=0; i < strlen(haystack) && j < strlen(temp_needle) ; i+=len)
+       {
+               len = ctsvc_check_utf8(haystack[i]);
+               if (len < 0)
+                       return false;
+               memcpy(temp, haystack + i, len );
+               temp[len] = '\0';
+
+               ret = ctsvc_convert_chinese_to_pinyin(temp, &pinyinname, &size);
+               if (ret != CONTACTS_ERROR_NONE) {
+                       return false;
+               }
+
+               for(k=0; k<size; k++) {
+                       if (!initial_match &&
+                                       strlen(pinyinname[k].pinyin_name) <= strlen(temp_needle + j) &&
+                                       strncmp(pinyinname[k].pinyin_name, temp_needle + j, strlen(pinyinname[k].pinyin_name)) == 0) {
+                               match = true;
+                               j+=strlen(pinyinname[k].pinyin_name);
+                               break;
+
+                       }
+                       else if (!initial_match &&
+                                       strlen(pinyinname[k].pinyin_name) > strlen(temp_needle + j) &&
+                                       strncmp(pinyinname[k].pinyin_name, temp_needle + j, strlen(temp_needle + j)) == 0) {
+                               match = true;
+                               j+=strlen(temp_needle + j);
+                               break;
+
+                       }
+                       else if (pinyinname[k].pinyin_initial[0] ==  temp_needle[j]) {
+                               initial_match = true;
+                               match = true;
+                               j++;
+                               break;
+                       }
+                       else
+                               match = false;
+               }
+               ctsvc_pinyin_free(pinyinname, size);
+
+               if (match==false) {
+                       break;
+               }
+
+       }
+
+       if (match) {
+               *h_len = i;
+               *n_len = j;
+       }
+
+       return match;
+}
+
+static bool __ctsvc_compare_unicode_letter(const UChar* haystack, int haystack_lang, const UChar *needle, int needle_lang)
+{
+       int i, j;
+       bool ret = false;
+
+       switch (haystack_lang)
+       {
+       case CTSVC_LANG_NUMBER:
+       case CTSVC_LANG_OTHERS:
+               {
+                       if (haystack_lang == needle_lang)
+                       {
+                               for(i=0, j=0; i<u_strlen(haystack) && j<u_strlen(needle);) {
+                                       if(haystack[i] == needle[j])
+                                               ret = true;
+                                       else {
+                                               ret = false;
+                                               break;
+                                       }
+                                       i++;
+                                       j++;
+                               }
+                       }
+                       return ret;
+               }
+       case CTSVC_LANG_ENGLISH:
+               {
+                       switch(needle_lang)
+                       {
+                       case CTSVC_LANG_ENGLISH:
+                               for(i=0, j=0; i<u_strlen(haystack) && j<u_strlen(needle);) {
+                                       if (CTSVC_COMPARE_BETWEEN(CTSVC_COMBINING_DIACRITICAL_MARKS_START,
+                                                       haystack[i], CTSVC_COMBINING_DIACRITICAL_MARKS_END)) {
+                                               i++;
+                                               continue;
+                                       }
+                                       if (CTSVC_COMPARE_BETWEEN(CTSVC_COMBINING_DIACRITICAL_MARKS_START,
+                                                       needle[j], CTSVC_COMBINING_DIACRITICAL_MARKS_END)) {
+                                               j++;
+                                               continue;
+                                       }
+
+                                       if(haystack[i] == needle[j])
+                                               ret = true;
+                                       else {
+                                               ret = false;
+                                               break;
+                                       }
+
+                                       i++;
+                                       j++;
+                               }
+                               return ret;
+                       default:
+                               return false;
+                       }
+               }
+               break;
+       case CTSVC_LANG_KOREAN:
+               {
+                       if(needle_lang != CTSVC_LANG_KOREAN)
+                               break;
+
+                       if (u_strlen(needle) == 1
+                                       && CTSVC_COMPARE_BETWEEN(0x3130, needle[0], 0x314e)
+                                       && haystack[0] == needle[0]) {
+                               return true;
+                       }
+
+                       for(i=0, j=0; i<u_strlen(haystack) && j<u_strlen(needle);) {
+                               if(haystack[i] == needle[j])
+                                       ret = true;
+                               else {
+                                       ret = false;
+                                       break;
+                               }
+                               i++;
+                               j++;
+                       }
+                       return ret;
+               }
+               break;
+       case CTSVC_LANG_JAPANESE:
+               {
+                       if(needle_lang != CTSVC_LANG_JAPANESE)
+                               break;
+
+                       if (haystack[0] == needle[0])
+                               ret = true;
+                       else {
+                               UChar temp_haystack[2] = {0x00,};
+                               UChar temp_needle[2] = {0x00,};
+                               UChar hiragana_haystack[2] = {0x00,};
+                               UChar hiragana_needle[2] = {0x00,};
+                               temp_haystack[0] = haystack[0];
+                               temp_needle[0] = needle[0];
+
+                               ctsvc_convert_japanese_to_hiragana_unicode(temp_haystack, hiragana_haystack, 2 );
+
+                               ctsvc_convert_japanese_to_hiragana_unicode(temp_needle, hiragana_needle,  2);
+
+                               if (hiragana_haystack[0] == hiragana_needle[0])
+                                       ret = true;
+                       }
+                       return ret;
+               }
+       case CTSVC_LANG_CHINESE:
+               {
+                       if(needle_lang == haystack_lang
+                                       && haystack[0] == needle[0])
+                               ret = true;
+               }
+               return ret;
+       }
+
+       return false;
+}
+
+int ctsvc_utils_string_strstr(const char *haystack, const char *needle, int *len)
+{
+       int h_len = 0, h_len_temp, n_len, i, j;
+       UChar haystack_letter[SMALL_BUFFER_SIZE];
+       UChar needle_letter[SMALL_BUFFER_SIZE];
+       UChar first_needle_letter[SMALL_BUFFER_SIZE];
+       int haystack_letter_lang;
+       int needle_letter_lang;
+       int first_needle_letter_lang;
+
+       bool matching=false;
+       int match_len = 0;
+       int match_start = -1;
+
+       RETVM_IF(NULL == haystack, -1, "The parameter(haystack) is NULL");
+       RETVM_IF(NULL == needle, -1, "The parameter(needle) is NULL");
+       SECURE_SLOGD("haystack = %s, needle = %s", haystack, needle);
+
+       char temp_haystack[strlen(haystack) + 1];
+       char temp_needle[strlen(needle) + 1];
+
+       *len = 0;
+
+       __ctsvc_copy_and_remove_special_char(haystack, temp_haystack, strlen(haystack) + 1);
+       __ctsvc_copy_and_remove_special_char(needle, temp_needle, strlen(needle) + 1);
+
+       n_len = ctsvc_check_utf8(temp_needle[0]);
+
+       first_needle_letter_lang = __ctsvc_normalize_str_to_unicode(temp_needle, n_len, first_needle_letter, SMALL_BUFFER_SIZE);
+       RETVM_IF(first_needle_letter_lang < CONTACTS_ERROR_NONE , -1, "The __ctsvc_normalize_str_to_unicode failed(%d)", first_needle_letter_lang);
+
+       for (i=0, j=0;i<strlen(temp_haystack) && j<strlen(temp_needle);i+=h_len) {
+               h_len_temp = ctsvc_check_utf8(temp_haystack[i]);
+
+               haystack_letter_lang = __ctsvc_normalize_str_to_unicode(temp_haystack + i, h_len_temp, haystack_letter, SMALL_BUFFER_SIZE);
+               RETVM_IF(haystack_letter_lang < CONTACTS_ERROR_NONE , -1, "The __ctsvc_normalize_str_to_unicode failed(%d)", haystack_letter_lang);
+
+               if (matching == false) {
+                       if (__ctsvc_compare_unicode_letter(haystack_letter, haystack_letter_lang, first_needle_letter, first_needle_letter_lang)
+                                       || __ctsvc_compare_pinyin_letter(temp_haystack + i, haystack_letter_lang, temp_needle + j, first_needle_letter_lang, &h_len_temp, &n_len)) {
+                               matching = true;
+                               j+=n_len;
+                               match_start = i;
+                               match_len = h_len_temp;
+
+                               if (temp_needle[j] == '\0') {
+                                       *len = match_len;
+                                       return match_start;
+                               }
+                       }
+                       h_len = h_len_temp;
+                       continue;
+               }
+               else {
+                       n_len = ctsvc_check_utf8(temp_needle[j]);
+
+                       needle_letter_lang = __ctsvc_normalize_str_to_unicode(temp_needle + j, n_len, needle_letter, SMALL_BUFFER_SIZE);
+                       RETVM_IF(needle_letter_lang < CONTACTS_ERROR_NONE , -1, "The __ctsvc_normalize_str_to_unicode failed(%d)", needle_letter_lang);
+
+                       if (__ctsvc_compare_unicode_letter(haystack_letter, haystack_letter_lang, needle_letter, needle_letter_lang )){
+                               j+=n_len;
+                               match_len += h_len_temp;
+
+                               if (temp_needle[j] == '\0') {
+                                       *len = match_len;
+                                       return match_start;
+                               }
+                               h_len = h_len_temp;
+                               continue;
+                       }
+                       else {
+                               j = 0;
+                               matching = false;
+                               match_start = -1;
+                               match_len = 0;
+                               i-=h_len;
+                       }
+               }
+
+       }
+
+       DBG("NOT match");
+       return -1;
+}
+
+static bool _get_modified_number(char *temp, char *keyword, int *out_len_keyword,
+               int *out_len_offset)
+{
+       RETV_IF(NULL == temp, false);
+       RETV_IF(NULL == keyword, false);
+       RETV_IF(NULL == out_len_keyword, false);
+       RETV_IF(NULL == out_len_offset, false);
+
+       char *start_needle = NULL;
+       char *cursor_number = temp;
+       char *cursor_keyword = keyword;
+       bool is_start = false;
+       int len_keyword = 0;
+
+       while (1) {
+               if ('\0' == *cursor_keyword)
+                       break;
+               if ('\0' == *cursor_number) {
+                       if (true == is_start) /* ended even if keyword is remained */
+                               is_start = false;
+                       break;
+               }
+               if (*cursor_number < '0' || '9' < *cursor_number) {
+                       if (true == is_start)
+                               len_keyword++;
+                       cursor_number++;
+                       continue;
+               }
+               if (*cursor_keyword < '0' || '9' < *cursor_keyword) {
+                       cursor_keyword++;
+                       continue;
+               }
+               if (*cursor_keyword != *cursor_number) {
+                       if (true == is_start) {
+                               is_start = false;
+                               cursor_keyword = keyword;
+                               len_keyword = 0;
+                       } else {
+                               cursor_number++;
+                       }
+                       continue;
+               }
+               if (false == is_start)
+                       start_needle = cursor_number;
+               is_start = true;
+               len_keyword++;
+               cursor_number++;
+               cursor_keyword++;
+       }
+       if (false == is_start) { /* false to search */
+               return false;
+       }
+       *out_len_keyword = len_keyword;
+       *out_len_offset = strlen(temp) - strlen(start_needle);
+
+       return true;
+}
+
+static char *_strchr_with_nth(char *s, int c, int nth)
+{
+       char *cursor = s;
+       while (*cursor) {
+               if (*cursor == c)
+                       nth--;
+
+               if (nth < 0)
+                       break;
+
+               cursor++;
+       }
+       return cursor;
+}
+
+static char *_strrchr_with_nth(char *ori, char *s, int c, int nth)
+{
+       char *cursor = s;
+       while (*cursor) {
+               if (cursor <= ori) {
+                       ERR("over");
+                       return ori;
+               }
+
+               if (*cursor == c)
+                       nth--;
+
+               if (nth < 0)
+                       break;
+
+               cursor--;
+       }
+       return cursor + 1;
+}
+
+char *ctsvc_utils_get_modified_str(char *temp, bool is_snippet, const char *keyword,
+               const char *start_match, const char *end_match, int token_number)
+{
+       char *mod_temp = NULL;
+
+       RETV_IF(NULL == temp, NULL);
+       RETV_IF('\0' == *temp, NULL);
+       RETV_IF(false == is_snippet, NULL);
+       RETV_IF(NULL == keyword, NULL);
+       RETV_IF('\0' == *keyword, NULL);
+
+       bool is_modified = true;
+       int len_keyword = 0;
+       int len_offset = 0;
+       int len_full = 0;
+       int len_print = 0;
+       char *pos_start = NULL;
+
+       char *pos_at = strstr(temp, "@");
+       if (NULL == pos_at) {
+               ERR("Invalid value[%s]", temp);
+               return NULL;
+       }
+       DBG("[%s]", temp);
+       *pos_at = '\0';
+       char datatype_str[12] = {0};
+       snprintf(datatype_str, sizeof(datatype_str), "%s", temp);
+       temp = pos_at + 1;
+       DBG("[%s]", temp);
+       switch (atoi(datatype_str)) {
+       case CONTACTS_DATA_TYPE_NAME:
+               DBG("NAME");
+               len_offset = ctsvc_utils_string_strstr(temp, keyword, &len_keyword);
+               if (len_offset < 0) {
+                       is_modified = false;
+                       break;
+               }
+               break;
+
+       case CONTACTS_DATA_TYPE_NUMBER:
+               DBG("NUMBER");
+               is_modified = _get_modified_number(temp, (char *)keyword, &len_keyword, &len_offset);
+               break;
+
+       default:
+               DBG("DATA");
+               pos_start = strcasestr(temp, keyword);
+               if (NULL == pos_start)
+                       break;
+
+               len_keyword = strlen(keyword);
+               len_offset = strlen(temp) - strlen(pos_start);;
+               break;
+       }
+
+       if (false == is_modified)
+               return NULL;
+
+       len_full = strlen(temp) + strlen(start_match) + strlen(end_match) + 1;
+
+       mod_temp = calloc(len_full, sizeof(char));
+       if (NULL == mod_temp) {
+               ERR("calloc() Fail");
+               return NULL;
+       }
+
+       char *keyword_start = NULL;
+       snprintf(mod_temp, len_offset + 1, "%s", temp);
+       len_print = len_offset;
+       len_print += snprintf(mod_temp + len_print, len_full - len_print,
+                       "%s", start_match);
+       keyword_start = mod_temp + len_print;
+       snprintf(mod_temp + len_print, len_keyword + 1, "%s", temp + len_offset);
+       len_print += len_keyword;
+       len_print += snprintf(mod_temp + len_print, len_full - len_print,
+                       "%s%s", end_match, temp + len_offset + len_keyword);
+
+       if (token_number < 1)
+               return mod_temp;
+
+       char *cursor = NULL;
+       cursor = _strchr_with_nth(keyword_start, ' ', token_number);
+       *cursor = '\0';
+       cursor = _strrchr_with_nth(mod_temp, keyword_start, ' ', token_number);
+       memcpy(mod_temp, cursor, len_full);
+
+       return mod_temp;
+}
+
+
diff --git a/server/ctsvc_utils_string.h b/server/ctsvc_utils_string.h
new file mode 100644 (file)
index 0000000..d20c26e
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __CTSVC_UTILS_STRING_H__
+#define __CTSVC_UTILS_STRING_H__
+
+#include "ctsvc_struct.h"
+#include "ctsvc_record.h"
+
+enum {
+       CTSVC_ENUM_URI_PERSON,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED,
+       CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED,
+};
+
+int ctsvc_utils_string_strstr(const char *haystack, const char *needle, int *len);
+char *ctsvc_utils_get_modified_str(char *temp, bool is_snippet, const char *keyword,
+               const char *start_match, const char *end_match, int token_number);
+
+#endif /*  __CTSVC_UTILS_STRING_H__ */
+
index c5dd03b..3ab305c 100644 (file)
@@ -377,7 +377,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_NAME);
+                       CONTACTS_DATA_TYPE_NAME);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -397,7 +397,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_NUMBER);
+                       CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -414,7 +414,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_EMAIL);
+                       CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -437,7 +437,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_POSTAL);
+                       CONTACTS_DATA_TYPE_POSTAL);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -453,7 +453,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_URL);
+                       CONTACTS_DATA_TYPE_URL);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -471,7 +471,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_EVENT);
+                       CONTACTS_DATA_TYPE_EVENT);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -500,7 +500,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_RELATIONSHIP);
+                       CONTACTS_DATA_TYPE_RELATIONSHIP);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -517,7 +517,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_IMAGE);
+                       CONTACTS_DATA_TYPE_IMAGE);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -541,7 +541,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_COMPANY);
+                       CONTACTS_DATA_TYPE_COMPANY);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -555,7 +555,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_NICKNAME);
+                       CONTACTS_DATA_TYPE_NICKNAME);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -571,7 +571,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_MESSENGER);
+                       CONTACTS_DATA_TYPE_MESSENGER);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -585,7 +585,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_NOTE);
+                       CONTACTS_DATA_TYPE_NOTE);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -609,7 +609,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_PROFILE);
+                       CONTACTS_DATA_TYPE_PROFILE);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -634,7 +634,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                       CTSVC_DATA_EXTENSION);
+                       CONTACTS_DATA_TYPE_EXTENSION);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -726,7 +726,7 @@ static int __ctsvc_db_create_views()
                        "data6 cleaned_number "
                        "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
                        "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
-                       CTSVC_DATA_NUMBER);
+                       CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -742,7 +742,7 @@ static int __ctsvc_db_create_views()
                        "data3 email "
                        "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
                        "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
-                       CTSVC_DATA_EMAIL);
+                       CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -843,7 +843,7 @@ static int __ctsvc_db_create_views()
                        "data6 cleaned_number "
                        "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
                        "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
-                       CTSVC_DATA_NUMBER);
+                       CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -859,7 +859,7 @@ static int __ctsvc_db_create_views()
                        "data3 email "
                        "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
                        "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
-                       CTSVC_DATA_EMAIL);
+                       CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
 
@@ -916,7 +916,7 @@ static int __ctsvc_db_create_views()
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile = 0 ",
-                               CTSVC_DATA_SIP);
+                               CONTACTS_DATA_TYPE_SIP);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Fail(%d)", ret);
 
index 15fa25a..85db2fe 100644 (file)
@@ -222,7 +222,7 @@ static int __ctsvc_db_address_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype=%d AND id = %d ",
-                       CTSVC_DATA_POSTAL, id);
+                       CONTACTS_DATA_TYPE_POSTAL, id);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -260,7 +260,7 @@ static int __ctsvc_db_address_get_all_records(int offset, int limit, contacts_li
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype=%d AND is_my_profile=0 ",
-                       CTSVC_DATA_POSTAL);
+                       CONTACTS_DATA_TYPE_POSTAL);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index e31321e..4407b1d 100644 (file)
@@ -68,7 +68,7 @@ static int __ctsvc_db_address_reset_default(int address_id, int contact_id)
        snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_DATA" SET is_default = 0, is_primary_default = 0 "
                        "WHERE id != %d AND contact_id = %d AND datatype = %d",
-                       address_id, contact_id, CTSVC_DATA_POSTAL);
+                       address_id, contact_id, CONTACTS_DATA_TYPE_POSTAL);
        ret = ctsvc_query_exec(query);
        WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
        return ret;
@@ -93,7 +93,7 @@ int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my
                                "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, "
                                "data4, data5, data6, data7, data8, data9) "
                                "VALUES(%d, %d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?)",
-                               contact_id, is_my_profile, CTSVC_DATA_POSTAL, address->is_default, address->type);
+                               contact_id, is_my_profile, CONTACTS_DATA_TYPE_POSTAL, address->is_default, address->type);
 
                ret = ctsvc_query_prepare(query, &stmt);
                RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -192,7 +192,7 @@ int ctsvc_db_address_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE datatype = %d AND id = %d",
-                       CTSVC_DATA_POSTAL, id);
+                       CONTACTS_DATA_TYPE_POSTAL, id);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index f00cd32..d3cd0af 100644 (file)
@@ -48,7 +48,7 @@ static int __ctsvc_db_company_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_COMPANY);
+                       id, CONTACTS_DATA_TYPE_COMPANY);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -278,7 +278,7 @@ static int __ctsvc_db_company_get_all_records(int offset, int limit, contacts_li
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype=%d AND is_my_profile=0 ",
-                       CTSVC_DATA_COMPANY);
+                       CONTACTS_DATA_TYPE_COMPANY);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 88077d2..0fe04a8 100644 (file)
@@ -99,7 +99,7 @@ int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my
                                "INSERT INTO "CTS_TABLE_DATA"(id, contact_id, is_my_profile, datatype, is_default, data1, data2, data3, data4, "
                                "data5, data6, data7, data8, data9, data10, data11, data12) "
                                "VALUES(%d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                               company_id, contact_id, is_my_profile, CTSVC_DATA_COMPANY);
+                               company_id, contact_id, is_my_profile, CONTACTS_DATA_TYPE_COMPANY);
 
                ret = ctsvc_query_prepare(query, &stmt);
                RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -297,7 +297,7 @@ int ctsvc_db_company_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_COMPANY);
+                       id, CONTACTS_DATA_TYPE_COMPANY);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 048dcc6..379f317 100644 (file)
@@ -144,49 +144,49 @@ static int __ctsvc_db_get_data(int id, ctsvc_contact_s *contact)
        do {
                datatype = ctsvc_stmt_get_int(stmt, 0);
                switch (datatype) {
-               case CTSVC_DATA_NAME:
+               case CONTACTS_DATA_TYPE_NAME:
                        ctsvc_get_data_info_name(stmt, (contacts_list_h)contact->name);
                        break;
-               case CTSVC_DATA_EVENT:
+               case CONTACTS_DATA_TYPE_EVENT:
                        ctsvc_get_data_info_event(stmt, (contacts_list_h)contact->events);
                        break;
-               case CTSVC_DATA_MESSENGER:
+               case CONTACTS_DATA_TYPE_MESSENGER:
                        ctsvc_get_data_info_messenger(stmt, (contacts_list_h)contact->messengers);
                        break;
-               case CTSVC_DATA_POSTAL:
+               case CONTACTS_DATA_TYPE_POSTAL:
                        ctsvc_get_data_info_address(stmt, (contacts_list_h)contact->postal_addrs);
                        break;
-               case CTSVC_DATA_URL:
+               case CONTACTS_DATA_TYPE_URL:
                        ctsvc_get_data_info_url(stmt, (contacts_list_h)contact->urls);
                        break;
-               case CTSVC_DATA_NICKNAME:
+               case CONTACTS_DATA_TYPE_NICKNAME:
                        ctsvc_get_data_info_nickname(stmt, (contacts_list_h)contact->nicknames);
                        break;
-               case CTSVC_DATA_NUMBER:
+               case CONTACTS_DATA_TYPE_NUMBER:
                        ctsvc_get_data_info_number(stmt, (contacts_list_h)contact->numbers);
                        break;
-               case CTSVC_DATA_EMAIL:
+               case CONTACTS_DATA_TYPE_EMAIL:
                        ctsvc_get_data_info_email(stmt, (contacts_list_h)contact->emails);
                        break;
-               case CTSVC_DATA_PROFILE:
+               case CONTACTS_DATA_TYPE_PROFILE:
                        ctsvc_get_data_info_profile(stmt, (contacts_list_h)contact->profiles);
                        break;
-               case CTSVC_DATA_RELATIONSHIP:
+               case CONTACTS_DATA_TYPE_RELATIONSHIP:
                        ctsvc_get_data_info_relationship(stmt, (contacts_list_h)contact->relationships);
                        break;
-               case CTSVC_DATA_IMAGE:
+               case CONTACTS_DATA_TYPE_IMAGE:
                        ctsvc_get_data_info_image(stmt, (contacts_list_h)contact->images);
                        break;
-               case CTSVC_DATA_COMPANY:
+               case CONTACTS_DATA_TYPE_COMPANY:
                        ctsvc_get_data_info_company(stmt, (contacts_list_h)contact->company);
                        break;
-               case CTSVC_DATA_NOTE:
+               case CONTACTS_DATA_TYPE_NOTE:
                        ctsvc_get_data_info_note(stmt, (contacts_list_h)contact->note);
                        break;
-               case CTSVC_DATA_EXTENSION:
+               case CONTACTS_DATA_TYPE_EXTENSION:
                        ctsvc_get_data_info_extension(stmt, (contacts_list_h)contact->extensions);
                        break;
-               case CTSVC_DATA_SIP:
+               case CONTACTS_DATA_TYPE_SIP:
                        ctsvc_get_data_info_sip(stmt, (contacts_list_h)contact->sips);
                        break;
                default:
@@ -1922,7 +1922,7 @@ static inline int __ctsvc_find_person_to_link_with_number(const char *number,
                                "WHERE D.data4 = ?",
                                /* Below condition takes long time, so omit the condition */
                                /* AND _NUMBER_COMPARE_(D.data5, ?, NULL, NULL) */
-                               CTSVC_DATA_NUMBER, addressbook_id);
+                               CONTACTS_DATA_TYPE_NUMBER, addressbook_id);
 
                ret = ctsvc_query_prepare(query, &stmt);
                RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare fail(%d)", ret);
@@ -1954,7 +1954,7 @@ static inline int __ctsvc_find_person_to_link_with_email(const char *email_addr,
                        "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 AND D.is_my_profile = 0 "
                        "AND C.addressbook_id <> %d "
                        "WHERE D.data3 = ?",
-                       CTSVC_DATA_EMAIL, addressbook_id);
+                       CONTACTS_DATA_TYPE_EMAIL, addressbook_id);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare fail(%d)", ret);
index 9b63b45..6b74175 100644 (file)
@@ -40,7 +40,7 @@ static int __ctsvc_db_email_get_person_default_email(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTSVC_DB_VIEW_CONTACT" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
-                       person_id, CTSVC_DATA_EMAIL);
+                       person_id, CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_get_first_int_result(query, &default_email_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -82,7 +82,7 @@ static int __ctsvc_db_email_get_default_email_id(int contact_id)
        char query[CTS_SQL_MAX_LEN] = {0};
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
-                       CTSVC_DATA_EMAIL, contact_id);
+                       CONTACTS_DATA_TYPE_EMAIL, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &email_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -96,7 +96,7 @@ static int __ctsvc_db_email_get_primary_default_email_id(int contact_id)
        char query[CTS_SQL_MAX_LEN] = {0};
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_primary_default=1",
-                       CTSVC_DATA_EMAIL, contact_id);
+                       CONTACTS_DATA_TYPE_EMAIL, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &email_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -112,7 +112,7 @@ static int __ctsvc_db_email_get_primary_default_contact_id(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
-                       person_id, CTSVC_DATA_EMAIL);
+                       person_id, CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -239,7 +239,7 @@ static int __ctsvc_db_email_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_EMAIL);
+                       id, CONTACTS_DATA_TYPE_EMAIL);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -402,7 +402,7 @@ static int __ctsvc_db_email_delete_record(int id)
 
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
-                       CTSVC_DATA_EMAIL, contact_id);
+                       CONTACTS_DATA_TYPE_EMAIL, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &email_id);
        if (0 < ret)
                has_email = true;
@@ -456,7 +456,7 @@ static int __ctsvc_db_email_get_all_records(int offset, int limit, contacts_list
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_EMAIL);
+                       CONTACTS_DATA_TYPE_EMAIL);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 1c59b5d..3b45c34 100644 (file)
@@ -56,7 +56,7 @@ static int __ctsvc_db_email_reset_default(int email_id, int contact_id)
        snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_DATA" SET is_default = 0, is_primary_default = 0 "
                        "WHERE id != %d AND contact_id = %d AND datatype = %d",
-                       email_id, contact_id, CTSVC_DATA_EMAIL);
+                       email_id, contact_id, CONTACTS_DATA_TYPE_EMAIL);
        ret = ctsvc_query_exec(query);
        WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
        return ret;
@@ -79,7 +79,7 @@ int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_p
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, %d, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_EMAIL, email->is_default, email->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_EMAIL, email->is_default, email->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -162,7 +162,7 @@ int ctsvc_db_email_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_EMAIL);
+                       id, CONTACTS_DATA_TYPE_EMAIL);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 4370450..e6b4fce 100644 (file)
@@ -105,7 +105,7 @@ static int __ctsvc_db_event_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_EVENT);
+                       id, CONTACTS_DATA_TYPE_EVENT);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -262,7 +262,7 @@ static int __ctsvc_db_event_get_all_records(int offset, int limit, contacts_list
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_EVENT);
+                       CONTACTS_DATA_TYPE_EVENT);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index c50ee25..e02d3cd 100644 (file)
@@ -43,7 +43,7 @@ int ctsvc_db_event_insert(contacts_record_h record, int contact_id, bool is_my_p
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3, data4, data5) "
                        "VALUES(%d, %d, %d, %d, ?, ?, ?, %d)",
-                       contact_id, is_my_profile, CTSVC_DATA_EVENT, event->type, event->is_leap_month);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_EVENT, event->type, event->is_leap_month);
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
 
@@ -141,7 +141,7 @@ int ctsvc_db_event_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_EVENT);
+                       id, CONTACTS_DATA_TYPE_EVENT);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 0c06908..8ce39ec 100644 (file)
@@ -109,7 +109,7 @@ static int __ctsvc_db_extension_get_record(int id, contacts_record_h *out_record
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_EXTENSION);
+                       id, CONTACTS_DATA_TYPE_EXTENSION);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -271,7 +271,7 @@ static int __ctsvc_db_extension_get_all_records(int offset, int limit, contacts_
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_EXTENSION);
+                       CONTACTS_DATA_TYPE_EXTENSION);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 28926c4..f964808 100644 (file)
@@ -113,7 +113,7 @@ int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_
                                "INSERT INTO "CTS_TABLE_DATA" (contact_id, is_my_profile, datatype, data1, data2, data3, data4, "
                                "data5, data6, data7, data8, data9, data10, data11, data12) "
                                "VALUES(%d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                               contact_id, is_my_profile, CTSVC_DATA_EXTENSION, extension->data1);
+                               contact_id, is_my_profile, CONTACTS_DATA_TYPE_EXTENSION, extension->data1);
 
                ret = ctsvc_query_prepare(query, &stmt);
                RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -181,7 +181,7 @@ int ctsvc_db_extension_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_EXTENSION);
+                       id, CONTACTS_DATA_TYPE_EXTENSION);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 6ad06c8..3b62770 100644 (file)
@@ -38,7 +38,7 @@ static int __ctsvc_db_image_get_default_image_id(int contact_id)
        char query[CTS_SQL_MAX_LEN] = {0};
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
-                       CTSVC_DATA_IMAGE, contact_id);
+                       CONTACTS_DATA_TYPE_IMAGE, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &image_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -81,7 +81,7 @@ static int __ctsvc_db_image_get_primary_default_image_id(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
-                       person_id, CTSVC_DATA_IMAGE);
+                       person_id, CONTACTS_DATA_TYPE_IMAGE);
        ret = ctsvc_query_get_first_int_result(query, &default_image_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -97,7 +97,7 @@ static int __ctsvc_db_image_get_primary_default_contact_id(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
-                       person_id, CTSVC_DATA_IMAGE);
+                       person_id, CONTACTS_DATA_TYPE_IMAGE);
        ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -265,7 +265,7 @@ static int __ctsvc_db_image_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_IMAGE);
+                       id, CONTACTS_DATA_TYPE_IMAGE);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -481,7 +481,7 @@ static int __ctsvc_db_image_delete_record(int id)
        if (is_default) {
                snprintf(query, sizeof(query),
                                "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
-                               CTSVC_DATA_IMAGE, contact_id);
+                               CONTACTS_DATA_TYPE_IMAGE, contact_id);
                ret = ctsvc_query_get_first_int_result(query, &image_id);
 
                if (image_id) {
@@ -525,7 +525,7 @@ static int __ctsvc_db_image_get_all_records(int offset, int limit, contacts_list
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_IMAGE);
+                       CONTACTS_DATA_TYPE_IMAGE);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index e7a9073..5d1407d 100644 (file)
@@ -72,7 +72,7 @@ static int __ctsvc_db_image_reset_default(int image_id, int contact_id)
 
        snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_DATA" SET is_default=0, is_primary_default=0 WHERE id != %d AND contact_id = %d AND datatype=%d",
-                       image_id, contact_id, CTSVC_DATA_IMAGE);
+                       image_id, contact_id, CONTACTS_DATA_TYPE_IMAGE);
        ret = ctsvc_query_exec(query);
        WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
        return ret;
@@ -109,7 +109,7 @@ int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_p
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(id, contact_id, is_my_profile, datatype, is_default, is_primary_default, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, %d, %d, %d, ?, ?)",
-                       image_id, contact_id, is_my_profile, CTSVC_DATA_IMAGE, image->is_default, image->is_default, image->type);
+                       image_id, contact_id, is_my_profile, CONTACTS_DATA_TYPE_IMAGE, image->is_default, image->is_default, image->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -207,7 +207,7 @@ int ctsvc_db_image_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_IMAGE);
+                       id, CONTACTS_DATA_TYPE_IMAGE);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 2302c90..682d7d3 100644 (file)
@@ -104,7 +104,7 @@ static int __ctsvc_db_messenger_get_record(int id, contacts_record_h *out_record
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_MESSENGER);
+                       id, CONTACTS_DATA_TYPE_MESSENGER);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -261,7 +261,7 @@ static int __ctsvc_db_messenger_get_all_records(int offset, int limit, contacts_
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_MESSENGER);
+                       CONTACTS_DATA_TYPE_MESSENGER);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 4966521..4ef5e1d 100644 (file)
@@ -65,7 +65,7 @@ int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_MESSENGER, messenger->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_MESSENGER, messenger->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -140,7 +140,7 @@ int ctsvc_db_messenger_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_MESSENGER);
+                       id, CONTACTS_DATA_TYPE_MESSENGER);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 0931a08..a5f388e 100644 (file)
@@ -113,49 +113,49 @@ static int __ctsvc_db_my_profile_get_data(int id, ctsvc_my_profile_s *my_profile
        do {
                datatype = ctsvc_stmt_get_int(stmt, 0);
                switch (datatype) {
-               case CTSVC_DATA_NAME:
+               case CONTACTS_DATA_TYPE_NAME:
                        ctsvc_get_data_info_name(stmt, (contacts_list_h)my_profile->name);
                        break;
-               case CTSVC_DATA_EVENT:
+               case CONTACTS_DATA_TYPE_EVENT:
                        ctsvc_get_data_info_event(stmt, (contacts_list_h)my_profile->events);
                        break;
-               case CTSVC_DATA_MESSENGER:
+               case CONTACTS_DATA_TYPE_MESSENGER:
                        ctsvc_get_data_info_messenger(stmt, (contacts_list_h)my_profile->messengers);
                        break;
-               case CTSVC_DATA_POSTAL:
+               case CONTACTS_DATA_TYPE_POSTAL:
                        ctsvc_get_data_info_address(stmt, (contacts_list_h)my_profile->postal_addrs);
                        break;
-               case CTSVC_DATA_URL:
+               case CONTACTS_DATA_TYPE_URL:
                        ctsvc_get_data_info_url(stmt, (contacts_list_h)my_profile->urls);
                        break;
-               case CTSVC_DATA_NICKNAME:
+               case CONTACTS_DATA_TYPE_NICKNAME:
                        ctsvc_get_data_info_nickname(stmt, (contacts_list_h)my_profile->nicknames);
                        break;
-               case CTSVC_DATA_NUMBER:
+               case CONTACTS_DATA_TYPE_NUMBER:
                        ctsvc_get_data_info_number(stmt, (contacts_list_h)my_profile->numbers);
                        break;
-               case CTSVC_DATA_EMAIL:
+               case CONTACTS_DATA_TYPE_EMAIL:
                        ctsvc_get_data_info_email(stmt, (contacts_list_h)my_profile->emails);
                        break;
-               case CTSVC_DATA_PROFILE:
+               case CONTACTS_DATA_TYPE_PROFILE:
                        ctsvc_get_data_info_profile(stmt, (contacts_list_h)my_profile->profiles);
                        break;
-               case CTSVC_DATA_RELATIONSHIP:
+               case CONTACTS_DATA_TYPE_RELATIONSHIP:
                        ctsvc_get_data_info_relationship(stmt, (contacts_list_h)my_profile->relationships);
                        break;
-               case CTSVC_DATA_IMAGE:
+               case CONTACTS_DATA_TYPE_IMAGE:
                        ctsvc_get_data_info_image(stmt, (contacts_list_h)my_profile->images);
                        break;
-               case CTSVC_DATA_COMPANY:
+               case CONTACTS_DATA_TYPE_COMPANY:
                        ctsvc_get_data_info_company(stmt, (contacts_list_h)my_profile->company);
                        break;
-               case CTSVC_DATA_NOTE:
+               case CONTACTS_DATA_TYPE_NOTE:
                        ctsvc_get_data_info_note(stmt, (contacts_list_h)my_profile->note);
                        break;
-               case CTSVC_DATA_EXTENSION:
+               case CONTACTS_DATA_TYPE_EXTENSION:
                        ctsvc_get_data_info_extension(stmt, (contacts_list_h)my_profile->extensions);
                        break;
-               case CTSVC_DATA_SIP:
+               case CONTACTS_DATA_TYPE_SIP:
                        ctsvc_get_data_info_sip(stmt, (contacts_list_h)my_profile->sips);
                        break;
                default:
index 4782dd7..f09e63a 100644 (file)
@@ -67,7 +67,7 @@ static int __ctsvc_db_name_insert_record(contacts_record_h record, int *id)
        }
 
        snprintf(query, sizeof(query),
-                       "SELECT id FROM "CTS_TABLE_DATA" WHERE contact_id = %d AND datatype=%d", name->contact_id, CTSVC_DATA_NAME);
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE contact_id = %d AND datatype=%d", name->contact_id, CONTACTS_DATA_TYPE_NAME);
        ret = ctsvc_query_get_first_int_result(query, &name_id);
        if (name_id) {
                ERR("name_id (%d) is exist", name_id);
@@ -116,7 +116,7 @@ static int __ctsvc_db_name_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_NAME);
+                       id, CONTACTS_DATA_TYPE_NAME);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -281,7 +281,7 @@ static int __ctsvc_db_name_get_all_records(int offset, int limit, contacts_list_
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_NAME);
+                       CONTACTS_DATA_TYPE_NAME);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 90235df..f007905 100644 (file)
@@ -149,7 +149,7 @@ int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_pr
                                "DELETE FROM "CTS_TABLE_DATA" "
                                "WHERE contact_id = %d AND datatype=%d "
                                "AND is_my_profile = %d",
-                               contact_id, CTSVC_DATA_NAME, is_my_profile);
+                               contact_id, CONTACTS_DATA_TYPE_NAME, is_my_profile);
                ret = ctsvc_query_exec(query);
                if (CONTACTS_ERROR_NONE != ret) {
                        ERR("ctsvc_query_exec() Faild(%d)", ret);
@@ -160,7 +160,7 @@ int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_pr
                                "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, "
                                "data4, data5, data6, data7, data8, data9, data10, data11, data12) "
                                "VALUES(%d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                               contact_id, is_my_profile, CTSVC_DATA_NAME);
+                               contact_id, is_my_profile, CONTACTS_DATA_TYPE_NAME);
 
                ret = ctsvc_query_prepare(query, &stmt);
                RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
index 8560ea3..9f0ee0b 100644 (file)
@@ -106,7 +106,7 @@ static int __ctsvc_db_nickname_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_NICKNAME);
+                       id, CONTACTS_DATA_TYPE_NICKNAME);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -268,7 +268,7 @@ static int __ctsvc_db_nickname_get_all_records(int offset, int limit, contacts_l
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_NICKNAME);
+                       CONTACTS_DATA_TYPE_NICKNAME);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index cf09bea..7d7eba2 100644 (file)
@@ -64,7 +64,7 @@ int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_m
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_NICKNAME, nickname->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_NICKNAME, nickname->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -135,7 +135,7 @@ int ctsvc_db_nickname_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_NICKNAME);
+                       id, CONTACTS_DATA_TYPE_NICKNAME);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 730a04b..7df01d2 100644 (file)
@@ -45,7 +45,7 @@ static int __ctsvc_db_note_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_NOTE);
+                       id, CONTACTS_DATA_TYPE_NOTE);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -264,7 +264,7 @@ static int __ctsvc_db_note_get_all_records(int offset, int limit, contacts_list_
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_NOTE);
+                       CONTACTS_DATA_TYPE_NOTE);
 
 
        if (0 != limit) {
index ffe9aea..987ce21 100644 (file)
@@ -64,7 +64,7 @@ int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_pr
 
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data3) "
-                       "VALUES(%d, %d, %d, ?)", contact_id, is_my_profile, CTSVC_DATA_NOTE);
+                       "VALUES(%d, %d, %d, ?)", contact_id, is_my_profile, CONTACTS_DATA_TYPE_NOTE);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -133,7 +133,7 @@ int ctsvc_db_note_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_NOTE);
+                       id, CONTACTS_DATA_TYPE_NOTE);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index e098805..e76bc5c 100644 (file)
@@ -41,7 +41,7 @@ static int __ctsvc_db_number_get_person_default_number(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
-                       person_id, CTSVC_DATA_NUMBER);
+                       person_id, CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_get_first_int_result(query, &default_number_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -70,7 +70,7 @@ static int __ctsvc_db_number_get_default_number_id(int contact_id)
        char query[CTS_SQL_MAX_LEN] = {0};
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
-                       CTSVC_DATA_NUMBER, contact_id);
+                       CONTACTS_DATA_TYPE_NUMBER, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &number_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -98,7 +98,7 @@ static int __ctsvc_db_number_get_primary_default(int contact_id)
        char query[CTS_SQL_MAX_LEN] = {0};
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_primary_default=%d",
-                       CTSVC_DATA_NUMBER, contact_id, 1);
+                       CONTACTS_DATA_TYPE_NUMBER, contact_id, 1);
        ret = ctsvc_query_get_first_int_result(query, &number_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -114,7 +114,7 @@ static int __ctsvc_db_number_get_primary_default_contact_id(int person_id)
        snprintf(query, sizeof(query),
                        "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
                        "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
-                       person_id, CTSVC_DATA_NUMBER);
+                       person_id, CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
        if (CONTACTS_ERROR_NONE != ret)
                return 0;
@@ -398,7 +398,7 @@ static int __ctsvc_db_number_delete_record(int id)
 
        snprintf(query, sizeof(query),
                        "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
-                       CTSVC_DATA_NUMBER, contact_id);
+                       CONTACTS_DATA_TYPE_NUMBER, contact_id);
        ret = ctsvc_query_get_first_int_result(query, &number_id);
        if (0 < ret)
                has_phonenumber = true;
@@ -452,7 +452,7 @@ static int __ctsvc_db_number_get_all_records(int offset, int limit, contacts_lis
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_NUMBER);
+                       CONTACTS_DATA_TYPE_NUMBER);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index a8b5bb3..dbe1843 100644 (file)
@@ -41,7 +41,7 @@ static int __ctsvc_db_number_reset_default(int number_id, int contact_id)
 
        snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_DATA" SET is_default = 0, is_primary_default = 0 WHERE id != %d AND contact_id = %d AND datatype = %d",
-                       number_id, contact_id, CTSVC_DATA_NUMBER);
+                       number_id, contact_id, CONTACTS_DATA_TYPE_NUMBER);
        ret = ctsvc_query_exec(query);
        WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
        return ret;
@@ -64,7 +64,7 @@ int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, data4, data5, data6) "
                        "VALUES(%d, %d, %d, %d, %d, ?, ?, ?, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_NUMBER, number->is_default, number->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_NUMBER, number->is_default, number->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -314,7 +314,7 @@ int ctsvc_db_number_delete(int id, bool is_my_profile)
 #endif /* ENABLE_LOG_FEATURE */
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_NUMBER);
+                       id, CONTACTS_DATA_TYPE_NUMBER);
 
        ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
index 694cbfd..0609882 100644 (file)
@@ -16,6 +16,7 @@
  * limitations under the License.
  *
  */
+
 #include "contacts.h"
 #include "ctsvc_internal.h"
 #include "ctsvc_db_schema.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
 #include "ctsvc_notify.h"
+#include "ctsvc_utils_string.h"
 
 #ifdef _CONTACTS_IPC_SERVER
 #include "ctsvc_server_change_subject.h"
 #endif
 
-int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt, unsigned int *projection, int projection_count, contacts_record_h *record)
+int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt,
+               unsigned int *projection,
+               int projection_count,
+               bool is_snippet,
+               const char *keyword,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_record_h *record)
 {
        ctsvc_person_s *person;
        char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
@@ -118,6 +128,17 @@ int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt, unsig
                                value++; /* fix warning */
                        }
                        break;
+               case CTSVC_PROPERTY_PERSON_SNIPPET_TYPE:
+                       person->snippet_type = ctsvc_stmt_get_int(stmt, i);
+                       break;
+               case CTSVC_PROPERTY_PERSON_SNIPPET_STRING:
+                       temp = ctsvc_stmt_get_text(stmt, i);
+                       free(person->snippet_string);
+                       person->snippet_string = ctsvc_utils_get_modified_str(temp, is_snippet,
+                                       keyword, start_match, end_match, token_number);
+                       if (NULL == person->snippet_string)
+                               person->snippet_string = SAFE_STRDUP(temp);
+                       break;
                default:
                        ASSERT_NOT_REACHED("property_id(0x%0x) is not supported in value(person)", property_id);
                        return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -144,13 +165,15 @@ int ctsvc_db_person_create_record_from_stmt_with_query(cts_stmt stmt, contacts_q
                        projection[i] = s_query->properties[i].property_id;
 
                int ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt,
-                               projection, s_query->property_count, record);
+                               projection, s_query->property_count, false, NULL, NULL, NULL, -1, record);
 
                free(projection);
 
                return ret;
        } else {
-               return ctsvc_db_person_create_record_from_stmt_with_projection(stmt, s_query->projection, s_query->projection_count, record);
+               return ctsvc_db_person_create_record_from_stmt_with_projection(stmt,
+                               s_query->projection, s_query->projection_count, false, NULL, NULL, NULL,
+                               -1, record);
        }
 
 }
@@ -402,7 +425,7 @@ static inline int __ctsvc_db_update_person_default(int person_id, int datatype)
                }
                ctsvc_stmt_finalize(stmt);
 
-               if (CTSVC_DATA_IMAGE == datatype) {
+               if (CONTACTS_DATA_TYPE_IMAGE == datatype) {
                        if (image_thumbnail_path) {
                                snprintf(query, sizeof(query),
                                                "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id=%d", person_id);
@@ -454,7 +477,7 @@ static int __ctsvc_get_thumbnail_contact_id(int person_id)
                        "SELECT D.contact_id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D "
                        "ON C.contact_id = D.contact_id AND C.deleted = 0 "
                        "WHERE C.person_id=%d AND D.datatype=%d AND is_primary_default=1 AND D.is_my_profile = 0",
-                       person_id, CTSVC_DATA_IMAGE);
+                       person_id, CONTACTS_DATA_TYPE_IMAGE);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        RETV_IF(CONTACTS_ERROR_NONE != ret, -1);
        return contact_id;
@@ -474,9 +497,9 @@ int ctsvc_db_update_person(contacts_record_h record)
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Fail(%d)", ret);
 
-       __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_NUMBER);
-       __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_EMAIL);
-       __ctsvc_db_update_person_default(contact->person_id, CTSVC_DATA_IMAGE);
+       __ctsvc_db_update_person_default(contact->person_id, CONTACTS_DATA_TYPE_NUMBER);
+       __ctsvc_db_update_person_default(contact->person_id, CONTACTS_DATA_TYPE_EMAIL);
+       __ctsvc_db_update_person_default(contact->person_id, CONTACTS_DATA_TYPE_IMAGE);
 
        has_phonenumber = __ctsvc_get_has_column(contact->person_id, "has_phonenumber");
        has_email = __ctsvc_get_has_column(contact->person_id, "has_email");
index aef48a7..ff02ff9 100644 (file)
@@ -30,7 +30,14 @@ int ctsvc_db_person_create_record_from_stmt(cts_stmt stmt, contacts_record_h *re
 int ctsvc_db_person_create_record_from_stmt_with_query(cts_stmt stmt,
                contacts_query_h query, contacts_record_h *record);
 int ctsvc_db_person_create_record_from_stmt_with_projection(cts_stmt stmt,
-               unsigned int *projection, int projection_count, contacts_record_h *record);
+               unsigned int *projection,
+               int projection_count,
+               bool is_snippet,
+               const char *keyword,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_record_h *record);
 void ctsvc_db_normalize_str_callback(sqlite3_context  *context,        int argc,
                sqlite3_value **argv);
 int ctsvc_db_person_set_favorite(int person_id, bool set, bool propagate);
index 1116c87..c3e841a 100644 (file)
@@ -106,7 +106,7 @@ static int __ctsvc_db_profile_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_PROFILE);
+                       id, CONTACTS_DATA_TYPE_PROFILE);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -264,7 +264,7 @@ static int __ctsvc_db_profile_get_all_records(int offset, int limit, contacts_li
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_PROFILE);
+                       CONTACTS_DATA_TYPE_PROFILE);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 79f7bfe..769135e 100644 (file)
@@ -102,7 +102,7 @@ int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data3, data4, data5, "
                        "data6, data7, data8, data9, data10, data11) "
                        "VALUES(%d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_PROFILE);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_PROFILE);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -175,7 +175,7 @@ int ctsvc_db_profile_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_PROFILE);
+                       id, CONTACTS_DATA_TYPE_PROFILE);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 91071d3..f9ac962 100644 (file)
@@ -104,7 +104,7 @@ static int __ctsvc_db_relationship_get_record(int id, contacts_record_h *out_rec
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_RELATIONSHIP);
+                       id, CONTACTS_DATA_TYPE_RELATIONSHIP);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -261,7 +261,7 @@ static int __ctsvc_db_relationship_get_all_records(int offset, int limit, contac
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_RELATIONSHIP);
+                       CONTACTS_DATA_TYPE_RELATIONSHIP);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 53d10b7..0f9450a 100644 (file)
@@ -75,7 +75,7 @@ int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_RELATIONSHIP, relationship->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_RELATIONSHIP, relationship->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -146,7 +146,7 @@ int ctsvc_db_relationship_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_RELATIONSHIP);
+                       id, CONTACTS_DATA_TYPE_RELATIONSHIP);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 2354d27..82bd46c 100644 (file)
@@ -126,7 +126,7 @@ static int __ctsvc_db_sip_get_record(int id, contacts_record_h* out_record)
                                "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                                "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                                "WHERE id = %d AND datatype = %d ",
-                               id, CTSVC_DATA_SIP);
+                               id, CONTACTS_DATA_TYPE_SIP);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
@@ -283,7 +283,7 @@ static int __ctsvc_db_sip_get_all_records(int offset, int limit, contacts_list_h
                                "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                                "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                                "WHERE datatype = %d AND is_my_profile=0 ",
-                               CTSVC_DATA_SIP);
+                               CONTACTS_DATA_TYPE_SIP);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index 16fe57b..846c8f7 100644 (file)
@@ -43,7 +43,7 @@ int ctsvc_db_sip_insert(contacts_record_h record, int contact_id, bool is_my_pro
        snprintf(query, sizeof(query),
                "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) "
                                                                        "VALUES(%d, %d, %d, ?, %d, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_SIP, sip->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_SIP, sip->type);
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "DB error : ctsvc_query_prepare() Fail(%d)", ret);
 
@@ -136,7 +136,7 @@ int ctsvc_db_sip_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_SIP);
+                       id, CONTACTS_DATA_TYPE_SIP);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index e6f5bbe..ef7c2b3 100644 (file)
@@ -45,7 +45,7 @@ static int __ctsvc_db_speeddial_insert_record(contacts_record_h record, int *id)
                        "ON "CTS_TABLE_DATA".contact_id = "CTS_TABLE_CONTACTS".contact_id "
                        "AND contacts.deleted = 0  AND is_my_profile = 0 AND datatype = %d "
                        "WHERE id = %d ",
-                       CTSVC_DATA_NUMBER, speeddial->number_id);
+                       CONTACTS_DATA_TYPE_NUMBER, speeddial->number_id);
        ret = ctsvc_query_get_first_int_result(query, &number_id);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("ctsvc_query_get_first_int_result() Fail(%d) : number_id is invalid", ret);
@@ -176,7 +176,7 @@ static int __ctsvc_db_speeddial_update_record(contacts_record_h record)
                        "ON "CTS_TABLE_DATA".contact_id = "CTS_TABLE_CONTACTS".contact_id "
                        "AND contacts.deleted = 0  AND is_my_profile = 0 AND datatype = %d "
                        "WHERE id = %d ",
-                       CTSVC_DATA_NUMBER, speeddial->number_id);
+                       CONTACTS_DATA_TYPE_NUMBER, speeddial->number_id);
        ret = ctsvc_query_get_first_int_result(query, &number_id);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("ctsvc_query_get_first_int_result() Fail(%d) : number_id is invalid", ret);
index c70f8b0..4bf06cd 100644 (file)
@@ -104,7 +104,7 @@ static int __ctsvc_db_url_get_record(int id, contacts_record_h *out_record)
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE id = %d AND datatype = %d ",
-                       id, CTSVC_DATA_URL);
+                       id, CONTACTS_DATA_TYPE_URL);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -261,7 +261,7 @@ static int __ctsvc_db_url_get_all_records(int offset, int limit, contacts_list_h
                        "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                        "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
                        "WHERE datatype = %d AND is_my_profile=0 ",
-                       CTSVC_DATA_URL);
+                       CONTACTS_DATA_TYPE_URL);
 
        if (0 != limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index ed8f2af..8f6a61b 100644 (file)
@@ -66,7 +66,7 @@ int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_pro
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, data1, data2, data3) "
                        "VALUES(%d, %d, %d, %d, ?, ?)",
-                       contact_id, is_my_profile, CTSVC_DATA_URL, url->type);
+                       contact_id, is_my_profile, CONTACTS_DATA_TYPE_URL, url->type);
 
        ret = ctsvc_query_prepare(query, &stmt);
        RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
@@ -138,7 +138,7 @@ int ctsvc_db_url_delete(int id, bool is_my_profile)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_DATA" WHERE id = %d AND datatype = %d",
-                       id, CTSVC_DATA_URL);
+                       id, CONTACTS_DATA_TYPE_URL);
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
index 59ebef3..6933761 100644 (file)
@@ -36,6 +36,7 @@
 #include "ctsvc_localize_utils.h"
 #include "ctsvc_server_setting.h"
 #include "ctsvc_notify.h"
+#include "ctsvc_utils_string.h"
 
 #include "ctsvc_db_access_control.h"
 #include "ctsvc_db_plugin_person_helper.h"
@@ -343,6 +344,377 @@ static int __db_add_str_matching_rule(const char *field_name, int match,
        return len;
 }
 
+static char* __ctsvc_db_make_search_keyword(const char *keyword)
+{
+       int size;
+       if (keyword == NULL)
+               return NULL;
+
+       size = strlen(keyword);
+       if (strstr(keyword, " ")) {
+               int i = 0;
+               int j = 0;
+               char search_keyword[size * 2+1];
+               for (i = 0; i < size; i++) {
+                       if (0 < j && keyword[i] == ' ') {
+                               if (search_keyword[j-1] != ' ')
+                                       search_keyword[j++] = '*';
+                       }
+                       search_keyword[j++] = keyword[i];
+               }
+               if (0 < j && search_keyword[j-1] != ' ')
+                       search_keyword[j++] = '*';
+               search_keyword[j] = '\0';
+               return strdup(search_keyword);
+       } else {
+               char search_keyword[size+2];
+               snprintf(search_keyword, sizeof(search_keyword), "%s*", keyword);
+               return strdup(search_keyword);
+       }
+}
+
+static char *_get_search_query_for_name(const char *keyword)
+{
+       int ret = 0;
+       char *half_keyword = NULL;
+       int keyword_size = 0;
+       bool use_replaced_keyword = true;
+
+       ret = ctsvc_get_halfwidth_string(keyword, &half_keyword, &keyword_size);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("UChar converting error : ctsvc_get_halfwidth_string() Fail");
+               half_keyword = (char*)keyword;
+               use_replaced_keyword = false;
+       }
+
+       char *search_keyword = NULL;
+       search_keyword = __ctsvc_db_make_search_keyword(half_keyword);
+
+       char *normalized_name = NULL;
+       int lang = CTSVC_LANG_OTHERS;
+       lang = ctsvc_normalize_str(half_keyword, &normalized_name);
+       char *hiragana = NULL;
+       char *search_hiragana = NULL;
+
+       if (CTSVC_LANG_JAPANESE == lang) {
+               ctsvc_convert_japanese_to_hiragana(half_keyword, &hiragana);
+               search_hiragana = __ctsvc_db_make_search_keyword(hiragana);
+       }
+
+       int len_keyword = strlen(half_keyword);
+       int len_chosung= 0;
+       char *chosung = NULL;
+       char *korean_pattern = NULL;
+       char *search_chosung = NULL;
+       char *search_normalized = NULL;
+
+       char *mod_keyword = NULL;
+       switch (lang) {
+       case CTSVC_LANG_KOREAN: /* search with chosung */
+               /*
+                * If try to find '홍길동' by 'ㄱ동'
+                * search by 'ㄱㄷ' in search_index table
+                * intersect
+                * search by '*ㄱ*동*' in name_lookup table
+                */
+               chosung = calloc(len_keyword * 5, sizeof(char));
+               len_chosung = ctsvc_get_chosung(half_keyword, chosung, len_keyword * 5);
+               mod_keyword = __ctsvc_db_make_search_keyword(0 < len_chosung? chosung : half_keyword);
+               break;
+       case CTSVC_LANG_JAPANESE:
+               mod_keyword = search_hiragana;
+               break;
+       default:
+               if (CONTACTS_ERROR_NONE <= lang) { /* normalized string search */
+                       search_normalized = __ctsvc_db_make_search_keyword(normalized_name);
+                       mod_keyword = search_normalized;
+               } else {  /* original keyword search */
+                       mod_keyword = search_keyword;
+               }
+               break;
+       }
+
+       int temp_len = 0;
+       int query_size = CTS_SQL_MAX_LEN;
+       char *query = calloc(query_size, sizeof(char));
+       int len = 0;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " SELECT contact_id "
+                       "FROM "CTS_TABLE_SEARCH_INDEX" WHERE "CTS_TABLE_SEARCH_INDEX" "
+                       "MATCH 'name:");
+       if (0 <= temp_len)
+               len += temp_len;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, mod_keyword);
+       if (0 <= temp_len)
+               len += temp_len;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " '");
+       if (0 <= temp_len)
+               len += temp_len;
+
+
+       switch (lang) {
+       case CTSVC_LANG_KOREAN:
+               DBG("korean");
+               korean_pattern = calloc(len_keyword *5, sizeof(char));
+               ctsvc_get_korean_search_pattern(half_keyword, korean_pattern, len_keyword * 5);
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " INTERSECT SELECT "
+                               "contact_id FROM "CTS_TABLE_NAME_LOOKUP" WHERE name GLOB '*");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, korean_pattern);
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "*' ");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               free(chosung);
+               free(korean_pattern);
+               free(search_chosung);
+               break;
+       case CTSVC_LANG_JAPANESE:
+               break;
+       default:
+               DBG("default");
+               free(search_normalized);
+               break;
+       }
+
+       int i, j = 0;
+       char temp_str[len_keyword * 2 + 1];
+       for (i = 0; i < len_keyword; i++) {
+               if (half_keyword[i] == '\'' || half_keyword[i] == '_' ||
+                               half_keyword[i] == '%' || half_keyword[i] == '\\') {
+                       temp_str[j++] = CTSVC_DB_ESCAPE_CHAR;
+               }
+               temp_str[j++] = half_keyword[i];
+       }
+       temp_str[j] = '\0';
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION SELECT contact_id "
+                       " FROM "CTS_TABLE_NAME_LOOKUP" WHERE name LIKE '%%");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_str);
+       if (0 <= temp_len)
+               len += temp_len;
+
+       /* CTSVC_DB_ESCAPE_CHAR */
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ESCAPE '\\' ");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       free(normalized_name);
+       free(hiragana);
+       free(search_hiragana);
+       free(search_keyword);
+
+       if (use_replaced_keyword)
+               free(half_keyword);
+
+       DBG("[%s]", query);
+       return strdup(query);
+}
+
+static char *_get_search_query_for_number(const char *keyword)
+{
+       int ret = 0;
+       char *half_keyword = NULL;
+       int keyword_size = 0;
+       bool use_replaced_keyword = true;
+
+       ret = ctsvc_get_halfwidth_string(keyword, &half_keyword, &keyword_size);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("UChar converting error : ctsvc_get_halfwidth_string() Fail");
+               half_keyword = (char*)keyword;
+               use_replaced_keyword = false;
+       }
+
+       char *search_keyword = NULL;
+       search_keyword = __ctsvc_db_make_search_keyword(half_keyword);
+
+       char *normalized_name = NULL;
+       int lang = CTSVC_LANG_OTHERS;
+       lang = ctsvc_normalize_str(half_keyword, &normalized_name);
+       char *hiragana = NULL;
+       char *search_hiragana = NULL;
+
+       if (CTSVC_LANG_JAPANESE == lang) {
+               ctsvc_convert_japanese_to_hiragana(half_keyword, &hiragana);
+               search_hiragana = __ctsvc_db_make_search_keyword(hiragana);
+       }
+
+       char *mod_keyword = NULL;
+       switch (lang) {
+       case CTSVC_LANG_JAPANESE:
+               mod_keyword = search_hiragana;
+               break;
+       default:
+               mod_keyword = search_keyword;
+               break;
+       }
+
+       int temp_len = 0;
+       int query_size = CTS_SQL_MAX_LEN;
+       char *query = calloc(query_size, sizeof(char));
+       int len = 0;
+
+       mod_keyword = search_hiragana ? search_hiragana : search_keyword;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT contact_id "
+                       "FROM "CTS_TABLE_SEARCH_INDEX" WHERE "CTS_TABLE_SEARCH_INDEX" "
+                       "MATCH 'number:");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, mod_keyword);
+       if (0 <= temp_len)
+               len += temp_len;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " '");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       free(hiragana);
+       free(search_hiragana);
+       free(search_keyword);
+
+
+
+       do {
+               int len_keyword = strlen(half_keyword);
+               char *clean_number = calloc(len_keyword + 1, sizeof(char));
+               int err = ctsvc_clean_number(half_keyword, clean_number, len_keyword + 1, false);
+               if (err <= 0) {
+                       ERR("ctsvc_clean_number() Fail(%d)", err);
+                       free(clean_number);
+                       break;
+               }
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION SELECT contact_id "
+                               "FROM "CTS_TABLE_PHONE_LOOKUP" WHERE number LIKE '%%");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, clean_number);
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               const char *cc = ctsvc_get_network_cc(false);
+               if (cc && cc[0] == '7' && clean_number[0] == '8') {   /* Russia */
+                       char normal_num[strlen(clean_number)+1+5];   /* for cc */
+                       int ret;
+                       ret = ctsvc_normalize_number(clean_number, normal_num, sizeof(normal_num), false);
+                       if (ret <= 0) {
+                               free(clean_number);
+                               break;
+                       }
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "OR number LIKE '%%");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, normal_num);
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+               }
+               free(clean_number);
+       } while (0);
+
+       if (use_replaced_keyword)
+               free(half_keyword);
+
+       DBG("[%s]", query);
+       return strdup(query);
+}
+
+static char *_get_search_query_for_data(const char *keyword)
+{
+       int ret = 0;
+       char *half_keyword = NULL;
+       int keyword_size = 0;
+       bool use_replaced_keyword = true;
+
+       ret = ctsvc_get_halfwidth_string(keyword, &half_keyword, &keyword_size);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ERR("UChar converting error : ctsvc_get_halfwidth_string() Fail");
+               half_keyword = (char*)keyword;
+               use_replaced_keyword = false;
+       }
+
+       char *search_keyword = NULL;
+       search_keyword = __ctsvc_db_make_search_keyword(half_keyword);
+
+       char *normalized_name = NULL;
+       int lang = CTSVC_LANG_OTHERS;
+       lang = ctsvc_normalize_str(half_keyword, &normalized_name);
+       char *hiragana = NULL;
+       char *search_hiragana = NULL;
+
+       if (CTSVC_LANG_JAPANESE == lang) {
+               ctsvc_convert_japanese_to_hiragana(half_keyword, &hiragana);
+               search_hiragana = __ctsvc_db_make_search_keyword(hiragana);
+       }
+
+       int tmp_len = 0;
+       char *tmp_keyword = NULL;
+       int i;
+
+       char *mod_keyword = NULL;
+       switch (lang) {
+       case CTSVC_LANG_JAPANESE:
+               mod_keyword = search_hiragana;
+               break;
+       default:
+               /* replace '-' -> '_' because FTS does not support search '-' */
+               tmp_len = strlen(search_keyword);
+               tmp_keyword = calloc(tmp_len + 1, sizeof(char));
+               for (i = 0; i < tmp_len; i++)
+                       tmp_keyword[i] = ('-' == search_keyword[i]) ? '_' : search_keyword[i];
+               tmp_keyword[i] = '\0';
+               mod_keyword = tmp_keyword;
+               break;
+       }
+
+
+       int temp_len = 0;
+       int query_size = CTS_SQL_MAX_LEN;
+       char *query = calloc(query_size, sizeof(char));
+       int len = 0;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " SELECT contact_id "
+                       "FROM "CTS_TABLE_SEARCH_INDEX" WHERE "CTS_TABLE_SEARCH_INDEX" "
+                       "MATCH 'data:");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, mod_keyword);
+       if (0 <= temp_len)
+               len += temp_len;
+
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " '");
+       if (0 <= temp_len)
+               len += temp_len;
+
+       free(hiragana);
+       free(search_hiragana);
+       free(search_keyword);
+       free(tmp_keyword);
+
+       if (use_replaced_keyword)
+               free(half_keyword);
+
+       DBG("[%s]", query);
+       return strdup(query);
+}
 
 static inline void __db_create_str_condtion_number(
                ctsvc_composite_filter_s *com_filter,
@@ -984,7 +1356,8 @@ static int __db_create_projection(const char *view_uri,
                const property_info_s *properties, int ids_count,
                unsigned int *projections,
                int pro_count,
-               char **projection)
+               char **projection,
+               bool is_snippet)
 {
        bool first;
        int i;
@@ -992,6 +1365,8 @@ static int __db_create_projection(const char *view_uri,
        const char *field_name = NULL;
        char out_projection[CTS_SQL_MAX_LEN] = {0};
        char temp[CTS_SQL_MAX_LEN] = {0};
+       bool is_data1 = false;
+       bool is_data2 = false;
 
        len = 0;
        first = true;
@@ -1001,6 +1376,16 @@ static int __db_create_projection(const char *view_uri,
                                snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)",
                                                ctsvc_get_sort_name_column());
                                field_name = temp;
+                       } else if (projections[i] == CTSVC_PROPERTY_PERSON_SNIPPET_TYPE) {
+                               snprintf(temp, sizeof(temp), "temp_data.datatype");
+                               field_name = temp;
+                               is_data1 = true;
+                       } else if (projections[i] == CTSVC_PROPERTY_PERSON_SNIPPET_STRING) {
+                               snprintf(temp, sizeof(temp), "(CASE "
+                                               "WHEN datatype=1 THEN (datatype || '@' || display_name) "
+                                               "ELSE (datatype || '@' || temp_data._data) END)");
+                               field_name = temp;
+                               is_data2 = true;
                        } else {
                                field_name = __ctsvc_db_get_property_field_name(properties, ids_count,
                                                QUERY_PROJECTION, projections[i]);
@@ -1029,6 +1414,18 @@ static int __db_create_projection(const char *view_uri,
                                snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)",
                                                ctsvc_get_sort_name_column());
                                field_name = temp;
+                       } else if (true == is_snippet &&
+                                       properties[i].property_id == CTSVC_PROPERTY_PERSON_SNIPPET_TYPE) {
+                               snprintf(temp, sizeof(temp), "temp_data.datatype");
+                               field_name = temp;
+                               is_data1 = true;
+                       } else if (true == is_snippet &&
+                                       properties[i].property_id == CTSVC_PROPERTY_PERSON_SNIPPET_STRING) {
+                               snprintf(temp, sizeof(temp), "(CASE "
+                                               "WHEN datatype=1 THEN (datatype || '@' || display_name) "
+                                               "ELSE (datatype || '@' || temp_data._data) END)");
+                               field_name = temp;
+                               is_data2 = true;
                        } else {
                                field_name = ctsvc_get_display_column();
                        }
@@ -1044,6 +1441,21 @@ static int __db_create_projection(const char *view_uri,
                }
        }
 
+       /* check extra data */
+       if (true == is_data1 || true == is_data2) {
+               snprintf(temp, sizeof(temp), "MIN(temp_data._priority) ");
+               field_name = temp;
+               if (first) {
+                       len += snprintf(out_projection+len, sizeof(out_projection)-len, "%s",
+                                       field_name);
+                       first = false;
+               } else {
+                       len += snprintf(out_projection+len, sizeof(out_projection)-len, ", %s",
+                                       field_name);
+               }
+       }
+DBG("[%s]", out_projection);
+
        *projection = strdup(out_projection);
        return CONTACTS_ERROR_NONE;
 }
@@ -1093,10 +1505,8 @@ int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "Invalid view uri(%s)", s_query->view_uri);
 
        ret = __db_create_projection(s_query->view_uri, s_query->properties,
-                       s_query->property_count,
-                       s_query->projection,
-                       s_query->projection_count,
-                       &projection);
+                       s_query->property_count, s_query->projection, s_query->projection_count,
+                       &projection, false);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("__db_create_projection() Fail(%d)", ret);
                return ret;
@@ -1394,7 +1804,7 @@ static int __ctsvc_db_get_all_records(const char *view_uri, int offset, int limi
        char *projection;
 
        const property_info_s *p = ctsvc_view_get_all_property_infos(view_uri, &count);
-       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection);
+       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection, false);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__db_create_projection Fail(%d)", ret);
 
        ret = __ctsvc_db_get_all_records_exec(view_uri, p, count, projection, offset, limit, out_list);
@@ -1403,49 +1813,34 @@ static int __ctsvc_db_get_all_records(const char *view_uri, int offset, int limi
        return ret;
 }
 
-static inline bool __ctsvc_db_view_can_keyword_search(const char *view_uri)
+static bool __ctsvc_db_view_can_keyword_search(const char *view_uri, int *out_enum_uri)
 {
        RETV_IF(NULL == view_uri, false);
+       RETV_IF(NULL == out_enum_uri, false);
 
-       if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_PERSON)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_ASSIGNED)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED)) {
-               return true;
-       }
-       return false;
-}
+       int enum_uri = -1;
 
-static char* __ctsvc_db_make_search_keyword(const char *keyword)
-{
-       int size;
-       if (keyword == NULL)
-               return NULL;
-
-       size = strlen(keyword);
-       if (strstr(keyword, " ")) {
-               int i = 0;
-               int j = 0;
-               char search_keyword[size * 2+1];
-               for (i = 0; i < size; i++) {
-                       if (0 < j && keyword[i] == ' ') {
-                               if (search_keyword[j-1] != ' ')
-                                       search_keyword[j++] = '*';
-                       }
-                       search_keyword[j++] = keyword[i];
-               }
-               if (0 < j && search_keyword[j-1] != ' ')
-                       search_keyword[j++] = '*';
-               search_keyword[j] = '\0';
-               return strdup(search_keyword);
+       if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_PERSON)) {
+               enum_uri = CTSVC_ENUM_URI_PERSON;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_ASSIGNED)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED;
+       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED)) {
+               enum_uri = CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED;
        } else {
-               char search_keyword[size+2];
-               snprintf(search_keyword, sizeof(search_keyword), "%s*", keyword);
-               return strdup(search_keyword);
+               ERR("Invalid uri[%s]", view_uri);
        }
+
+       *out_enum_uri = enum_uri;
+
+       return (-1 == enum_uri) ? false : true;
 }
 
 /*
@@ -1660,11 +2055,11 @@ static int __db_append_search_query(const char *keyword, char **query, int *quer
                                break;
                        }
                        if (need_union) {
-                               temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION");
+                               temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION ");
                                if (0 <= temp_len)
                                        len += temp_len;
                        }
-                       temp_len = SAFE_SNPRINTF(query, query_size, len, " SELECT contact_id "
+                       temp_len = SAFE_SNPRINTF(query, query_size, len, "SELECT contact_id "
                                        "FROM "CTS_TABLE_SEARCH_INDEX" WHERE "CTS_TABLE_SEARCH_INDEX" "
                                        "MATCH 'data:");
                        if (0 <= temp_len)
@@ -1714,11 +2109,11 @@ static int __db_append_search_query(const char *keyword, char **query, int *quer
                                break;
                        }
                        if (need_union) {
-                               temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION");
+                               temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION ");
                                if (0 <= temp_len)
                                        len += temp_len;
                        }
-                       temp_len = SAFE_SNPRINTF(query, query_size, len, " SELECT contact_id "
+                       temp_len = SAFE_SNPRINTF(query, query_size, len, "SELECT contact_id "
                                        "FROM "CTS_TABLE_SEARCH_INDEX" WHERE "CTS_TABLE_SEARCH_INDEX" "
                                        "MATCH 'name:");
                        if (0 <= temp_len)
@@ -1770,8 +2165,8 @@ static int __db_append_search_query(const char *keyword, char **query, int *quer
                                temp_str[j++] = half_keyword[i];
                        }
                        temp_str[j] = '\0';
-                       temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION SELECT contact_id"
-                                       " FROM "CTS_TABLE_NAME_LOOKUP" WHERE name LIKE '");
+                       temp_len = SAFE_SNPRINTF(query, query_size, len, " UNION SELECT contact_id "
+                                       "FROM "CTS_TABLE_NAME_LOOKUP" WHERE name LIKE '");
                        if (0 <= temp_len)
                                len += temp_len;
 
@@ -1960,6 +2355,7 @@ static int __ctsvc_db_search_records_append_sort(const char *view_uri,
 }
 
 static int __ctsvc_db_search_records_exec(const char *view_uri,
+               int enum_uri,
                const property_info_s *properties,
                int ids_count,
                const char *projection,
@@ -1967,6 +2363,10 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                int offset,
                int limit,
                int range,
+               bool is_snippet,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
                contacts_list_h *out_list)
 {
        char *query = NULL;
@@ -1998,46 +2398,57 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
        if (STRING_EQUAL == strcmp(keyword, "+"))
                range &= ~CONTACTS_SEARCH_RANGE_NUMBER;
 
-       if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_ASSIGNED)
-                       || STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED)) {
+       if (0 == range) {
+               ERR("No range");
+               contacts_list_create(&list);
+               *out_list = list;
+               free(query);
+               return CONTACTS_ERROR_NONE;
+       }
+
+       switch (enum_uri) {
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED:
+
                if (range & CONTACTS_SEARCH_RANGE_EMAIL) {
                        free(query);
                        return CONTACTS_ERROR_INVALID_PARAMETER;
                }
 
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
-               if (0 <= temp_len) len += temp_len;
+               if (0 <= temp_len)
+                       len += temp_len;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, projection);
-               if (0 <= temp_len) len += temp_len;
+               if (0 <= temp_len)
+                       len += temp_len;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM ");
-               if (0 <= temp_len) len += temp_len;
+               if (0 <= temp_len)
+                       len += temp_len;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
-               if (0 <= temp_len) len += temp_len;
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE contact_id IN ");
-               if (0 <= temp_len) len += temp_len;
+               if (0 <= temp_len)
+                       len += temp_len;
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " as temp_contacts");
+               if (0 <= temp_len)
+                       len += temp_len;
+               break;
 
-               temp_len = __db_append_search_query(keyword, &query, &query_size, len, range);
-               if (0 <= temp_len) len = temp_len;
-       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER)) {
-               bool need_or = false;
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER:
                if (range & CONTACTS_SEARCH_RANGE_DATA || range & CONTACTS_SEARCH_RANGE_EMAIL) {
+                       ERR("Invalid range");
                        free(query);
                        return CONTACTS_ERROR_INVALID_PARAMETER;
                }
+               bool need_or = false;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
                if (0 <= temp_len) len += temp_len;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, projection);
                if (0 <= temp_len) len += temp_len;
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM (");
-               if (0 <= temp_len) len += temp_len;
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " SELECT * FROM ");
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM (SELECT * FROM ");
                if (0 <= temp_len) len += temp_len;
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
                if (0 <= temp_len) len += temp_len;
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE ");
-               if (0 <= temp_len) len += temp_len;
 
                if ((range & CONTACTS_SEARCH_RANGE_NUMBER) && ctsvc_is_phonenumber(keyword)) {
                        char clean_num[strlen(keyword)+1+5];   /* for cc */
@@ -2047,12 +2458,15 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                         * If contact has 010 1234 5678 (normalized number is +cc 10 1234 5678),
                         *      then the contact should be searched by keyword +cc 10 1234 5678
                         */
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
                        ret = ctsvc_clean_number(keyword, clean_num, sizeof(clean_num), false);
                        if (0 < ret) {
                                const char *cc = ctsvc_get_network_cc(false);
 
-                               temp_len = SAFE_SNPRINTF(&query, &query_size, len,
-                                               "(normalized_number LIKE '%%");
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "(normalized_number LIKE '%%");
                                if (0 <= temp_len)
                                        len += temp_len;
 
@@ -2070,8 +2484,7 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                                if (0 <= temp_len)
                                        len += temp_len;
 
-                               temp_len = SAFE_SNPRINTF(&query, &query_size, len,
-                                               "%%' OR cleaned_number LIKE '%%");
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' OR cleaned_number LIKE '%%");
                                if (0 <= temp_len)
                                        len += temp_len;
 
@@ -2091,7 +2504,7 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                                        return CONTACTS_ERROR_OUT_OF_MEMORY;
                                }
 
-                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " SELECT * FROM ");
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "(SELECT * FROM ");
                                if (0 <= temp_len)
                                        len += temp_len;
 
@@ -2107,7 +2520,7 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                                if (0 <= temp_len)
                                        len += temp_len;
 
-                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ESCAPE '\\'");
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ESCAPE '\\')");
                                if (0 <= temp_len)
                                        len += temp_len;
                                free(temp_keyword);
@@ -2118,13 +2531,14 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                if (range & CONTACTS_SEARCH_RANGE_NAME) {
                        if (need_or) {
                                temp_len = SAFE_SNPRINTF(&query, &query_size, len, " OR ");
-                               if (0 <= temp_len) len += temp_len;
+                       } else {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE ");
                        }
-                       snprintf(temp_query, sizeof(temp_query),
-                                       "person_id IN (SELECT person_id "
-                                       "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0 AND  contact_id ");
+                       if (0 <= temp_len)
+                               len += temp_len;
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_query);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "person_id IN (SELECT "
+                                       "person_id FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0 AND contact_id IN");
                        if (0 <= temp_len)
                                len += temp_len;
 
@@ -2133,15 +2547,89 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                         * FTS can support to serach with multiple words
                         * If contact display_name is 'abc def', then the contact should be searched by 'def'
                         */
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " IN ");
+                       temp_len = __db_append_search_query(keyword, &query, &query_size, len,
+                                       CONTACTS_SEARCH_RANGE_NAME);
+                       if (0 <= temp_len)
+                               len = temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+               }
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") as temp_contacts");
+               if (0 <= temp_len)
+                       len += temp_len;
+               break;
+
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL:
+               if (range & CONTACTS_SEARCH_RANGE_NUMBER || range & CONTACTS_SEARCH_RANGE_DATA) {
+                       free(query);
+                       return CONTACTS_ERROR_INVALID_PARAMETER;
+               }
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, projection);
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM (");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               if (range & CONTACTS_SEARCH_RANGE_EMAIL) {
+                       /* search contact which has email address started with keyword */
+                       char *temp_keyword = __db_get_str_with_escape((char*)keyword,
+                                       strlen(keyword), true);
+                       if (NULL == temp_keyword) {
+                               ERR("__db_get_str_with_escape() Fail");
+                               free(query);
+                               return CONTACTS_ERROR_OUT_OF_MEMORY;
+                       }
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT * FROM ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE (email LIKE '");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_keyword);
                        if (0 <= temp_len)
                                len += temp_len;
 
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ESCAPE '\\')");
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       free(temp_keyword);
+                       need_or = true;
+               }
+
+               if (range & CONTACTS_SEARCH_RANGE_NAME) {
+                       if (need_or) {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " OR ");
+                               if (0 <= temp_len)
+                                       len += temp_len;
+                       }
+                       snprintf(temp_query, sizeof(temp_query), "person_id IN (SELECT person_id "
+                                       "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0 AND contact_id ");
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_query);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " IN ");
+                       if (0 <= temp_len)
+                               len += temp_len;
                        temp_len = __db_append_search_query(keyword, &query, &query_size, len,
                                        CONTACTS_SEARCH_RANGE_NAME);
                        if (0 <= temp_len)
                                len = temp_len;
-
                        temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
                        if (0 <= temp_len)
                                len += temp_len;
@@ -2150,13 +2638,13 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
                if (0 <= temp_len)
                        len += temp_len;
-       } else if (STRING_EQUAL == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL)) {
-               bool need_or = false;
-               if (range & CONTACTS_SEARCH_RANGE_NUMBER || range & CONTACTS_SEARCH_RANGE_DATA) {
+               break;
+
+       case CTSVC_ENUM_URI_PERSON:
+               if (range & CONTACTS_SEARCH_RANGE_EMAIL) {
                        free(query);
                        return CONTACTS_ERROR_INVALID_PARAMETER;
                }
-
                temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
                if (0 <= temp_len)
                        len += temp_len;
@@ -2165,81 +2653,154 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                if (0 <= temp_len)
                        len += temp_len;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM (");
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM ");
                if (0 <= temp_len)
                        len += temp_len;
 
-               if (range & CONTACTS_SEARCH_RANGE_EMAIL) {
-                       /* search contact which has email address started with keyword */
-                       char *temp_keyword = __db_get_str_with_escape((char*)keyword,
-                                       strlen(keyword), true);
-                       if (NULL == temp_keyword) {
-                               ERR("__db_get_str_with_escape() Fail");
-                               free(query);
-                               return CONTACTS_ERROR_OUT_OF_MEMORY;
-                       }
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT * FROM ");
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
+               if (0 <= temp_len)
+                       len += temp_len;
+       }
+
+       if (true == is_snippet) {
+               bool need_union = false;
+               char cond_data[CTS_SQL_MAX_LEN] = {0};
+               char clean_number[SAFE_STRLEN(keyword) + 1];
+               ctsvc_clean_number(keyword, clean_number, sizeof(clean_number), false);
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ", (SELECT contact_id temp_contact_id, "
+                               "datatype, _priority, _data FROM (");
+               if (0 <= temp_len)
+                       len += temp_len;
+
+               if (range & CONTACTS_SEARCH_RANGE_NAME) {
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT contact_id, "
+                                       "datatype, 1 as _priority, 'a' as _data FROM "CTS_TABLE_DATA" "
+                                       "WHERE contact_id IN (");
                        if (0 <= temp_len)
                                len += temp_len;
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
+                       char *query_name = _get_search_query_for_name(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_name);
                        if (0 <= temp_len)
                                len += temp_len;
+                       free(query_name);
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE (email LIKE '");
+                       /* datatype=1 NAME */
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND datatype=1 ");
                        if (0 <= temp_len)
                                len += temp_len;
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_keyword);
+                       need_union = true;
+               }
+               if (range & CONTACTS_SEARCH_RANGE_NUMBER) {
+                       if (true == need_union) {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION ");
+                               if (0 <= temp_len)
+                                       len += temp_len;
+                       }
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT contact_id, "
+                                       "datatype, 2 as _priority, data3 as _data FROM "CTS_TABLE_DATA" "
+                                       "WHERE contact_id IN (");
                        if (0 <= temp_len)
                                len += temp_len;
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "%%' ESCAPE '\\')");
+                       char *query_number = _get_search_query_for_number(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_number);
                        if (0 <= temp_len)
                                len += temp_len;
-                       free(temp_keyword);
-                       need_or = true;
-               }
+                       free(query_number);
 
-               if (range & CONTACTS_SEARCH_RANGE_NAME) {
-                       if (need_or) {
-                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " OR ");
+                       /* datatype=8 NUMBER */
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND datatype=8 ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       need_union = true;
+               }
+               if (range & CONTACTS_SEARCH_RANGE_DATA) {
+                       if (true == need_union) {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION ");
                                if (0 <= temp_len)
                                        len += temp_len;
                        }
+                       snprintf(cond_data, sizeof(cond_data), "SELECT contact_id, datatype, "
+                                       "(CASE "
+                                       "WHEN datatype=%d THEN 5 " /* POSTAL       */
+                                       "WHEN datatype=%d THEN 8 " /* MESSENGER    */
+                                       "WHEN datatype=%d THEN 4 " /* COMPANY      */
+                                       "WHEN datatype=%d THEN 3 " /* NICKNAME     */
+                                       "WHEN datatype=%d THEN 6 " /* EMAIL        */
+                                       "WHEN datatype=%d THEN 9 " /* RELATIONSHIP */
+                                       "WHEN datatype=%d THEN 7 " /* NOTE         */
+                                       "END) as _priority, "
+                                       "(CASE "
+                                       "WHEN datatype=%d THEN (COALESCE(data5||' ','')||"
+                                       "COALESCE(data6||' ','')||COALESCE(data7||' ','')||"
+                                       "COALESCE(data8||' ','')||COALESCE(data9,'')) " /* POSTAL       */
+                                       "WHEN datatype=%d THEN data3 " /* MESSENGER    */
+                                       "WHEN datatype=%d THEN (COALESCE(data3||' ','')||"
+                                       "COALESCE(data4||' ','')||COALESCE(data5||' ','')||"
+                                       "COALESCE(data6||' ','')||COALESCE(data7||' ','')||"
+                                       "COALESCE(data8||' ','')||COALESCE(data9||' ','')||"
+                                       "COALESCE(data10||' ','')||COALESCE(data11||' ','')) " /* COMPANY      */
+                                       "WHEN datatype=%d THEN data3 " /* NICKNAME     */
+                                       "WHEN datatype=%d THEN data3 " /* EMAIL        */
+                                       "WHEN datatype=%d THEN data3 " /* RELATIONSHIP */
+                                       "WHEN datatype=%d THEN data3 " /* NOTE         */
+                                       "END) as _data FROM "CTS_TABLE_DATA" WHERE contact_id IN (",
+                               CONTACTS_DATA_TYPE_POSTAL, CONTACTS_DATA_TYPE_MESSENGER, CONTACTS_DATA_TYPE_COMPANY,
+                               CONTACTS_DATA_TYPE_NICKNAME, CONTACTS_DATA_TYPE_EMAIL, CONTACTS_DATA_TYPE_RELATIONSHIP,
+                               CONTACTS_DATA_TYPE_NOTE, CONTACTS_DATA_TYPE_POSTAL, CONTACTS_DATA_TYPE_MESSENGER,
+                               CONTACTS_DATA_TYPE_COMPANY, CONTACTS_DATA_TYPE_NICKNAME, CONTACTS_DATA_TYPE_EMAIL,
+                               CONTACTS_DATA_TYPE_RELATIONSHIP, CONTACTS_DATA_TYPE_NOTE);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, cond_data);
+                       if (0 <= temp_len)
+                               len += temp_len;
 
-                       snprintf(temp_query, sizeof(temp_query),
-                                       "person_id IN (SELECT person_id "
-                                       "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0 AND  contact_id ");
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_query);
-                       if (0 <= temp_len) len += temp_len;
+                       char *query_data = _get_search_query_for_data(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_data);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       free(query_data);
 
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " IN ");
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND _data IS NOT NULL "
+                                       "AND _data LIKE ('%%' || '");
                        if (0 <= temp_len)
                                len += temp_len;
-                       temp_len = __db_append_search_query(keyword, &query, &query_size, len,
-                                       CONTACTS_SEARCH_RANGE_NAME);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, keyword);
                        if (0 <= temp_len)
-                               len = temp_len;
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
+                               len += temp_len;
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "' || '%%') ");
                        if (0 <= temp_len)
                                len += temp_len;
                }
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ")) as temp_data ON "
+                               "temp_data.temp_contact_id = temp_contacts.contact_id ");
+               if (0 <= temp_len)
+                       len += temp_len;
+       }
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
-               if (0 <= temp_len) len += temp_len;
-       } else {   /* CTSVC_VIEW_URI_PERSON */
-               if (range & CONTACTS_SEARCH_RANGE_EMAIL) {
-                       free(query);
-                       return CONTACTS_ERROR_INVALID_PARAMETER;
-               }
+       switch (enum_uri) {
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED:
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE temp_contacts.contact_id IN ");
+               if (0 <= temp_len)
+                       len += temp_len;
+               temp_len = __db_append_search_query(keyword, &query, &query_size, len, range);
+               if (0 <= temp_len)
+                       len = temp_len;
+               break;
 
-               snprintf(temp_query, sizeof(temp_query), "SELECT %s FROM %s, "
-                               "(SELECT person_id person_id_in_contact, addressbook_id "
-                               "FROM "CTS_TABLE_CONTACTS " "
-                               "WHERE deleted = 0 AND contact_id IN ",
-                               projection, table);
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, temp_query);
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER:
+               break;
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL:
+               break;
+       case CTSVC_ENUM_URI_PERSON:
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ", (SELECT contact_id, person_id "
+                               "person_id_in_contact, addressbook_id FROM "CTS_TABLE_CONTACTS" "
+                               "WHERE deleted = 0 AND contact_id IN ");
                if (0 <= temp_len)
                        len += temp_len;
 
@@ -2260,11 +2821,18 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                                ".person_id = temp_contacts.person_id_in_contact");
                if (0 <= temp_len)
                        len += temp_len;
+               break;
        }
 
        if (__ctsvc_db_view_has_display_name(view_uri, properties, ids_count))
                sortkey = ctsvc_get_sort_column();
 
+       if (true == is_snippet) {
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " GROUP BY temp_data.temp_contact_id");
+               if (0 <= temp_len)
+                       len += temp_len;
+       }
+
        if (sortkey) {
                len = __ctsvc_db_search_records_append_sort(view_uri, sortkey, keyword, len,
                                &query, &query_size);
@@ -2312,8 +2880,8 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
                        for (i = 0; i < ids_count; i++)
                                project[i] = properties[i].property_id;
 
-                       int ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt,
-                                       project, ids_count, &record);
+                       int ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt, project,
+                                       ids_count, is_snippet, keyword, start_match, end_match, token_number, &record);
 
                        free(project);
 
@@ -2324,23 +2892,35 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
 
                        for (i = 0; i < ids_count; i++) {
                                type = (properties[i].property_id & CTSVC_VIEW_DATA_TYPE_MASK);
-                               if (type == CTSVC_VIEW_DATA_TYPE_INT) {
+                               char *temp = NULL;
+                               switch (type) {
+                               case CTSVC_VIEW_DATA_TYPE_INT:
                                        ctsvc_record_set_int(record, properties[i].property_id,
                                                        ctsvc_stmt_get_int(stmt, i));
-                               } else if (type == CTSVC_VIEW_DATA_TYPE_STR) {
-                                       ctsvc_record_set_str(record, properties[i].property_id,
-                                                       ctsvc_stmt_get_text(stmt, i));
-                               } else if (type == CTSVC_VIEW_DATA_TYPE_BOOL) {
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_STR:
+                                       temp = ctsvc_stmt_get_text(stmt, i);
+                                       if (CTSVC_PROPERTY_PERSON_SNIPPET_STRING == properties[i].property_id) {
+                                               temp = ctsvc_utils_get_modified_str(temp, is_snippet, keyword,
+                                                               start_match, end_match, token_number);
+                                       }
+                                       ctsvc_record_set_str(record, properties[i].property_id, temp);
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_BOOL:
                                        ctsvc_record_set_bool(record, properties[i].property_id,
                                                        (ctsvc_stmt_get_int(stmt, i) ? true : false));
-                               } else if (type == CTSVC_VIEW_DATA_TYPE_LLI) {
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_LLI:
                                        ctsvc_record_set_lli(record, properties[i].property_id,
                                                        ctsvc_stmt_get_int64(stmt, i));
-                               } else if (type == CTSVC_VIEW_DATA_TYPE_DOUBLE) {
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_DOUBLE:
                                        ctsvc_record_set_double(record, properties[i].property_id,
                                                        ctsvc_stmt_get_dbl(stmt, i));
-                               } else {
+                                       break;
+                               default:
                                        ERR("unknown type (%d)", type);
+                                       break;
                                }
                        }
                }
@@ -2354,68 +2934,90 @@ static int __ctsvc_db_search_records_exec(const char *view_uri,
        return CONTACTS_ERROR_NONE;
 }
 
-static int __ctsvc_db_search_records(const char *view_uri, const char *keyword,
-               int offset, int limit, contacts_list_h *out_list)
+static int __ctsvc_db_search_records(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               bool is_snippet,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
 {
        int ret;
        unsigned int count;
        char *projection;
        const property_info_s *p;
        bool can_keyword_search = false;
+       int enum_uri = 0;
        int range = CONTACTS_SEARCH_RANGE_NAME | CONTACTS_SEARCH_RANGE_NUMBER | CONTACTS_SEARCH_RANGE_DATA;
 
        RETV_IF(NULL == keyword, CONTACTS_ERROR_INVALID_PARAMETER);
 
-       can_keyword_search = __ctsvc_db_view_can_keyword_search(view_uri);
+       can_keyword_search = __ctsvc_db_view_can_keyword_search(view_uri, &enum_uri);
        RETVM_IF(false == can_keyword_search, CONTACTS_ERROR_INVALID_PARAMETER,
                        "can not keyword search");
 
        p = ctsvc_view_get_all_property_infos(view_uri, &count);
-       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection);
+       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection, is_snippet);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("__db_create_projection() Fail(%d)", ret);
                return ret;
        }
 
-       ret = __ctsvc_db_search_records_exec(view_uri, p, count, projection, keyword, offset,
-                       limit, range, out_list);
+       ret = __ctsvc_db_search_records_exec(view_uri, enum_uri, p, count, projection,
+                       keyword, offset, limit, range, is_snippet, start_match, end_match, token_number, out_list);
        free(projection);
 
        return ret;
 }
 
-static int __ctsvc_db_search_records_with_range(const char *view_uri, const char *keyword,
-               int offset, int limit, int range, contacts_list_h *out_list)
+static int __ctsvc_db_search_records_with_range(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               bool is_snippet,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
 {
        int ret;
        unsigned int count;
        char *projection;
        const property_info_s *p;
        bool can_keyword_search = false;
+       int eunm_uri = 0;
 
        RETV_IF(NULL == keyword, CONTACTS_ERROR_INVALID_PARAMETER);
 
-       can_keyword_search = __ctsvc_db_view_can_keyword_search(view_uri);
+       can_keyword_search = __ctsvc_db_view_can_keyword_search(view_uri, &eunm_uri);
        RETV_IF(false == can_keyword_search, CONTACTS_ERROR_INVALID_PARAMETER);
 
        p = ctsvc_view_get_all_property_infos(view_uri, &count);
-       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection);
+       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection, is_snippet);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__db_create_projection() Fail(%d)", ret);
 
-       ret = __ctsvc_db_search_records_exec(view_uri, p, count, projection, keyword, offset,
-                       limit, range, out_list);
+       ret = __ctsvc_db_search_records_exec(view_uri, eunm_uri, p, count, projection,
+                       keyword, offset, limit, range, is_snippet, start_match, end_match, token_number, out_list);
        free(projection);
 
        return ret;
 }
 
 static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_query,
+               int enum_uri,
                const char *projection,
                const char *condition,
                GSList *bind,
                const char *keyword,
                int offset,
                int limit,
+               bool is_snippet,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
                contacts_list_h *out_list)
 {
        char *query = NULL;
@@ -2447,62 +3049,180 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
 
        len = 0;
 
-       if (s_query->distinct)
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT DISTINCT ");
-       else
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
-       if (0 <= temp_len) len += temp_len;
-       temp_len = SAFE_SNPRINTF(&query, &query_size, len, projection);
-       if (0 <= temp_len) len += temp_len;
-       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM ");
-       if (0 <= temp_len) len += temp_len;
-
-       if (STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
-                       || STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)
-                       || STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_ASSIGNED)
-                       || STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED)) {
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
-               if (0 <= temp_len)
-                       len += temp_len;
-
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE person_id IN ");
-               if (0 <= temp_len)
-                       len += temp_len;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT ");
+       if (0 <= temp_len)
+               len += temp_len;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " ( SELECT person_id FROM ");
+       if (s_query->distinct) {
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, "DISTINCT ");
                if (0 <= temp_len)
                        len += temp_len;
+       }
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, projection);
+       if (0 <= temp_len)
+               len += temp_len;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " FROM ");
+       if (0 <= temp_len)
+               len += temp_len;
+       temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
+       if (0 <= temp_len)
+               len += temp_len;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, CTS_TABLE_CONTACTS);
+       switch (enum_uri) {
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED:
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " temp_contacts ");
                if (0 <= temp_len)
                        len += temp_len;
+               break;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len,
-                               " WHERE deleted = 0 AND contact_id IN ");
-               if (0 <= temp_len)
-                       len += temp_len;
+       case CTSVC_ENUM_URI_PERSON:
+               break;
 
-               person_contact_query = true;
-       } else if (STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER)
-                       || STRING_EQUAL == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL)) {
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL:
+       default:
                free(query);
                return CONTACTS_ERROR_INVALID_PARAMETER;
-       } else {   /* CTSVC_VIEW_URI_PERSON */
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
+       }
+
+       if (true == is_snippet) {
+               bool need_union = false;
+               char cond_data[CTS_SQL_MAX_LEN] = {0};
+               char clean_number[SAFE_STRLEN(keyword) + 1];
+               ctsvc_clean_number(keyword, clean_number, sizeof(clean_number), false);
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ", (SELECT contact_id temp_contact_id, "
+                               "datatype, _priority, _data FROM (");
                if (0 <= temp_len)
                        len += temp_len;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ", "
-                               "(SELECT contact_id, person_id person_id_in_contact, addressbook_id FROM ");
+               if (range & CONTACTS_SEARCH_RANGE_NAME) {
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT contact_id, "
+                                       "datatype, 1 as _priority, 'a' as _data FROM "CTS_TABLE_DATA" "
+                                       "WHERE contact_id IN (");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       char *query_name = _get_search_query_for_name(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_name);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       free(query_name);
+
+                       /* datatype=1 NAME */
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND datatype=1 ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       need_union = true;
+               }
+               if (range & CONTACTS_SEARCH_RANGE_NUMBER) {
+                       if (true == need_union) {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION ");
+                               if (0 <= temp_len)
+                                       len += temp_len;
+                       }
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "SELECT contact_id, "
+                                       "datatype, 2 as _priority, data3 as _data FROM "CTS_TABLE_DATA" "
+                                       "WHERE contact_id IN (");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       char *query_number = _get_search_query_for_number(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_number);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       free(query_number);
+
+                       /* datatype=8 NUMBER */
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND datatype=8 ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       need_union = true;
+               }
+               if (range & CONTACTS_SEARCH_RANGE_DATA) {
+                       if (true == need_union) {
+                               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " UNION ");
+                               if (0 <= temp_len)
+                                       len += temp_len;
+                       }
+                       snprintf(cond_data, sizeof(cond_data), "SELECT contact_id, datatype, "
+                                       "(CASE "
+                                       "WHEN datatype=%d THEN 5 " /* POSTAL       */
+                                       "WHEN datatype=%d THEN 8 " /* MESSENGER    */
+                                       "WHEN datatype=%d THEN 4 " /* COMPANY      */
+                                       "WHEN datatype=%d THEN 3 " /* NICKNAME     */
+                                       "WHEN datatype=%d THEN 6 " /* EMAIL        */
+                                       "WHEN datatype=%d THEN 9 " /* RELATIONSHIP */
+                                       "WHEN datatype=%d THEN 7 " /* NOTE         */
+                                       "END) as _priority, "
+                                       "(CASE "
+                                       "WHEN datatype=%d THEN (COALESCE(data5||' ','')||"
+                                       "COALESCE(data6||' ','')||COALESCE(data7||' ','')||"
+                                       "COALESCE(data8||' ','')||COALESCE(data9,'')) " /* POSTAL       */
+                                       "WHEN datatype=%d THEN data3 " /* MESSENGER    */
+                                       "WHEN datatype=%d THEN (COALESCE(data3||' ','')||"
+                                       "COALESCE(data4||' ','')||COALESCE(data5||' ','')||"
+                                       "COALESCE(data6||' ','')||COALESCE(data7||' ','')||"
+                                       "COALESCE(data8||' ','')||COALESCE(data9||' ','')||"
+                                       "COALESCE(data10||' ','')||COALESCE(data11||' ','')) " /* COMPANY      */
+                                       "WHEN datatype=%d THEN data3 " /* NICKNAME     */
+                                       "WHEN datatype=%d THEN data3 " /* EMAIL        */
+                                       "WHEN datatype=%d THEN data3 " /* RELATIONSHIP */
+                                       "WHEN datatype=%d THEN data3 " /* NOTE         */
+                                       "END) as _data FROM "CTS_TABLE_DATA" WHERE contact_id IN (",
+                               CONTACTS_DATA_TYPE_POSTAL, CONTACTS_DATA_TYPE_MESSENGER, CONTACTS_DATA_TYPE_COMPANY,
+                               CONTACTS_DATA_TYPE_NICKNAME, CONTACTS_DATA_TYPE_EMAIL, CONTACTS_DATA_TYPE_RELATIONSHIP,
+                               CONTACTS_DATA_TYPE_NOTE, CONTACTS_DATA_TYPE_POSTAL, CONTACTS_DATA_TYPE_MESSENGER,
+                               CONTACTS_DATA_TYPE_COMPANY, CONTACTS_DATA_TYPE_NICKNAME, CONTACTS_DATA_TYPE_EMAIL,
+                               CONTACTS_DATA_TYPE_RELATIONSHIP, CONTACTS_DATA_TYPE_NOTE);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, cond_data);
+                       if (0 <= temp_len)
+                               len += temp_len;
+
+                       char *query_data = _get_search_query_for_data(keyword);
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, query_data);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       free(query_data);
+
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") AND _data IS NOT NULL "
+                                       "AND _data LIKE ('%%' || '");
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, keyword);
+                       if (0 <= temp_len)
+                               len += temp_len;
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, "' || '%%') ");
+                       if (0 <= temp_len)
+                               len += temp_len;
+               }
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ")) as temp_data ON "
+                               "temp_data.temp_contact_id = temp_contacts.contact_id ");
                if (0 <= temp_len)
                        len += temp_len;
+       }
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, CTS_TABLE_CONTACTS);
+       switch (enum_uri) {
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_CONTACT:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_ASSIGNED:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED:
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " WHERE temp_contacts.person_id IN (SELECT "
+                               "person_id FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0 AND temp_contacts.contact_id IN ");
                if (0 <= temp_len)
                        len += temp_len;
 
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len,
-                               " WHERE deleted = 0) temp_contacts ON ");
+               person_contact_query = true;
+               break;
+
+       case CTSVC_ENUM_URI_PERSON:
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ", (SELECT contact_id, "
+                               "person_id person_id_in_contact, addressbook_id FROM "CTS_TABLE_CONTACTS" "
+                               "WHERE deleted = 0) temp_contacts ON ");
                if (0 <= temp_len)
                        len += temp_len;
 
@@ -2514,6 +3234,12 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
                                ".person_id = temp_contacts.person_id_in_contact WHERE temp_contacts.contact_id IN ");
                if (0 <= temp_len)
                        len += temp_len;
+               break;
+
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_NUMBER:
+       case CTSVC_ENUM_URI_READ_ONLY_PERSON_EMAIL:
+       default:
+               return CONTACTS_ERROR_INVALID_PARAMETER;
        }
 
        temp_len = __db_append_search_query(keyword, &query, &query_size, len, range);
@@ -2521,17 +3247,15 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
                len = temp_len;
 
        if (person_contact_query) {
-               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " ) ");
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, ") ");
                if (0 <= temp_len)
                        len += temp_len;
        }
 
        if (condition && *condition) {
                if (person_contact_query) {
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " AND contact_id IN (");
-                       if (0 <= temp_len)
-                               len += temp_len;
-                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " SELECT contact_id FROM ");
+                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " AND contact_id IN "
+                                       "(SELECT contact_id FROM ");
                        if (0 <= temp_len)
                                len += temp_len;
                        temp_len = SAFE_SNPRINTF(&query, &query_size, len, table);
@@ -2553,6 +3277,12 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
                        len += temp_len;
        }
 
+       if (true == is_snippet) {
+               temp_len = SAFE_SNPRINTF(&query, &query_size, len, " GROUP BY temp_data.temp_contact_id");
+               if (0 <= temp_len)
+                       len += temp_len;
+       }
+
        if (__ctsvc_db_view_has_display_name(s_query->view_uri, s_query->properties, s_query->property_count))
                sortkey = ctsvc_get_sort_column();
 
@@ -2631,8 +3361,12 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
        } while (0);
 
        ret = ctsvc_query_prepare(query, &stmt);
+       if (NULL == stmt) {
+               ERR("ctsvc_query_prepare() Fail(%d)[%s]", ret, query);
+               free(query);
+               return ret;
+       }
        free(query);
-       RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
 
        i = 1;
        len = g_slist_length(bind);
@@ -2667,7 +3401,7 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
                        }
 
                        ret = ctsvc_db_person_create_record_from_stmt_with_projection(stmt, project,
-                                       ids_count, &record);
+                                       ids_count, is_snippet, keyword, start_match, end_match, token_number, &record);
                        if (CONTACTS_ERROR_NONE != ret)
                                ERR("ctsvc_db_person_create_record_from_stmt_with_projection() Fail(%d)", ret);
 
@@ -2696,18 +3430,33 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
 
                                type = __ctsvc_db_get_property_type(s_query->properties,
                                                s_query->property_count, property_id);
-                               if (type == CTSVC_VIEW_DATA_TYPE_INT)
+
+                               char *temp = NULL;
+                               switch (type) {
+                               case CTSVC_VIEW_DATA_TYPE_INT:
                                        ctsvc_record_set_int(record, property_id, ctsvc_stmt_get_int(stmt, i));
-                               else if (type == CTSVC_VIEW_DATA_TYPE_STR)
-                                       ctsvc_record_set_str(record, property_id, ctsvc_stmt_get_text(stmt, i));
-                               else if (type == CTSVC_VIEW_DATA_TYPE_BOOL)
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_STR:
+                                       temp = ctsvc_stmt_get_text(stmt, i);
+                                       if (CTSVC_PROPERTY_PERSON_SNIPPET_STRING == property_id) {
+                                               temp = ctsvc_utils_get_modified_str(temp, is_snippet, keyword,
+                                                               start_match, end_match, token_number);
+                                       }
+                                       ctsvc_record_set_str(record, property_id, temp);
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_BOOL:
                                        ctsvc_record_set_bool(record, property_id, (ctsvc_stmt_get_int(stmt, i) ? true : false));
-                               else if (type == CTSVC_VIEW_DATA_TYPE_LLI)
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_LLI:
                                        ctsvc_record_set_lli(record, property_id, ctsvc_stmt_get_int64(stmt, i));
-                               else if (type == CTSVC_VIEW_DATA_TYPE_DOUBLE)
+                                       break;
+                               case CTSVC_VIEW_DATA_TYPE_DOUBLE:
                                        ctsvc_record_set_double(record, property_id, ctsvc_stmt_get_dbl(stmt, i));
-                               else
+                                       break;
+                               default:
                                        ERR("unknown type (%d)", type);
+                                       break;
+                               }
                        }
                }
                ctsvc_list_prepend(list, record);
@@ -2719,8 +3468,15 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
        return CONTACTS_ERROR_NONE;
 }
 
-static int __ctsvc_db_search_records_with_query(contacts_query_h query, const char *keyword,
-               int offset, int limit, contacts_list_h *out_list)
+static int __ctsvc_db_search_records_with_query(contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               bool is_snippet,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
 {
        int ret;
        char *condition = NULL;
@@ -2729,18 +3485,17 @@ static int __ctsvc_db_search_records_with_query(contacts_query_h query, const ch
        GSList *bind_text = NULL;
        GSList *cursor = NULL;
        bool can_keyword_search;
+       int enum_uri = 0;
 
        RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
        RETV_IF(NULL == keyword, CONTACTS_ERROR_INVALID_PARAMETER);
 
-       can_keyword_search = __ctsvc_db_view_can_keyword_search(s_query->view_uri);
+       can_keyword_search = __ctsvc_db_view_can_keyword_search(s_query->view_uri, &enum_uri);
        RETV_IF(false == can_keyword_search, CONTACTS_ERROR_INVALID_PARAMETER);
 
        ret = __db_create_projection(s_query->view_uri, s_query->properties,
-                       s_query->property_count,
-                       s_query->projection,
-                       s_query->projection_count,
-                       &projection);
+                       s_query->property_count, s_query->projection, s_query->projection_count,
+                       &projection, is_snippet);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__db_create_projection Fail(%d)", ret);
 
        if (s_query->filter) {
@@ -2753,8 +3508,8 @@ static int __ctsvc_db_search_records_with_query(contacts_query_h query, const ch
                }
        }
 
-       ret = __ctsvc_db_search_records_with_query_exec(s_query, projection, condition,
-                       bind_text, keyword, offset, limit, out_list);
+       ret = __ctsvc_db_search_records_with_query_exec(s_query, enum_uri, projection, condition,
+                       bind_text, keyword, offset, limit, is_snippet, start_match, end_match, token_number, out_list);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("__ctsvc_db_search_records_with_query_exec Fail(%d)", ret);
                for (cursor = bind_text; cursor; cursor = cursor->next)
@@ -2940,7 +3695,7 @@ static int __ctsvc_db_get_count(const char *view_uri, int *out_count)
        char *projection;
 
        const property_info_s *p = ctsvc_view_get_all_property_infos(view_uri, &count);
-       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection);
+       ret = __db_create_projection(view_uri, p, count, NULL, 0, &projection, false);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__db_create_projection Fail(%d)", ret);
 
        __ctsvc_db_get_count_exec(view_uri, p, count, projection, out_count);
@@ -3064,10 +3819,8 @@ static int __ctsvc_db_get_count_with_query(contacts_query_h query, int *out_coun
        }
 
        ret = __db_create_projection(s_query->view_uri, s_query->properties,
-                       s_query->property_count,
-                       s_query->projection,
-                       s_query->projection_count,
-                       &projection);
+                       s_query->property_count, s_query->projection, s_query->projection_count,
+                       &projection, false);
        if (CONTACTS_ERROR_NONE != ret) {
                ERR("__db_create_projection() Fail(%d)", ret);
                for (cursor = bind_text; cursor; cursor = cursor->next)
@@ -3524,7 +4277,8 @@ int ctsvc_db_search_records(const char *view_uri, const char *keyword,
        *out_list = NULL;
        RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
 
-       return __ctsvc_db_search_records(view_uri, keyword, offset, limit, out_list);
+       return __ctsvc_db_search_records(view_uri, keyword, offset, limit, false, NULL,
+                       NULL, -1, out_list);
 }
 
 int ctsvc_db_search_records_with_range(const char *view_uri, const char *keyword,
@@ -3536,7 +4290,7 @@ int ctsvc_db_search_records_with_range(const char *view_uri, const char *keyword
        RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
 
        return __ctsvc_db_search_records_with_range(view_uri, keyword, offset, limit, range,
-                       out_list);
+                       false, NULL, NULL, -1, out_list);
 }
 
 int ctsvc_db_search_records_with_query(contacts_query_h query, const char *keyword,
@@ -3546,7 +4300,60 @@ int ctsvc_db_search_records_with_query(contacts_query_h query, const char *keywo
        *out_list = NULL;
        RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
 
-       return __ctsvc_db_search_records_with_query(query, keyword, offset, limit, out_list);
+       return __ctsvc_db_search_records_with_query(query, keyword, offset, limit, false,
+                       NULL, NULL, -1, out_list);
+}
+
+int ctsvc_db_search_records_for_snippet(const char *view_uri, const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+       RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
+
+       return __ctsvc_db_search_records(view_uri, keyword, offset, limit, true, start_match,
+                       end_match, token_number, out_list);
+}
+
+int ctsvc_db_search_records_with_range_for_snippet(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+       RETV_IF(range == 0, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
+
+       return __ctsvc_db_search_records_with_range(view_uri, keyword, offset, limit, range,
+                       true, start_match, end_match, token_number, out_list);
+}
+
+int ctsvc_db_search_records_with_query_for_snippet(contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list)
+{
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+       RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
+
+       return __ctsvc_db_search_records_with_query(query, keyword, offset, limit, true,
+                       start_match, end_match, token_number, out_list);
 }
 
 int ctsvc_db_get_count(const char *view_uri, int *out_count)
index 8d68e4c..4353556 100644 (file)
@@ -44,6 +44,31 @@ int ctsvc_db_search_records_with_range(const char *view_uri, const char *keyword
                int offset, int limit, int range, contacts_list_h *out_list);
 int ctsvc_db_search_records_with_query(contacts_query_h query, const char *keyword,
                int offset, int limit, contacts_list_h *out_list);
+int ctsvc_db_search_records_for_snippet(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
+int ctsvc_db_search_records_with_range_for_snippet(const char *view_uri,
+               const char *keyword,
+               int offset,
+               int limit,
+               int range,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
+int ctsvc_db_search_records_with_query_for_snippet(contacts_query_h query,
+               const char *keyword,
+               int offset,
+               int limit,
+               const char *start_match,
+               const char *end_match,
+               int token_number,
+               contacts_list_h *out_list);
 int ctsvc_db_get_status(contacts_db_status_e *status);
 int ctsvc_db_insert_records_with_vcard(const char *vcard_stream, int **record_id_array,
                int *count);
index 2d291a1..f492264 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "test_main.h"
 #include "test_debug.h"
+#include "test_query.h"
 
 int _print_errors(int argc, char **argv)
 {
@@ -43,6 +44,7 @@ int _print_errors(int argc, char **argv)
 
 static const func _func[] = {
        _print_errors,
+       test_query,
 };
 
 bool test_main_is_selected(int argc, char **argv, int depth, const func test_func[], int count)
index 11020cc..00cbf4a 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <contacts.h>
-
-#include "test_main.h"
+#include "contacts.h"
 #include "test_debug.h"
+#include "test_main.h"
+#include "test_utils.h"
+
+#define TEST_CONTACT_COUNT 2
+
+enum {
+       TEST_URI_PERSON_CONTACT,
+       TEST_URI_PERSON_GROUPREL,
+       TEST_URI_PERSON_GROUP_ASSIGNED,
+       TEST_URI_PERSON_GROUP_NOT_ASSIGNED,
+       TEST_URI_PERSON_NUMBER,
+       TEST_URI_PERSON_EMAIL,
+       TEST_URI_PERSON,
+};
 
-int test_query_person_contact(int argc, char **argv)
-{
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
+static const char *uris[] = {
+       "tizen.contacts_view.person/simple_contact",
+       "tizen.contacts_view.person/simple_contact/number",
+       "tizen.contacts_view.person/simple_contact/email",
+       "tizen.contacts_view.person/simple_contact/group",
+       "tizen.contacts_view.person/simple_contact/group_assigned",
+       "tizen.contacts_view.person/simple_contact/group_not_assigned",
+       "tizen.contacts_view.person",
+};
 
-       int limit = -1;
-       int offset = -1;
+static const char *keywords[] = {
+       "gildo",
+       "123", "ㅎㄱ", "ㄱㄷ", "music", "Seoul",
+       "SEOUL", "run", "tiz", "plat", "hong",
+       "+", " ",
+};
 
-       contacts_connect();
 
-       contacts_list_h list = NULL;
-       contacts_db_search_records(_contacts_person_contact._uri, keyword, limit, offset, &list);
 
-       int count = 0;
-       contacts_list_get_count(list, &count);
-       DBG("count(%d)", count);
+static contacts_record_h _get_name(const char *first, const char *last)
+{
+       contacts_record_h name = NULL;
+       contacts_record_create(_contacts_name._uri, &name);
+       contacts_record_set_str(name, _contacts_name.first, first);
+       contacts_record_set_str(name, _contacts_name.last, last);
+       return name;
+}
 
-       contacts_list_first(list);
-       contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_contact.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_contact.display_name_index, &name_index);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s]", name_index, name);
-               contacts_list_next(list);
-       }
+static contacts_record_h _get_number(const char *phone_number)
+{
+       contacts_record_h number = NULL;
+       contacts_record_create(_contacts_number._uri, &number);
+       contacts_record_set_str(number, _contacts_number.number, phone_number);
+       return number;
+}
 
-       contacts_disconnect();
+static contacts_record_h _get_email(int type, const char *email_address)
+{
+       contacts_record_h email = NULL;
+       contacts_record_create(_contacts_email._uri, &email);
+       contacts_record_set_int(email, _contacts_email.type, type);
+       contacts_record_set_str(email, _contacts_email.email, email_address);
+       return email;
+}
 
-       return 0;
+static contacts_record_h _get_nickname(const char *name)
+{
+       contacts_record_h nickname = NULL;
+       contacts_record_create(_contacts_nickname._uri, &nickname);
+       contacts_record_set_str(nickname, _contacts_nickname.name, name);
+       return nickname;
 }
 
-int test_query_with_query_person_contact(int argc, char **argv)
+static contacts_record_h _get_address(const char *street, const char *locality,
+               const char *region, const char *country)
 {
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
+       contacts_record_h address = NULL;
+       contacts_record_create(_contacts_address._uri, &address);
+       contacts_record_set_str(address, _contacts_address.street, street);
+       contacts_record_set_str(address, _contacts_address.locality, locality);
+       contacts_record_set_str(address, _contacts_address.region, region);
+       contacts_record_set_str(address, _contacts_address.country, country);
+       return address;
+}
 
-       int limit = -1;
-       int offset = -1;
+static contacts_record_h _get_note(const char *contents)
+{
+       contacts_record_h note = NULL;
+       contacts_record_create(_contacts_note._uri, &note);
+       contacts_record_set_str(note, _contacts_note.note, contents);
+       return note;
+}
 
-       contacts_connect();
+static contacts_record_h _get_company(const char *department, const char *name,
+               const char *role)
+{
+       contacts_record_h company = NULL;
+       contacts_record_create(_contacts_company._uri, &company);
+       contacts_record_set_str(company, _contacts_company.department, department);
+       contacts_record_set_str(company, _contacts_company.name, name);
+       contacts_record_set_str(company, _contacts_company.role, role);
+       return company;
+}
 
-       contacts_query_h query = NULL;
-       contacts_query_create(_contacts_person_contact._uri, &query);
+int _insert_contact_01(int *id)
+{
+       int contact_id = 0;
+       contacts_record_h contact = NULL;
+       contacts_record_create(_contacts_contact._uri, &contact);
+       contacts_record_add_child_record(contact, _contacts_contact.name,
+                       _get_name("홍길동", "korea123"));
+       contacts_record_add_child_record(contact, _contacts_contact.number,
+                       _get_number("010-1234-1234"));
+       contacts_record_add_child_record(contact, _contacts_contact.email,
+                       _get_email(CONTACTS_EMAIL_TYPE_HOME, "gildong.hong@music.com"));
+       contacts_record_add_child_record(contact, _contacts_contact.nickname,
+                       _get_nickname("super"));
+       contacts_record_add_child_record(contact, _contacts_contact.address,
+                       _get_address("hongic Univ", "mapo", "Seoul", "Korea"));
+       contacts_record_add_child_record(contact, _contacts_contact.note,
+                       _get_note("running"));
+       contacts_record_add_child_record(contact, _contacts_contact.company,
+                       _get_company("Platform Lab", "tizen", "PIMS"));
+       contacts_db_insert_record(contact, &contact_id);
+       contacts_record_destroy(contact, true);
+       DBG("contact_id(%d)", contact_id);
+
+       if (id)
+               *id = contact_id;
 
-       contacts_filter_h filter = NULL;
-       contacts_filter_create(_contacts_person_contact._uri, &filter);
+       return 0;
+}
 
-       contacts_filter_add_int(filter,
-                       _contacts_person_contact.address_book_id, CONTACTS_MATCH_EQUAL, 0);
-       contacts_query_set_filter(query, filter);
+int _insert_contact_02(int *id)
+{
+       int contact_id = 0;
+       contacts_record_h contact = NULL;
+       contacts_record_create(_contacts_contact._uri, &contact);
+       contacts_record_add_child_record(contact, _contacts_contact.name,
+                       _get_name("AlpaGo", "pro9"));
+       contacts_record_add_child_record(contact, _contacts_contact.number,
+                       _get_number("+851034123412"));
+       contacts_record_add_child_record(contact, _contacts_contact.email,
+                       _get_email(CONTACTS_EMAIL_TYPE_HOME, "alpago@baduk.com"));
+       contacts_record_add_child_record(contact, _contacts_contact.nickname,
+                       _get_nickname("prime"));
+       contacts_record_add_child_record(contact, _contacts_contact.address,
+                       _get_address("broad", "young123", "Gyoung", "Korea"));
+       contacts_record_add_child_record(contact, _contacts_contact.note,
+                       _get_note("day123"));
+       contacts_record_add_child_record(contact, _contacts_contact.company,
+                       _get_company("customer", "new123", "role"));
+       contacts_db_insert_record(contact, &contact_id);
+       contacts_record_destroy(contact, true);
+       DBG("contact_id(%d)", contact_id);
+
+       if (id)
+               *id = contact_id;
 
-       contacts_list_h list = NULL;
-       contacts_db_search_records_with_query(query, keyword, limit, offset, &list);
+       return 0;
+}
 
-       contacts_filter_destroy(filter);
-       contacts_query_destroy(query);
 
-       int count = 0;
-       contacts_list_get_count(list, &count);
-       DBG("count(%d)", count);
+static void _delete_contact(int contact_id)
+{
+       contacts_db_delete_record(_contacts_contact._uri, contact_id);
+}
 
-       contacts_list_first(list);
-       contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_contact.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_contact.display_name_index, &name_index);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s]", name_index, name);
-               contacts_list_next(list);
+static void _get_query_on_uri(const char *uri, int limit, int offset, contacts_query_h *out_query)
+{
+       contacts_query_h query = NULL;
+       contacts_query_create(uri, &query);
+
+       contacts_filter_h filter = NULL;
+       contacts_filter_create(uri, &filter);
+
+
+       if (0 == strcmp(uri, _contacts_person_contact._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_contact.person_id,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person_grouprel._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_grouprel.link_count,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person_group_assigned._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_group_assigned.person_id,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person_group_not_assigned._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_group_not_assigned.link_count,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person_number._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_number.person_id,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person_email._uri)) {
+               contacts_filter_add_int(filter, _contacts_person_email.person_id,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else if (0 == strcmp(uri, _contacts_person._uri)) {
+               contacts_filter_add_int(filter, _contacts_person.link_count,
+                               CONTACTS_MATCH_GREATER_THAN, 0);
+       } else {
+               ERR("Invalid uri[%s]", uri);
+               return;
        }
 
-       contacts_disconnect();
+       contacts_query_set_filter(query, filter);
+       contacts_filter_destroy(filter);
 
-       return 0;
+       if (out_query)
+               *out_query = query;
 }
 
-int test_query_person_number(int argc, char **argv)
+static int _check_list(const char *uri, contacts_list_h in_list, bool is_snippet)
 {
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
-
-       int limit = -1;
-       int offset = -1;
-
-       contacts_connect();
+       if (NULL == in_list) {
+               ERR("NO list");
+               return 0;
+       }
 
-       contacts_list_h list = NULL;
-       contacts_db_search_records(_contacts_person_number._uri, keyword, limit, offset, &list);
+       int uri_type = -1;
+       if (0 == strcmp(uri, _contacts_person_contact._uri)) {
+               uri_type = TEST_URI_PERSON_CONTACT;
+       } else if (0 == strcmp(uri, _contacts_person_grouprel._uri)) {
+               uri_type = TEST_URI_PERSON_GROUPREL;
+       } else if (0 == strcmp(uri, _contacts_person_group_assigned._uri)) {
+               uri_type = TEST_URI_PERSON_GROUP_ASSIGNED;
+       } else if (0 == strcmp(uri, _contacts_person_group_not_assigned._uri)) {
+               uri_type = TEST_URI_PERSON_GROUP_NOT_ASSIGNED;
+       } else if (0 == strcmp(uri, _contacts_person_number._uri)) {
+               uri_type = TEST_URI_PERSON_NUMBER;
+       } else if (0 == strcmp(uri, _contacts_person_email._uri)) {
+               uri_type = TEST_URI_PERSON_EMAIL;
+       } else if (0 == strcmp(uri, _contacts_person._uri)) {
+               uri_type = TEST_URI_PERSON;
+       } else {
+               ERR("Invalid uri[%s]", uri);
+               return 0;
+       }
 
        int count = 0;
-       contacts_list_get_count(list, &count);
+       contacts_list_get_count(in_list, &count);
        DBG("count(%d)", count);
 
-       contacts_list_first(list);
+       contacts_list_first(in_list);
        contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.display_name_index, &name_index);
+       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(in_list, &record)) {
+               int contact_id = 0;
+               char *display_name = NULL;
                char *number = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.number, &number);
-               char *normalized_number = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.normalized_number, &normalized_number);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s] number[%s] normalized_number[%s]",
-                               name_index, name, number, normalized_number);
-               contacts_list_next(list);
-       }
+               int snippet_type = NULL;
+               char *snippet_string = NULL;
+
+               switch (uri_type) {
+               case TEST_URI_PERSON_CONTACT:
+                       contacts_record_get_int(record, _contacts_person_contact.contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_contact.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_contact.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_contact.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON_GROUPREL:
+                       contacts_record_get_int(record, _contacts_person_grouprel.contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_grouprel.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_grouprel.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_grouprel.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON_GROUP_ASSIGNED:
+                       contacts_record_get_int(record, _contacts_person_group_assigned.contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_group_assigned.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_group_assigned.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_group_assigned.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON_GROUP_NOT_ASSIGNED:
+                       contacts_record_get_int(record, _contacts_person_group_not_assigned.contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_group_not_assigned.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_group_not_assigned.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_group_not_assigned.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON_NUMBER:
+                       contacts_record_get_int(record, _contacts_person_number.display_contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_number.display_name, &display_name);
+                       contacts_record_get_str_p(record, _contacts_person_number.number, &number);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_number.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_number.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON_EMAIL:
+                       contacts_record_get_int(record, _contacts_person_email.display_contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person_email.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person_email.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person_email.snippet_string, &snippet_string);
+                       break;
+               case TEST_URI_PERSON:
+                       contacts_record_get_int(record, _contacts_person.display_contact_id, &contact_id);
+                       contacts_record_get_str_p(record, _contacts_person.display_name, &display_name);
+                       if (false == is_snippet)
+                               break;
+
+                       contacts_record_get_int(record, _contacts_person.snippet_type, &snippet_type);
+                       contacts_record_get_str_p(record, _contacts_person.snippet_string, &snippet_string);
+                       break;
+               }
+               DBG("id(%d) name[%s] |%d|%s|", contact_id, display_name, snippet_type, snippet_string);
 
-       contacts_disconnect();
+               contacts_list_next(in_list);
+       }
 
        return 0;
 }
 
-int test_query_with_query_person_number(int argc, char **argv)
+static int test_get_records(int argc, char **argv)
 {
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
+       DBG("[%s]", __func__);
 
-       int limit = -1;
-       int offset = -1;
+       int i;
+       int i_count = sizeof(uris)/sizeof(uris[0]);
 
-       contacts_connect();
+       const char *uri = NULL;
+       int offset = 0;
+       int limit = 0;
 
-       contacts_query_h query = NULL;
-       contacts_query_create(_contacts_person_number._uri, &query);
+       if (3 < argc) {
+               i_count = 1;
+       }
 
-       contacts_filter_h filter = NULL;
-       contacts_filter_create(_contacts_person_number._uri, &filter);
+       contacts_connect();
 
-       contacts_filter_add_bool(filter,
-                       _contacts_person_number.has_phonenumber, true);
-       contacts_query_set_filter(query, filter);
+       int ids[TEST_CONTACT_COUNT] = {0};
+       _insert_contact_01(&ids[0]);
+       _insert_contact_02(&ids[1]);
 
-       contacts_list_h list = NULL;
-       contacts_db_search_records_with_query(query, keyword, limit, offset, &list);
+       for (i = 0; i < i_count; i++) {
+               uri = 3 < argc ? argv[3] : uris[i];
+               DBG("uri[%s]", uri);
 
-       contacts_filter_destroy(filter);
-       contacts_query_destroy(query);
+               contacts_list_h get_list = NULL;
 
-       int count = 0;
-       contacts_list_get_count(list, &count);
-       DBG("count(%d)", count);
+               DBG("search_records");
+               contacts_db_get_all_records(uri, offset, limit, &get_list);
+               _check_list(uri, get_list, false);
+               contacts_list_destroy(get_list, true);
 
-       contacts_list_first(list);
-       contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.display_name_index, &name_index);
-               char *number = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.number, &number);
-               char *normalized_number = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_number.normalized_number, &normalized_number);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s] number[%s] normalized_number[%s]",
-                               name_index, name, number, normalized_number);
-               contacts_list_next(list);
+               DBG("search_records_with_query");
+               contacts_query_h query = NULL;
+               _get_query_on_uri(uri, limit, offset, &query);
+               contacts_db_get_records_with_query(query, offset, limit, &get_list);
+               _check_list(uri, get_list, false);
+               contacts_list_destroy(get_list, true);
+               contacts_query_destroy(query);
        }
 
-       contacts_disconnect();
+       for (i = 0; i < TEST_CONTACT_COUNT; i++)
+               _delete_contact(ids[i]);
 
+       contacts_disconnect();
        return 0;
 }
 
-int test_query_person_email(int argc, char **argv)
+static int test_search_records(int argc, char **argv)
 {
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
+       DBG("[%s]", __func__);
 
-       int limit = -1;
-       int offset = -1;
+       int i, j;
+       int i_count = sizeof(uris)/sizeof(uris[0]);
+       int j_count = sizeof(keywords)/sizeof(keywords[0]);
 
-       contacts_connect();
+       const char *uri = NULL;
+       const char *keyword = NULL;
+       int offset = 0;
+       int limit = 0;
 
-       contacts_list_h list = NULL;
-       contacts_db_search_records(_contacts_person_email._uri, keyword, limit, offset, &list);
+       if (3 < argc) {
+               i_count = 1;
+               j_count = 1;
+       }
 
-       int count = 0;
-       contacts_list_get_count(list, &count);
-       DBG("count(%d)", count);
+       contacts_connect();
 
-       contacts_list_first(list);
-       contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.display_name_index, &name_index);
-               char *email = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.email, &email);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s] email[%s]", name_index, name, email);
-               contacts_list_next(list);
+       int ids[TEST_CONTACT_COUNT] = {0};
+       _insert_contact_01(&ids[0]);
+       _insert_contact_02(&ids[1]);
+
+       for (i = 0; i < i_count; i++) {
+               uri = 3 < argc ? argv[3] : uris[i];
+               DBG("uri[%s]", uri);
+
+               for (j = 0; j < j_count; j++) {
+                       keyword = 4 < argc ? argv[4] : keywords[j];
+                       DBG("keyword[%s]", keyword);
+
+                       contacts_list_h get_list = NULL;
+
+                       DBG("search_records");
+                       contacts_db_search_records(uri, keyword, offset, limit, &get_list);
+                       _check_list(uri, get_list, false);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range:CONTACTS_SEARCH_RANGE_NAME");
+                       contacts_db_search_records_with_range(uri, keyword, offset, limit,
+                                       CONTACTS_SEARCH_RANGE_NAME, &get_list);
+                       _check_list(uri, get_list, false);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range:CONTACTS_SEARCH_RANGE_NUMBER");
+                       contacts_db_search_records_with_range(uri, keyword, offset, limit,
+                                       CONTACTS_SEARCH_RANGE_NUMBER, &get_list);
+                       _check_list(uri, get_list, false);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range:CONTACTS_SEARCH_RANGE_DATA");
+                       contacts_db_search_records_with_range(uri, keyword, offset, limit,
+                                       CONTACTS_SEARCH_RANGE_DATA, &get_list);
+                       _check_list(uri, get_list, false);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_query");
+                       contacts_query_h query = NULL;
+                       _get_query_on_uri(uri, limit, offset, &query);
+                       contacts_db_search_records_with_query(query, keyword, offset, limit,
+                                       &get_list);
+                       _check_list(uri, get_list, false);
+                       contacts_list_destroy(get_list, true);
+                       contacts_query_destroy(query);
+               }
        }
 
-       contacts_disconnect();
+       for (i = 0; i < TEST_CONTACT_COUNT; i++)
+               _delete_contact(ids[i]);
 
+       contacts_disconnect();
        return 0;
 }
 
-int test_query_with_query_person_email(int argc, char **argv)
+/*
+ * /usr/bin//contacts-service-test 1 2 {uri} {keyword}
+ */
+static int test_search_records_for_snippet(int argc, char **argv)
 {
-       char *keyword = NULL;
-       keyword = argv[0];
-       DBG("keyword[%s]", keyword);
-
-       int limit = -1;
-       int offset = -1;
+       DBG("[%s]", __func__);
+
+       int i, j;
+       int i_count = sizeof(uris)/sizeof(uris[0]);
+       int j_count = sizeof(keywords)/sizeof(keywords[0]);
+
+       const char *uri = NULL;
+       const char *keyword = NULL;
+       char *start_match = "[";
+       char *end_match = "]";
+       int offset = 0;
+       int limit = 0;
+
+       if (3 < argc) {
+               i_count = 1;
+               j_count = 1;
+       }
 
        contacts_connect();
 
-       contacts_query_h query = NULL;
-       contacts_query_create(_contacts_person_email._uri, &query);
-
-       contacts_filter_h filter = NULL;
-       contacts_filter_create(_contacts_person_email._uri, &filter);
-
-       contacts_filter_add_bool(filter,
-                       _contacts_person_email.is_favorite, false);
-       contacts_query_set_filter(query, filter);
-
-       contacts_list_h list = NULL;
-       contacts_db_search_records_with_query(query, keyword, limit, offset, &list);
-
-       contacts_filter_destroy(filter);
-       contacts_query_destroy(query);
-
-       int count = 0;
-       contacts_list_get_count(list, &count);
-       DBG("count(%d)", count);
-
-       contacts_list_first(list);
-       contacts_record_h record = NULL;
-       while (CONTACTS_ERROR_NONE == contacts_list_get_current_record_p(list, &record)) {
-               char *name = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.display_name, &name);
-               char *name_index = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.display_name_index, &name_index);
-               char *email = NULL;
-               contacts_record_get_str_p(record,
-                               _contacts_person_email.email, &email);
-
-               DBG("-------------------------------------------");
-               DBG("name_index[%s] name[%s] email[%s]", name_index, name, email);
-               contacts_list_next(list);
+       int ids[TEST_CONTACT_COUNT] = {0};
+       _insert_contact_01(&ids[0]);
+       _insert_contact_02(&ids[1]);
+
+       for (i = 0; i < i_count; i++) {
+               uri = 3 < argc ? argv[3] : uris[i];
+               DBG(">>>>>   uri[%s]", uri);
+
+               for (j = 0; j < j_count; j++) {
+                       keyword = 4 < argc ? argv[4] : keywords[j];
+                       DBG("keyword [%s]", keyword);
+
+                       contacts_list_h get_list = NULL;
+
+                       DBG("search_records_for_snippet");
+                       contacts_db_search_records_for_snippet(uri, keyword, offset, limit,
+                                       start_match, end_match, 0, &get_list);
+                       _check_list(uri, get_list, true);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range_for_snippet:CONTACTS_SEARCH_RANGE_NAME");
+                       contacts_db_search_records_with_range_for_snippet(uri, keyword, offset,
+                                       limit, CONTACTS_SEARCH_RANGE_NAME, start_match, end_match, 0, &get_list);
+                       _check_list(uri, get_list, true);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range_for_snippet:CONTACTS_SEARCH_RANGE_NUMBER");
+                       contacts_db_search_records_with_range_for_snippet(uri, keyword, offset,
+                                       limit, CONTACTS_SEARCH_RANGE_NUMBER, start_match, end_match, 0, &get_list);
+                       _check_list(uri, get_list, true);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_range_for_snippet:CONTACTS_SEARCH_RANGE_DATA");
+                       contacts_db_search_records_with_range_for_snippet(uri, keyword, offset,
+                                       limit, CONTACTS_SEARCH_RANGE_DATA, start_match, end_match, 0, &get_list);
+                       _check_list(uri, get_list, true);
+                       contacts_list_destroy(get_list, true);
+
+                       DBG("search_records_with_query_for_snippet");
+                       contacts_query_h query = NULL;
+                       _get_query_on_uri(uri, limit, offset, &query);
+                       contacts_db_search_records_with_query_for_snippet(query, keyword, offset,
+                                       limit, start_match, end_match, 0, &get_list);
+                       _check_list(uri, get_list, true);
+                       contacts_list_destroy(get_list, true);
+                       contacts_query_destroy(query);
+               }
        }
 
-       contacts_disconnect();
+       for (i = 0; i < TEST_CONTACT_COUNT; i++)
+               _delete_contact(ids[i]);
 
+       contacts_disconnect();
        return 0;
 }
 
 static const func _func[] = {
-       test_query_person_contact,
-       test_query_with_query_person_contact,
-       test_query_person_number,
-       test_query_with_query_person_number,
-       test_query_person_email,
-       test_query_with_query_person_email,
+       test_get_records,
+       test_search_records,
+       test_search_records_for_snippet,
 };
 
 int test_query(int argc, char **argv)
@@ -328,6 +558,7 @@ int test_query(int argc, char **argv)
 
        int i = 0;
        for (i = 0; i < count; i++) {
+               test_utils_cleanup();
                if (_func[i](argc, argv) < 0)
                        break;
        }
index 6e109b5..8e2c66f 100644 (file)
@@ -1,8 +1,17 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
-
-int test_query_person_contact(char **argv);
-int test_query_person_number(char **argv);
-int test_query_person_email(char **argv);
-int test_query_with_query_person_contact(char **argv);
-int test_query_with_query_person_number(char **argv);
-int test_query_with_query_person_email(char **argv);
+int test_query(int argc, char **argv);
diff --git a/test/test_utils.c b/test/test_utils.c
new file mode 100644 (file)
index 0000000..8bb30ac
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include "contacts.h"
+#include "test_debug.h"
+#include "test_utils.h"
+
+void test_utils_cleanup(void)
+{
+       DBG("[%s]", __func__);
+
+       int ret = 0;
+
+       contacts_connect();
+
+       contacts_list_h get_list = NULL;
+       contacts_db_get_all_records(_contacts_contact._uri, 0, 0, &get_list);
+
+       contacts_list_first(get_list);
+       int count = 0;
+       contacts_list_get_count(get_list, &count);
+       DBG("count(%d)", count);
+
+       int *ids = calloc(count, sizeof(int));
+       int index = 0;
+       do {
+               contacts_record_h record = NULL;
+               ret = contacts_list_get_current_record_p(get_list, &record);
+               if (CONTACTS_ERROR_NONE != ret)
+                       break;
+               int contact_id = 0;
+               contacts_record_get_int(record, _contacts_contact.id, &contact_id);
+               ids[index] =  contact_id;
+               contacts_list_next(get_list);
+       } while (1);
+
+       ret = contacts_db_delete_records(_contacts_contact._uri, ids, count);
+       if (CONTACTS_ERROR_NONE != ret)
+               ERR("contacts_db_delete_records() Fail(%d)", ret);
+
+       free(ids);
+
+       contacts_disconnect();
+}
diff --git a/test/test_utils.h b/test/test_utils.h
new file mode 100644 (file)
index 0000000..7cc741b
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TEST_UTILS_H__
+#define __TEST_UTILS_H__
+
+void test_utils_cleanup(void);
+
+#endif /* __TEST_UTILS_H__ */