merge with master
authorJinkun Jang <jinkun.jang@samsung.com>
Fri, 15 Mar 2013 16:17:42 +0000 (01:17 +0900)
committerJinkun Jang <jinkun.jang@samsung.com>
Fri, 15 Mar 2013 16:17:42 +0000 (01:17 +0900)
131 files changed:
CMakeLists.txt
build-util/DB-schema-gen2.c [new file with mode: 0755]
build-util/generator.sh
client/CMakeLists.txt
client/ctsvc_client_activity.c
client/ctsvc_client_db.c
client/ctsvc_client_group.c
client/ctsvc_client_ipc.c [changed mode: 0755->0644]
client/ctsvc_client_ipc.h
client/ctsvc_client_person.c
client/ctsvc_client_phonelog.c
client/ctsvc_client_service.c
client/ctsvc_client_sim.c
common/ctsvc_filter.c
common/ctsvc_internal.h
common/ctsvc_list.c
common/ctsvc_localize.c
common/ctsvc_localize.h
common/ctsvc_localize_ch.c
common/ctsvc_normalize.c
common/ctsvc_normalize.h
common/ctsvc_notify.h
common/ctsvc_record.c
common/ctsvc_record.h
common/ctsvc_record_contact.c
common/ctsvc_record_my_profile.c
common/ctsvc_record_person.c
common/ctsvc_record_updated_info.c
common/ctsvc_setting.c
common/ctsvc_struct.h
common/ctsvc_vcard.c
common/ctsvc_view.c
common/ctsvc_view.h
common/ipc/ctsvc_ipc_contact.c
common/ipc/ctsvc_ipc_define.h
common/ipc/ctsvc_ipc_event.c
common/ipc/ctsvc_ipc_marshal.c
common/ipc/ctsvc_ipc_person.c
common/ipc/ctsvc_ipc_updated_info.c
contacts-service2.manifest
include/contacts.h
include/contacts_db.h
include/contacts_filter.h
include/contacts_group.h
include/contacts_utils.h
include/contacts_vcard.h
include/contacts_views.h
native/ctsvc_activity.c
native/ctsvc_db_init.c
native/ctsvc_db_plugin_activity.c
native/ctsvc_db_plugin_address.c
native/ctsvc_db_plugin_address_helper.c
native/ctsvc_db_plugin_address_helper.h
native/ctsvc_db_plugin_addressbook.c
native/ctsvc_db_plugin_company.c
native/ctsvc_db_plugin_company_helper.c
native/ctsvc_db_plugin_company_helper.h
native/ctsvc_db_plugin_contact.c
native/ctsvc_db_plugin_contact_helper.c
native/ctsvc_db_plugin_contact_helper.h
native/ctsvc_db_plugin_email.c
native/ctsvc_db_plugin_email_helper.c
native/ctsvc_db_plugin_email_helper.h
native/ctsvc_db_plugin_event.c
native/ctsvc_db_plugin_event_helper.c
native/ctsvc_db_plugin_event_helper.h
native/ctsvc_db_plugin_extension.c
native/ctsvc_db_plugin_extension_helper.c
native/ctsvc_db_plugin_extension_helper.h
native/ctsvc_db_plugin_group.c
native/ctsvc_db_plugin_image.c
native/ctsvc_db_plugin_image_helper.c
native/ctsvc_db_plugin_image_helper.h
native/ctsvc_db_plugin_messenger.c
native/ctsvc_db_plugin_messenger_helper.c
native/ctsvc_db_plugin_messenger_helper.h
native/ctsvc_db_plugin_my_profile.c
native/ctsvc_db_plugin_name.c
native/ctsvc_db_plugin_name_helper.c
native/ctsvc_db_plugin_name_helper.h
native/ctsvc_db_plugin_nickname.c
native/ctsvc_db_plugin_nickname_helper.c
native/ctsvc_db_plugin_nickname_helper.h
native/ctsvc_db_plugin_note.c
native/ctsvc_db_plugin_note_helper.c
native/ctsvc_db_plugin_note_helper.h
native/ctsvc_db_plugin_number.c
native/ctsvc_db_plugin_number_helper.c
native/ctsvc_db_plugin_number_helper.h
native/ctsvc_db_plugin_person.c
native/ctsvc_db_plugin_person_helper.c
native/ctsvc_db_plugin_phonelog.c
native/ctsvc_db_plugin_profile.c
native/ctsvc_db_plugin_profile_helper.c
native/ctsvc_db_plugin_profile_helper.h
native/ctsvc_db_plugin_relationship.c
native/ctsvc_db_plugin_relationship_helper.c
native/ctsvc_db_plugin_relationship_helper.h
native/ctsvc_db_plugin_sdn.c
native/ctsvc_db_plugin_simple_contact.c
native/ctsvc_db_plugin_speeddial.c
native/ctsvc_db_plugin_url.c
native/ctsvc_db_plugin_url_helper.c
native/ctsvc_db_plugin_url_helper.h
native/ctsvc_db_query.c
native/ctsvc_db_query.h
native/ctsvc_group.c
native/ctsvc_notification.c
native/ctsvc_notification.h
native/ctsvc_person.c
native/ctsvc_schema.h
native/ctsvc_service.c
native/ctsvc_sqlite.c
native/ctsvc_utils.c
native/ctsvc_utils.h
packaging/contacts-service.spec
res/.CONTACTS_SVC_FAVOR_CHANGED [deleted file]
res/.CONTACTS_SVC_GROUP_REL_CHANGED [deleted file]
res/.CONTACTS_SVC_MISSED_CHANGED [deleted file]
schema.sql
server/ctsvc_ipc_server.c
server/ctsvc_ipc_server2.c
server/ctsvc_ipc_server2.h
server/ctsvc_schema_recovery.c
server/ctsvc_server.c
server/ctsvc_server_sim.c
server/ctsvc_server_sqlite.c
server/ctsvc_server_sqlite.h
server/ctsvc_server_utils.c
server/ctsvc_server_utils.h
server/internal.h

index cff5090..d29377c 100755 (executable)
@@ -14,7 +14,7 @@ SET(EXEC_PREFIX "\${prefix}")
 SET(LIBDIR "\${prefix}/lib")
 SET(INCLUDEDIR "\${prefix}/${DEST_INCLUDE_DIR}")
 SET(VERSION_MAJOR 0)
-SET(VERSION "${VERSION_MAJOR}.9.24.8")
+SET(VERSION "${VERSION_MAJOR}.9.45.3")
 
 EXECUTE_PROCESS(COMMAND build-util/generator.sh)
 
@@ -53,6 +53,10 @@ INSTALL(DIRECTORY DESTINATION /opt/usr/data/contacts-svc/img/logo)
 FILE(GLOB HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
 INSTALL(FILES ${HEADER_FILES} DESTINATION ${DEST_INCLUDE_DIR})
 
+# Install DB file
+FILE(GLOB DB_FILES ${CMAKE_CURRENT_SOURCE_DIR}/build-util/.contacts-svc.db*)
+INSTALL(FILES ${DB_FILES} DESTINATION /opt/usr/dbspace)
+
 ADD_SUBDIRECTORY(native)
 ADD_SUBDIRECTORY(client)
 ADD_SUBDIRECTORY(server)
diff --git a/build-util/DB-schema-gen2.c b/build-util/DB-schema-gen2.c
new file mode 100755 (executable)
index 0000000..7ffdf13
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Contacts Service
+ *
+ * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Youngjae Shin <yj99.shin@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv)
+{
+       FILE *fp;
+       int c;
+
+       fp = fopen(argv[1], "r");
+       if (fp == NULL)
+               exit(EXIT_FAILURE);
+
+       do{
+               c = fgetc(fp);
+               switch (c)
+               {
+               case '-':
+                       if ('-' == (c = fgetc(fp))) {
+                               while ('\n' != c && EOF != c)
+                                       c = fgetc(fp);
+                               printf("\n");
+                       }
+                       else printf("-%c",c);
+                       break;
+               case EOF:
+                       break;
+               default:
+                       printf("%c",c);
+                       break;
+               }
+       }while(EOF != c);
+
+       exit(EXIT_SUCCESS);
+}
+
index 366aeba..69ab788 100755 (executable)
 
 #!/bin/sh
 
-echo "###### API Generator #####"
+echo "###### DB Generator #####"
 
 cd build-util
 make
 
-# New server daemon Schema
+# Make DB schema for generating DB file when running contacts server daemon
 echo "static const char *schema_query = \"\\" > ../server/schema.h
 ./DB-schema-gen ../schema.sql >> ../server/schema.h
 echo \"\; >> ../server/schema.h
 
+# Make DB file at builing time
+echo "sqlite3 .contacts-svc.db \"" > DB-schema-create.sh
+./DB-schema-gen2 ../schema.sql >> DB-schema-create.sh
+echo \" >> DB-schema-create.sh
+chmod +x DB-schema-create.sh
+./DB-schema-create.sh
+rm DB-schema-create.sh
+
 
 make clean
index fdc06b4..26cd149 100755 (executable)
@@ -53,6 +53,7 @@ SET(SRCS
        ${CMAKE_SOURCE_DIR}/common/ctsvc_inotify.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_list.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_localize.c
+       ${CMAKE_SOURCE_DIR}/common/ctsvc_localize_ch.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_normalize.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_mutex.c
        ${CMAKE_SOURCE_DIR}/common/ctsvc_query.c
index b3856a9..d22a299 100644 (file)
@@ -53,7 +53,7 @@ API int contacts_activity_delete_by_contact_id(int contact_id)
        // ipc call\r
        if (ctsvc_ipc_call( CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_CONTACT_ID, indata, &outdata) != 0)\r
        {\r
-               CTS_ERR("pims_ipc_call failed");\r
+               CTS_ERR("ctsvc_ipc_call failed");\r
                pims_ipc_data_destroy(indata);\r
                return CONTACTS_ERROR_IPC;\r
        }\r
@@ -68,6 +68,11 @@ API int contacts_activity_delete_by_contact_id(int contact_id)
                // check result\r
                unsigned int size = 0;\r
                ret = *(int*) pims_ipc_data_get(outdata, &size);\r
+               if (CONTACTS_ERROR_NONE == ret) {\r
+                       int transaction_ver = 0;\r
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);\r
+                       ctsvc_client_ipc_set_change_version(transaction_ver);\r
+               }\r
 \r
                pims_ipc_data_destroy(outdata);\r
        }\r
@@ -102,7 +107,7 @@ API int contacts_activity_delete_by_account_id(int account_id)
        // ipc call\r
        if (ctsvc_ipc_call( CTSVC_IPC_ACTIVITY_MODULE, CTSVC_IPC_SERVER_ACTIVITY_DELETE_BY_ACCOUNT_ID, indata, &outdata) != 0)\r
        {\r
-               CTS_ERR("pims_ipc_call failed");\r
+               CTS_ERR("ctsvc_ipc_call failed");\r
                pims_ipc_data_destroy(indata);\r
                return CONTACTS_ERROR_IPC;\r
        }\r
@@ -117,6 +122,11 @@ API int contacts_activity_delete_by_account_id(int account_id)
                // check result\r
                unsigned int size = 0;\r
                ret = *(int*) pims_ipc_data_get(outdata, &size);\r
+               if (CONTACTS_ERROR_NONE == ret) {\r
+                       int transaction_ver = 0;\r
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);\r
+                       ctsvc_client_ipc_set_change_version(transaction_ver);\r
+               }\r
 \r
                pims_ipc_data_destroy(outdata);\r
        }\r
index cf1f9a0..faafdaa 100644 (file)
@@ -43,7 +43,6 @@
 typedef struct {
        void *callback;
        void *user_data;
-       contacts_list_h list;
 }ctsvc_ipc_async_userdata_s;
 
 static void __ctsvc_ipc_client_insert_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_out, void *userdata);
@@ -54,7 +53,6 @@ void __ctsvc_ipc_client_insert_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_o
 {
        ctsvc_ipc_async_userdata_s *sync_data = (ctsvc_ipc_async_userdata_s *)userdata;
        int ret = CONTACTS_ERROR_NONE;
-       contacts_list_h list = sync_data->list;
        int *ids = NULL;
        unsigned int count = 0;
 
@@ -64,10 +62,12 @@ void __ctsvc_ipc_client_insert_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_o
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(data_out,&size);
 
-               if (ret == CONTACTS_ERROR_NONE && list != NULL)
-               {
+               if (ret == CONTACTS_ERROR_NONE) {
                        int i=0;
                        unsigned int size = 0;
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(data_out, &size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
 
                        count = *(unsigned int*) pims_ipc_data_get(data_out,&size);
                        ids = calloc(count, sizeof(int));
@@ -102,6 +102,12 @@ void __ctsvc_ipc_client_update_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_o
                // check outdata
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(data_out,&size);
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(data_out, &size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
        }
 
        if (sync_data->callback)
@@ -126,6 +132,11 @@ void __ctsvc_ipc_client_delete_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_o
                // check outdata
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(data_out,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(data_out, &size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
        }
 
        if (sync_data->callback)
@@ -170,7 +181,7 @@ API int contacts_db_insert_record( contacts_record_h record, int *id )
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORD, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -186,8 +197,11 @@ API int contacts_db_insert_record( contacts_record_h record, int *id )
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
 
-               if (ret == CONTACTS_ERROR_NONE)
-               {
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+
                        if (id)
                                *id = *(int*)pims_ipc_data_get(outdata,&size);
                }
@@ -232,7 +246,7 @@ API int     contacts_db_get_record( const char* view_uri, int id, contacts_record_h*
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORD, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *out_record = NULL;
                return CONTACTS_ERROR_IPC;
@@ -287,7 +301,7 @@ API int contacts_db_update_record( contacts_record_h record )
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORD, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -302,6 +316,12 @@ API int contacts_db_update_record( contacts_record_h record )
                // check outdata
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
 
                pims_ipc_data_destroy(outdata);
        }
@@ -343,7 +363,7 @@ API int contacts_db_delete_record( const char* view_uri, int id )
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORD, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -358,6 +378,11 @@ API int contacts_db_delete_record( const char* view_uri, int id )
                // check outdata
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
 
                pims_ipc_data_destroy(outdata);
        }
@@ -371,7 +396,7 @@ API int contacts_db_replace_record( contacts_record_h record, int id )
        pims_ipc_data_h indata = NULL;
        pims_ipc_data_h outdata = NULL;
 
-       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL");
+       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : record is NULL");
 
        // make indata
        indata = pims_ipc_data_create(0);
@@ -395,7 +420,7 @@ API int contacts_db_replace_record( contacts_record_h record, int id )
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE,
                                CTSVC_IPC_SERVER_DB_REPLACE_RECORD, indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -406,6 +431,11 @@ API int contacts_db_replace_record( contacts_record_h record, int id )
                // check outdata
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
                pims_ipc_data_destroy(outdata);
        }
 
@@ -452,7 +482,7 @@ API int contacts_db_get_all_records( const char* view_uri, int offset, int limit
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_ALL_RECORDS, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *out_list = NULL;
                return CONTACTS_ERROR_IPC;
@@ -518,7 +548,7 @@ API int contacts_db_get_records_with_query( contacts_query_h query, int offset,
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_RECORDS_WITH_QUERY, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *out_list = NULL;
                return CONTACTS_ERROR_IPC;
@@ -574,7 +604,7 @@ API int contacts_db_get_count( const char* view_uri, int *out_count )
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -627,7 +657,7 @@ API int contacts_db_get_count_with_query( contacts_query_h query, int *out_count
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_COUNT_WITH_QUERY, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -658,62 +688,21 @@ API int contacts_db_insert_records_async(const contacts_list_h list, contacts_db
 {
        int ret = CONTACTS_ERROR_NONE;
        pims_ipc_data_h indata = NULL;
-       pims_ipc_data_h outdata = NULL;
-       contacts_list_h clone_list = NULL;
        ctsvc_ipc_async_userdata_s *async_data = NULL;
 
        RETVM_IF(list==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"list is NULL");
 
-
-       ret = ctsvc_list_clone(list, &clone_list);
-       RETV_IF(CONTACTS_ERROR_NONE != ret, ret);
-
-       // make indata
        indata = pims_ipc_data_create(0);
        if (indata == NULL)
        {
                CTS_ERR("ipc data created fail!");
                ret = CONTACTS_ERROR_OUT_OF_MEMORY;
-               contacts_list_destroy(clone_list, true);
                return ret;
        }
-       ret = ctsvc_ipc_marshal_list(clone_list,indata);
+       ret = ctsvc_ipc_marshal_list(list,indata);
        if (ret != CONTACTS_ERROR_NONE)
        {
                CTS_ERR("marshal fail");
-               contacts_list_destroy(clone_list, true);
-               return ret;
-       }
-
-       if (callback == NULL)
-       {
-               if (ctsvc_ipc_call( CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS,
-                                       indata,&outdata) != 0)
-               {
-                       CTS_ERR("pims_ipc_call_async failed");
-                       contacts_list_destroy(clone_list, true);
-                       return CONTACTS_ERROR_IPC;
-               }
-
-               if (indata)
-               {
-                       pims_ipc_data_destroy(indata);
-               }
-               if (outdata)
-               {
-                       // check outdata
-                       unsigned int size = 0;
-                       ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-                       if (ret == CONTACTS_ERROR_NONE)
-                       {
-                               goto SET_DATA;
-                       }
-
-                       pims_ipc_data_destroy(outdata);
-               }
-
-               contacts_list_destroy(clone_list, true);
                return ret;
        }
 
@@ -722,58 +711,21 @@ API int contacts_db_insert_records_async(const contacts_list_h list, contacts_db
        {
                CTS_ERR("malloc fail!");
                ret = CONTACTS_ERROR_OUT_OF_MEMORY;
-               contacts_list_destroy(clone_list, true);
+               pims_ipc_data_destroy(indata);
                return ret;
        }
        async_data->callback = callback;
        async_data->user_data = user_data;
-       async_data->list = clone_list;
+
        if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE,CTSVC_IPC_SERVER_DB_INSERT_RECORDS,
                                indata,__ctsvc_ipc_client_insert_records_cb,async_data) != 0)
        {
                CONTACTS_FREE(async_data);
-               CTS_ERR("pims_ipc_call_async failed");
-               contacts_list_destroy(clone_list, true);
+               CTS_ERR("ctsvc_ipc_call_async failed");
                return CONTACTS_ERROR_IPC;
        }
 
-       if (indata)
-       {
-               pims_ipc_data_destroy(indata);
-       }
-       contacts_list_destroy(clone_list, true);
-
-       return ret;
-
-SET_DATA:
-       if (outdata)
-       {
-/*
-               int count = 0;
-               int id = 0;
-               unsigned int property_id = 0;
-               int i=0;
-               unsigned int size = 0;
-
-               contacts_list_first(list);
-               count = *(int*) pims_ipc_data_get(outdata,&size);
-               property_id = *(unsigned int*) pims_ipc_data_get(outdata,&size);
-               for(i=0;i<count;i++)
-               {
-                       contacts_record_h record = NULL;
-                       if (contacts_list_get_current_record_p(list,&record) != CONTACTS_ERROR_NONE)
-                       {
-                               CTS_ERR("contacts_list_get_current_record_p fail");
-                               pims_ipc_data_destroy(outdata);
-                               return ret;
-                       }
-                       id = *(int*) pims_ipc_data_get(outdata,&size);
-                       ctsvc_record_set_int(record,property_id,id);
-               }
-*/
-               pims_ipc_data_destroy(outdata);
-       }
-       contacts_list_destroy(clone_list, true);
+       pims_ipc_data_destroy(indata);
 
        return ret;
 }
@@ -782,12 +734,10 @@ API int contacts_db_update_records_async(const contacts_list_h list, contacts_db
 {
        int ret = CONTACTS_ERROR_NONE;
        pims_ipc_data_h indata = NULL;
-       pims_ipc_data_h outdata = NULL;
        ctsvc_ipc_async_userdata_s *async_data = NULL;
 
        RETVM_IF(list==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"record is NULL");
 
-
        // make indata
        indata = pims_ipc_data_create(0);
        if (indata == NULL)
@@ -803,48 +753,22 @@ API int contacts_db_update_records_async(const contacts_list_h list, contacts_db
                return ret;
        }
 
-       if (callback == NULL)
-       {
-               // ipc call
-               if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORDS,
-                               indata, &outdata) != 0)
-               {
-                       CTS_ERR("pims_ipc_call failed");
-                       return CONTACTS_ERROR_IPC;
-               }
-
-               if (indata)
-               {
-                       pims_ipc_data_destroy(indata);
-               }
-
-               if (outdata)
-               {
-                       // check outdata
-                       unsigned int size = 0;
-                       ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-                       pims_ipc_data_destroy(outdata);
-               }
-
-               return ret;
-       }
-
        async_data = (ctsvc_ipc_async_userdata_s*)malloc(sizeof(ctsvc_ipc_async_userdata_s));
        if (async_data == NULL)
        {
                CTS_ERR("malloc fail!");
                ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+               pims_ipc_data_destroy(indata);
                return ret;
        }
        async_data->callback = callback;
        async_data->user_data = user_data;
-       async_data->list = list;
+
        if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE,CTSVC_IPC_SERVER_DB_UPDATE_RECORDS,
                                indata,__ctsvc_ipc_client_update_records_cb,async_data) != 0)
        {
                CONTACTS_FREE(async_data);
-               CTS_ERR("pims_ipc_call_async failed");
+               CTS_ERR("ctsvc_ipc_call_async failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -860,13 +784,12 @@ API int contacts_db_delete_records_async(const char* view_uri, int ids[], int co
 {
        int ret = CONTACTS_ERROR_NONE;
        pims_ipc_data_h indata = NULL;
-       pims_ipc_data_h outdata = NULL;
        int i = 0;
        ctsvc_ipc_async_userdata_s *async_data = NULL;
 
        RETVM_IF(view_uri==NULL,CONTACTS_ERROR_INVALID_PARAMETER,"view_uri is NULL");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        // make indata
        indata = pims_ipc_data_create(0);
@@ -898,33 +821,6 @@ API int contacts_db_delete_records_async(const char* view_uri, int ids[], int co
                }
        }
 
-       if (callback == NULL)
-       {
-               // ipc call
-               if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORDS,
-                               indata, &outdata) != 0)
-               {
-                       CTS_ERR("pims_ipc_call failed");
-                       return CONTACTS_ERROR_IPC;
-               }
-
-               if (indata)
-               {
-                       pims_ipc_data_destroy(indata);
-               }
-
-               if (outdata)
-               {
-                       // check outdata
-                       unsigned int size = 0;
-                       ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-                       pims_ipc_data_destroy(outdata);
-               }
-
-               return ret;
-       }
-
        async_data = (ctsvc_ipc_async_userdata_s*)malloc(sizeof(ctsvc_ipc_async_userdata_s));
        if (async_data == NULL)
        {
@@ -939,14 +835,11 @@ API int contacts_db_delete_records_async(const char* view_uri, int ids[], int co
                                indata,__ctsvc_ipc_client_delete_records_cb,async_data) != 0)
        {
                CONTACTS_FREE(async_data);
-               CTS_ERR("pims_ipc_call_async failed");
+               CTS_ERR("ctsvc_ipc_call_async failed");
                return CONTACTS_ERROR_IPC;
        }
 
-       if (indata)
-       {
-               pims_ipc_data_destroy(indata);
-       }
+       pims_ipc_data_destroy(indata);
 
        return ret;
 }
@@ -959,7 +852,12 @@ void __ctsvc_ipc_client_replace_records_cb(pims_ipc_h ipc, pims_ipc_data_h data_
        if (data_out) {
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(data_out,&size);
-               //pims_ipc_data_destroy(data_out);
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(data_out, &size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
        }
 
        if (async_data->callback) {
@@ -980,12 +878,11 @@ API int contacts_db_replace_records_async( contacts_list_h list, int ids[], unsi
        int i;
        int ret = CONTACTS_ERROR_NONE;
        pims_ipc_data_h indata = NULL;
-       pims_ipc_data_h outdata = NULL;
        ctsvc_ipc_async_userdata_s *async_data = NULL;
 
        RETVM_IF(NULL == list,CONTACTS_ERROR_INVALID_PARAMETER, "list is NULL");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        // make indata
        indata = pims_ipc_data_create(0);
@@ -1015,32 +912,14 @@ API int contacts_db_replace_records_async( contacts_list_h list, int ids[], unsi
                }
        }
 
-       if (callback == NULL) {
-               if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS,
-                                       indata, &outdata) != 0) {
-                       CTS_ERR("pims_ipc_call failed");
-                       return CONTACTS_ERROR_IPC;
-               }
-
-               pims_ipc_data_destroy(indata);
-
-               if (outdata) {
-                       unsigned int size = 0;
-                       ret = *(int*) pims_ipc_data_get(outdata,&size);
-                       pims_ipc_data_destroy(outdata);
-               }
-
-               return ret;
-       }
-
        async_data = (ctsvc_ipc_async_userdata_s*)malloc(sizeof(ctsvc_ipc_async_userdata_s));
        async_data->callback = callback;
        async_data->user_data = user_data;
-       async_data->list = list;
+
        if (ctsvc_ipc_call_async(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS,
                                indata, __ctsvc_ipc_client_replace_records_cb, async_data) != 0) {
                CONTACTS_FREE(async_data);
-               CTS_ERR("pims_ipc_call_async failed");
+               CTS_ERR("ctsvc_ipc_call_async failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -1079,7 +958,7 @@ API int contacts_db_insert_records( contacts_list_h list, int **ids, unsigned in
 
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_INSERT_RECORDS,
                                indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call_async failed");
+               CTS_ERR("ctsvc_ipc_call_async failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -1091,6 +970,10 @@ API int contacts_db_insert_records( contacts_list_h list, int **ids, unsigned in
                ret = *(int*) pims_ipc_data_get(outdata,&size);
 
                if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+
                        if (ids && count) {
                                int i = 0;
                                int *id = NULL;
@@ -1133,8 +1016,8 @@ API int contacts_db_update_records( contacts_list_h list)
        }
 
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_UPDATE_RECORDS,
-                       indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+                               indata, &outdata) != 0) {
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -1144,6 +1027,11 @@ API int contacts_db_update_records( contacts_list_h list)
        if (outdata) {
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
 
                pims_ipc_data_destroy(outdata);
        }
@@ -1192,8 +1080,8 @@ API int contacts_db_delete_records(const char* view_uri, int ids[], int count)
        }
 
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_DELETE_RECORDS,
-                       indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+                               indata, &outdata) != 0) {
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -1204,6 +1092,12 @@ API int contacts_db_delete_records(const char* view_uri, int ids[], int count)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -1218,8 +1112,8 @@ API int contacts_db_replace_records( contacts_list_h list, int ids[], unsigned i
        pims_ipc_data_h outdata = NULL;
 
        RETVM_IF(NULL == list,CONTACTS_ERROR_INVALID_PARAMETER, "list is NULL");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(0 == count, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        // make indata
        indata = pims_ipc_data_create(0);
@@ -1250,8 +1144,8 @@ API int contacts_db_replace_records( contacts_list_h list, int ids[], unsigned i
        }
 
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_REPLACE_RECORDS,
-                       indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+                               indata, &outdata) != 0) {
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -1261,6 +1155,11 @@ API int contacts_db_replace_records( contacts_list_h list, int ids[], unsigned i
        if (outdata) {
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata,&size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
                pims_ipc_data_destroy(outdata);
        }
 
@@ -1308,7 +1207,7 @@ API int contacts_db_get_changes_by_version(const char* view_uri, int addressbook
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_CHANGES_BY_VERSION, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *record_list = NULL;
                return CONTACTS_ERROR_IPC;
@@ -1351,7 +1250,7 @@ API int contacts_db_get_current_version(int* contacts_db_version)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_GET_CURRENT_VERSION, NULL, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -1416,7 +1315,7 @@ API int contacts_db_search_records(const char* view_uri, const char *keyword,
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *out_list = NULL;
                return CONTACTS_ERROR_IPC;
@@ -1491,7 +1390,7 @@ API int contacts_db_search_records_with_query(contacts_query_h query, const char
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_DB_MODULE, CTSVC_IPC_SERVER_DB_SEARCH_RECORDS_WITH_QUERY, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                *out_list = NULL;
                return CONTACTS_ERROR_IPC;
@@ -1519,3 +1418,12 @@ API int contacts_db_search_records_with_query(contacts_query_h query, const char
        return ret;
 }
 
+API int contacts_db_get_last_change_version(int* last_version)
+{
+       int ret = CONTACTS_ERROR_NONE;
+
+       RETVM_IF(NULL == last_version, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       *last_version = ctsvc_client_ipc_get_change_version();
+       return ret;
+}
+
index dc284d8..d01be77 100644 (file)
@@ -61,7 +61,7 @@ API int contacts_group_add_contact(int group_id, int contact_id)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_ADD_CONTACT, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -76,6 +76,12 @@ API int contacts_group_add_contact(int group_id, int contact_id)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -117,7 +123,79 @@ API int contacts_group_remove_contact(int group_id, int contact_id)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
+               return CONTACTS_ERROR_IPC;
+       }
+
+       if (indata)
+       {
+               pims_ipc_data_destroy(indata);
+       }
+
+       if (outdata)
+       {
+               // check result
+               unsigned int size = 0;
+               ret = *(int*) pims_ipc_data_get(outdata, &size);
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
+               pims_ipc_data_destroy(outdata);
+       }
+
+       return ret;
+}
+
+API int contacts_group_set_group_order(int group_id, int previous_group_id, int next_group_id)
+{
+       int ret = CONTACTS_ERROR_NONE;
+
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETVM_IF(group_id <= 0 || previous_group_id < 0 || next_group_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,"id should be greater than 0");
+       RETVM_IF(ctsvc_get_ipc_handle() == NULL,CONTACTS_ERROR_IPC,"contacts not connected");
+
+       // make indata
+       indata = pims_ipc_data_create(0);
+       if (indata == NULL)
+       {
+               CTS_ERR("ipc data created fail!");
+               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+               return ret;
+       }
+
+       ret = ctsvc_ipc_marshal_int( group_id, indata);
+       if (ret != CONTACTS_ERROR_NONE)
+       {
+               CTS_ERR("marshal fail");
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int( previous_group_id, indata);
+       if (ret != CONTACTS_ERROR_NONE)
+       {
+               CTS_ERR("marshal fail");
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+       ret = ctsvc_ipc_marshal_int( next_group_id, indata);
+       if (ret != CONTACTS_ERROR_NONE)
+       {
+               CTS_ERR("marshal fail");
+               pims_ipc_data_destroy(indata);
+               return ret;
+       }
+
+       // ipc call
+       if (ctsvc_ipc_call(CTSVC_IPC_GROUP_MODULE, CTSVC_IPC_SERVER_GROUP_SET_GROUP_ORDER, indata, &outdata) != 0)
+       {
+               CTS_ERR("ctsvc_ipc_call failed");
+               pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
 
@@ -132,9 +210,16 @@ API int contacts_group_remove_contact(int group_id, int contact_id)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
        return ret;
+
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 339dd77..30b9b50
 #include <pims-ipc-data.h>
 #include "ctsvc_mutex.h"
 
-static __thread pims_ipc_h contacts_ipc = NULL;
+static __thread pims_ipc_h __contacts_ipc = NULL;
+static pims_ipc_h __contacts_global_ipc = NULL;
 
-static pims_ipc_h contacts_global_ipc = NULL;
+static __thread int __contacts_change_version = 0;
+static int __contacts_global_change_version = 0;
 
 int ctsvc_ipc_connect_on_thread(void)
 {
-    int ret = CONTACTS_ERROR_NONE;
-    pims_ipc_data_h indata = NULL;
-    pims_ipc_data_h outdata = NULL;
-
-    // ipc create
-    if (contacts_ipc == NULL)
-    {
-        contacts_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH);
-        if (contacts_ipc == NULL)
-        {
-            CTS_ERR("pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE);
-            return CONTACTS_ERROR_IPC_NOT_AVALIABLE;
-        }
-    }
-    else
-    {
-        CTS_DBG("contacts already connected");
-        return CONTACTS_ERROR_NONE;
-    }
-
-    // ipc call
-    if (pims_ipc_call(contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0)
-    {
-        CTS_ERR("pims_ipc_call failed");
-        return CONTACTS_ERROR_IPC;
-    }
-
-    if (outdata)
-    {
-        // check outdata
-        unsigned int size = 0;
-        ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-        pims_ipc_data_destroy(outdata);
-
-        if (ret == CONTACTS_ERROR_NONE)
-        {
-
-        }
-        else
-        {
-            pims_ipc_destroy(contacts_ipc);
-            contacts_ipc = NULL;
-        }
-    }
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       // ipc create
+       if (__contacts_ipc == NULL)
+       {
+               __contacts_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH);
+               if (__contacts_ipc == NULL)
+               {
+                       CTS_ERR("pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE);
+                       return CONTACTS_ERROR_IPC_NOT_AVALIABLE;
+               }
+       }
+       else
+       {
+               CTS_DBG("contacts already connected");
+               return CONTACTS_ERROR_NONE;
+       }
+
+       // ipc call
+       if (pims_ipc_call(__contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0)
+       {
+               CTS_ERR("pims_ipc_call failed");
+               return CONTACTS_ERROR_IPC;
+       }
+
+       if (outdata)
+       {
+               // check outdata
+               unsigned int size = 0;
+               ret = *(int*) pims_ipc_data_get(outdata,&size);
+
+               pims_ipc_data_destroy(outdata);
+
+               if (ret == CONTACTS_ERROR_NONE)
+               {
+
+               }
+               else
+               {
+                       pims_ipc_destroy(__contacts_ipc);
+                       __contacts_ipc = NULL;
+               }
+       }
 
        return ret;
 }
 
 int ctsvc_ipc_disconnect_on_thread(void)
 {
-    int ret = CONTACTS_ERROR_NONE;
-    pims_ipc_data_h indata = NULL;
-    pims_ipc_data_h outdata = NULL;
-
-    RETVM_IF(contacts_ipc == NULL, CONTACTS_ERROR_IPC, "contacts not connected");
-
-    // ipc call
-    if (pims_ipc_call(contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
-    {
-        CTS_ERR("pims_ipc_call failed");
-        return CONTACTS_ERROR_IPC;
-    }
-
-    if (outdata)
-    {
-        // check outdata
-        unsigned int size = 0;
-        ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-        pims_ipc_data_destroy(outdata);
-    }
-
-    if (contacts_ipc && ret != CONTACTS_ERROR_NONE)
-    {
-        pims_ipc_destroy(contacts_ipc);
-        contacts_ipc = NULL;
-    }
-
-    return ret;
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETVM_IF(__contacts_ipc == NULL, CONTACTS_ERROR_IPC, "contacts not connected");
+
+       // ipc call
+       if (pims_ipc_call(__contacts_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
+       {
+               CTS_ERR("pims_ipc_call failed");
+               return CONTACTS_ERROR_IPC;
+       }
+
+       if (outdata)
+       {
+               // check outdata
+               unsigned int size = 0;
+               ret = *(int*) pims_ipc_data_get(outdata,&size);
+
+               pims_ipc_data_destroy(outdata);
+       }
+
+       if (__contacts_ipc && ret != CONTACTS_ERROR_NONE)
+       {
+               pims_ipc_destroy(__contacts_ipc);
+               __contacts_ipc = NULL;
+       }
+
+       return ret;
 }
 
 pims_ipc_h ctsvc_get_ipc_handle()
 {
-       if(contacts_ipc == NULL)
+       if(__contacts_ipc == NULL)
        {
-               if(contacts_global_ipc == NULL )
+               if(__contacts_global_ipc == NULL )
                {
                        ASSERT_NOT_REACHED("IPC haven't been initialized yet.");
                        return NULL;
                }
                CTS_DBG("fallback to global ipc channel");
-               return contacts_global_ipc;
+               return __contacts_global_ipc;
        }
 
-       return contacts_ipc;
+       return __contacts_ipc;
 }
 
 bool ctsvc_ipc_is_busy()
 {
        bool ret = false;
 
-       if(contacts_ipc != NULL)
+       if(__contacts_ipc != NULL)
        {
-               ret = pims_ipc_is_call_in_progress(contacts_ipc);
+               ret = pims_ipc_is_call_in_progress(__contacts_ipc);
                if(ret)
                {
                        CTS_ERR("thread local ipc channel is busy.");
                }
        }
        else {
-               ret = pims_ipc_is_call_in_progress(contacts_global_ipc);
+               ret = pims_ipc_is_call_in_progress(__contacts_global_ipc);
                if(ret)
                {
                        CTS_ERR("global ipc channel is busy.");
@@ -148,51 +150,51 @@ bool ctsvc_ipc_is_busy()
 
 int ctsvc_ipc_connect(void)
 {
-    int ret = CONTACTS_ERROR_NONE;
-    pims_ipc_data_h indata = NULL;
-    pims_ipc_data_h outdata = NULL;
-
-    // ipc create
-    if (contacts_global_ipc == NULL)
-    {
-       contacts_global_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH);
-        if (contacts_global_ipc == NULL)
-        {
-            CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE);
-            return CONTACTS_ERROR_IPC_NOT_AVALIABLE;
-        }
-    }
-    else
-    {
-        CTS_DBG("[GLOBAL_IPC_CHANNEL] contacts already connected");
-        return CONTACTS_ERROR_NONE;
-    }
-
-    // ipc call
-    if (pims_ipc_call(contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0)
-    {
-        CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed");
-        return CONTACTS_ERROR_IPC;
-    }
-
-    if (outdata)
-    {
-        // check outdata
-        unsigned int size = 0;
-        ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-        pims_ipc_data_destroy(outdata);
-
-        if (ret == CONTACTS_ERROR_NONE)
-        {
-
-        }
-        else
-        {
-            pims_ipc_destroy(contacts_global_ipc);
-            contacts_global_ipc = NULL;
-        }
-    }
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       // ipc create
+       if (__contacts_global_ipc == NULL)
+       {
+               __contacts_global_ipc = pims_ipc_create(CTSVC_IPC_SOCKET_PATH);
+               if (__contacts_global_ipc == NULL)
+               {
+                       CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_create() Failed(%d)", CONTACTS_ERROR_IPC_NOT_AVALIABLE);
+                       return CONTACTS_ERROR_IPC_NOT_AVALIABLE;
+               }
+       }
+       else
+       {
+               CTS_DBG("[GLOBAL_IPC_CHANNEL] contacts already connected");
+               return CONTACTS_ERROR_NONE;
+       }
+
+       // ipc call
+       if (pims_ipc_call(__contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_CONNECT, indata, &outdata) != 0)
+       {
+               CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed");
+               return CONTACTS_ERROR_IPC;
+       }
+
+       if (outdata)
+       {
+               // check outdata
+               unsigned int size = 0;
+               ret = *(int*) pims_ipc_data_get(outdata,&size);
+
+               pims_ipc_data_destroy(outdata);
+
+               if (ret == CONTACTS_ERROR_NONE)
+               {
+
+               }
+               else
+               {
+                       pims_ipc_destroy(__contacts_global_ipc);
+                       __contacts_global_ipc = NULL;
+               }
+       }
 
        return ret;
 }
@@ -200,80 +202,99 @@ int ctsvc_ipc_connect(void)
 
 int ctsvc_ipc_disconnect(void)
 {
-    int ret = CONTACTS_ERROR_NONE;
-    pims_ipc_data_h indata = NULL;
-    pims_ipc_data_h outdata = NULL;
-
-    RETVM_IF(contacts_global_ipc == NULL, CONTACTS_ERROR_IPC, "[GLOBAL_IPC_CHANNEL] contacts not connected");
-
-    // ipc call
-    if (pims_ipc_call(contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
-    {
-        CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed");
-        return CONTACTS_ERROR_IPC;
-    }
-
-    if (outdata)
-    {
-        // check outdata
-        unsigned int size = 0;
-        ret = *(int*) pims_ipc_data_get(outdata,&size);
-
-        pims_ipc_data_destroy(outdata);
-    }
-
-    if (contacts_global_ipc && ret == CONTACTS_ERROR_NONE)
-    {
-        pims_ipc_destroy(contacts_global_ipc);
-        contacts_global_ipc = NULL;
-    }
-    else
-    {
-       CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc didn't destroyed!!!(%d)", ret);
-    }
-
-    return ret;
-}
+       int ret = CONTACTS_ERROR_NONE;
+       pims_ipc_data_h indata = NULL;
+       pims_ipc_data_h outdata = NULL;
+
+       RETVM_IF(__contacts_global_ipc == NULL, CONTACTS_ERROR_IPC, "[GLOBAL_IPC_CHANNEL] contacts not connected");
+
+       // ipc call
+       if (pims_ipc_call(__contacts_global_ipc, CTSVC_IPC_MODULE, CTSVC_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
+       {
+               CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc_call failed");
+               return CONTACTS_ERROR_IPC;
+       }
+
+       if (outdata)
+       {
+               // check outdata
+               unsigned int size = 0;
+               ret = *(int*) pims_ipc_data_get(outdata,&size);
+
+               pims_ipc_data_destroy(outdata);
+       }
+
+       if (__contacts_global_ipc && ret == CONTACTS_ERROR_NONE)
+       {
+               pims_ipc_destroy(__contacts_global_ipc);
+               __contacts_global_ipc = NULL;
+       }
+       else
+       {
+               CTS_ERR("[GLOBAL_IPC_CHANNEL] pims_ipc didn't destroyed!!!(%d)", ret);
+       }
 
+       return ret;
+}
 
-void __ctsvc_ipc_lock()
+static void __ctsvc_ipc_lock()
 {
-    if (contacts_ipc == NULL)
-    {
-       ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_CALL);
-    }
+       if (__contacts_ipc == NULL)
+       {
+               ctsvc_mutex_lock(CTS_MUTEX_PIMS_IPC_CALL);
+       }
 }
 
-void __ctsvc_ipc_unlock(void)
+static void __ctsvc_ipc_unlock(void)
 {
-    if (contacts_ipc == NULL)
-    {
-       ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_CALL);
-    }
+       if (__contacts_ipc == NULL)
+       {
+               ctsvc_mutex_unlock(CTS_MUTEX_PIMS_IPC_CALL);
+       }
 }
 
 int ctsvc_ipc_call(char *module, char *function, pims_ipc_h data_in, pims_ipc_data_h *data_out)
 {
-    pims_ipc_h ipc_handle = ctsvc_get_ipc_handle();
+       pims_ipc_h ipc_handle = ctsvc_get_ipc_handle();
 
-    __ctsvc_ipc_lock();
+       __ctsvc_ipc_lock();
 
-    int ret = pims_ipc_call(ipc_handle, module, function, data_in, data_out);
+       int ret = pims_ipc_call(ipc_handle, module, function, data_in, data_out);
 
-    __ctsvc_ipc_unlock();
+       __ctsvc_ipc_unlock();
 
-    return ret;
+       return ret;
 }
 
 int ctsvc_ipc_call_async(char *module, char *function, pims_ipc_h data_in, pims_ipc_call_async_cb callback, void *userdata)
 {
-    pims_ipc_h ipc_handle = ctsvc_get_ipc_handle();
+       pims_ipc_h ipc_handle = ctsvc_get_ipc_handle();
 
-    __ctsvc_ipc_lock();
+       __ctsvc_ipc_lock();
 
-    int ret = pims_ipc_call_async(ipc_handle, module, function, data_in, callback, userdata);
+       int ret = pims_ipc_call_async(ipc_handle, module, function, data_in, callback, userdata);
 
-    __ctsvc_ipc_unlock();
+       __ctsvc_ipc_unlock();
 
-    return ret;
+       return ret;
+}
+
+void ctsvc_client_ipc_set_change_version(int version)
+{
+       if (__contacts_ipc == NULL) {
+               __contacts_global_change_version = version;
+               CTS_DBG("change_version = %d", version);
+               return;
+       }
+       __contacts_change_version = version;
+       CTS_DBG("change_version = %d", version);
 }
+
+int ctsvc_client_ipc_get_change_version(void)
+{
+       if (__contacts_ipc == NULL)
+               return __contacts_global_change_version;
+
+       return __contacts_change_version;
+}
+
index 39515d7..ab0af18 100644 (file)
@@ -39,6 +39,8 @@ int ctsvc_ipc_destroy_for_change_subscription();
 int ctsvc_ipc_call(char *module, char *function, pims_ipc_h data_in, pims_ipc_data_h *data_out);
 int ctsvc_ipc_call_async(char *module, char *function, pims_ipc_h data_in, pims_ipc_call_async_cb callback, void *userdata);
 
+void ctsvc_client_ipc_set_change_version(int version);
+int ctsvc_client_ipc_get_change_version(void);
 
 #endif /*  __TIZEN_SOCIAL_CTSVC_CLIENT_IPC_H__ */
 
index 8b3329a..403d514 100644 (file)
@@ -77,7 +77,8 @@ API int contacts_person_link_person(int base_person_id, int person_id)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_LINK_PERSON, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
+               pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
 
@@ -92,6 +93,12 @@ API int contacts_person_link_person(int base_person_id, int person_id)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -138,7 +145,7 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* unlin
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -155,6 +162,10 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* unlin
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
                if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+
                        if (unlinked_person_id)
                                *unlinked_person_id = *(int*)pims_ipc_data_get(outdata,&size);
                }
@@ -202,7 +213,7 @@ API int contacts_person_reset_usage(int person_id, contacts_usage_type_e type)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_RESET_USAGE, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -218,6 +229,12 @@ API int contacts_person_reset_usage(int person_id, contacts_usage_type_e type)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -268,7 +285,8 @@ API int contacts_person_set_favorite_order(int person_id, int previous_person_id
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_FAVORITE_ORDER, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
+               pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
 
@@ -283,6 +301,12 @@ API int contacts_person_set_favorite_order(int person_id, int previous_person_id
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -335,7 +359,7 @@ API int contacts_person_set_default_property(contacts_person_property_e property
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_SET_DEFAULT_PROPERTY, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -350,6 +374,11 @@ API int contacts_person_set_default_property(contacts_person_property_e property
                // check result
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
 
                pims_ipc_data_destroy(outdata);
        }
@@ -393,7 +422,7 @@ API int contacts_person_get_default_property(contacts_person_property_e property
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PERSON_MODULE, CTSVC_IPC_SERVER_PERSON_GET_DEFAULT_PROPERTY,
                                indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
index 67e25fc..b5305ef 100644 (file)
@@ -47,7 +47,7 @@ API int contacts_phone_log_reset_statistics(void)
        // ipc call
        if (ctsvc_ipc_call(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS, indata, &outdata) != 0)
        {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -62,6 +62,12 @@ API int contacts_phone_log_reset_statistics(void)
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
 
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
@@ -130,7 +136,7 @@ API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...)
 
        if (ctsvc_ipc_call(CTSVC_IPC_PHONELOG_MODULE,
                        CTSVC_IPC_SERVER_PHONELOG_DELETE, indata, &outdata) != 0) {
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                pims_ipc_data_destroy(indata);
                return CONTACTS_ERROR_IPC;
        }
@@ -140,6 +146,13 @@ API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...)
        if (outdata) {
                unsigned int size = 0;
                ret = *(int*) pims_ipc_data_get(outdata, &size);
+
+               if (CONTACTS_ERROR_NONE == ret) {
+                       int transaction_ver = 0;
+                       transaction_ver = *(int*)pims_ipc_data_get(outdata,&size);
+                       ctsvc_client_ipc_set_change_version(transaction_ver);
+               }
+
                pims_ipc_data_destroy(outdata);
        }
 
index 35f3cd7..39b9048 100644 (file)
@@ -36,7 +36,7 @@
 
 static int ctsvc_connection = 0;
 
-static int __thread ctsvc_connection_on_thread = 0;
+static __thread int ctsvc_connection_on_thread = 0;
 
 API int contacts_connect_with_flags(unsigned int flags)
 {
@@ -50,7 +50,7 @@ API int contacts_connect_with_flags(unsigned int flags)
        if (flags & CONTACTS_CONNECT_FLAG_RETRY) {
                int i;
                int waiting_time = 500;
-               for (i=0;i<6;i++) {
+               for (i=0;i<7;i++) {
                        usleep(waiting_time * 1000);
                        DBG("retry cnt=%d, ret=%x, %d",(i+1), ret, waiting_time);
                        ret = contacts_connect2();
index f68054f..a309537 100644 (file)
@@ -53,7 +53,7 @@ API int contacts_sim_insert(contacts_record_h record, int *contact_id)
        if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_INSERT_CONTACT, indata, &outdata) != 0)
        {
                pims_ipc_data_destroy(indata);
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -100,7 +100,7 @@ API int contacts_sim_update(contacts_record_h record)
        if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_UPDATE_CONTACT, indata, &outdata) != 0)
        {
                pims_ipc_data_destroy(indata);
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
@@ -148,7 +148,7 @@ API int contacts_sim_delete(int person_id)
        if (ctsvc_ipc_call(CTSVC_IPC_SIM_MODULE, CTSVC_IPC_SERVER_SIM_DELETE_CONTACT, indata, &outdata) != 0)
        {
                pims_ipc_data_destroy(indata);
-               CTS_ERR("pims_ipc_call failed");
+               CTS_ERR("ctsvc_ipc_call failed");
                return CONTACTS_ERROR_IPC;
        }
 
index 7efb32a..d3da91a 100644 (file)
@@ -35,7 +35,7 @@ static inline bool __ctsvc_filters_property_check(const property_info_s *propert
                property_info_s *p = (property_info_s*)&(properties[i]);
                if (property_id == p->property_id) {
                        if (p->property_type == CTSVC_SEARCH_PROPERTY_ALL || p->property_type == CTSVC_SEARCH_PROPERTY_FILTER) {
-                               *type = p->type;
+                               *type = (property_id & CTSVC_VIEW_DATA_TYPE_MASK);
                                return true;
                        }
                        else
index 049cc08..4deffb7 100644 (file)
 //#undef API
 #endif
 
-
 //#define CONTACTS_DEBUGGING
 //#define CONTACTS_TIMECHECK
 
-
 #define LOG_TAG "CONTACTS_SERVICE"
 #include <dlog.h>
 #define DLOG(prio, fmt, arg...) \
index 3e4879a..c4456f3 100644 (file)
@@ -405,7 +405,7 @@ int ctsvc_list_get_deleted_nth_record_p( contacts_list_h list, int index, contac
 
        RETV_IF(NULL == list_s->deleted_records, CONTACTS_ERROR_NO_DATA);
 
-       *record = (ctsvc_record_s *)g_list_nth_data(list_s->deleted_records, index);
+       *record = (contacts_record_h)g_list_nth_data(list_s->deleted_records, index);
 
        return CONTACTS_ERROR_NONE;
 }
index c53957a..b6f2d03 100755 (executable)
 #define CTSVC_HAN_HALF_START (UChar)0xFFA0
 #define CTSVC_HAN_HALF_END (UChar)0xFFDC
 
+/* korean -Hangul Syllables */
+#define CTSVC_HAN_SYLLABLES_START (UChar)0xAC00
+#define CTSVC_HAN_SYLLABLES_END (UChar)0xD7A3
+
+
+/* japanese - katakana */
+#define CTSVC_JAPANESE_KATAKANA_START  0x30A0
+#define CTSVC_JAPANESE_KATAKANA_END    0x30FF
+
+/* japanese - katakana phonetic extensions */
+#define CTSVC_JAPANESE_KATAKANA_PHONETIC_EXTENSIONS_START 0x31F0
+#define CTSVC_JAPANESE_KATAKANA_PHONETIC_EXTENSIONS_END 0x31FF
+
+/* japanese - halfwidth and fullwidth forms */
+#define CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_START 0xFF00
+#define CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_END 0xFFEF
+
+/* japanese - hiragana */
+#define CTSVC_JAPANESE_HIRAGANA_START 0x3040
+#define CTSVC_JAPANESE_HIRAGANA_END 0x309F
+
 static const char hangul_compatibility_choseong[] = {
        0x31, 0x32, 0x34, 0x37, 0x38, 0x39, 0x40, 0x41,
        0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
@@ -49,6 +70,7 @@ static const char hangul_compatibility_choseong[] = {
        0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
        0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80,
        0x81, 0x84, 0x85, 0x86, 0x00};
+
 static const unsigned char hangul_jamo_choseong[] = {
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x1A, 0x06, 0x07,           // to choseong 0x1100~0x115F
        0x08, 0x21, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
@@ -61,6 +83,7 @@ static const char hangul_compatibility_jungseong[] = {
        0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E,
        0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x87, 0x88,
        0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x00};
+
 static const unsigned char hangul_jamo_jungseong[] = {
        0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,   // to jungseong 0x1160~0x11A7
        0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
@@ -71,10 +94,26 @@ static const char hangul_compatibility_jongseong[] = {
        0x33, 0x35, 0x36, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E,
        0x3F, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
        0x6F, 0x70, 0x82, 0x83, 0x00};
+
 static const unsigned char hangul_jamo_jongseong[] = {
        0xAA, 0xAC, 0xAD, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,   // to jongseong 0x11A8~0x11FF
        0xC7, 0xC8, 0xCC, 0xCE, 0xD3, 0xD7, 0xD9, 0xDF, 0xF1, 0xF2, 0x00};
 
+static const unsigned char japanese_halfwidth_katakana_to_hiragana[] = { // 0xff66 - 0xff9f
+       0x92, 0x41, 0x43, 0x45, 0x47, 0x49, 0x83, 0x85, 0x87, 0x63,
+       0x00, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4B, 0x4D, 0x4F, 0x51,
+       0x53, 0x55, 0x57, 0x59, 0x5B, 0x5D, 0x5F, 0x61, 0x64, 0x66,
+       0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x72, 0x75, 0x78,
+       0x7B, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x84, 0x86, 0x88, 0x89,
+       0x8A, 0x8B, 0x8C, 0x8D, 0x8F, 0x93};
+
+static const unsigned char japanese_halfwidth_katakana_sonant_to_hiragana[] = { // 0xff76 - 0xff89
+       0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E,
+       0x60, 0x62, 0x65, 0x67, 0x69, 0x70, 0x73, 0x76, 0x79, 0x7C};
+
+static const unsigned char japanese_halfwidth_katakana_half_dullness_to_hiragana[] = { // 0xff8a - 0xff8e
+       0x71, 0x74, 0x77, 0x7A, 0x7D};
+
 int ctsvc_check_utf8(char c)
 {
        if ((c & 0xff) < (128 & 0xff))
@@ -93,18 +132,44 @@ int ctsvc_check_utf8(char c)
                return CONTACTS_ERROR_INVALID_PARAMETER;
 }
 
+static inline bool is_chosung(UChar src)
+{
+       int unicode_value1 = 0;
+       int unicode_value2 = 0;
+
+       unicode_value1 = (0xFF00 & (src)) >> 8;
+       unicode_value2 = (0xFF & (src));
+
+       if (unicode_value1 == 0x31
+                       && (unicode_value2 >= 0x30 && unicode_value2 <= 0x4e))
+               return true;
+       return false;
+}
+
 static inline bool is_hangul(UChar src)
 {
        if ((0x1100 == (src & 0xFF00))       /* korean -Hangul Jamo*/
                        || CTSVC_COMPARE_BETWEEN(CTSVC_JAMO_A_START, src, CTSVC_JAMO_A_END)
                        || CTSVC_COMPARE_BETWEEN(CTSVC_JAMO_B_START, src, CTSVC_JAMO_B_END)
                        || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_C_START, src, CTSVC_HAN_C_END)
-                       || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_HALF_START, src, CTSVC_HAN_HALF_END))
+                       || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_HALF_START, src, CTSVC_HAN_HALF_END)
+                       || CTSVC_COMPARE_BETWEEN(CTSVC_HAN_SYLLABLES_START, src, CTSVC_HAN_SYLLABLES_END))
                return true;
        else
                return FALSE;
 }
 
+static inline bool is_japanese(UChar src)
+{
+       if (CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_KATAKANA_START, src, CTSVC_JAPANESE_KATAKANA_END )
+                       || CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_KATAKANA_PHONETIC_EXTENSIONS_START, src, CTSVC_JAPANESE_KATAKANA_PHONETIC_EXTENSIONS_END )
+                       || CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_START, src, CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_END )
+                       || CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_HIRAGANA_START, src, CTSVC_JAPANESE_HIRAGANA_END ))
+               return true;
+       else
+               return false;
+}
+
 static inline void hangul_compatibility2jamo(UChar *src)
 {
        int unicode_value1 = 0;
@@ -151,6 +216,110 @@ static inline void hangul_compatibility2jamo(UChar *src)
        }
 }
 
+static inline int __ctsvc_convert_japanese_to_hiragana(UChar *src, UChar *dest, int dest_size)
+{
+       int i, j = 0, len = 0;
+
+       len = u_strlen(src);
+
+       for(i = 0; i < len; i++) {
+               int unicode_value1 = 0;
+               int unicode_value2 = 0;
+
+               unicode_value1 = 0x30;
+               unicode_value2 = (0xFF & (src[i]));
+
+               if (CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_KATAKANA_START, src[i], CTSVC_JAPANESE_KATAKANA_END)) {
+                       if ((unicode_value2 >= 0xa1 && unicode_value2 <= 0xef )
+                                       || (unicode_value2 == 0xF2 || unicode_value2 == 0xF3) ) {
+                               unicode_value2 -= 0x60;
+                               dest[j] = unicode_value1 << 8 | unicode_value2;
+                       }
+                       else
+                               dest[j] = src[i];
+               }
+               else if (CTSVC_COMPARE_BETWEEN(CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_START, src[i], CTSVC_JAPANESE_HALFWIDTH_AND_FULLWIDTH_FORMS_END)) {
+                       if (i+1 < len && (0xFF & (src[i+1])) == 0x9E
+                                       && unicode_value2 >= 0x76 && unicode_value2 <= 0x89) {
+                               unicode_value2 = japanese_halfwidth_katakana_sonant_to_hiragana[unicode_value2 - 0x76];
+                               dest[j] = unicode_value1 << 8 | unicode_value2;
+                               i++;
+                       }
+                       else if (i+1 < len && (0xFF & (src[i])) == 0x9F
+                                       && unicode_value2 >= 0x8a && unicode_value2 <= 0x8e) {
+                               unicode_value2 = japanese_halfwidth_katakana_half_dullness_to_hiragana[unicode_value2 - 0x8a];
+                               dest[j] = unicode_value1 << 8 | unicode_value2;
+                               i++;
+                       }
+                       else if (unicode_value2 >= 0x66 && unicode_value2 <= 0x9f) {
+                               unicode_value2 = japanese_halfwidth_katakana_to_hiragana[unicode_value2 - 0x66];
+                               dest[j] = unicode_value1 << 8 | unicode_value2;
+                       }
+                       else
+                               dest[j] = src[i];
+
+               } else
+                       dest[j] = src[i];
+               j++;
+       }
+
+       dest[j] = 0x0;
+
+       return j;
+}
+
+int ctsvc_convert_japanese_to_hiragana(const char *src, char **dest)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       UChar *tmp_result = NULL;
+       UChar *result = NULL;
+       UErrorCode status = 0;
+       int32_t size;
+
+       u_strFromUTF8(NULL, 0, &size, src, strlen(src), &status);
+       if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) {
+               CTS_ERR("u_strFromUTF8 to get the dest length Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+       status = U_ZERO_ERROR;
+       tmp_result = calloc(1, sizeof(UChar) * (size + 1));
+       u_strFromUTF8(tmp_result, size + 1, NULL, src, -1, &status);
+       if (U_FAILURE(status)){
+               CTS_ERR("u_strFromUTF8 Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+       result = calloc(1, sizeof(UChar) * (size + 1));
+
+       __ctsvc_convert_japanese_to_hiragana(tmp_result, result, size + 1 );
+
+       u_strToUTF8(NULL, 0, &size, result, -1, &status);
+       if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) {
+               CTS_ERR("u_strToUTF8 to get the dest length Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+
+       status = U_ZERO_ERROR;
+       *dest = calloc(1, sizeof(char)*(size+1));
+
+       u_strToUTF8(*dest, size + 1, &size, result, -1, &status);
+
+       if (U_FAILURE(status) ) {
+               CTS_ERR("u_strToUTF8 Failed(%s)", u_errorName(status));
+               ret =  CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+
+DATA_FREE:
+
+       free(tmp_result);
+       free(result);
+
+       return ret;
+}
+
 int ctsvc_check_language(UChar *word)
 {
        int type;
@@ -172,8 +341,11 @@ int ctsvc_check_language(UChar *word)
        else if (is_hangul(word[0])){
                type = CTSVC_LANG_KOREAN;
        }
-       else if (0x4E00 <= *word && *word <= 0x9FA5) {
-               type = CTSVC_LANG_ENGLISH;
+       else if (CTSVC_COMPARE_BETWEEN(0x4E00, word[0],  0x9FA5)) {
+               type = CTSVC_LANG_CHINESE;
+       }
+       else if (is_japanese(word[0])) {
+               type = CTSVC_LANG_JAPANESE;
        }
 
 #if 0          // TODO
@@ -305,6 +477,52 @@ int ctsvc_check_language_type(const char *src)
        return CONTACTS_ERROR_INVALID_PARAMETER;
 }
 
+int ctsvc_get_name_sort_type(const char *src)
+{
+       UErrorCode status = 0;
+       UChar tmp_result[10];
+       int ret = CTSVC_SORT_OTHERS;
+       int char_len = 0;
+       int language_type;
+       char char_src[10];
+
+
+       char_len = ctsvc_check_utf8(src[0]);
+       RETVM_IF(char_len <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "check_utf8 failed");
+
+       memcpy(char_src, &src[0], char_len);
+       char_src[char_len] = '\0';
+
+       u_strFromUTF8(tmp_result, array_sizeof(tmp_result), NULL, char_src, -1, &status);
+       RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                       "u_strFromUTF8() Failed(%s)", u_errorName(status));
+
+       language_type = ctsvc_check_language(tmp_result);
+
+       switch(language_type)
+       {
+       case CTSVC_LANG_CHINESE:
+               ret = CTSVC_SORT_CJK;
+               break;
+       case CTSVC_LANG_JAPANESE:
+               ret = CTSVC_SORT_JAPANESE;
+               break;
+       case CTSVC_LANG_KOREAN:
+               ret = CTSVC_SORT_KOREAN;
+               break;
+       case CTSVC_LANG_ENGLISH:
+               ret = CTSVC_SORT_WESTERN;
+               break;
+       case CTSVC_LANG_NUMBER:
+               ret = CTSVC_SORT_NUMBER;
+               break;
+       default:
+               ret = CTSVC_SORT_OTHERS;
+       }
+
+       return ret;
+}
+
 void ctsvc_extra_normalize(UChar *word, int32_t word_size)
 {
        int i;
@@ -315,6 +533,99 @@ void ctsvc_extra_normalize(UChar *word, int32_t word_size)
        }
 }
 
+const char *ctsvc_get_language(int lang)
+{
+       switch(lang)
+       {
+       case CTSVC_LANG_AZERBAIJAN: // az, Azerbaijan
+               return "az";
+       case CTSVC_LANG_ARABIC: // ar, Bahrain - Arabic
+               return "ar";
+       case CTSVC_LANG_BULGARIAN: // bg, Bulgaria - Bulgarian
+               return "bg";
+       case CTSVC_LANG_CATALAN: // ca, Spain - Catalan
+               return "ca";
+       case CTSVC_LANG_CZECH: // cs, Czech Republic - Czech
+               return "cs";
+       case CTSVC_LANG_DANISH: // da, Denmark - Danish
+               return "da";
+       case CTSVC_LANG_GERMAN: // de, Germany - German
+               return "de";
+       case CTSVC_LANG_GREEK: // el, Greece - Greek
+               return "el";
+       case CTSVC_LANG_ENGLISH: // en, en_PH, en_US
+               return "en";
+       case CTSVC_LANG_SPANISH: // es_ES, es_US, El Salvador - Spanish
+               return "es";
+       case CTSVC_LANG_ESTONIAN: // et, Estonia - Estonian
+               return "et";
+       case CTSVC_LANG_BASQUE: // eu, Spain - Basque
+               return "eu";
+       case CTSVC_LANG_FINNISH: // fi, Finland - Finnish
+               return "fi";
+       case CTSVC_LANG_FRENCH: // fr_CA, fr_FR
+               return "fr";
+       case CTSVC_LANG_IRISH: // ga, Ireland - Irish
+               return "ga";
+       case CTSVC_LANG_GALICIAN: // gl, Spain - Galician
+               return "gl";
+       case CTSVC_LANG_HINDI: // hi, India - Hindi
+               return "hi";
+       case CTSVC_LANG_CROATIAN: // hr, Bosnia and Herzegovina - Croatian
+               return "hr";
+       case CTSVC_LANG_HUNGARIAN: // hu, Hungary - Hungarian
+               return "hu";
+       case CTSVC_LANG_ARMENIAN: // hy, Armenia - Armenian
+               return "hy";
+       case CTSVC_LANG_ICELANDIC: // is, Iceland - Icelandic
+               return "is";
+       case CTSVC_LANG_ITALIAN: // it_IT, Italy - Italian
+               return "it";
+       case CTSVC_LANG_JAPANESE: // ja_JP, japan
+               return "ja";
+       case CTSVC_LANG_GEORGIAN: // ka, Georgia - Georgian
+               return "ka";
+       case CTSVC_LANG_KAZAKHSTAN: // kk, Kazakhstan
+               return "kk";
+       case CTSVC_LANG_KOREAN: // ko, ko_KR
+               return "ko";
+       case CTSVC_LANG_LITHUANIAN: // lt, Lithuania - Lithuanian
+               return "lt";
+       case CTSVC_LANG_LATVIAN: // lv, Latvia - Latvian
+               return "lv";
+       case CTSVC_LANG_MACEDONIA: // mk, Macedonia
+               return "mk";
+       case CTSVC_LANG_NORWAY: // nb, Norway
+               return "nb";
+       case CTSVC_LANG_DUTCH: // nl_Nl, Netherlands Dutch
+               return "nl";
+       case CTSVC_LANG_POLISH: // pl, Polish
+               return "pl";
+       case CTSVC_LANG_PORTUGUESE: // pt_BR, pt_PT, Portugal
+               return "pt";
+       case CTSVC_LANG_ROMANIA: // ro, Romania
+               return "ro";
+       case CTSVC_LANG_RUSSIAN: // ru_RU, Russia
+               return "ru";
+       case CTSVC_LANG_SLOVAK: // sk, Slovakia - Slovak
+               return "sk";
+       case CTSVC_LANG_SLOVENIAN: // sl, Slovenia - Slovenian
+               return "sl";
+       case CTSVC_LANG_SERBIAN: // sr, Serbia - Serbian
+               return "sr";
+       case CTSVC_LANG_SWEDISH: // sv, Finland - Swedish
+               return "sv";
+       case CTSVC_LANG_TURKISH: // tr_TR, Turkey - Turkish
+               return "tr";
+       case CTSVC_LANG_UKRAINE: // uk, Ukraine
+               return "uk";
+       case CTSVC_LANG_CHINESE: // zh_CN, zh_HK, zh_SG, zh_TW
+               return "zh";
+       }
+
+       return "";
+}
+
 int ctsvc_get_language_type(const char *system_lang)
 {
        int type;
@@ -484,7 +795,7 @@ int ctsvc_get_chosung(const char *src, char *dest, int dest_size)
                                (UChar *)result, array_sizeof(result), &status);
                RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
                                "unorm_normalize(%s) Failed(%s)", src, u_errorName(status));
-
+               ctsvc_extra_normalize(result, size);
                u_strToUTF8(temp, dest_size, &size, result, -1, &status);
                RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
                                "u_strToUTF8() Failed(%s)", u_errorName(status));
@@ -500,3 +811,59 @@ int ctsvc_get_chosung(const char *src, char *dest, int dest_size)
        return count;
 }
 
+int ctsvc_get_korean_search_pattern(const char *src, char *dest, int dest_size)
+{
+       int32_t size;
+       UErrorCode status = 0;
+       UChar tmp_result[10];
+       UChar result[10];
+       int i=0, j=0, count=0;
+       int char_len = 0;
+       int str_len = strlen(src);
+
+
+       for (i=0;i<str_len;i+=char_len) {
+               char char_src[10];
+               char_len = ctsvc_check_utf8(src[i]);
+               RETVM_IF(char_len <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "check_utf8 failed");
+
+               memcpy(char_src, &src[i], char_len);
+               char_src[char_len] = '\0';
+
+               u_strFromUTF8(tmp_result, array_sizeof(tmp_result), NULL, char_src, -1, &status);
+               RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                               "u_strFromUTF8() Failed(%s)", u_errorName(status));
+
+               if (is_chosung(tmp_result[0]))
+               {
+                       hangul_compatibility2jamo(tmp_result);
+
+                       u_strToUTF8(&dest[j], dest_size - j, &size, tmp_result, -1, &status);
+                       RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                                       "u_strToUTF8() Failed(%s)", u_errorName(status));
+                       j += size;
+                       dest[j] = '*';
+                       j++;
+               }
+               else {
+                       u_strToUpper(tmp_result, array_sizeof(tmp_result), tmp_result, -1, NULL, &status);
+                       RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                                       "u_strToUpper() Failed(%s)", u_errorName(status));
+                       size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0,
+                                       (UChar *)result, array_sizeof(result), &status);
+                       RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                                       "unorm_normalize(%s) Failed(%s)", src, u_errorName(status));
+                       ctsvc_extra_normalize(result, size);
+                       u_strToUTF8(&dest[j], dest_size - j, &size, result, -1, &status);
+                       RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
+                                       "u_strToUTF8() Failed(%s)", u_errorName(status));
+                       j += size;
+
+               }
+               count++;
+       }
+
+       dest[j] = '\0';
+
+       return count;
+}
index 0621d60..802bda8 100755 (executable)
 
 #include <unicode/utypes.h>
 
+enum SORTTYPE{
+       CTSVC_SORT_NUMBER,              // 0
+       CTSVC_SORT_PRIMARY,     // 1
+       CTSVC_SORT_SECONDARY,   // 2
+       CTSVC_SORT_WESTERN,             // 3
+       CTSVC_SORT_KOREAN,              // 4
+       CTSVC_SORT_JAPANESE,    // 5
+       CTSVC_SORT_CJK,                 // 6
+       CTSVC_SORT_OTHERS = 100,// 0
+};
+
 int ctsvc_check_utf8(char c);
 int ctsvc_check_language(UChar *word);
 int ctsvc_check_language_type(const char *src);
+int ctsvc_get_name_sort_type(const char *src);
 int ctsvc_get_language_type(const char *system_lang);
+const char *ctsvc_get_language(int lang);
 void ctsvc_extra_normalize(UChar *word, int32_t word_size);
 int ctsvc_get_chosung(const char *src, char *dest, int dest_size);
+int ctsvc_convert_japanese_to_hiragana(const char *src, char **dest);
+int ctsvc_get_korean_search_pattern(const char *src, char *dest, int dest_size);
+
 #endif // __TIZEN_SOCIAL_CTSVC_LOCALIZE_H__
index 9d7f29d..402ba3f 100755 (executable)
@@ -2193,9 +2193,8 @@ bool ctsvc_has_chinese(const char *src)
 
 int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *size)
 {
-       char            spell[CHINESE_PINYIN_MAX_LEN][CHINESE_DUOYINZI_MAX_COUNT][CHINESE_PINYIN_SPELL_MAX_LEN]
-                                                                                 = {NULL};
-       int                     pinyin_spell_count[CHINESE_PINYIN_MAX_LEN] = {0};;
+       char spell[CHINESE_PINYIN_MAX_LEN][CHINESE_DUOYINZI_MAX_COUNT][CHINESE_PINYIN_SPELL_MAX_LEN];
+       int pinyin_spell_count[CHINESE_PINYIN_MAX_LEN] = {0};
        UChar   temp_result[strlen(src)+1];
        int     count = 0, len=0, total_count=0;
        int ret, i, j;
@@ -2205,6 +2204,8 @@ int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *
        RETVM_IF(src==NULL, CONTACTS_ERROR_SYSTEM, "src is NULL");
        RETVM_IF(!*src, CONTACTS_ERROR_SYSTEM, "*src is NULL");
 
+       memset(spell, 0x0, CHINESE_PINYIN_MAX_LEN * CHINESE_DUOYINZI_MAX_COUNT * CHINESE_PINYIN_SPELL_MAX_LEN);
+
        u_strFromUTF8(temp_result, array_sizeof(temp_result), NULL, src, -1, &status);
        if (U_FAILURE(status)){
                CTS_ERR("u_strFromUTF8 Failed(%s)", u_errorName(status));
@@ -2255,8 +2256,11 @@ int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *
                        }
 
                        if (spell[i][index][0]) {
+                               if(temp_name[j].pinyin_name[0])
+                                       name_len[j] += snprintf(temp_name[j].pinyin_name + name_len[j], sizeof(temp_name[j].pinyin_name) - name_len[j], " ");
+
                                name_len[j] += snprintf(temp_name[j].pinyin_name + name_len[j], sizeof(temp_name[j].pinyin_name) - name_len[j],
-                                                               "%s ", spell[i][index]);
+                                                               "%s", spell[i][index]);
                                initial_len[j] += snprintf(temp_name[j].pinyin_initial + initial_len[j], sizeof(temp_name[j].pinyin_initial) - initial_len[j],
                                                                "%c", spell[i][index][0]);
                        }
@@ -2264,11 +2268,6 @@ int ctsvc_convert_chinese_to_pinyin(const char *src, pinyin_name_s **name, int *
                repeat *= pinyin_spell_count[i];
        }
 
-//     for(j=0;j<total_count;j++) {
-//             DBG("temp_name[%d]->pinyin_name %s", j, temp_name[j].pinyin_name);
-//             DBG("temp_name[%d]->pinyin_initial %s", j, temp_name[j].pinyin_initial);
-//     }
-
        *name = temp_name;
 
        return CONTACTS_ERROR_NONE;
index 1f3d4f4..cfdee58 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 
+#include <ctype.h>
 #include <unicode/ulocdata.h>
 #include <unicode/ustring.h>
 #include <unicode/unorm.h>
 #include "ctsvc_internal.h"
 #include "ctsvc_normalize.h"
 #include "ctsvc_localize.h"
+#include "ctsvc_localize_ch.h"
+#include "ctsvc_setting.h"
+
+
 
-#define CTSVC_NORMALIZED_NUMBER_SIZE_MAX 7
 #define CTSVC_NORMALIZED_MAX_LEN 1024
 
+#define CTSVC_COMBINING_DIACRITICAL_MARKS_START 0x0300
+#define CTSVC_COMBINING_DIACRITICAL_MARKS_END  0x036f
+
+typedef struct {
+       UChar letter;
+       char start;
+       char end;
+}hiragana_group_letter;
+
+static hiragana_group_letter hiragana_group[13] = {
+       {0x3042, 0x41, 0x4a}, // ぁ    あ     ぃ     い     ぅ     う     ぇ     え     ぉ     お
+       {0x3042, 0x94, 0x94}, // ゔ
+       {0x304b, 0x4b, 0x54}, // か    が     き     ぎ     く     ぐ     け     げ     こ     ご
+       {0x304b, 0x95, 0x96}, // ゕ    ゖ
+       {0x3055, 0x55, 0x5e}, // さ    ざ     し     じ     す     ず     せ     ぜ     そ     ぞ
+       {0x305f, 0x5f, 0x69}, // た    だ     ち     ぢ     っ     つ     づ     て     で     と     ど
+       {0x306a, 0x6a, 0x6e}, // な    に     ぬ     ね     の
+       {0x306f, 0x6f, 0x7d}, // は    ば     ぱ     ひ     び     ぴ     ふ     ぶ     ぷ     へ     べ     ぺ     ほ     ぼ     ぽ
+       {0x307e, 0x7e, 0x82}, // ま    み     む     め     も
+       {0x3084, 0x83, 0x88}, // ゃ    や     ゅ     ゆ     ょ     よ
+       {0x3089, 0x89, 0x8d}, // ら    り     る     れ     ろ
+       {0x308f, 0x8e, 0x92}, // ゎ    わ
+       {0x3093, 0x93, 0x93}, // ゐ    ゑ     を
+};
 
 
 static inline bool __ctsvc_check_dirty_number(char digit)
@@ -247,7 +275,7 @@ static inline const char* __ctsvc_clean_country_code(const char *src)
        return &src[ret];
 }
 
-int ctsvc_normalize_number(const char *src, char *dest, int dest_size)
+static int __ctsvc_normalize_number(const char *src, char *dest, int dest_size, int min_match)
 {
        int i;
        int len;
@@ -265,7 +293,7 @@ int ctsvc_normalize_number(const char *src, char *dest, int dest_size)
 
        if (0 < len) {
                while(0 <= (len-d_pos-1) && temp_number[len-d_pos-1]
-                               && d_pos < CTSVC_NORMALIZED_NUMBER_SIZE_MAX) {
+                               && d_pos < min_match) {
                        if (dest_size-d_pos == 0) {
                                CTS_ERR("Destination string buffer is not enough(%s)", src);
                                return CONTACTS_ERROR_INTERNAL;
@@ -288,6 +316,20 @@ int ctsvc_normalize_number(const char *src, char *dest, int dest_size)
        return CONTACTS_ERROR_NONE;
 }
 
+
+int ctsvc_normalize_number(const char *src, char *dest, int dest_size, int min_match)
+{
+       int ret;
+
+       ret = __ctsvc_normalize_number(src, dest, dest_size, min_match);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("__ctsvc_normalize_number(src) failed(%d)", src, ret);
+               return ret;
+       }
+
+       return CONTACTS_ERROR_NONE;
+}
+
 static int __ctsvc_remove_special_char(const char *src, char *dest, int dest_size)
 {
        int s_pos=0, d_pos=0, char_type, src_size;
@@ -374,78 +416,166 @@ int ctsvc_collation_str(char *src, char **dest)
        return __ctsvc_collation_str(temp, dest);
 }
 
-static int __ctsvc_normalize_str(const char *src, char *dest, int dest_size)
+static int __ctsvc_normalize_str(const char *src, char **dest)
 {
-       int type = CTSVC_LANG_OTHERS;
-       int32_t size;
+       int ret;
+       int32_t tmp_size = 100;
+       int32_t size = 100;
        UErrorCode status = 0;
-       UChar tmp_result[dest_size*2];
-       UChar result[dest_size*2];
-       int i = 0;
-       int j = 0;
-       int str_len = strlen(src);
-       int char_len = 0;
-
-       for (i=0;i<str_len;i+=char_len) {
-               char char_src[10];
-               char_len = ctsvc_check_utf8(src[i]);
-               if( char_len < 0 )
-               {
-                       return char_len;
+       UChar *tmp_result = NULL;
+       UChar *result = NULL;
+
+       tmp_result = calloc(1, sizeof(UChar)*(tmp_size+1));
+       result = calloc(1, sizeof(UChar)*(size+1));
+       u_strFromUTF8(tmp_result, tmp_size + 1, &tmp_size, src, -1, &status);
+
+       if (status == U_BUFFER_OVERFLOW_ERROR) {
+               status = U_ZERO_ERROR;
+               free(tmp_result);
+               tmp_result = calloc(1, sizeof(UChar) * (tmp_size + 1));
+               u_strFromUTF8(tmp_result, tmp_size + 1, NULL, src, -1, &status);
+               if (U_FAILURE(status)) {
+                       CTS_ERR("u_strFromUTF8()Failed(%s)", u_errorName(status));
+                       ret = CONTACTS_ERROR_SYSTEM;
+                       goto DATA_FREE;
+               }
+       }
+       else if (U_FAILURE(status)) {
+               CTS_ERR("u_strFromUTF8() Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+
+       u_strToUpper(tmp_result, tmp_size + 1, tmp_result, -1, NULL, &status);
+       if (U_FAILURE(status)) {
+               CTS_ERR("u_strToUpper() Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+
+       size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0,
+                       (UChar *)result, size + 1, &status);
+
+       if (status == U_BUFFER_OVERFLOW_ERROR) {
+               status = U_ZERO_ERROR;
+               free(result);
+               result = calloc(1, sizeof(UChar) * (size + 1));
+               size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0, (UChar *)result, size + 1, &status);
+               if (U_FAILURE(status)) {
+                       CTS_ERR("unorm_normalize() Failed(%s)", u_errorName(status));
+                       ret = CONTACTS_ERROR_SYSTEM;
+                       goto DATA_FREE;
                }
+       }
+       else if (U_FAILURE(status)) {
+               CTS_ERR("unorm_normalize() Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               goto DATA_FREE;
+       }
+
+       ret = ctsvc_check_language(result);
+       ctsvc_extra_normalize(result, size);
+
+       u_strToUTF8(NULL, 0, &size, result, -1, &status);
+       status = U_ZERO_ERROR;
+       *dest = calloc(1, sizeof(char) * (size+1));
+
+       u_strToUTF8(*dest, size+1, NULL, result, -1, &status);
+       if (U_FAILURE(status)) {
+               CTS_ERR("u_strToUTF8() Failed(%s)", u_errorName(status));
+               ret = CONTACTS_ERROR_SYSTEM;
+               free(*dest);
+               goto DATA_FREE;
+       }
 
-               memcpy(char_src, &src[i], char_len);
-               char_src[char_len] = '\0';
+DATA_FREE:
+       free(tmp_result);
+       free(result);
+       return ret;
 
-               u_strFromUTF8(tmp_result, array_sizeof(tmp_result), NULL, char_src, -1, &status);
-               RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
-                               "u_strFromUTF8() Failed(%s)", u_errorName(status));
+}
 
-               u_strToUpper(tmp_result, array_sizeof(tmp_result), tmp_result, -1, NULL, &status);
-               RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
-                               "u_strToLower() Failed(%s)", u_errorName(status));
+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];
 
-               size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0,
-                               (UChar *)result, array_sizeof(result), &status);
-               RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
-                               "unorm_normalize(%s) Failed(%s)", src, u_errorName(status));
+       u_strFromUTF8(tmp_result, dest_size, &size, src, src_size, &status);
 
-               if (i == 0)
-                       type = ctsvc_check_language(result);
-               ctsvc_extra_normalize(result, size);
+       if (U_FAILURE(status)) {
+               CTS_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)) {
+               CTS_ERR("u_strToUpper() Failed(%s)", u_errorName(status));
+               return CONTACTS_ERROR_SYSTEM;
+       }
 
-               u_strToUTF8(&dest[j], dest_size-j, &size, result, -1, &status);
-               RETVM_IF(U_FAILURE(status), CONTACTS_ERROR_SYSTEM,
-                               "u_strToUTF8() Failed(%s)", u_errorName(status));
-               j += size;
-               //dest[j++] = 0x7E;
+       size = unorm_normalize(tmp_result, -1, UNORM_NFD, 0,
+                       (UChar *)dest, dest_size, &status);
+       if (U_FAILURE(status)) {
+               CTS_ERR("unorm_normalize() Failed(%s)", u_errorName(status));
+               return CONTACTS_ERROR_SYSTEM;
        }
-       dest[j]='\0';
 
-       return type;
+       ret = ctsvc_check_language(dest);
+       ctsvc_extra_normalize(dest, size);
+
+       dest[size] = 0x00;
+
+       return ret;
 }
 
-int ctsvc_normalize_str(const char *src, char *dest, int dest_size)
+int ctsvc_normalize_str(const char *src, char **dest)
 {
        int ret = CONTACTS_ERROR_NONE;
-       char temp[dest_size];
+       char temp[strlen(src) + 1];
 
-       dest[0] = '\0';
-       ret = __ctsvc_remove_special_char(src, temp, dest_size);
+       ret = __ctsvc_remove_special_char(src, temp, strlen(src) + 1);
        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "__ctsvc_remove_special_char() Failed(%d)", ret);
 
-       ret = __ctsvc_normalize_str(temp, dest, dest_size);
+       ret = __ctsvc_normalize_str(temp, dest);
        return ret;
 }
 
-int ctsvc_normalize_index(const char *src, char *dest, int dest_size)
+static void __ctsvc_convert_japanese_group_letter(char *dest)
+{
+       int i, size, dest_len;
+       UErrorCode status = 0;
+       UChar tmp_result[2];
+       UChar result[2] = {0x00};
+       int unicode_value1, unicode_value2;
+
+       dest_len = strlen(dest) + 1;
+       u_strFromUTF8(tmp_result, array_sizeof(tmp_result), NULL, dest, -1, &status);
+       RETM_IF(U_FAILURE(status), "u_strFromUTF8() Failed(%s)", u_errorName(status));
+
+       unicode_value1 = (0xFF00 & (tmp_result[0])) >> 8;
+       unicode_value2 = (0xFF & (tmp_result[0]));
+
+
+       for(i=0; i < 13; i++)
+       {
+               if (hiragana_group[i].start <= unicode_value2
+                               && unicode_value2 <= hiragana_group[i].end)
+                       result[0] = hiragana_group[i].letter;
+       }
+
+       u_strToUTF8(dest, dest_len, &size, result, -1, &status);
+       RETM_IF(U_FAILURE(status), "u_strToUTF8() Failed(%s)", u_errorName(status));
+
+}
+
+int ctsvc_normalize_index(const char *src, char **dest)
 {
        int ret = CONTACTS_ERROR_NONE;
        char first_str[10] = {0};
        int length = 0;
 
-       dest[0] = '\0';
-
        length = ctsvc_check_utf8(src[0]);
        RETVM_IF(length <= 0, CONTACTS_ERROR_INTERNAL, "check_utf8 is failed");
 
@@ -453,10 +583,14 @@ int ctsvc_normalize_index(const char *src, char *dest, int dest_size)
        if (length != strlen(first_str))
                return CONTACTS_ERROR_INVALID_PARAMETER;
 
-       ret = __ctsvc_normalize_str(first_str, dest, dest_size);
-       if (dest[0] != '\0') {
-               length = ctsvc_check_utf8(dest[0]);
-               dest[length] = '\0';
+       ret = __ctsvc_normalize_str(first_str, dest);
+       if ((*dest)[0] != '\0') {
+               length = ctsvc_check_utf8((*dest)[0]);
+               (*dest)[length] = '\0';
+       }
+
+       if (ret == CTSVC_LANG_JAPANESE) {
+               __ctsvc_convert_japanese_group_letter(*dest);
        }
        return ret;
 }
@@ -506,8 +640,9 @@ API int contacts_utils_get_index_characters(char **index_string)
 {
        const char *first;
        const char *second;
-       int lang_first;
-       int lang_second;
+       int lang_first = CTSVC_LANG_ENGLISH;
+       int lang_second = CTSVC_LANG_KOREAN;
+       int sort_first, sort_second;
        char **first_list = NULL;
        char **second_list = NULL;
        char list[1024] = {0,};
@@ -526,8 +661,25 @@ API int contacts_utils_get_index_characters(char **index_string)
        }
 
        strcat(list, ":");
-       first = vconf_get_str(VCONFKEY_LANGSET);
-       lang_first = ctsvc_get_language_type(first);
+
+
+       sort_first = ctsvc_get_default_language();
+       switch(sort_first)
+       {
+       case CTSVC_SORT_WESTERN:
+               lang_first = CTSVC_LANG_ENGLISH;
+               break;
+       case CTSVC_SORT_KOREAN:
+               lang_first = CTSVC_LANG_KOREAN;
+               break;
+       case CTSVC_SORT_JAPANESE:
+               lang_first = CTSVC_LANG_JAPANESE;
+               break;
+       default:
+               CTS_ERR("The default language is not valid");
+       }
+
+       first = ctsvc_get_language(lang_first);
        __ctsvc_get_language_index(first, &first_list, &first_len);
        for (i=0;i<first_len;i++) {
                strcat(list, first_list[i]);
@@ -537,8 +689,22 @@ API int contacts_utils_get_index_characters(char **index_string)
        }
        free(first_list);
 
-       second = vconf_get_str(VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE);
-       lang_second = ctsvc_get_language_type(second);
+       sort_second = ctsvc_get_secondary_language();
+       switch(sort_second)
+       {
+       case CTSVC_SORT_WESTERN:
+               lang_second = CTSVC_LANG_ENGLISH;
+               break;
+       case CTSVC_SORT_KOREAN:
+               lang_second = CTSVC_LANG_KOREAN;
+               break;
+       case CTSVC_SORT_JAPANESE:
+               lang_second = CTSVC_LANG_JAPANESE;
+               break;
+       default:
+               CTS_ERR("The default language is not valid");
+       }
+       second = ctsvc_get_language(lang_second);
        if (lang_first != lang_second)
                __ctsvc_get_language_index(second, &second_list, &second_len);
 
@@ -592,7 +758,7 @@ static inline bool __ctsvc_is_diacritical(const char *src)
        return false;
 }
 
-static inline bool __ctsvc_compare_unicode(const char *str1, const char *str2, int str2_len)
+static inline bool __ctsvc_compare_utf8(const char *str1, const char *str2, int str2_len)
 {
        int k;
        for (k=0; k<str2_len;k++)
@@ -601,6 +767,269 @@ static inline bool __ctsvc_compare_unicode(const char *str1, const char *str2, i
        return true;
 }
 
+#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 < strlen(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]);
+               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) {
+                               DBG("A name matched");
+                               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;
+               }
+               free(pinyinname);
+
+               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_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:
+       case CTSVC_LANG_CHINESE:
+               {
+                       if(needle_lang == haystack_lang
+                                       && haystack[0] == needle[0])
+                               ret = true;
+               }
+               return ret;
+       }
+
+       return false;
+}
+
+/**
+ * This function compares compares two strings which is not normalized.
+ * If search_str is included in str, this function return #sCONTACTS_ERROR_NONE. \n
+ * The behavior of this function cannot fix because of localization.
+ * So, The behavior can be different from each other.
+ *
+ * @param[in] haystack Base string.
+ * @param[in] needle searching string
+ * @param[out] len substring length
+ * @return a position of the beginning of the substring, Negative value(#cts_error) on error or difference.
+ * @par example
+ * @code
+       ret = contacts_strstr(str1, str2, &len);
+       if(CONTACTS_ERROR_NONE == ret) {
+               snprintf(first, ret+1, "%s", item_data->display);
+               snprintf(middle, len+1, "%s", item_data->display + ret);
+               printf("%s -> %s, %s, %s", item_data->display, first, middle, item_data->display + ret + len);
+       } else
+               printf("str1 doesn't has str2");
+ * @endcode
+ */
+
+
+API int contacts_utils_strstr(const char *haystack,
+               const char *needle, int *len)
+{
+
+       int ret, h_len, 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;
+
+       char temp_haystack[strlen(haystack) + 1];
+       char temp_needle[strlen(needle) + 1];
+
+
+       RETVM_IF(NULL == haystack, -1, "The parameter(haystack) is NULL");
+       RETVM_IF(NULL == needle, -1, "The parameter(needle) is NULL");
+       CTS_VERBOSE("haystack = %s, needle = %s", haystack, needle);
+
+       *len = 0;
+
+       ret = __ctsvc_remove_special_char(haystack, temp_haystack, strlen(haystack) + 1);
+       ret = __ctsvc_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 = ctsvc_check_utf8(temp_haystack[i]);
+
+               haystack_letter_lang = __ctsvc_normalize_str_to_unicode(temp_haystack + i, h_len, 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, &n_len)) {
+                               matching = true;
+                               j+=n_len;
+                               match_start = i;
+                               match_len = h_len;
+
+                               if (temp_needle[j] == '\0') {
+                                       *len = match_len;
+                                       return match_start;
+                               }
+                       }
+                       continue;
+               }
+               else if (matching == true) {
+                       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;
+
+                               if (temp_needle[j] == '\0') {
+                                       *len = match_len;
+                                       return match_start;
+                               }
+                               continue;
+                       }
+                       else {
+                               j = 0;
+                               matching = false;
+                               match_start = -1;
+                               match_len = 0;
+                       }
+               }
+       }
+
+       CTS_VERBOSE("NOT match");
+       return -1;
+}
+
 /**
  * This function compares compares two strings which must have been normalized already.
  * If search_str is included in str, this function return #sCONTACTS_ERROR_NONE. \n
@@ -664,7 +1093,7 @@ API int contacts_normalized_strstr(const char *haystack,
                        }
 
                        if (wind == 0 && j && 0 < i) {
-                               if (h_len == first_needle_len && __ctsvc_compare_unicode(&haystack[i], needle, first_needle_len)
+                               if (h_len == first_needle_len && __ctsvc_compare_utf8(&haystack[i], needle, first_needle_len)
                                                && !__ctsvc_is_diacritical(&haystack[i])) {
                                        unsigned short tmp;
 
@@ -728,7 +1157,7 @@ API int contacts_normalized_strstr(const char *haystack,
                                }
                        }
 
-                       equal = __ctsvc_compare_unicode(&haystack[i], &needle[j], n_len);
+                       equal = __ctsvc_compare_utf8(&haystack[i], &needle[j], n_len);
 
                        if (equal) {
                                if (!counted) {
@@ -795,12 +1224,17 @@ API int contacts_normalized_strstr(const char *haystack,
 API int contacts_normalize_str(const char *src, char *dest, const int dest_len)
 {
        int ret;
+       char *temp = NULL;
        RETV_IF(NULL == dest, CONTACTS_ERROR_INVALID_PARAMETER);
        RETVM_IF(dest_len <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "dest_len(%d) is Invalid", dest_len);
+       dest[0] = '\0';
 
-       ret = ctsvc_normalize_str(src, dest, dest_len);
+       ret = ctsvc_normalize_str(src, &temp);
        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_normalize_str() Failed(%d)", ret);
 
+       snprintf(dest, dest_len, "%s", temp);
+       free(temp);
+
        return CONTACTS_ERROR_NONE;
 }
 
index 60dc3a0..f52e0a6 100644 (file)
@@ -19,7 +19,7 @@
 #ifndef __TIZEN_SOCIAL_CTSVC_NORMALIZE_H__\r
 #define __TIZEN_SOCIAL_CTSVC_NORMALIZE_H__\r
 \r
-#define VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE "db/contacts-svc/secondary_lang"      // It should be added to vconf-internal-keys\r
+#define CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE 8\r
 \r
 enum LANGTYPE{\r
        CTSVC_LANG_NUMBER = 0,\r
@@ -71,9 +71,9 @@ enum LANGTYPE{
 };\r
 \r
 int ctsvc_clean_number(const char *src, char *dest, int dest_size);\r
-int ctsvc_normalize_number(const char *src, char *dest, int dest_size);\r
-int ctsvc_normalize_str(const char *src, char *dest, int dest_size);\r
+int ctsvc_normalize_number(const char *src, char *dest, int dest_size, int min_match);\r
+int ctsvc_normalize_str(const char *src, char **dest);\r
 int ctsvc_collation_str(char *src, char **dest);\r
-int ctsvc_normalize_index(const char *src, char *dest, int dest_size);\r
+int ctsvc_normalize_index(const char *src, char **dest);\r
 \r
 #endif /*  __TIZEN_SOCIAL_CTSVC_NORMALIZE_H__ */\r
index 40b7db9..6a41067 100644 (file)
 #define CTSVC_NOTI_PERSON_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_PERSON_CHANGED"\r
 #define CTSVC_NOTI_SIMPLE_CONTACT_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_SIMPLE_CONTACT_CHANGED"\r
 #define CTSVC_NOTI_CONTACT_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_DB_CHANGED"\r
-#define CTSVC_NOTI_MY_PROFILE_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_MYPROFILE_CHANGED"\r
+#define CTSVC_NOTI_MY_PROFILE_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_MY_PROFILE_CHANGED"\r
 #define CTSVC_NOTI_NAME_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_NAME_CHANGED"\r
 #define CTSVC_NOTI_NUMBER_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_NUMBER_CHANGED"\r
 #define CTSVC_NOTI_EMAIL_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_EMAIL_CHANGED"\r
 #define CTSVC_NOTI_EVENT_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_EVENT_CHANGED"\r
 #define CTSVC_NOTI_URL_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_URL_CHANGED"\r
-#define CTSVC_NOTI_GROUP_RELATION_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_GROUP_REL_CHANGED"\r
+#define CTSVC_NOTI_GROUP_RELATION_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_GROUP_RELATION_CHANGED"\r
 #define CTSVC_NOTI_ADDRESS_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_ADDRESS_CHANGED"\r
 #define CTSVC_NOTI_NOTE_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_NOTE_CHANGED"\r
 #define CTSVC_NOTI_COMPANY_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_COMPANY_CHANGED"\r
@@ -44,9 +44,7 @@
 #define CTSVC_NOTI_PROFILE_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_PROFILE_CHANGED"\r
 #define CTSVC_NOTI_ACTIVITY_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_ACTIVITY_CHANGED"\r
 #define CTSVC_NOTI_PHONELOG_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_PLOG_CHANGED"\r
-#define CTSVC_NOTI_FAVORITE_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_FAVOR_CHANGED"\r
 #define CTSVC_NOTI_SPEEDDIAL_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_SPEED_CHANGED"\r
-#define CTSVC_NOTI_MISSED_CALL_CHANGED  "/opt/usr/data/contacts-svc/.CONTACTS_SVC_MISSED_CHANGED"\r
 \r
 \r
 #endif /* __TIZEN_SOCIAL_CTSVC_NOTIFY_H__ */\r
index 771b2cb..06fdd1c 100644 (file)
@@ -127,24 +127,54 @@ static const ctsvc_record_plugin_cb_s *__ctsvc_record_get_plugin_cb(int r_type)
                ASSERT_NOT_REACHED("Invalid parameter: Operation restricted."); \
                return CONTACTS_ERROR_INVALID_PARAMETER;
 
-static inline bool __ctsvc_record_check_property_flag(const ctsvc_record_s* s_record, unsigned int property_id, contacts_property_flag_e flag)
+bool ctsvc_record_check_property_flag(const ctsvc_record_s* s_record, unsigned int property_id, contacts_property_flag_e flag)
 {
        int index = property_id & 0x000000FF;
 
-       if ( s_record->properties_flags == NULL)
+       if (CTSVC_RECORD_RESULT == s_record->r_type)
                return true;
 
+       // Check it when getting value of property
+       // property_flag and properties_flags is set when getting record with query
+       if (CTSVC_PROPERTY_FLAG_PROJECTION == flag) {
+               // all property get.
+               if (NULL == s_record->properties_flags)
+                       return true;
+               // Or before inserting record from DB, just get after setting.
+               // properties_flags is not NULL when just setting dirty
+               if (0 == (CTSVC_PROPERTY_FLAG_PROJECTION & s_record->property_flag))
+                       return true;
+       }
+
+       // Check it when updating record
+       if (CTSVC_PROPERTY_FLAG_DIRTY == flag) {
+               // all property is clean
+               if (NULL == s_record->properties_flags)
+                       return false;
+       }
        return ( s_record->properties_flags[index] & flag) ? true : false;
 }
 
-static inline contacts_property_flag_e __ctsvc_record_get_property_flag(const ctsvc_record_s* s_record, unsigned int index)
+int ctsvc_record_set_property_flag(ctsvc_record_s* _record, int property_id, contacts_property_flag_e flag)
 {
-       return s_record->properties_flags[index] & 0x0000000F;
-}
+       int index = property_id & 0x000000FF;
 
-static inline void __ctsvc_record_set_property_flag(ctsvc_record_s* _record, unsigned int index, contacts_property_flag_e flag)
-{
+       if (CTSVC_RECORD_RESULT == _record->r_type)
+               return CONTACTS_ERROR_NONE;
+
+       if (NULL == _record->properties_flags) {
+               unsigned int count = 0;
+               ctsvc_view_get_all_property_infos(_record->view_uri, &count);
+               RETVM_IF(count < 0, CONTACTS_ERROR_INVALID_PARAMETER, "ctsvc_view_get_all_property_infos() Failed");
+
+               _record->properties_flags = calloc(count, sizeof(char));
+               _record->property_max_count = count;
+               RETVM_IF(NULL == _record->properties_flags, CONTACTS_ERROR_INTERNAL, "calloc Failed");
+       }
+       _record->property_flag |= flag;
        _record->properties_flags[index] |= flag;
+
+       return CONTACTS_ERROR_NONE;
 }
 
 #define __CHECK_READ_ONLY_PROPERTY() \
@@ -155,7 +185,7 @@ static inline void __ctsvc_record_set_property_flag(ctsvc_record_s* _record, uns
        }
 
 #define __CHECK_PROJECTED_PROPERTY() \
-       if( __ctsvc_record_check_property_flag( s_record, property_id, CTSVC_PROPERTY_FLAG_PROJECTION ) ) \
+       if( false == ctsvc_record_check_property_flag( s_record, property_id, CTSVC_PROPERTY_FLAG_PROJECTION ) ) \
        { \
                CTS_ERR("Invalid parameter: Don't try to get un-projected property(0x%0x).", property_id); \
                return CONTACTS_ERROR_INVALID_PARAMETER; \
@@ -240,7 +270,7 @@ API int contacts_record_get_str( contacts_record_h record, unsigned int property
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_str)
                return s_record->plugin_cbs->get_str(record, property_id, out_str);
@@ -258,7 +288,7 @@ API int contacts_record_get_lli( contacts_record_h record, unsigned int property
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_lli)
                return s_record->plugin_cbs->get_lli(record, property_id, value);
@@ -276,7 +306,7 @@ API int contacts_record_get_double( contacts_record_h record, unsigned int prope
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_double)
                return s_record->plugin_cbs->get_double(record, property_id, value);
@@ -294,7 +324,7 @@ API int contacts_record_get_str_p( contacts_record_h record, unsigned int proper
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_str_p)
                return s_record->plugin_cbs->get_str_p(record, property_id, out_str );
@@ -312,7 +342,7 @@ API int contacts_record_get_int( contacts_record_h record, unsigned int property
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_int)
                return s_record->plugin_cbs->get_int(record, property_id, out_value);
@@ -333,16 +363,22 @@ int ctsvc_record_set_str( contacts_record_h record, unsigned int property_id, co
 {
        char *str;
        ctsvc_record_s *s_record;
+       int ret;
 
        s_record = (ctsvc_record_s *)record;
+       __CHECK_PROJECTED_PROPERTY();
 
        if (value && *value)
                str = (char *)value;
        else
                str = NULL;
 
-       if (s_record->plugin_cbs && s_record->plugin_cbs->set_str)
-               return s_record->plugin_cbs->set_str(record, property_id, str);
+       if (s_record->plugin_cbs && s_record->plugin_cbs->set_str) {
+               ret = s_record->plugin_cbs->set_str(record, property_id, str);
+               if (CONTACTS_ERROR_NONE == ret)
+                       ctsvc_record_set_property_flag(s_record, property_id, CTSVC_PROPERTY_FLAG_DIRTY);
+               return ret;
+       }
 
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
@@ -357,7 +393,7 @@ API int contacts_record_get_bool( contacts_record_h record, unsigned int propert
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        s_record = (ctsvc_record_s *)record;
 
-//     __CHECK_PROJECTED_PROPERTY();
+       __CHECK_PROJECTED_PROPERTY();
 
        if (s_record->plugin_cbs && s_record->plugin_cbs->get_bool)
                return s_record->plugin_cbs->get_bool(record, property_id, value);
@@ -376,11 +412,17 @@ API int   contacts_record_set_bool( contacts_record_h record, unsigned int propert
 
 int ctsvc_record_set_bool( contacts_record_h record, unsigned int property_id, bool value )
 {
+       int ret;
        ctsvc_record_s *s_record;
        s_record = (ctsvc_record_s *)record;
+       __CHECK_PROJECTED_PROPERTY();
 
-       if (s_record->plugin_cbs && s_record->plugin_cbs->set_bool)
-               return s_record->plugin_cbs->set_bool(record, property_id, value);
+       if (s_record->plugin_cbs && s_record->plugin_cbs->set_bool) {
+               ret = s_record->plugin_cbs->set_bool(record, property_id, value);
+               if (CONTACTS_ERROR_NONE == ret)
+                       ctsvc_record_set_property_flag(s_record, property_id, CTSVC_PROPERTY_FLAG_DIRTY);
+               return ret;
+       }
 
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
@@ -396,12 +438,17 @@ API int contacts_record_set_int( contacts_record_h record, unsigned int property
 
 int ctsvc_record_set_int( contacts_record_h record, unsigned int property_id, int value )
 {
+       int ret;
        ctsvc_record_s *s_record;
        s_record = (ctsvc_record_s *)record;
+       __CHECK_PROJECTED_PROPERTY();
 
-       if (s_record->plugin_cbs && s_record->plugin_cbs->set_int)
-               return s_record->plugin_cbs->set_int(record, property_id, value);
-
+       if (s_record->plugin_cbs && s_record->plugin_cbs->set_int) {
+               ret = s_record->plugin_cbs->set_int(record, property_id, value);
+               if (CONTACTS_ERROR_NONE == ret)
+                       ctsvc_record_set_property_flag(s_record, property_id, CTSVC_PROPERTY_FLAG_DIRTY);
+               return ret;
+       }
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
 
@@ -417,11 +464,17 @@ API int contacts_record_set_lli( contacts_record_h record, unsigned int property
 
 int ctsvc_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value )
 {
+       int ret;
        ctsvc_record_s *s_record;
        s_record = (ctsvc_record_s *)record;
+       __CHECK_PROJECTED_PROPERTY();
 
-       if (s_record->plugin_cbs && s_record->plugin_cbs->set_lli)
-               return s_record->plugin_cbs->set_lli(record, property_id, value);
+       if (s_record->plugin_cbs && s_record->plugin_cbs->set_lli) {
+               ret = s_record->plugin_cbs->set_lli(record, property_id, value);
+               if (CONTACTS_ERROR_NONE == ret)
+                       ctsvc_record_set_property_flag(s_record, property_id, CTSVC_PROPERTY_FLAG_DIRTY);
+               return ret;
+       }
 
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
@@ -437,12 +490,18 @@ API int contacts_record_set_double( contacts_record_h record, unsigned int prope
 
 int ctsvc_record_set_double( contacts_record_h record, unsigned int property_id, double value )
 {
+       int ret;
        ctsvc_record_s *s_record;
 
        s_record = (ctsvc_record_s *)record;
+       __CHECK_PROJECTED_PROPERTY();
 
-       if (s_record->plugin_cbs && s_record->plugin_cbs->set_double)
-               return s_record->plugin_cbs->set_double(record, property_id, value);
+       if (s_record->plugin_cbs && s_record->plugin_cbs->set_double) {
+               ret = s_record->plugin_cbs->set_double(record, property_id, value);
+               if (CONTACTS_ERROR_NONE == ret)
+                       ctsvc_record_set_property_flag(s_record, property_id, CTSVC_PROPERTY_FLAG_DIRTY);
+               return ret;
+       }
 
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
@@ -527,10 +586,12 @@ API int contacts_record_clone_child_record_list( contacts_record_h record,
        __INVALID_PARAMETER_ERROR_HANDLING();
 }
 
-
-int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned int *projection,
-               const unsigned int projection_count, const unsigned int property_max_count)
+int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned int *projection, const unsigned int projection_count, const unsigned int property_max_count)
 {
+       int i;
+       unsigned int count;
+       const property_info_s *property_info;
+
        RETV_IF(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER);
 
        ctsvc_record_s *_record = (ctsvc_record_s *)record;
@@ -543,15 +604,12 @@ int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned
 
        _record->property_max_count = property_max_count;
 
-       int i;
-       for (i = 0; i < projection_count; i++)
-       {
-               unsigned int index = projection[i] & 0x00000FFF;
-               if( index >= property_max_count ) {
-                       ASSERT_NOT_REACHED("Boundary Check failed");
-                       return CONTACTS_ERROR_INTERNAL;
-               }
-               __ctsvc_record_set_property_flag(_record, index, CTSVC_PROPERTY_FLAG_PROJECTION);
+       property_info = ctsvc_view_get_all_property_infos(_record->view_uri, &count);
+       if (CTSVC_RECORD_RESULT == _record->r_type)
+               _record->property_flag |= CTSVC_PROPERTY_FLAG_PROJECTION;
+       else {
+               for (i=0;i<projection_count;i++)
+                       ctsvc_record_set_property_flag(_record, projection[i], CTSVC_PROPERTY_FLAG_PROJECTION);
        }
 
        return CONTACTS_ERROR_NONE;
index 625b234..f78f7c2 100644 (file)
     }\\r
 } while (0)\r
 \r
+#define CTSVC_RECORD_RESET_PROPERTY_FLAGS(base)do {\\r
+    if ((base)->properties_flags) \\r
+    {\\r
+        free((base)->properties_flags); \\r
+        (base)->property_max_count = 0;\\r
+        (base)->properties_flags = NULL;\\r
+        (base)->property_flag = 0;\\r
+    }\\r
+} while (0)\r
+\r
+int ctsvc_record_set_property_flag(ctsvc_record_s* _record, int property_id, contacts_property_flag_e flag);\r
 int ctsvc_record_set_projection_flags( contacts_record_h record, const unsigned int *projection, const unsigned int projection_count, const unsigned int property_max_count);\r
 int ctsvc_record_set_str( contacts_record_h record, unsigned int property_id, const char* value );\r
 int ctsvc_record_set_bool( contacts_record_h record, unsigned int property_id, bool value );\r
 int ctsvc_record_set_int( contacts_record_h record, unsigned int property_id, int value );\r
 int ctsvc_record_set_lli( contacts_record_h record, unsigned int property_id, long long int value );\r
 int ctsvc_record_set_double( contacts_record_h record, unsigned int property_id, double value );\r
+bool ctsvc_record_check_property_flag(const ctsvc_record_s* s_record, unsigned int property_id, contacts_property_flag_e flag);\r
 \r
 #endif /* __TIZEN_SOCIAL_CTSVC_RECORD_H__ */\r
index e4cef2d..3660d54 100644 (file)
@@ -1191,6 +1191,8 @@ static int __ctsvc_contact_destroy(contacts_record_h record, bool delete_child)
        free(contact->image_thumbnail_path);
        free(contact->ringtone_path);
        free(contact->vibration);
+       free(contact->sort_name);
+       free(contact->reverse_sort_name);
        free(contact->sortkey);
        free(contact->reverse_sortkey);
        free(contact->sync_data1);
@@ -3210,6 +3212,7 @@ static int __ctsvc_company_set_str(contacts_record_h record, unsigned int proper
                FREEandSTRDUP(company->role, str);
                break;
        case CTSVC_PROPERTY_COMPANY_LOGO:
+               company->logo_changed = true;
                FREEandSTRDUP(company->logo, str);
                break;
        case CTSVC_PROPERTY_COMPANY_LOCATION:
@@ -3807,6 +3810,8 @@ static int __ctsvc_contact_clone(contacts_record_h record, contacts_record_h *ou
        out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path);
        out_data->vibration = SAFE_STRDUP(src_data->vibration);
        out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path);
+       out_data->sort_name = SAFE_STRDUP(src_data->sort_name);
+       out_data->reverse_sort_name = SAFE_STRDUP(src_data->reverse_sort_name);
        out_data->sortkey = SAFE_STRDUP(src_data->sortkey);
        out_data->reverse_sortkey = SAFE_STRDUP(src_data->reverse_sortkey);
        out_data->sync_data1 = SAFE_STRDUP(src_data->sync_data1);
@@ -3960,6 +3965,9 @@ static int __ctsvc_company_clone(contacts_record_h record, contacts_record_h *ou
        out_data->id = src_data->id;
        out_data->logo_changed= src_data->logo_changed;
        out_data->contact_id = src_data->contact_id;
+       out_data->is_default = src_data->is_default;
+       out_data->type = src_data->type;
+       out_data->label = SAFE_STRDUP(src_data->label);
        out_data->name = SAFE_STRDUP(src_data->name);
        out_data->department = SAFE_STRDUP(src_data->department);
        out_data->job_title = SAFE_STRDUP(src_data->job_title);
@@ -4014,6 +4022,8 @@ static int __ctsvc_event_clone(contacts_record_h record, contacts_record_h *out_
        out_data->type = src_data->type;
        out_data->label = SAFE_STRDUP(src_data->label);
        out_data->date = src_data->date;
+       out_data->is_lunar = src_data->is_lunar;
+       out_data->lunar_date = src_data->lunar_date;
 
        CTSVC_RECORD_COPY_BASE(&(out_data->base), &(src_data->base));
 
index 26eee2f..80e608f 100644 (file)
@@ -164,20 +164,20 @@ static int __ctsvc_my_profile_destroy(contacts_record_h record, bool delete_chil
 
 static int __ctsvc_my_profile_get_int(contacts_record_h record, unsigned int property_id, int *out)
 {
-       ctsvc_contact_s *contact = (ctsvc_contact_s *)record;
+       ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s *)record;
 
        switch(property_id) {
        case CTSVC_PROPERTY_MY_PROFILE_ID:
-               *out = contact->id;
+               *out = my_profile->id;
                break;
        case CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID:
-               *out = contact->addressbook_id;
+               *out = my_profile->addressbook_id;
                break;
        case CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME:
-               *out = contact->changed_time;
+               *out = my_profile->changed_time;
                break;
        default:
-               ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id);
+               ASSERT_NOT_REACHED("Invalid parameter : property_id(%d) is not supported in value(my_profile)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
        return CONTACTS_ERROR_NONE;
@@ -208,19 +208,19 @@ static int __ctsvc_my_profile_set_int(contacts_record_h record, unsigned int pro
 
 static int __ctsvc_my_profile_get_str_real(contacts_record_h record, unsigned int property_id, char** out_str, bool copy )
 {
-       ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
+       ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record;
        switch(property_id) {
        case CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME:
-               *out_str = GET_STR(copy, contact->display_name);
+               *out_str = GET_STR(copy, my_profile->display_name);
                break;
        case CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL:
-               *out_str = GET_STR(copy, contact->image_thumbnail_path);
+               *out_str = GET_STR(copy, my_profile->image_thumbnail_path);
                break;
        case CTSVC_PROPERTY_MY_PROFILE_UID:
-               *out_str = GET_STR(copy, contact->uid);
+               *out_str = GET_STR(copy, my_profile->uid);
                break;
        default :
-               CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(contact)", property_id);
+               CTS_ERR("Invalid parameter : property_id(%d) is not supported in value(my_profile)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
        return CONTACTS_ERROR_NONE;
@@ -534,7 +534,7 @@ static int __ctsvc_my_profile_clone(contacts_record_h record, contacts_record_h
        src_data = (ctsvc_my_profile_s*)record;
        out_data = calloc(1, sizeof(ctsvc_my_profile_s));
        RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY,
-                       "Out of memeory : calloc(ctsvc_contact_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);
+                       "Out of memeory : calloc(ctsvc_my_profile_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);
 
        out_data->id = src_data->id;
        out_data->addressbook_id = src_data->addressbook_id;
index 86c18fa..3164a8b 100755 (executable)
@@ -98,7 +98,6 @@ static int __ctsvc_person_clone(contacts_record_h record, contacts_record_h *out
                         "Out of memeory : calloc(ctsvc_person_s) Failed(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);
 
        out_data->name_contact_id_changed = src_data->name_contact_id_changed;
-       out_data->image_thumbnail_changed = src_data->image_thumbnail_changed;
        out_data->ringtone_changed = src_data->ringtone_changed;
        out_data->vibration_changed = src_data->vibration_changed;
        out_data->is_favorite_changed = src_data->is_favorite_changed;
@@ -240,10 +239,6 @@ static int __ctsvc_person_set_int(contacts_record_h record, unsigned int propert
        case CTSVC_PROPERTY_PERSON_ACCOUNT_ID3:
                person->account_id3 = value;
                break;
-/*
-               ASSERT_NOT_REACHED("The field(0x%0x) is a read-only value (person)", property_id);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
-*/
        default:
                ASSERT_NOT_REACHED("This field(0x%0x) is not supported in value(person)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -262,18 +257,13 @@ static int __ctsvc_person_set_str(contacts_record_h record, unsigned int propert
        case CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX:
                FREEandSTRDUP( person->display_name_index, str);
                break;
-/*
-               ASSERT_NOT_REACHED("The field(%d) is a read-only value (contact)", property_id);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
-*/
+       case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL:
+               FREEandSTRDUP(person->image_thumbnail_path, str);
+               break;
        case CTSVC_PROPERTY_PERSON_RINGTONE:
                FREEandSTRDUP(person->ringtone_path, str);
                person->ringtone_changed = true;
                break;
-       case CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL:
-               FREEandSTRDUP(person->image_thumbnail_path, str);
-               person->image_thumbnail_changed = true;
-               break;
        case CTSVC_PROPERTY_PERSON_VIBRATION:
                FREEandSTRDUP(person->vibration, str);
                person->vibration_changed = true;
index 07442a5..24edcab 100644 (file)
@@ -29,6 +29,8 @@ static int __ctsvc_updated_info_destroy(contacts_record_h record, bool delete_ch
 static int __ctsvc_updated_info_clone(contacts_record_h record, contacts_record_h *out_record);
 static int __ctsvc_updated_info_get_int(contacts_record_h record, unsigned int property_id, int *out);
 static int __ctsvc_updated_info_set_int(contacts_record_h record, unsigned int property_id, int value);
+static int __ctsvc_updated_info_get_bool(contacts_record_h record, unsigned int property_id, bool *out);
+static int __ctsvc_updated_info_set_bool(contacts_record_h record, unsigned int property_id, bool value);
 
 ctsvc_record_plugin_cb_s updated_info_plugin_cbs = {
        .create = __ctsvc_updated_info_create,
@@ -37,12 +39,12 @@ ctsvc_record_plugin_cb_s updated_info_plugin_cbs = {
        .get_str = NULL,
        .get_str_p = NULL,
        .get_int = __ctsvc_updated_info_get_int,
-       .get_bool = NULL,
+       .get_bool = __ctsvc_updated_info_get_bool,
        .get_lli = NULL,
        .get_double = NULL,
        .set_str = NULL,
        .set_int = __ctsvc_updated_info_set_int,
-       .set_bool = NULL,
+       .set_bool = __ctsvc_updated_info_set_bool,
        .set_lli = NULL,
        .set_double = NULL,
        .add_child_record = NULL,
@@ -111,6 +113,9 @@ static int __ctsvc_updated_info_get_int(contacts_record_h record, unsigned int p
        case CTSVC_PROPERTY_UPDATE_INFO_VERSION:
                *out = updated_info->changed_ver;
                break;
+       case CTSVC_PROPERTY_UPDATE_INFO_LAST_CHANGED_TYPE:
+               *out = updated_info->last_changed_type;
+               break;
        default:
                ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
@@ -135,6 +140,39 @@ static int __ctsvc_updated_info_set_int(contacts_record_h record, unsigned int p
        case CTSVC_PROPERTY_UPDATE_INFO_VERSION:
                updated_info->changed_ver = value;
                break;
+       case CTSVC_PROPERTY_UPDATE_INFO_LAST_CHANGED_TYPE:
+               updated_info->last_changed_type = value;
+               break;
+       default:
+               ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id);
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
+       return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_updated_info_get_bool(contacts_record_h record, unsigned int property_id, bool *out)
+{
+       ctsvc_updated_info_s* updated_info = (ctsvc_updated_info_s*)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_UPDATE_INFO_IMAGE_CHANGED :
+               *out = updated_info->image_changed;
+               break;
+       default:
+               ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id);
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
+       return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_updated_info_set_bool(contacts_record_h record, unsigned int property_id, bool value)
+{
+       ctsvc_updated_info_s* updated_info = (ctsvc_updated_info_s*)record;
+
+       switch(property_id) {
+       case CTSVC_PROPERTY_UPDATE_INFO_IMAGE_CHANGED :
+               updated_info->image_changed = value;
+               break;
        default:
                ASSERT_NOT_REACHED("This field(%d) is not supported in value(updated_info)", property_id);
                return CONTACTS_ERROR_INVALID_PARAMETER;
index b645ad8..298d638 100644 (file)
 #include "ctsvc_internal.h"
 #include "ctsvc_setting.h"
 #include "ctsvc_normalize.h"
+#include "ctsvc_localize.h"
 
 static int name_display_order = -1;
-static int default_lang = -1;
-static int secondary_lang = -1;
+static int primary_sort = -1;
+static int secondary_sort = -1;
 
 static const char *CTSVC_VCONF_DISPLAY_ORDER = VCONFKEY_CONTACTS_SVC_NAME_DISPLAY_ORDER;
 
@@ -41,11 +42,6 @@ const char* ctsvc_get_default_language_vconfkey(void)
        return "file/private/contacts-service/default_lang";
 }
 
-const char* ctsvc_get_secondary_language_vconfkey(void)
-{
-       return "file/private/contacts-service/secondary_lang";
-}
-
 API int contacts_setting_get_name_display_order(contacts_name_display_order_e *order)
 {
        int ret;
@@ -81,12 +77,15 @@ static void ctsvc_vconf_diplay_order_cb(keynode_t *key, void *data)
 
 static void ctsvc_vconf_language_cb(keynode_t *key, void *data)
 {
-       default_lang = vconf_keynode_get_int(key);
-}
-
-static void ctsvc_vconf_secondary_language_cb(keynode_t *key, void *data)
-{
-       secondary_lang = vconf_keynode_get_int(key);
+       primary_sort = vconf_keynode_get_int(key);
+       {
+               if (primary_sort==CTSVC_SORT_KOREAN)
+                       secondary_sort = CTSVC_SORT_WESTERN;
+               else if (primary_sort==CTSVC_SORT_WESTERN)
+                       secondary_sort = CTSVC_SORT_KOREAN;
+               else
+                       secondary_sort = CTSVC_SORT_WESTERN;
+       }
 }
 
 int ctsvc_register_vconf(void)
@@ -99,11 +98,17 @@ int ctsvc_register_vconf(void)
                name_display_order = CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST;
        }
 
-       ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_lang);
+       ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &primary_sort);
        WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret);
 
-       ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_lang);
-       WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret);
+       {
+               if (primary_sort==CTSVC_SORT_KOREAN)
+                       secondary_sort = CTSVC_SORT_WESTERN;
+               else if (primary_sort==CTSVC_SORT_WESTERN)
+                       secondary_sort = CTSVC_SORT_KOREAN;
+               else
+                       secondary_sort = CTSVC_SORT_WESTERN;
+       }
 
        ret = vconf_notify_key_changed(CTSVC_VCONF_DISPLAY_ORDER,
                        ctsvc_vconf_diplay_order_cb, NULL);
@@ -114,11 +119,6 @@ int ctsvc_register_vconf(void)
        RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
                        ctsvc_get_default_language_vconfkey(), ret);
 
-       ret = vconf_notify_key_changed(ctsvc_get_secondary_language_vconfkey(),
-                       ctsvc_vconf_secondary_language_cb, NULL);
-       RETVM_IF(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
-                       ctsvc_get_secondary_language_vconfkey(), ret);
-
        return CONTACTS_ERROR_NONE;
 }
 
@@ -130,27 +130,29 @@ void ctsvc_deregister_vconf(void)
        RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)",CTSVC_VCONF_DISPLAY_ORDER,ret);
        ret = vconf_ignore_key_changed(ctsvc_get_default_language_vconfkey(), ctsvc_vconf_language_cb);
        RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)", ctsvc_get_default_language_vconfkey(),ret);
-       ret = vconf_ignore_key_changed(ctsvc_get_secondary_language_vconfkey(), ctsvc_vconf_secondary_language_cb);
-       RETM_IF(ret<0,"vconf_ignore_key_changed(%s) Failed(%d)", ctsvc_get_secondary_language_vconfkey(),ret);
 }
 
 int ctsvc_get_default_language(void)
 {
-       if (default_lang < 0) {
+       if (primary_sort < 0) {
                int ret;
-               ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_lang);
+               ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &primary_sort);
                WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret);
+               {
+                       if (primary_sort==CTSVC_SORT_KOREAN)
+                               secondary_sort = CTSVC_SORT_WESTERN;
+                       else if (primary_sort==CTSVC_SORT_WESTERN)
+                               secondary_sort = CTSVC_SORT_KOREAN;
+                       else
+                               secondary_sort = CTSVC_SORT_WESTERN;
+               }
        }
-       return default_lang;
+
+       return primary_sort;
 }
 
 int ctsvc_get_secondary_language(void)
 {
-       if (secondary_lang < 0) {
-               int ret;
-               ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_lang);
-               WARN_IF(ret < 0, "vconf_get_int() Failed(%d)", ret);
-       }
-       return secondary_lang;
+       return secondary_sort;
 }
 
index 381300d..da86cab 100644 (file)
@@ -104,27 +104,8 @@ typedef enum {
        CTSVC_FILTER_COMPOSITE,
 }ctsvc_filter_type_e;
 
-/*
-typedef enum {
-       TYPE_BOOL,
-       TYPE_INT,
-       TYPE_LLI,
-       TYPE_STR,
-       TYPE_DOUBLE,
-       TYPE_PTR,
-}value_type_e;
-
-typedef enum {
-       PROPERTY_NONE,
-       PROPERTY_FILTER,
-       PROPERTY_PROJECTION,
-       PROPERTY_ALL,
-}property_type_e;
-*/
-
 typedef struct{
        unsigned int property_id;
-       int type;
        int property_type;
        void* fields;
 }property_info_s;
@@ -176,11 +157,11 @@ typedef struct {
 
 typedef struct {
        int r_type;
-       bool deleted;
        const ctsvc_record_plugin_cb_s *plugin_cbs;
        const char* view_uri;
        unsigned int property_max_count;
        unsigned char* properties_flags;
+       unsigned char property_flag;
 }ctsvc_record_s;
 
 typedef struct  {
@@ -253,7 +234,6 @@ typedef struct {
 typedef struct {
        ctsvc_record_s base;
        bool name_contact_id_changed;
-       bool image_thumbnail_changed;
        bool ringtone_changed;
        bool vibration_changed;
        bool is_favorite_changed;
@@ -534,6 +514,8 @@ typedef struct {
        char *reverse_display_name;
        int display_source_type;
        int display_name_language;
+       char *sort_name;
+       char *reverse_sort_name;
        char *sortkey;
        char *reverse_sortkey;
        char *uid;
@@ -599,6 +581,8 @@ typedef struct {
        int id;
        int changed_ver;
        int addressbook_id;
+       bool image_changed;
+       int last_changed_type;  // it is used for _contacts_my_profile_updated_info
 }ctsvc_updated_info_s;
 
 typedef struct {
index 2c19455..46e3159 100644 (file)
@@ -50,10 +50,13 @@ enum {
        CTSVC_VCARD_VALUE_FN,
        CTSVC_VCARD_VALUE_N,
        CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME,
+       CTSVC_VCARD_VALUE_PHONETIC_MIDDLE_NAME,
        CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME,
        CTSVC_VCARD_VALUE_NICKNAME,
        CTSVC_VCARD_VALUE_PHOTO,
        CTSVC_VCARD_VALUE_BDAY,
+       CTSVC_VCARD_VALUE_X_ANNIVERSARY,
+       CTSVC_VCARD_VALUE_X_TIZEN_EVENT,
        CTSVC_VCARD_VALUE_ADR,
        CTSVC_VCARD_VALUE_LABEL,
        CTSVC_VCARD_VALUE_TEL,
@@ -62,19 +65,25 @@ enum {
        CTSVC_VCARD_VALUE_ROLE,
        CTSVC_VCARD_VALUE_LOGO,
        CTSVC_VCARD_VALUE_ORG,
+       CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_LOCATION,
+       CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_DESCRIPTION,
+       CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_PHONETIC_NAME,
+       CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_ASSISTANT_NAME,
        CTSVC_VCARD_VALUE_NOTE,
        CTSVC_VCARD_VALUE_REV,
        CTSVC_VCARD_VALUE_UID,
        CTSVC_VCARD_VALUE_URL,
-       CTSVC_VCARD_VALUE_X_ANNIVERSARY,
        CTSVC_VCARD_VALUE_X_MSN,
        CTSVC_VCARD_VALUE_X_YAHOO,
        CTSVC_VCARD_VALUE_X_ICQ,
        CTSVC_VCARD_VALUE_X_AIM,
        CTSVC_VCARD_VALUE_X_JABBER,
+       CTSVC_VCARD_VALUE_X_SKYPE_USERNAME,
        CTSVC_VCARD_VALUE_X_SKYPE,
        CTSVC_VCARD_VALUE_X_QQ,
        CTSVC_VCARD_VALUE_X_GOOGLE_TALK,
+       CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER,
+       CTSVC_VCARD_VALUE_X_TIZEN_RELATIONSHIP,
        CTSVC_VCARD_VALUE_END,
        CTSVC_VCARD_VALUE_MAX
 };
@@ -102,10 +111,13 @@ static void __ctsvc_vcard_initial(void)
                content_name[CTSVC_VCARD_VALUE_FN] = "FN";
                content_name[CTSVC_VCARD_VALUE_N] = "N";
                content_name[CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME] = "X-PHONETIC-FIRST-NAME";
+               content_name[CTSVC_VCARD_VALUE_PHONETIC_MIDDLE_NAME] = "X-PHONETIC-MIDDLE-NAME";
                content_name[CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME] = "X-PHONETIC-LAST-NAME";
                content_name[CTSVC_VCARD_VALUE_NICKNAME] = "NICKNAME";
                content_name[CTSVC_VCARD_VALUE_PHOTO] = "PHOTO";
                content_name[CTSVC_VCARD_VALUE_BDAY] = "BDAY";
+               content_name[CTSVC_VCARD_VALUE_X_ANNIVERSARY] = "ANNIVERSARY";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_EVENT] = "X-TIZEN-EVENT";
                content_name[CTSVC_VCARD_VALUE_ADR] = "ADR";
                content_name[CTSVC_VCARD_VALUE_LABEL] = "LABEL"; /* not supported */
                content_name[CTSVC_VCARD_VALUE_TEL] = "TEL";
@@ -118,6 +130,10 @@ static void __ctsvc_vcard_initial(void)
                content_name[CTSVC_VCARD_VALUE_LOGO] = "LOGO";
                //content_name[CTSVC_VCARD_VALUE_AGENT] = "AGENT"; /* not supported */
                content_name[CTSVC_VCARD_VALUE_ORG] = "ORG";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_LOCATION] = "X-TIZEN-COMPANY-LOCATION";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_DESCRIPTION] = "X-TIZEN-COMPANY-DESCRIPTION";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_PHONETIC_NAME] = "X-TIZEN-COMPANY-PHONETIC-NAME";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_ASSISTANT_NAME] = "X-TIZEN-COMPANY-ASSISTANT-NAME";
                //content_name[CTSVC_VCARD_VALUE_CATEGORIES] = "CATEGORIES"; /* not supported */
                content_name[CTSVC_VCARD_VALUE_NOTE] = "NOTE";
                //content_name[CTSVC_VCARD_VALUE_PRODID] = "PRODID"; /* not supported */
@@ -129,15 +145,17 @@ static void __ctsvc_vcard_initial(void)
                //content_name[CTSVC_VCARD_VALUE_VERSION] = "VERSION"; /* not supported */
                //content_name[CTSVC_VCARD_VALUE_CLASS] = "CLASS";         /* not supported */
                //content_name[CTSVC_VCARD_VALUE_KEY] = "KEY"; /* not supported */
-               content_name[CTSVC_VCARD_VALUE_X_ANNIVERSARY] = "X-ANNIVERSARY";
                content_name[CTSVC_VCARD_VALUE_X_MSN] = "X-MSN";
                content_name[CTSVC_VCARD_VALUE_X_YAHOO] = "X-YAHOO";
                content_name[CTSVC_VCARD_VALUE_X_ICQ] = "X-ICQ";
                content_name[CTSVC_VCARD_VALUE_X_AIM] = "X-AIM";
                content_name[CTSVC_VCARD_VALUE_X_JABBER] = "X-JABBER";
+               content_name[CTSVC_VCARD_VALUE_X_SKYPE_USERNAME] = "X-SKYPE-USERNAME";
                content_name[CTSVC_VCARD_VALUE_X_SKYPE] = "X-SKYPE";
                content_name[CTSVC_VCARD_VALUE_X_QQ] = "X-QQ";
                content_name[CTSVC_VCARD_VALUE_X_GOOGLE_TALK] = "X-GOOGLE-TALK";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER] = "X-TIZEN-MESSENGER";
+               content_name[CTSVC_VCARD_VALUE_X_TIZEN_RELATIONSHIP] = "X-TIZEN-RELATIONSHIP";
                //content_name[CTSVC_VCARD_VALUE_X_CHILDREN] = "X-CHILDREN";
                content_name[CTSVC_VCARD_VALUE_END] = "END";
        }
@@ -256,6 +274,12 @@ static inline int __ctsvc_vcard_append_name(ctsvc_list_s *names,
                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
        }
 
+       if (name->phonetic_middle) {
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                               content_name[CTSVC_VCARD_VALUE_PHONETIC_MIDDLE_NAME], name->phonetic_middle, CTSVC_CRLF);
+               RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+       }
+
        if (name->phonetic_last) {
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
                                content_name[CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME], name->phonetic_last, CTSVC_CRLF);
@@ -368,47 +392,91 @@ static inline int __ctsvc_vcard_put_company_logo(const char *path, char *dest, i
        return ret;
 }
 
+static inline int __ctsvc_vcard_put_company_type(int type, char *label, char *dest, int dest_size)
+{
+       int ret_len = 0;
+       if (type == CONTACTS_COMPANY_TYPE_WORK)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK");
+       else if (type == CONTACTS_COMPANY_TYPE_CUSTOM)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
+       return ret_len;
+}
+
 static inline int __ctsvc_vcard_append_company(ctsvc_list_s *company_list,
                char *dest, int dest_size)
 {
        int ret_len = 0;
-       GList *cursor = company_list->records;
+       GList *cursor;
        ctsvc_company_s *company;
-       RETV_IF(NULL == cursor, 0);
 
-       company = (ctsvc_company_s *)cursor->data;
+       for (cursor=company_list->records;cursor;cursor=cursor->next) {
+               company = (ctsvc_company_s *)cursor->data;
 
-       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s",
-                       content_name[CTSVC_VCARD_VALUE_ORG],
-                       SAFE_STR(company->name));
-       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
-
-       if (company->department) {
-               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s",
-                               company->department);
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s",
+                               content_name[CTSVC_VCARD_VALUE_ORG]);
                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
-       }
-
-       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTSVC_CRLF);
-       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
-       if (company->job_title) {
-               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
-                               content_name[CTSVC_VCARD_VALUE_TITLE],
-                               company->job_title, CTSVC_CRLF);
+               ret_len += __ctsvc_vcard_put_company_type(company->type, SAFE_STR(company->label), dest+ret_len, dest_size-ret_len);
                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
-       }
 
-       if (company->role) {
-               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
-                               content_name[CTSVC_VCARD_VALUE_ROLE],
-                               company->role, CTSVC_CRLF);
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s", SAFE_STR(company->name));
                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
-       }
 
-       if (company->logo) {
-               ret_len += __ctsvc_vcard_put_company_logo(company->logo, dest+ret_len, dest_size-ret_len);
+               if (company->department) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s",
+                                       company->department);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s", CTSVC_CRLF);
                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+
+               if (company->job_title) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_TITLE],
+                                       company->job_title, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->role) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_ROLE],
+                                       company->role, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->location) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_LOCATION],
+                                       company->location, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->description) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_DESCRIPTION],
+                                       company->description, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->phonetic_name) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_PHONETIC_NAME],
+                                       company->phonetic_name, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->assistant_name) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_ASSISTANT_NAME],
+                                       company->assistant_name, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+
+               if (company->logo) {
+                       ret_len += __ctsvc_vcard_put_company_logo(company->logo, dest+ret_len, dest_size-ret_len);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
        }
 
        return ret_len;
@@ -418,18 +486,17 @@ static inline int __ctsvc_vcard_append_note(ctsvc_list_s *note_list,
                char *dest, int dest_size)
 {
        int ret_len = 0;
-       GList *cursor = note_list->records;
+       GList *cursor;
        ctsvc_note_s *note;
 
-       RETV_IF(NULL == cursor, 0);
-
-       note = (ctsvc_note_s *)cursor->data;
-
-       if (note->note) {
-               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
-                               content_name[CTSVC_VCARD_VALUE_NOTE],
-                               SAFE_STR(note->note), CTSVC_CRLF);
-               RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+       for (cursor=note_list->records;cursor;cursor=cursor->next) {
+               note = (ctsvc_note_s *)cursor->data;
+               if (note->note) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                       content_name[CTSVC_VCARD_VALUE_NOTE],
+                                       SAFE_STR(note->note), CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
        }
 
        return ret_len;
@@ -459,19 +526,19 @@ static inline int __ctsvc_vcard_put_postal_type(int type, char *label, char *des
 {
        int ret_len = 0;
 
-       if (type & CONTACTS_ADDRESS_TYPE_DOM)
+       if (type == CONTACTS_ADDRESS_TYPE_DOM)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "DOM");
-       if (type & CONTACTS_ADDRESS_TYPE_INTL)
+       if (type == CONTACTS_ADDRESS_TYPE_INTL)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "INTL");
-       if (type & CONTACTS_ADDRESS_TYPE_HOME)
+       if (type == CONTACTS_ADDRESS_TYPE_HOME)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME");
-       if (type & CONTACTS_ADDRESS_TYPE_WORK)
+       if (type == CONTACTS_ADDRESS_TYPE_WORK)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK");
-       if (type & CONTACTS_ADDRESS_TYPE_POSTAL)
+       if (type == CONTACTS_ADDRESS_TYPE_POSTAL)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "POSTAL");
-       if (type & CONTACTS_ADDRESS_TYPE_PARCEL)
+       if (type == CONTACTS_ADDRESS_TYPE_PARCEL)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PARCEL");
-       if (type & CONTACTS_ADDRESS_TYPE_CUSTOM)
+       if (type == CONTACTS_ADDRESS_TYPE_CUSTOM)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
 
        return ret_len;
@@ -491,7 +558,7 @@ static inline int __ctsvc_vcard_append_postals(ctsvc_list_s *address_list,
                                        content_name[CTSVC_VCARD_VALUE_ADR]);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
-                       ret_len += __ctsvc_vcard_put_postal_type(address->type, address->label, dest+ret_len,
+                       ret_len += __ctsvc_vcard_put_postal_type(address->type, SAFE_STR(address->label), dest+ret_len,
                                        dest_size-ret_len);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
@@ -607,8 +674,6 @@ static inline int __ctsvc_vcard_put_number_type(int type, char *label, char *des
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "VOICE");
        if (type & CONTACTS_NUMBER_TYPE_FAX)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "FAX");
-       if (type & CONTACTS_NUMBER_TYPE_VOICE)
-               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "VOICE");
        if (type & CONTACTS_NUMBER_TYPE_CELL)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "CELL");
        if (type & CONTACTS_NUMBER_TYPE_VIDEO)
@@ -627,7 +692,7 @@ static inline int __ctsvc_vcard_put_number_type(int type, char *label, char *des
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PCS");
        if (type & CONTACTS_NUMBER_TYPE_ASSISTANT)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "X-ASSISTANT");
-       if (type & CONTACTS_NUMBER_TYPE_CUSTOM)
+       if (type == CONTACTS_NUMBER_TYPE_CUSTOM)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
        return ret_len;
 }
@@ -647,7 +712,7 @@ static inline int __ctsvc_vcard_append_numbers(ctsvc_list_s *number_list,
                                        content_name[CTSVC_VCARD_VALUE_TEL]);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
-                       ret_len += __ctsvc_vcard_put_number_type(number->type, number->label, dest+ret_len, dest_size-ret_len);
+                       ret_len += __ctsvc_vcard_put_number_type(number->type, SAFE_STR(number->label), dest+ret_len, dest_size-ret_len);
                        if (number->is_default) {
                                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";%s", "PREF");
                                RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
@@ -677,11 +742,13 @@ static inline int __ctsvc_vcard_put_email_type(int type, char *label, char *dest
 {
        int ret_len = 0;
 
-       if (CONTACTS_EMAIL_TYPE_HOME & type)
+       if (CONTACTS_EMAIL_TYPE_HOME == type)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME");
-       if (CONTACTS_EMAIL_TYPE_WORK & type)
+       else if (CONTACTS_EMAIL_TYPE_WORK == type)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK");
-       if (CONTACTS_EMAIL_TYPE_CUSTOM & type)
+       else if (CONTACTS_EMAIL_TYPE_MOBILE == type)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "CELL");
+       else if (CONTACTS_EMAIL_TYPE_CUSTOM == type)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
 
        return ret_len;
@@ -701,7 +768,7 @@ static inline int __ctsvc_vcard_append_emails(ctsvc_list_s *email_list,
                                        content_name[CTSVC_VCARD_VALUE_EMAIL]);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
-                       ret_len += __ctsvc_vcard_put_email_type(email->type, email->label, dest+ret_len, dest_size-ret_len);
+                       ret_len += __ctsvc_vcard_put_email_type(email->type, SAFE_STR(email->label), dest+ret_len, dest_size-ret_len);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
 
                        if (email->is_default) {
@@ -718,6 +785,20 @@ static inline int __ctsvc_vcard_append_emails(ctsvc_list_s *email_list,
        return ret_len;
 }
 
+static inline int __ctsvc_vcard_put_url_type(int type, char *label, char *dest, int dest_size)
+{
+       int ret_len = 0;
+
+       if (CONTACTS_URL_TYPE_HOME == type)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "HOME");
+       else if (CONTACTS_URL_TYPE_WORK == type)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "WORK");
+       else if (CONTACTS_URL_TYPE_CUSTOM == type)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
+
+       return ret_len;
+}
+
 static inline int __ctsvc_vcard_append_webs(ctsvc_list_s *url_list,
                char *dest, int dest_size)
 {
@@ -727,12 +808,17 @@ static inline int __ctsvc_vcard_append_webs(ctsvc_list_s *url_list,
 
        for (cursor=url_list->records;cursor;cursor=cursor->next) {
                url = cursor->data;
-               if (url->url && *url->url) {
-                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
-                                       content_name[CTSVC_VCARD_VALUE_URL],
-                                       url->url, CTSVC_CRLF);
-                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
-               }
+
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s",
+                               content_name[CTSVC_VCARD_VALUE_URL]);
+               RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+
+               ret_len += __ctsvc_vcard_put_url_type(url->type, SAFE_STR(url->label), dest+ret_len, dest_size-ret_len);
+               RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s",
+                               url->url, CTSVC_CRLF);
+               RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
        }
 
        return ret_len;
@@ -750,15 +836,30 @@ static inline int __ctsvc_vcard_append_events(ctsvc_list_s *event_list,
                if (!data->date) continue;
 
                if (CONTACTS_EVENT_TYPE_BIRTH == data->type) {
-                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s",
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%02d%s",
                                        content_name[CTSVC_VCARD_VALUE_BDAY],
                                        data->date/10000, (data->date%10000)/100, data->date%100,
                                        CTSVC_CRLF);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
                }
                else if (CONTACTS_EVENT_TYPE_ANNIVERSARY == data->type) {
-                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%d%s",
-                                       content_name[CTSVC_VCARD_VALUE_X_ANNIVERSARY],
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s;TYPE=ANNIVERSARY:%d-%02d-%02d%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_EVENT],
+                                       data->date/10000, (data->date%10000)/100, data->date%100,
+                                       CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+               else if (CONTACTS_EVENT_TYPE_CUSTOM == data->type) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s;X-%s:%d-%02d-%02d%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_EVENT],
+                                       SAFE_STR(data->label),
+                                       data->date/10000, (data->date%10000)/100, data->date%100,
+                                       CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+               else {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%d-%02d-%02d%s",
+                                       content_name[CTSVC_VCARD_VALUE_X_TIZEN_EVENT],
                                        data->date/10000, (data->date%10000)/100, data->date%100,
                                        CTSVC_CRLF);
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
@@ -800,7 +901,7 @@ static inline int __ctsvc_vcard_append_messengers(ctsvc_list_s *messenger_list,
                                break;
                        case CONTACTS_MESSENGER_TYPE_SKYPE:
                                ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
-                                               content_name[CTSVC_VCARD_VALUE_X_SKYPE], messenger->im_id, CTSVC_CRLF);
+                                               content_name[CTSVC_VCARD_VALUE_X_SKYPE_USERNAME], messenger->im_id, CTSVC_CRLF);
                                break;
                        case CONTACTS_MESSENGER_TYPE_QQ:
                                ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
@@ -810,7 +911,21 @@ static inline int __ctsvc_vcard_append_messengers(ctsvc_list_s *messenger_list,
                                ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
                                                content_name[CTSVC_VCARD_VALUE_X_GOOGLE_TALK], messenger->im_id, CTSVC_CRLF);
                                break;
+                       case CONTACTS_MESSENGER_TYPE_FACEBOOK:
+                               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s;TYPE=FACEBOOK:%s%s",
+                                               content_name[CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER], messenger->im_id, CTSVC_CRLF);
+                               break;
+                       case CONTACTS_MESSENGER_TYPE_IRC:
+                               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s;TYPE=IRC:%s%s",
+                                               content_name[CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER], messenger->im_id, CTSVC_CRLF);
+                               break;
+                       case CONTACTS_MESSENGER_TYPE_CUSTOM:
+                               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s;TYPE=X-%s:%s%s",
+                                               content_name[CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER], SAFE_STR(messenger->label), messenger->im_id, CTSVC_CRLF);
+                               break;
                        default:
+                               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                                               content_name[CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER], messenger->im_id, CTSVC_CRLF);
                                break;
                        }
                        RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
@@ -819,6 +934,85 @@ static inline int __ctsvc_vcard_append_messengers(ctsvc_list_s *messenger_list,
        return ret_len;
 }
 
+static inline int __ctsvc_vcard_put_relationship_type(int type, char *label, char *dest, int dest_size)
+{
+       int ret_len = 0;
+       switch (type) {
+       case CONTACTS_RELATIONSHIP_TYPE_ASSISTANT:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "ASSISTANT");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_BROTHER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "BROTHER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_CHILD:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "CHILD");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_DOMESTIC_PARTNER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "DOMESTIC_PARTNER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_FATHER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "FATHER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_FRIEND:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "FRIEND");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_MANAGER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "MANAGER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_MOTHER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "MOTHER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_PARENT:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PARENT");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_PARTNER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "PARTNER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_REFERRED_BY:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "REFERRED_BY");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_RELATIVE:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "RELATIVE");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_SISTER:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "SISTER");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_SPOUSE:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=%s", "SPOUSE");
+               break;
+       case CONTACTS_RELATIONSHIP_TYPE_CUSTOM:
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, ";TYPE=X-%s", label);
+               break;
+       }
+       return ret_len;
+}
+
+
+
+static inline int __ctsvc_vcard_append_relationships(ctsvc_list_s *relationship_list, char *dest, int dest_size)
+{
+       int ret_len = 0;
+       GList *cursor;
+       ctsvc_relationship_s *relationship;
+
+       for (cursor=relationship_list->records;cursor;cursor=cursor->next) {
+               relationship = cursor->data;
+
+               if (relationship->name) {
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, "X-TIZEN-RELATIONSHIP");
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+
+                       ret_len += __ctsvc_vcard_put_relationship_type(relationship->type, SAFE_STR(relationship->label), dest+ret_len, dest_size-ret_len);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+
+                       ret_len += snprintf(dest+ret_len, dest_size-ret_len, ":%s%s", relationship->name, CTSVC_CRLF);
+                       RETV_IF(dest_size <= ret_len, CONTACTS_ERROR_INTERNAL);
+               }
+       }
+
+       return ret_len;
+}
+
 static inline int __ctsvc_vcard_put_photo(ctsvc_list_s *image_list, char *dest, int dest_size)
 {
        int ret = 0, fd, type;
@@ -943,6 +1137,11 @@ static inline int __ctsvc_vcard_append_contact(ctsvc_contact_s *contact,
                RETV_IF(ret < 0, ret);
                ret_len += ret;
        }
+       if (contact->relationships) {
+               ret = __ctsvc_vcard_append_relationships(contact->relationships, dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
        if (contact->uid)
                ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
                                content_name[CTSVC_VCARD_VALUE_UID],
@@ -957,14 +1156,106 @@ static inline int __ctsvc_vcard_append_contact(ctsvc_contact_s *contact,
                                CTSVC_CRLF);
        }
 #if 0
-       char *image_path;
-       ctsvc_list_s* grouprelations;
        ctsvc_list_s* profile;
-       ctsvc_list_s* relationships;
 #endif
        return ret_len;
 }
 
+static inline int __ctsvc_vcard_append_my_profile(ctsvc_my_profile_s *my_profile, char *dest, int dest_size)
+{
+       int ret_len = 0;
+       int ret;
+
+       if (my_profile->name) {
+               ret = __ctsvc_vcard_append_name(my_profile->name,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->company) {
+               ret = __ctsvc_vcard_append_company(my_profile->company,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->note) {
+               ret = __ctsvc_vcard_append_note(my_profile->note,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->postal_addrs) {
+               ret = __ctsvc_vcard_append_postals(my_profile->postal_addrs,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->numbers) {
+               ret = __ctsvc_vcard_append_numbers(my_profile->numbers,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->emails) {
+               ret = __ctsvc_vcard_append_emails(my_profile->emails,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->nicknames) {
+               ret = __ctsvc_vcard_append_nicknames(my_profile->nicknames,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->urls) {
+               ret = __ctsvc_vcard_append_webs(my_profile->urls,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->events) {
+               ret = __ctsvc_vcard_append_events(my_profile->events,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->images) {
+               ret = __ctsvc_vcard_put_photo(my_profile->images,
+                               dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->messengers) {
+               ret = __ctsvc_vcard_append_messengers(my_profile->messengers, dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->relationships) {
+               ret = __ctsvc_vcard_append_relationships(my_profile->relationships, dest+ret_len, dest_size-ret_len);
+               RETV_IF(ret < 0, ret);
+               ret_len += ret;
+       }
+       if (my_profile->uid)
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%s%s",
+                               content_name[CTSVC_VCARD_VALUE_UID],
+                               my_profile->uid, CTSVC_CRLF);
+       if (my_profile->changed_time) {
+               struct tm ts;
+               gmtime_r((time_t *)&my_profile->changed_time, &ts);
+               ret_len += snprintf(dest+ret_len, dest_size-ret_len, "%s:%04d-%02d-%02dT%02d:%02d:%02dZ%s",
+                               content_name[CTSVC_VCARD_VALUE_REV],
+                               1900+ts.tm_year, 1+ts.tm_mon, ts.tm_mday,
+                               ts.tm_hour, ts.tm_min, ts.tm_sec,
+                               CTSVC_CRLF);
+       }
+#if 0
+               ctsvc_list_s* profile;
+#endif
+               return ret_len;
+
+}
+
 static int __ctsvc_vcard_make(ctsvc_contact_s *contact, char **vcard_stream)
 {
        int ret_len, ret;
@@ -995,6 +1286,37 @@ static int __ctsvc_vcard_make(ctsvc_contact_s *contact, char **vcard_stream)
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_vcard_make_from_my_profile(ctsvc_my_profile_s *my_profile, char **vcard_stream)
+{
+       int ret_len, ret;
+       char result[CTSVC_VCARD_FILE_MAX_SIZE] = {0};
+
+       __ctsvc_vcard_initial();
+
+       ret_len = snprintf(result, sizeof(result), "%s%s", "BEGIN:VCARD", CTSVC_CRLF);
+       ret_len += snprintf(result+ret_len, sizeof(result)-ret_len,
+                       "%s%s%s", "VERSION:", "3.0", CTSVC_CRLF);
+
+       ret = __ctsvc_vcard_append_my_profile(my_profile,
+                       result+ret_len, sizeof(result)-ret_len);
+       RETVM_IF(ret < 0, CONTACTS_ERROR_INTERNAL,
+                                       "This contact has too many information");
+       ret_len += ret;
+       RETVM_IF(sizeof(result)-ret_len <= 0, CONTACTS_ERROR_INTERNAL,
+                       "This contact has too many information");
+
+       ret_len += snprintf(result+ret_len, sizeof(result)-ret_len,
+                       "%s%s", "END:VCARD", CTSVC_CRLF);
+
+       ret = __ctsvc_vcard_add_folding(result);
+       RETV_IF (CONTACTS_ERROR_NONE != ret, ret);
+
+       *vcard_stream = strdup(result);
+
+       return CONTACTS_ERROR_NONE;
+}
+
+
 API int contacts_vcard_make_from_contact(contacts_record_h record, char **vcard_stream)
 {
        ctsvc_contact_s *contact;
@@ -1008,10 +1330,26 @@ API int contacts_vcard_make_from_contact(contacts_record_h record, char **vcard_
        RETVM_IF(CTSVC_RECORD_CONTACT != contact->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
                "Invalid parameter : The record is not conatct record (type : %d)", contact->base.r_type);
 
-       __ctsvc_vcard_make(contact, vcard_stream);
-       return CONTACTS_ERROR_NONE;
+       return __ctsvc_vcard_make(contact, vcard_stream);
+}
+
+API int contacts_vcard_make_from_my_profile(contacts_record_h record, char **vcard_stream)
+{
+       ctsvc_my_profile_s *my_profile;
+       RETV_IF(NULL == vcard_stream, CONTACTS_ERROR_INVALID_PARAMETER);
+       *vcard_stream = NULL;
+
+       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER,
+               "Invalid parameter : my_profile(%p), vcard_stream(%p)", record, vcard_stream);
+
+       my_profile = (ctsvc_my_profile_s*)record;
+       RETVM_IF(CTSVC_RECORD_MY_PROFILE != my_profile->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
+               "Invalid parameter : The record is not conatct record (type : %d)", my_profile->base.r_type);
+
+       return __ctsvc_vcard_make_from_my_profile(my_profile, vcard_stream);
 }
 
+
 static int __ctsvc_vcard_append_person(ctsvc_person_s *person, ctsvc_list_s *list_contacts, char *dest, int dest_size)
 {
        int ret;
@@ -1123,6 +1461,17 @@ static int __ctsvc_vcard_append_person(ctsvc_person_s *person, ctsvc_list_s *lis
                        total_len += ret_len;
                }
        }
+
+       for(cursor=list_contacts->records;cursor;cursor=cursor->next) {
+               simple_contact = (ctsvc_simple_contact_s *)cursor->data;
+               ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact);
+               if (CONTACTS_ERROR_NONE == ret && contact && contact->relationships && contact->relationships->cursor) {
+                       ret_len = __ctsvc_vcard_append_relationships(contact->relationships, dest+total_len, dest_size-total_len);
+                       RETVM_IF(ret_len < 0, CONTACTS_ERROR_INTERNAL, "This person has too many information");
+                       total_len += ret_len;
+               }
+       }
+
        for(cursor=list_contacts->records;cursor;cursor=cursor->next) {
                simple_contact = (ctsvc_simple_contact_s *)cursor->data;
                ret = contacts_db_get_record(_contacts_contact._uri, simple_contact->contact_id, (contacts_record_h *)&contact);
@@ -1150,10 +1499,7 @@ static int __ctsvc_vcard_append_person(ctsvc_person_s *person, ctsvc_list_s *lis
                total_len += ret_len;
        }
 #if 0
-       char *image_path;
-       ctsvc_list_s* grouprelations;
        ctsvc_list_s* profile;
-       ctsvc_list_s* relationships;
 #endif
        return total_len;
 }
@@ -1221,12 +1567,12 @@ API int contacts_vcard_make_from_person(contacts_record_h record, char **vcard_s
        person = (ctsvc_person_s *)record;
 
        RETVM_IF(CTSVC_RECORD_PERSON != person->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
-               "Invalid paramter : The record is not conatct record (type : %d)", person->base.r_type);
+               "Invalid parameter : The record is not conatct record (type : %d)", person->base.r_type);
 
        contacts_filter_create(_contacts_simple_contact._uri, &filter);
        ret = contacts_filter_add_int(filter, _contacts_simple_contact.person_id, CONTACTS_MATCH_EQUAL, person->person_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("Invalid paramter : contacts_filter_add_int is failed", ret);
+               CTS_ERR("Invalid parameter : contacts_filter_add_int is failed", ret);
                contacts_filter_destroy(filter);
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
@@ -1235,13 +1581,13 @@ API int contacts_vcard_make_from_person(contacts_record_h record, char **vcard_s
        ret = contacts_db_get_records_with_query(query, 0, 0, &list);
 
        if (ret == CONTACTS_ERROR_NONE)
-               __ctsvc_vcard_make_from_person(person, (ctsvc_list_s *)list, vcard_stream);
+               ret = __ctsvc_vcard_make_from_person(person, (ctsvc_list_s *)list, vcard_stream);
 
        contacts_query_destroy(query);
        contacts_filter_destroy(filter);
        contacts_list_destroy(list, true);
 
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
 ////////////////////////////////////////////////////////////////////////////
@@ -1695,7 +2041,9 @@ static inline int __ctsvc_vcard_get_phonetic_name(ctsvc_list_s *name_list, int t
        __ctsvc_strtok(start, separator);
        if (CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME == type)
                contacts_record_set_str(name, _contacts_name.phonetic_first, start);
-       else
+       else if (CTSVC_VCARD_VALUE_PHONETIC_MIDDLE_NAME == type)
+               contacts_record_set_str(name, _contacts_name.phonetic_middle, start);
+       else if (CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME == type)
                contacts_record_set_str(name, _contacts_name.phonetic_last, start);
 
        return CONTACTS_ERROR_NONE;
@@ -1812,11 +2160,47 @@ static inline int __ctsvc_vcard_get_photo(contacts_record_h contact, ctsvc_list_
        return CONTACTS_ERROR_NONE;
 }
 
+static inline void __ctsvc_vcard_get_event_type(contacts_record_h event, char *val)
+{
+       int type = CONTACTS_EVENT_TYPE_OTHER;
+       char *temp, *result, *last = NULL;
+       char *lower, *lower_temp;
+
+       temp = strtok_r(val, ";", &last);
+       while (temp) {
+               lower = strdup(temp);
+               lower_temp = lower;
+               while (*lower_temp) {
+                       *lower_temp = tolower(*lower_temp);
+                       lower_temp++;
+               }
+               if (strstr(lower, "anniversary"))
+                       type = CONTACTS_EVENT_TYPE_ANNIVERSARY;
+               else if (NULL != (result = strstr(lower, "x-"))) {
+                       type = CONTACTS_EVENT_TYPE_CUSTOM;
+                       contacts_record_set_str(event, _contacts_event.label, temp+(result-lower)+2);
+               }
+
+               free(lower);
+               temp = strtok_r(NULL, ";", &last);
+       }
+       contacts_record_set_int(event, _contacts_event.type, type);
+}
+
+
 static inline int __ctsvc_vcard_get_event(ctsvc_list_s *event_list, int type, char *val)
 {
        int ret;
        contacts_record_h event;
-       char *dest, *src;
+       char *dest, *src, *temp, *cpy;
+
+       cpy = strdup(val);
+       temp = __ctsvc_get_content_value(cpy);
+       if (NULL == temp) {
+               free(cpy);
+               ERR("Invalid parameter : vcard(%s)", val);
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
 
        dest = src = val;
        while (*src) {
@@ -1829,55 +2213,113 @@ static inline int __ctsvc_vcard_get_event(ctsvc_list_s *event_list, int type, ch
                        break;
        }
        *dest = '\0';
-
-       RETVM_IF('\0' == *val, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : val(%d)", val);
+       if ('\0' == *val) {
+               free(cpy);
+               ERR("Invalid parameter : val(%d)", val);
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
 
        ret = contacts_record_create(_contacts_event._uri, &event);
-       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
+       if (ret < CONTACTS_ERROR_NONE) {
+               free(cpy);
+               ERR("contacts_record_create is failed(%d)", ret);
+               return ret;
+       }
 
        contacts_record_set_int(event, _contacts_event.date, atoi(val));
-       contacts_record_set_int(event, _contacts_event.type, type);
+
+       if (CTSVC_VCARD_VALUE_BDAY == type)
+               contacts_record_set_int(event, _contacts_event.type, CONTACTS_EVENT_TYPE_BIRTH);
+       else if (CTSVC_VCARD_VALUE_X_ANNIVERSARY == type)
+               contacts_record_set_int(event, _contacts_event.type, CONTACTS_EVENT_TYPE_ANNIVERSARY);
+       else if (CTSVC_VCARD_VALUE_X_TIZEN_EVENT == type) {
+               if (temp != cpy) {
+                       *(temp-1) = '\0';
+                       __ctsvc_vcard_get_event_type(event, cpy);
+               }
+       }
        contacts_list_add((contacts_list_h)event_list, event);
+       free(cpy);
+       return CONTACTS_ERROR_NONE;
+}
+
+
+static inline void __ctsvc_vcard_get_company_type(contacts_record_h company, char *val)
+{
+       char *temp, *result, *last = NULL;
+       char *lower, *lower_temp;
+       int type = CONTACTS_COMPANY_TYPE_OTHER;
+
+       temp = strtok_r(val, ";", &last);
+       while (temp) {
+               lower = strdup(temp);
+               lower_temp = lower;
+               while (*lower_temp) {
+                       *lower_temp = tolower(*lower_temp);
+                       lower_temp++;
+               }
+               result = strstr(lower, "work");
+               if (result) type = CONTACTS_COMPANY_TYPE_WORK;
+               result = strstr(lower, "x-");
+               if (result) {
+                       type = CONTACTS_COMPANY_TYPE_CUSTOM;
+                       contacts_record_set_str(company, _contacts_company.label, temp+(result-lower)+2);
+               }
+               free(lower);
+               temp = strtok_r(NULL, ";", &last);
+       }
+       contacts_record_set_int(company, _contacts_company.type, type);
+}
+
+static inline int __ctsvc_vcard_get_company_value(ctsvc_list_s *company_list, int property_id, char *val)
+{
+       unsigned int count;
+       char *value;
+       contacts_record_h company;
+
+       contacts_list_get_count((contacts_list_h)company_list, &count);
+       RETVM_IF(count == 0, CONTACTS_ERROR_INVALID_PARAMETER, "list is empty");
+
+       contacts_list_last((contacts_list_h)company_list);
+       contacts_list_get_current_record_p((contacts_list_h)company_list, &company);
+       RETVM_IF(NULL == company, CONTACTS_ERROR_INVALID_PARAMETER, "contacts_list_get_current_record_p() return NULL");
+
+       value = __ctsvc_get_content_value(val);
+       RETV_IF(NULL == value, CONTACTS_ERROR_NO_DATA);
+
+       contacts_record_set_str(company, property_id, value);
 
        return CONTACTS_ERROR_NONE;
 }
 
-static inline int __ctsvc_vcard_get_company(ctsvc_list_s *company_list, unsigned int property_id, char *val)
+
+static inline int __ctsvc_vcard_get_company(ctsvc_list_s *company_list, char *val)
 {
        int ret;
-       unsigned int count;
        char *temp, *start;
        contacts_record_h company;
 
-       contacts_list_get_count((contacts_list_h)company_list, &count);
-       if (count <= 0) {
-               ret = contacts_record_create(_contacts_company._uri, &company);
-               RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
-               contacts_list_add((contacts_list_h)company_list, company);
-       }
-       else {
-               contacts_list_get_current_record_p((contacts_list_h)company_list, &company);
-       }
+       ret = contacts_record_create(_contacts_company._uri, &company);
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
+       contacts_list_add((contacts_list_h)company_list, company);
 
-       if (property_id == _contacts_company.name) {
-               start = __ctsvc_get_content_value(val);
-               RETV_IF(NULL == start, CONTACTS_ERROR_NO_DATA);
+       start = __ctsvc_get_content_value(val);
+       RETV_IF(NULL == start, CONTACTS_ERROR_NO_DATA);
 
-               temp = strchr(start, ';');
-               if (temp) {
-                       *temp = '\0';
-                       contacts_record_set_str(company, property_id, start);
-                       contacts_record_set_str(company, _contacts_company.department, temp+1);
-               }
-               else
-                       contacts_record_set_str(company, property_id, start);
+       temp = strchr(start, ';');
+       if (NULL == temp) {
+               contacts_record_set_str(company, _contacts_company.name, start);
+               return CONTACTS_ERROR_NONE;
        }
-       else if (property_id == _contacts_company.job_title
-                       || property_id == _contacts_company.role) {
-               contacts_record_set_str(company, property_id, val);
+
+       *temp = '\0';
+       contacts_record_set_str(company, _contacts_company.name, start);
+       contacts_record_set_str(company, _contacts_company.department, temp+1);
+
+       if (val != temp) {
+               *(temp-1) = '\0';
+               __ctsvc_vcard_get_company_type(company, val);
        }
-       else
-               return CONTACTS_ERROR_INVALID_PARAMETER;
 
        return CONTACTS_ERROR_NONE;
 }
@@ -1893,14 +2335,11 @@ static inline int __ctsvc_vcard_get_company_logo(ctsvc_list_s *company_list, cha
        contacts_record_h company;
 
        contacts_list_get_count((contacts_list_h)company_list, &count);
-       if (count <= 0) {
-               ret = contacts_record_create(_contacts_company._uri, &company);
-               RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
-               contacts_list_add((contacts_list_h)company_list, company);
-       }
-       else {
-               contacts_list_get_current_record_p((contacts_list_h)company_list, &company);
-       }
+       RETVM_IF(count == 0, CONTACTS_ERROR_INVALID_PARAMETER, "list is empty");
+
+       contacts_list_last((contacts_list_h)company_list);
+       contacts_list_get_current_record_p((contacts_list_h)company_list, &company);
+       RETVM_IF(NULL == company, CONTACTS_ERROR_INVALID_PARAMETER, "contacts_list_get_current_record_p() return NULL");
 
        temp = strchr(val , ':');
        RETVM_IF(NULL == temp, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : val is invalid(%s)", val);
@@ -1945,22 +2384,16 @@ static inline int __ctsvc_vcard_get_company_logo(ctsvc_list_s *company_list, cha
 static inline int __ctsvc_vcard_get_note(ctsvc_list_s *note_list, char *val)
 {
        int ret;
-       unsigned int count;
        char *temp;
        contacts_record_h note;
 
-       contacts_list_get_count((contacts_list_h)note_list, &count);
-       if (count <= 0) {
-               ret = contacts_record_create(_contacts_note._uri, &note);
-               RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
-               contacts_list_add((contacts_list_h)note_list, note);
-       }
-       else {
-               contacts_list_get_current_record_p((contacts_list_h)note_list, &note);
-       }
+       ret = contacts_record_create(_contacts_note._uri, &note);
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
+       contacts_list_add((contacts_list_h)note_list, note);
 
        temp = __ctsvc_get_content_value(val);
        RETV_IF(NULL == temp, CONTACTS_ERROR_NO_DATA);
+
        contacts_record_set_str(note, _contacts_note.note, g_strcompress(temp));
 
        return CONTACTS_ERROR_NONE;
@@ -2035,6 +2468,35 @@ static inline int __ctsvc_vcard_get_time(char *val)
        return (int)mktime(&ts);
 }
 
+static inline void __ctsvc_vcard_get_url_type(contacts_record_h url, char *val)
+{
+       char *temp, *result, *last = NULL;
+       char *lower, *lower_temp;
+       int type = CONTACTS_URL_TYPE_OTHER;
+
+       temp = strtok_r(val, ";", &last);
+       while (temp) {
+               lower = strdup(temp);
+               lower_temp = lower;
+               while (*lower_temp) {
+                       *lower_temp = tolower(*lower_temp);
+                       lower_temp++;
+               }
+               result = strstr(lower, "home");
+               if (result) type = CONTACTS_URL_TYPE_HOME;
+               result = strstr(lower, "work");
+               if (result) type = CONTACTS_URL_TYPE_WORK;
+               result = strstr(lower, "x-");
+               if (result) {
+                       type = CONTACTS_URL_TYPE_CUSTOM;
+                       contacts_record_set_str(url, _contacts_url.label, temp+(result-lower)+2);
+               }
+
+               free(lower);
+               temp = strtok_r(NULL, ";", &last);
+       }
+       contacts_record_set_int(url, _contacts_url.type, type);
+}
 
 static inline int __ctsvc_vcard_get_url(ctsvc_list_s* url_list, char *val)
 {
@@ -2051,19 +2513,7 @@ static inline int __ctsvc_vcard_get_url(ctsvc_list_s* url_list, char *val)
        contacts_record_set_str(url, _contacts_url.url, temp);
        if (val != temp) {
                *(temp-1) = '\0';
-               temp = val;
-               while (*temp) {
-                       *temp = tolower(*temp);
-                       temp++;
-               }
-
-               temp = strchr(val, ';');
-               if (temp) {
-                       if (strstr(val, "home"))
-                               contacts_record_set_int(url, _contacts_url.type, CONTACTS_URL_TYPE_HOME);
-                       else if (strstr(val, "work"))
-                               contacts_record_set_int(url, _contacts_url.type, CONTACTS_URL_TYPE_WORK);
-               }
+               __ctsvc_vcard_get_url_type(url, val);
        }
        contacts_list_add((contacts_list_h)url_list, url);
 
@@ -2168,14 +2618,15 @@ static inline bool __ctsvc_vcard_get_email_type(contacts_record_h email, char *v
                        *lower_temp = tolower(*lower_temp);
                        lower_temp++;
                }
-               result = strstr(lower, "home");
-               if (result) type = CONTACTS_EMAIL_TYPE_HOME;
-               result = strstr(lower, "work");
-               if (result) type = CONTACTS_EMAIL_TYPE_WORK;
-               result = strstr(lower, "pref");
-               if (result) pref = true;
-               result = strstr(lower, "x-");
-               if (result) {
+               if (strstr(lower, "pref"))
+                       pref = true;
+               if (strstr(lower, "home"))
+                       type = CONTACTS_EMAIL_TYPE_HOME;
+               else if (strstr(lower, "work"))
+                       type = CONTACTS_EMAIL_TYPE_WORK;
+               else if (strstr(lower, "cell"))
+                       type = CONTACTS_EMAIL_TYPE_MOBILE;
+               else if (NULL != (result = strstr(lower, "x-"))) {
                        type = CONTACTS_EMAIL_TYPE_CUSTOM;
                        contacts_record_set_str(email, _contacts_email.label, temp+(result-lower)+2);
                }
@@ -2313,6 +2764,35 @@ static inline int __ctsvc_vcard_get_address(ctsvc_list_s *address_list, char *va
        return CONTACTS_ERROR_NONE;
 }
 
+static inline void __ctsvc_vcard_get_messenger_type(contacts_record_h messenger, char *val)
+{
+       char *temp, *result, *last = NULL;
+       char *lower, *lower_temp;
+       int type = CONTACTS_MESSENGER_TYPE_OTHER;
+
+       temp = strtok_r(val, ";", &last);
+       while (temp) {
+               lower = strdup(temp);
+               lower_temp = lower;
+               while (*lower_temp) {
+                       *lower_temp = tolower(*lower_temp);
+                       lower_temp++;
+               }
+               result = strstr(lower, "facebook");
+               if (result) type = CONTACTS_MESSENGER_TYPE_FACEBOOK;
+               result = strstr(lower, "irc");
+               if (result) type = CONTACTS_MESSENGER_TYPE_IRC;
+               result = strstr(lower, "x-");
+               if (result) {
+                       type = CONTACTS_MESSENGER_TYPE_CUSTOM;
+                       contacts_record_set_str(messenger, _contacts_messenger.label, temp+(result-lower)+2);
+               }
+               free(lower);
+               temp = strtok_r(NULL, ";", &last);
+       }
+       contacts_record_set_int(messenger, _contacts_messenger.type, type);
+}
+
 static inline int __ctsvc_vcard_get_messenger(ctsvc_list_s* messenger_list, int type, char *val)
 {
        int ret;
@@ -2343,6 +2823,7 @@ static inline int __ctsvc_vcard_get_messenger(ctsvc_list_s* messenger_list, int
        case CTSVC_VCARD_VALUE_X_JABBER:
                contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_JABBER);
                break;
+       case CTSVC_VCARD_VALUE_X_SKYPE_USERNAME:
        case CTSVC_VCARD_VALUE_X_SKYPE:
                contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_SKYPE);
                break;
@@ -2352,12 +2833,94 @@ static inline int __ctsvc_vcard_get_messenger(ctsvc_list_s* messenger_list, int
        case CTSVC_VCARD_VALUE_X_GOOGLE_TALK:
                contacts_record_set_int(messenger, _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_GOOGLE);
                break;
+       case CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER:
+               if (val != temp) {
+                       *(temp-1) = '\0';
+                       __ctsvc_vcard_get_messenger_type(messenger, val);
+               }
+               break;
        }
        contacts_list_add((contacts_list_h)messenger_list, messenger);
 
        return CONTACTS_ERROR_NONE;
 }
 
+static inline void __ctsvc_vcard_get_relationship_type(contacts_record_h relationship, char *val)
+{
+       char *temp, *result, *last = NULL;
+       char *lower, *lower_temp;
+       int type = CONTACTS_RELATIONSHIP_TYPE_OTHER;
+
+       temp = strtok_r(val, ";", &last);
+       while (temp) {
+               lower = strdup(temp);
+               lower_temp = lower;
+               while (*lower_temp) {
+                       *lower_temp = tolower(*lower_temp);
+                       lower_temp++;
+               }
+               if (strstr(lower, "assistant"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_ASSISTANT;
+               else if (strstr(lower, "brother"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_BROTHER;
+               else if (strstr(lower, "child"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_CHILD;
+               else if (strstr(lower, "domestic_partner"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_DOMESTIC_PARTNER;
+               else if (strstr(lower, "father"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_FATHER;
+               else if (strstr(lower, "friend"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_FRIEND;
+               else if (strstr(lower, "manager"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_MANAGER;
+               else if (strstr(lower, "mother"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_MOTHER;
+               else if (strstr(lower, "parent"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_PARENT;
+               else if (strstr(lower, "partner"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_PARTNER;
+               else if (strstr(lower, "referred_by"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_REFERRED_BY;
+               else if (strstr(lower, "relative"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_RELATIVE;
+               else if (strstr(lower, "sister"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_SISTER;
+               else if (strstr(lower, "spouse"))
+                       type = CONTACTS_RELATIONSHIP_TYPE_SPOUSE;
+               else if (NULL != (result = strstr(lower, "x-"))) {
+                       type = CONTACTS_RELATIONSHIP_TYPE_CUSTOM;
+                       contacts_record_set_str(relationship, _contacts_relationship.label, temp+(result-lower)+2);
+               }
+               free(lower);
+               temp = strtok_r(NULL, ";", &last);
+       }
+       contacts_record_set_int(relationship, _contacts_relationship.type, type);
+}
+
+
+static inline int __ctsvc_vcard_get_relationship(ctsvc_list_s* relationship_list, int type, char *val)
+{
+       int ret;
+       char *temp;
+       contacts_record_h relationship;
+
+       temp = __ctsvc_get_content_value(val);
+       RETVM_IF(NULL == temp, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : vcard(%s)", val);
+
+       ret = contacts_record_create(_contacts_relationship._uri, &relationship);
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "contacts_record_create is failed(%d)", ret);
+
+       contacts_record_set_str(relationship, _contacts_relationship.name, temp);
+       if (val != temp) {
+               *(temp-1) = '\0';
+               __ctsvc_vcard_get_relationship_type(relationship, val);
+       }
+       contacts_list_add((contacts_list_h)relationship_list, relationship);
+
+       return CONTACTS_ERROR_NONE;
+
+}
+
 static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_record_h *record)
 {
        int type;
@@ -2396,6 +2959,7 @@ static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_recor
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_PHONETIC_FIRST_NAME:
+               case CTSVC_VCARD_VALUE_PHONETIC_MIDDLE_NAME:
                case CTSVC_VCARD_VALUE_PHONETIC_LAST_NAME:
                        __ctsvc_vcard_get_phonetic_name(contact->name, type, val);
                        free(val);
@@ -2409,7 +2973,9 @@ static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_recor
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_BDAY:
-                       __ctsvc_vcard_get_event(contact->events, CONTACTS_EVENT_TYPE_BIRTH, val);
+               case CTSVC_VCARD_VALUE_X_ANNIVERSARY:
+               case CTSVC_VCARD_VALUE_X_TIZEN_EVENT:
+                       __ctsvc_vcard_get_event(contact->events, type, val);
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_ADR:
@@ -2426,11 +2992,27 @@ static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_recor
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_TITLE:
-                       __ctsvc_vcard_get_company(contact->company, _contacts_company.job_title, val);
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.job_title, val);
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_ROLE:
-                       __ctsvc_vcard_get_company(contact->company, _contacts_company.role, val);
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.role, val);
+                       free(val);
+                       break;
+               case CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_LOCATION:
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.location, val);
+                       free(val);
+                       break;
+               case CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_DESCRIPTION:
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.description, val);
+                       free(val);
+                       break;
+               case CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_PHONETIC_NAME:
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.phonetic_name, val);
+                       free(val);
+                       break;
+               case CTSVC_VCARD_VALUE_X_TIZEN_COMPANY_ASSISTANT_NAME:
+                       __ctsvc_vcard_get_company_value(contact->company, _contacts_company.assistant_name, val);
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_LOGO:
@@ -2438,7 +3020,7 @@ static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_recor
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_ORG:
-                       __ctsvc_vcard_get_company(contact->company, _contacts_company.name, val);
+                       __ctsvc_vcard_get_company(contact->company, val);
                        free(val);
                        break;
                case CTSVC_VCARD_VALUE_NOTE:
@@ -2458,21 +3040,24 @@ static inline int __ctsvc_vcard_get_contact(int ver, char *vcard, contacts_recor
                        __ctsvc_vcard_get_url(contact->urls, val);
                        free(val);
                        break;
-               case CTSVC_VCARD_VALUE_X_ANNIVERSARY:
-                       __ctsvc_vcard_get_event(contact->events, CONTACTS_EVENT_TYPE_ANNIVERSARY, val);
-                       free(val);
-                       break;
                case CTSVC_VCARD_VALUE_X_MSN:
                case CTSVC_VCARD_VALUE_X_YAHOO:
                case CTSVC_VCARD_VALUE_X_ICQ:
                case CTSVC_VCARD_VALUE_X_AIM:
                case CTSVC_VCARD_VALUE_X_JABBER:
+               case CTSVC_VCARD_VALUE_X_SKYPE_USERNAME:
                case CTSVC_VCARD_VALUE_X_SKYPE:
                case CTSVC_VCARD_VALUE_X_QQ:
                case CTSVC_VCARD_VALUE_X_GOOGLE_TALK:
+               case CTSVC_VCARD_VALUE_X_TIZEN_MESSENGER:
                        __ctsvc_vcard_get_messenger(contact->messengers, type, val);
                        free(val);
                        break;
+
+               case CTSVC_VCARD_VALUE_X_TIZEN_RELATIONSHIP:
+                       __ctsvc_vcard_get_relationship(contact->relationships, type, val);
+                       free(val);
+                       break;
                case CTSVC_VCARD_VALUE_END:
                        free(val);
                        return CONTACTS_ERROR_NONE;
index a8c08fa..77f27b6 100644 (file)
@@ -318,6 +318,14 @@ API const _contacts_contact_updated_info_property_ids _contacts_contact_updated_
        .address_book_id        = CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID,
        .type                   = CTSVC_PROPERTY_UPDATE_INFO_TYPE,
        .version                = CTSVC_PROPERTY_UPDATE_INFO_VERSION,
+       .image_changed  = CTSVC_PROPERTY_UPDATE_INFO_IMAGE_CHANGED,
+};
+
+API const _contacts_my_profile_updated_info_property_ids _contacts_my_profile_updated_info = {
+       ._uri                   = CTSVC_VIEW_URI_MY_PROFILE_UPDATED_INFO,
+       .address_book_id        = CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID,
+       .last_changed_type      = CTSVC_PROPERTY_UPDATE_INFO_LAST_CHANGED_TYPE,
+       .version                = CTSVC_PROPERTY_UPDATE_INFO_VERSION,
 };
 
 API const _contacts_group_updated_info_property_ids _contacts_group_updated_info = {
@@ -556,7 +564,7 @@ API const _contacts_contact_grouprel_property_ids _contacts_contact_grouprel = {
        .ringtone_path                  = CTSVC_PROPERTY_CONTACT_RINGTONE,
        .image_thumbnail_path   = CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,
        .group_id               = CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,
-       .group_name     = CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME
+       .group_name             = CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME
 };
 
 API const _contacts_contact_activity_property_ids _contacts_contact_activity = {
@@ -591,526 +599,529 @@ API const _contacts_phone_log_stat_property_ids _contacts_phone_log_stat = {
 };
 
 const property_info_s __property_addressbook[] = {
-       {CTSVC_PROPERTY_ADDRESSBOOK_ID,                 CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,               CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "mode"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_ID,                 CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, CTSVC_SEARCH_PROPERTY_ALL,      "account_id"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,               CTSVC_SEARCH_PROPERTY_ALL,      "mode"},
 };
 
 const property_info_s __property_snd[] = {
-       {CTSVC_PROPERTY_SDN_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_SDN_NAME,       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "name"},
-       {CTSVC_PROPERTY_SDN_NUMBER,     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_SDN_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_SDN_NAME,               CTSVC_SEARCH_PROPERTY_ALL,      "name"},
+       {CTSVC_PROPERTY_SDN_NUMBER,     CTSVC_SEARCH_PROPERTY_ALL,      "number"},
 };
 
 const property_info_s __property_group[] = {
-       {CTSVC_PROPERTY_GROUP_ID,                               CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
-       {CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_GROUP_NAME,                     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "group_name"},
-       {CTSVC_PROPERTY_GROUP_RINGTONE,                 CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
-       {CTSVC_PROPERTY_GROUP_IMAGE,                    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
-       {CTSVC_PROPERTY_GROUP_VIBRATION,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
-       {CTSVC_PROPERTY_GROUP_SYSTEM_ID,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "system_id"},
-       {CTSVC_PROPERTY_GROUP_IS_READ_ONLY,     CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_read_only"},
+       {CTSVC_PROPERTY_GROUP_ID,                               CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
+       {CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID,   CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_GROUP_NAME,                     CTSVC_SEARCH_PROPERTY_ALL,      "group_name"},
+       {CTSVC_PROPERTY_GROUP_RINGTONE,         CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
+       {CTSVC_PROPERTY_GROUP_IMAGE,                    CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_GROUP_VIBRATION,                CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
+       {CTSVC_PROPERTY_GROUP_SYSTEM_ID,                CTSVC_SEARCH_PROPERTY_ALL,      "system_id"},
+       {CTSVC_PROPERTY_GROUP_IS_READ_ONLY,     CTSVC_SEARCH_PROPERTY_ALL,      "is_read_only"},
 };
 
 const property_info_s __property_person[] = {
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
-       {CTSVC_PROPERTY_PERSON_STATUS,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "status"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY,       CTSVC_VIEW_DATA_TYPE_DOUBLE,CTSVC_SEARCH_PROPERTY_FILTER,       "favorite_prio"},
-       {CTSVC_PROPERTY_PERSON_LINK_COUNT,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
-       {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "addressbook_ids"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,CTSVC_SEARCH_PROPERTY_ALL,    "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL, CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,               CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
+       {CTSVC_PROPERTY_PERSON_STATUS,                  CTSVC_SEARCH_PROPERTY_ALL,      "status"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY,       CTSVC_SEARCH_PROPERTY_FILTER,   "favorite_prio"},
+       {CTSVC_PROPERTY_PERSON_LINK_COUNT,              CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,             CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,             CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,             CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
+       {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"},
 };
 
 const property_info_s __property_simple_contact[] = {
-       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
-       {CTSVC_PROPERTY_CONTACT_IS_FAVORITE,    CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER,CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_CONTACT_HAS_EMAIL,              CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_UID,                    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
-       {CTSVC_PROPERTY_CONTACT_VIBRATION,              CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
-       {CTSVC_PROPERTY_CONTACT_CHANGED_TIME,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
+       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_CONTACT_IS_FAVORITE,            CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER, CTSVC_SEARCH_PROPERTY_ALL,     "has_phonenumber"},
+       {CTSVC_PROPERTY_CONTACT_HAS_EMAIL,              CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_UID,                            CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
+       {CTSVC_PROPERTY_CONTACT_VIBRATION,              CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
+       {CTSVC_PROPERTY_CONTACT_CHANGED_TIME,   CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
 };
 
 const property_info_s __property_name[] = {
-       {CTSVC_PROPERTY_NAME_ID,                                CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_NAME_CONTACT_ID,                CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_NAME_FIRST,                     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "first"},
-       {CTSVC_PROPERTY_NAME_LAST,                              CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "last"},
-       {CTSVC_PROPERTY_NAME_ADDITION,                  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "addition"},
-       {CTSVC_PROPERTY_NAME_PREFIX,                    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "prefix"},
-       {CTSVC_PROPERTY_NAME_SUFFIX,                    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "suffix"},
-       {CTSVC_PROPERTY_NAME_PHONETIC_FIRST,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "phonetic_first"},
-       {CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "phonetic_middle"},
-       {CTSVC_PROPERTY_NAME_PHONETIC_LAST,     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "phonetic_last"},
+       {CTSVC_PROPERTY_NAME_ID,                                        CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_NAME_CONTACT_ID,                        CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_NAME_FIRST,                             CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_NAME_LAST,                                      CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_NAME_ADDITION,                  CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_NAME_PREFIX,                            CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
+       {CTSVC_PROPERTY_NAME_SUFFIX,                            CTSVC_SEARCH_PROPERTY_ALL,      "data6"},
+       {CTSVC_PROPERTY_NAME_PHONETIC_FIRST,    CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
+       {CTSVC_PROPERTY_NAME_PHONETIC_MIDDLE,   CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
+       {CTSVC_PROPERTY_NAME_PHONETIC_LAST,     CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
 };
 
 const property_info_s __property_number[] = {
-       {CTSVC_PROPERTY_NUMBER_ID,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_NUMBER_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_NUMBER_TYPE,            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_NUMBER_LABEL,           CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_NUMBER_IS_DEFAULT,      CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
-       {CTSVC_PROPERTY_NUMBER_NUMBER,          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_NUMBER_ID,                              CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_NUMBER_CONTACT_ID,      CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_NUMBER_TYPE,                    CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_NUMBER_LABEL,                   CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_NUMBER_IS_DEFAULT,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_NUMBER_NUMBER,          CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_email[] = {
-       {CTSVC_PROPERTY_EMAIL_ID,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_EMAIL_CONTACT_ID,       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_EMAIL_TYPE,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_EMAIL_LABEL,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_EMAIL_IS_DEFAULT,       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
-       {CTSVC_PROPERTY_EMAIL_EMAIL,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "email"},
+       {CTSVC_PROPERTY_EMAIL_ID,                               CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_EMAIL_CONTACT_ID,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_EMAIL_TYPE,                     CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_EMAIL_LABEL,                    CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_EMAIL_IS_DEFAULT,       CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_EMAIL_EMAIL,                    CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_address[] = {
-       {CTSVC_PROPERTY_ADDRESS_ID,                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_ADDRESS_CONTACT_ID,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_ADDRESS_TYPE,           CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_ADDRESS_LABEL,          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_ADDRESS_POSTBOX,        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "postbox"},
-       {CTSVC_PROPERTY_ADDRESS_POSTAL_CODE,CTSVC_VIEW_DATA_TYPE_STR,   CTSVC_SEARCH_PROPERTY_ALL,      "postal_code"},
-       {CTSVC_PROPERTY_ADDRESS_REGION,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "region"},
-       {CTSVC_PROPERTY_ADDRESS_LOCALITY,       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "locality"},
-       {CTSVC_PROPERTY_ADDRESS_STREET,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "street"},
-       {CTSVC_PROPERTY_ADDRESS_COUNTRY,        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "country"},
-       {CTSVC_PROPERTY_ADDRESS_EXTENDED,       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "extend"},
-       {CTSVC_PROPERTY_ADDRESS_IS_DEFAULT,     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_ADDRESS_ID,                     CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_ADDRESS_CONTACT_ID,     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_ADDRESS_TYPE,                   CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_ADDRESS_LABEL,          CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_ADDRESS_POSTBOX,                CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_ADDRESS_POSTAL_CODE,CTSVC_SEARCH_PROPERTY_ALL,  "data4"},
+       {CTSVC_PROPERTY_ADDRESS_REGION,         CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
+       {CTSVC_PROPERTY_ADDRESS_LOCALITY,       CTSVC_SEARCH_PROPERTY_ALL,      "data6"},
+       {CTSVC_PROPERTY_ADDRESS_STREET,         CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
+       {CTSVC_PROPERTY_ADDRESS_COUNTRY,                CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
+       {CTSVC_PROPERTY_ADDRESS_EXTENDED,       CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
+       {CTSVC_PROPERTY_ADDRESS_IS_DEFAULT,     CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
 };
 
 const property_info_s __property_url[] = {
-       {CTSVC_PROPERTY_URL_ID,                 CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_URL_CONTACT_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_URL_TYPE,               CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_URL_LABEL,              CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_URL_URL,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "url"},
+       {CTSVC_PROPERTY_URL_ID,                         CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_URL_CONTACT_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_URL_TYPE,                       CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_URL_LABEL,                      CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_URL_URL,                        CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_event[] = {
-       {CTSVC_PROPERTY_EVENT_ID,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_EVENT_CONTACT_ID,       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_EVENT_TYPE,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_EVENT_LABEL,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_EVENT_DATE,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "date"},
-       {CTSVC_PROPERTY_EVENT_IS_LUNAR,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "is_lunar"},
-       {CTSVC_PROPERTY_EVENT_LUNAR_DATE,       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "lunar_date"},
+       {CTSVC_PROPERTY_EVENT_ID,                               CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_EVENT_CONTACT_ID,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_EVENT_TYPE,                     CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_EVENT_LABEL,                    CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_EVENT_DATE,                     CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_EVENT_IS_LUNAR,                 CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_EVENT_LUNAR_DATE,       CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
 };
 
 const property_info_s __property_group_relation[] = {
-//     {CTSVC_PROPERTY_GROUP_RELATION_ID,                      CTSVC_VIEW_DATA_TYPE_INT,       "id"},
-       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
-       {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "group_name"},
+       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,        CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
+       {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,      CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME,CTSVC_SEARCH_PROPERTY_ALL,    "group_name"},
 };
 
 const property_info_s __property_relationship[] = {
-       {CTSVC_PROPERTY_RELATIONSHIP_ID,                        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID,        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_RELATIONSHIP_TYPE,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_RELATIONSHIP_LABEL,             CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_RELATIONSHIP_NAME,                      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "name"},
+       {CTSVC_PROPERTY_RELATIONSHIP_ID,                                CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_RELATIONSHIP_CONTACT_ID,        CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_RELATIONSHIP_TYPE,                      CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_RELATIONSHIP_LABEL,             CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_RELATIONSHIP_NAME,                      CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_image[] = {
-       {CTSVC_PROPERTY_IMAGE_ID,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_IMAGE_CONTACT_ID,       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_IMAGE_TYPE,                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_IMAGE_LABEL,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_IMAGE_PATH,                     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "path"},
-       {CTSVC_PROPERTY_IMAGE_IS_DEFAULT,       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_IMAGE_ID,                               CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_IMAGE_CONTACT_ID,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_IMAGE_TYPE,                     CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_IMAGE_LABEL,                    CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_IMAGE_PATH,                     CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_IMAGE_IS_DEFAULT,       CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
 };
 
 const property_info_s __property_company[] = {
-       {CTSVC_PROPERTY_COMPANY_ID,                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_COMPANY_CONTACT_ID,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_COMPANY_TYPE,                   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_COMPANY_LABEL,                  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_COMPANY_NAME,                   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "name"},
-       {CTSVC_PROPERTY_COMPANY_DEPARTMENT,     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "department"},
-       {CTSVC_PROPERTY_COMPANY_JOB_TITLE,              CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "job_title"},
-       {CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME, CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "assistant"},
-       {CTSVC_PROPERTY_COMPANY_ROLE,                   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "role"},
-       {CTSVC_PROPERTY_COMPANY_LOGO,                   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "logo"},
-       {CTSVC_PROPERTY_COMPANY_LOCATION,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "location"},
-       {CTSVC_PROPERTY_COMPANY_DESCRIPTION,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "description"},
-       {CTSVC_PROPERTY_COMPANY_PHONETIC_NAME,  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "phonetic_name"},
+       {CTSVC_PROPERTY_COMPANY_ID,                             CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_COMPANY_CONTACT_ID,     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_COMPANY_TYPE,                   CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_COMPANY_LABEL,                  CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_COMPANY_NAME,                           CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_COMPANY_DEPARTMENT,     CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_COMPANY_JOB_TITLE,              CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
+       {CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME,CTSVC_SEARCH_PROPERTY_ALL,       "data6"},
+       {CTSVC_PROPERTY_COMPANY_ROLE,                           CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
+       {CTSVC_PROPERTY_COMPANY_LOGO,                           CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
+       {CTSVC_PROPERTY_COMPANY_LOCATION,               CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
+       {CTSVC_PROPERTY_COMPANY_DESCRIPTION,    CTSVC_SEARCH_PROPERTY_ALL,      "data10"},
+       {CTSVC_PROPERTY_COMPANY_PHONETIC_NAME,  CTSVC_SEARCH_PROPERTY_ALL,      "data11"},
 };
 
 const property_info_s __property_nickname[] = {
-       {CTSVC_PROPERTY_NICKNAME_ID,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id",},
-       {CTSVC_PROPERTY_NICKNAME_CONTACT_ID,    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_NICKNAME_NAME,                  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "nickname"},
+       {CTSVC_PROPERTY_NICKNAME_ID,                            CTSVC_SEARCH_PROPERTY_ALL,      "id",},
+       {CTSVC_PROPERTY_NICKNAME_CONTACT_ID,    CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_NICKNAME_NAME,                  CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_messenger[] = {
-       {CTSVC_PROPERTY_MESSENGER_ID,                   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_MESSENGER_CONTACT_ID,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_MESSENGER_TYPE,                 CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_MESSENGER_LABEL,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_MESSENGER_IM_ID,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "im_id"},
+       {CTSVC_PROPERTY_MESSENGER_ID,                           CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_MESSENGER_CONTACT_ID,   CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_MESSENGER_TYPE,                         CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_MESSENGER_LABEL,                        CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_MESSENGER_IM_ID,                        CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_note[] = {
-       {CTSVC_PROPERTY_NOTE_ID,                        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_NOTE_CONTACT_ID,        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_NOTE_NOTE,                      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "note"},
+       {CTSVC_PROPERTY_NOTE_ID,                        CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_NOTE_CONTACT_ID,        CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_NOTE_NOTE,                      CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
 };
 
 const property_info_s __property_profile[] = {
-       {CTSVC_PROPERTY_PROFILE_ID,                                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_PROFILE_CONTACT_ID,                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_PROFILE_TYPE,                           CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_PROFILE_LABEL,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_PROFILE_UID,                            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
-       {CTSVC_PROPERTY_PROFILE_TEXT,                           CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "text"},
-       {CTSVC_PROPERTY_PROFILE_ORDER,                          CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "profile_order"},
-       {CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION,       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "appsvc_op"},
-       {CTSVC_PROPERTY_PROFILE_DATA1,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
-       {CTSVC_PROPERTY_PROFILE_DATA2,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
-       {CTSVC_PROPERTY_PROFILE_DATA3,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
-       {CTSVC_PROPERTY_PROFILE_DATA4,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_PROFILE_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_PROFILE_CONTACT_ID,                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_PROFILE_TYPE,                                   CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_PROFILE_LABEL,                          CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_PROFILE_UID,                                    CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_PROFILE_TEXT,                                   CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_PROFILE_ORDER,                          CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
+       {CTSVC_PROPERTY_PROFILE_APPSVC_OPERATION,       CTSVC_SEARCH_PROPERTY_ALL,      "data6"},
+       {CTSVC_PROPERTY_PROFILE_DATA1,                          CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
+       {CTSVC_PROPERTY_PROFILE_DATA2,                          CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
+       {CTSVC_PROPERTY_PROFILE_DATA3,                          CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
+       {CTSVC_PROPERTY_PROFILE_DATA4,                          CTSVC_SEARCH_PROPERTY_ALL,      "data10"},
 };
 
 const property_info_s __property_activity_photo[] = {
-       {CTSVC_PROPERTY_ACTIVITY_PHOTO_ID,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "activity_id"},
-       {CTSVC_PROPERTY_ACTIVITY_PHOTO_URL,                     CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "photo_url"},
-       {CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "sort_index"},
+       {CTSVC_PROPERTY_ACTIVITY_PHOTO_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_ACTIVITY_PHOTO_ACTIVITY_ID,     CTSVC_SEARCH_PROPERTY_ALL,      "activity_id"},
+       {CTSVC_PROPERTY_ACTIVITY_PHOTO_URL,                     CTSVC_SEARCH_PROPERTY_ALL,      "photo_url"},
+       {CTSVC_PROPERTY_ACTIVITY_PHOTO_SORT_INDEX,      CTSVC_SEARCH_PROPERTY_ALL,      "sort_index"},
 };
 
 const property_info_s __property_activity[] = {
-       {CTSVC_PROPERTY_ACTIVITY_ID,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_ACTIVITY_CONTACT_ID,    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "source_name"},
-       {CTSVC_PROPERTY_ACTIVITY_STATUS,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "status"},
-       {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "timestamp"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "sync_data1"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "sync_data2"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "sync_data3"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "sync_data4"},
-       {CTSVC_PROPERTY_ACTIVITY_ACTIVITY_PHOTO,CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,     (void*)__property_activity_photo},
+       {CTSVC_PROPERTY_ACTIVITY_ID,                            CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_ACTIVITY_CONTACT_ID,            CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME,   CTSVC_SEARCH_PROPERTY_ALL,      "source_name"},
+       {CTSVC_PROPERTY_ACTIVITY_STATUS,                        CTSVC_SEARCH_PROPERTY_ALL,      "status"},
+       {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP,             CTSVC_SEARCH_PROPERTY_ALL,      "timestamp"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1,            CTSVC_SEARCH_PROPERTY_ALL,      "sync_data1"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2,            CTSVC_SEARCH_PROPERTY_ALL,      "sync_data2"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3,            CTSVC_SEARCH_PROPERTY_ALL,      "sync_data3"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4,            CTSVC_SEARCH_PROPERTY_ALL,      "sync_data4"},
+       {CTSVC_PROPERTY_ACTIVITY_ACTIVITY_PHOTO,CTSVC_SEARCH_PROPERTY_NONE,     (void*)__property_activity_photo},
 };
 
 const property_info_s __property_extension[] = {
-       {CTSVC_PROPERTY_EXTENSION_ID,                   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_EXTENSION_CONTACT_ID,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_EXTENSION_DATA1,                CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
-       {CTSVC_PROPERTY_EXTENSION_DATA2,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
-       {CTSVC_PROPERTY_EXTENSION_DATA3,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
-       {CTSVC_PROPERTY_EXTENSION_DATA4,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
-       {CTSVC_PROPERTY_EXTENSION_DATA5,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
-       {CTSVC_PROPERTY_EXTENSION_DATA6,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data6"},
-       {CTSVC_PROPERTY_EXTENSION_DATA7,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
-       {CTSVC_PROPERTY_EXTENSION_DATA8,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
-       {CTSVC_PROPERTY_EXTENSION_DATA9,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
-       {CTSVC_PROPERTY_EXTENSION_DATA10,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data10"},
-       {CTSVC_PROPERTY_EXTENSION_DATA11,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data11"},
-       {CTSVC_PROPERTY_EXTENSION_DATA12,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data12"},
+       {CTSVC_PROPERTY_EXTENSION_ID,                           CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_EXTENSION_CONTACT_ID,   CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_EXTENSION_DATA1,                CTSVC_SEARCH_PROPERTY_ALL,      "data1"},
+       {CTSVC_PROPERTY_EXTENSION_DATA2,                CTSVC_SEARCH_PROPERTY_ALL,      "data2"},
+       {CTSVC_PROPERTY_EXTENSION_DATA3,                CTSVC_SEARCH_PROPERTY_ALL,      "data3"},
+       {CTSVC_PROPERTY_EXTENSION_DATA4,                CTSVC_SEARCH_PROPERTY_ALL,      "data4"},
+       {CTSVC_PROPERTY_EXTENSION_DATA5,                CTSVC_SEARCH_PROPERTY_ALL,      "data5"},
+       {CTSVC_PROPERTY_EXTENSION_DATA6,                CTSVC_SEARCH_PROPERTY_ALL,      "data6"},
+       {CTSVC_PROPERTY_EXTENSION_DATA7,                CTSVC_SEARCH_PROPERTY_ALL,      "data7"},
+       {CTSVC_PROPERTY_EXTENSION_DATA8,                CTSVC_SEARCH_PROPERTY_ALL,      "data8"},
+       {CTSVC_PROPERTY_EXTENSION_DATA9,                CTSVC_SEARCH_PROPERTY_ALL,      "data9"},
+       {CTSVC_PROPERTY_EXTENSION_DATA10,               CTSVC_SEARCH_PROPERTY_ALL,      "data10"},
+       {CTSVC_PROPERTY_EXTENSION_DATA11,               CTSVC_SEARCH_PROPERTY_ALL,      "data11"},
+       {CTSVC_PROPERTY_EXTENSION_DATA12,               CTSVC_SEARCH_PROPERTY_ALL,      "data12"},
 };
 
 const property_info_s __property_contact[] = {
-       {CTSVC_PROPERTY_CONTACT_ID,                                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,                   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  //dispaly_name, reverse_display_name
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,                 CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,                               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
-       {CTSVC_PROPERTY_CONTACT_IS_FAVORITE,                    CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER,                CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_CONTACT_HAS_EMAIL,                              CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_UID,                                    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
-       {CTSVC_PROPERTY_CONTACT_VIBRATION,                              CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
-       {CTSVC_PROPERTY_CONTACT_CHANGED_TIME,                   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
-       {CTSVC_PROPERTY_CONTACT_NAME,                                   CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,     (void*)__property_name},
-       {CTSVC_PROPERTY_CONTACT_COMPANY,                                CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company},
-       {CTSVC_PROPERTY_CONTACT_NOTE,                                   CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note},
-       {CTSVC_PROPERTY_CONTACT_NUMBER,                                 CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number},
-       {CTSVC_PROPERTY_CONTACT_EMAIL,                                  CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email},
-       {CTSVC_PROPERTY_CONTACT_EVENT,                                  CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event},
-       {CTSVC_PROPERTY_CONTACT_MESSENGER,                              CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger},
-       {CTSVC_PROPERTY_CONTACT_ADDRESS,                                CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address},
-       {CTSVC_PROPERTY_CONTACT_URL,                                    CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url},
-       {CTSVC_PROPERTY_CONTACT_NICKNAME,                               CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname},
-       {CTSVC_PROPERTY_CONTACT_PROFILE,                                CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile},
-       {CTSVC_PROPERTY_CONTACT_RELATIONSHIP,                   CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship},
-       {CTSVC_PROPERTY_CONTACT_IMAGE,                                  CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image},
-       {CTSVC_PROPERTY_CONTACT_GROUP_RELATION,                 CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_group_relation},
-       {CTSVC_PROPERTY_CONTACT_EXTENSION,                              CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension},
+       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},  //dispaly_name, reverse_display_name
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID, CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,                       CTSVC_SEARCH_PROPERTY_ALL,      "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,        CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_CONTACT_IS_FAVORITE,                    CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER,        CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
+       {CTSVC_PROPERTY_CONTACT_HAS_EMAIL,                      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_UID,                                    CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
+       {CTSVC_PROPERTY_CONTACT_VIBRATION,                      CTSVC_SEARCH_PROPERTY_ALL,      "vibration"},
+       {CTSVC_PROPERTY_CONTACT_CHANGED_TIME,           CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
+       {CTSVC_PROPERTY_CONTACT_NAME,                                   CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_name},
+       {CTSVC_PROPERTY_CONTACT_COMPANY,                                CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company},
+       {CTSVC_PROPERTY_CONTACT_NOTE,                                   CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note},
+       {CTSVC_PROPERTY_CONTACT_NUMBER,                         CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number},
+       {CTSVC_PROPERTY_CONTACT_EMAIL,                          CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email},
+       {CTSVC_PROPERTY_CONTACT_EVENT,                          CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event},
+       {CTSVC_PROPERTY_CONTACT_MESSENGER,                      CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger},
+       {CTSVC_PROPERTY_CONTACT_ADDRESS,                                CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address},
+       {CTSVC_PROPERTY_CONTACT_URL,                                    CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url},
+       {CTSVC_PROPERTY_CONTACT_NICKNAME,                       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname},
+       {CTSVC_PROPERTY_CONTACT_PROFILE,                                CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile},
+       {CTSVC_PROPERTY_CONTACT_RELATIONSHIP,           CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship},
+       {CTSVC_PROPERTY_CONTACT_IMAGE,                          CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image},
+       {CTSVC_PROPERTY_CONTACT_GROUP_RELATION,         CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_group_relation},
+       {CTSVC_PROPERTY_CONTACT_EXTENSION,                      CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension},
 };
 
 const property_info_s __property_my_profile[] = {
-       {CTSVC_PROPERTY_MY_PROFILE_ID,                                          CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "my_profile_id"},
-       {CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  //dispaly_name, reverse_display_name
-       {CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL,             CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
-       {CTSVC_PROPERTY_MY_PROFILE_UID,                                 CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
-       {CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME,                        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
-       {CTSVC_PROPERTY_MY_PROFILE_NAME,                                        CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,     (void*)__property_name},
-       {CTSVC_PROPERTY_MY_PROFILE_COMPANY,                             CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company},
-       {CTSVC_PROPERTY_MY_PROFILE_NOTE,                                        CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note},
-       {CTSVC_PROPERTY_MY_PROFILE_NUMBER,                                      CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number},
-       {CTSVC_PROPERTY_MY_PROFILE_EMAIL,                                       CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email},
-       {CTSVC_PROPERTY_MY_PROFILE_EVENT,                                       CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event},
-       {CTSVC_PROPERTY_MY_PROFILE_MESSENGER,                           CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger},
-       {CTSVC_PROPERTY_MY_PROFILE_ADDRESS,                             CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address},
-       {CTSVC_PROPERTY_MY_PROFILE_URL,                                 CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url},
-       {CTSVC_PROPERTY_MY_PROFILE_NICKNAME,                            CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname},
-       {CTSVC_PROPERTY_MY_PROFILE_PROFILE,                             CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile},
-       {CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP,                        CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship},
-       {CTSVC_PROPERTY_MY_PROFILE_IMAGE,                                       CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image},
-       {CTSVC_PROPERTY_MY_PROFILE_EXTENSION,                           CTSVC_VIEW_DATA_TYPE_REC,       CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension},
+       {CTSVC_PROPERTY_MY_PROFILE_ID,                                  CTSVC_SEARCH_PROPERTY_ALL,      "my_profile_id"},
+       {CTSVC_PROPERTY_MY_PROFILE_DISPLAY_NAME,                CTSVC_SEARCH_PROPERTY_ALL,      NULL},  //dispaly_name, reverse_display_name
+       {CTSVC_PROPERTY_MY_PROFILE_ADDRESSBOOK_ID,              CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_MY_PROFILE_IMAGE_THUMBNAIL,     CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_MY_PROFILE_UID,                                 CTSVC_SEARCH_PROPERTY_ALL,      "uid"},
+       {CTSVC_PROPERTY_MY_PROFILE_CHANGED_TIME,                CTSVC_SEARCH_PROPERTY_ALL,      "changed_time"},
+       {CTSVC_PROPERTY_MY_PROFILE_NAME,                                        CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_name},
+       {CTSVC_PROPERTY_MY_PROFILE_COMPANY,                             CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_company},
+       {CTSVC_PROPERTY_MY_PROFILE_NOTE,                                        CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_note},
+       {CTSVC_PROPERTY_MY_PROFILE_NUMBER,                              CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_number},
+       {CTSVC_PROPERTY_MY_PROFILE_EMAIL,                               CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_email},
+       {CTSVC_PROPERTY_MY_PROFILE_EVENT,                               CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_event},
+       {CTSVC_PROPERTY_MY_PROFILE_MESSENGER,                   CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_messenger},
+       {CTSVC_PROPERTY_MY_PROFILE_ADDRESS,                             CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_address},
+       {CTSVC_PROPERTY_MY_PROFILE_URL,                                 CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_url},
+       {CTSVC_PROPERTY_MY_PROFILE_NICKNAME,                            CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_nickname},
+       {CTSVC_PROPERTY_MY_PROFILE_PROFILE,                             CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_profile},
+       {CTSVC_PROPERTY_MY_PROFILE_RELATIONSHIP,                CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_relationship},
+       {CTSVC_PROPERTY_MY_PROFILE_IMAGE,                               CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_image},
+       {CTSVC_PROPERTY_MY_PROFILE_EXTENSION,                   CTSVC_SEARCH_PROPERTY_NONE,(void*)__property_extension},
 };
 
 
 const property_info_s __property_speeddial[] = {
-       {CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER,          CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "speed_number"},
-       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID,            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
-       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
-       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "label"},
-       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE,          CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID,            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},          // display_name or reverse_display_name
-       {CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
+       {CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER,          CTSVC_SEARCH_PROPERTY_ALL,      "speed_number"},
+       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID,                    CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
+       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER,                       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL, CTSVC_SEARCH_PROPERTY_ALL,      "label"},
+       {CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE,          CTSVC_SEARCH_PROPERTY_ALL,      "type"},
+       {CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID,                    CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME, CTSVC_SEARCH_PROPERTY_ALL,      NULL},          // display_name or reverse_display_name
+       {CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL,      CTSVC_SEARCH_PROPERTY_ALL,      "image_thumbnail_path"},
 };
 
 const property_info_s __property_phonelog[] = {
-       {CTSVC_PROPERTY_PHONELOG_ID,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_PHONELOG_PERSON_ID,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PHONELOG_ADDRESS,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
-       {CTSVC_PROPERTY_PHONELOG_LOG_TIME,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "log_time"},
-       {CTSVC_PROPERTY_PHONELOG_LOG_TYPE,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
-       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "data1"},               // duration
-       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "data2"},               // short message, email subject
+       {CTSVC_PROPERTY_PHONELOG_ID,                            CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_PHONELOG_PERSON_ID,             CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PHONELOG_ADDRESS,               CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_PHONELOG_LOG_TIME,              CTSVC_SEARCH_PROPERTY_ALL,      "log_time"},
+       {CTSVC_PROPERTY_PHONELOG_LOG_TYPE,              CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
+       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1,   CTSVC_SEARCH_PROPERTY_ALL,      "data1"},               // duration
+       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2,   CTSVC_SEARCH_PROPERTY_ALL,      "data2"},               // short message, email subject
 };
 
+#if 0
 const property_info_s __property_updated_info[] = {
-       {CTSVC_PROPERTY_UPDATE_INFO_ID,                         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,   CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_UPDATE_INFO_TYPE,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_UPDATE_INFO_VERSION,            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "version"},
+       {CTSVC_PROPERTY_UPDATE_INFO_ID,                                 CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID, CTSVC_SEARCH_PROPERTY_ALL,  "addressbook_id"},
+       {CTSVC_PROPERTY_UPDATE_INFO_TYPE,                       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
+       {CTSVC_PROPERTY_UPDATE_INFO_VERSION,            CTSVC_SEARCH_PROPERTY_ALL,      "version"},
+       {CTSVC_PROPERTY_UPDATE_INFO_IMAGE_CHANGED,      CTSVC_SEARCH_PROPERTY_ALL,      "image_changed"},
+       {CTSVC_PROPERTY_UPDATE_INFO_LAST_CHANGED_TYPE,  CTSVC_SEARCH_PROPERTY_ALL,      "is_deleted"},
 };
 
 const property_info_s __property_grouprel_updated_info[] = {
-       {CTSVC_PROPERTY_GROUP_ID,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
-       {CTSVC_PROPERTY_CONTACT_ID,                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_UPDATE_INFO_TYPE,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
-       {CTSVC_PROPERTY_UPDATE_INFO_VERSION,            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "version"},
+       {CTSVC_PROPERTY_GROUP_ID,                               CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
+       {CTSVC_PROPERTY_CONTACT_ID,                     CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_UPDATE_INFO_TYPE,       CTSVC_SEARCH_PROPERTY_ALL,      "type"},
+       {CTSVC_PROPERTY_UPDATE_INFO_VERSION,    CTSVC_SEARCH_PROPERTY_ALL,      "version"},
 };
+#endif
 
 // search properties ///////////////////////////////////////////////////////////////////////////////////////////////////
 const property_info_s __property_person_contact[] = {          // _contacts_person_contact
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
-       {CTSVC_PROPERTY_PERSON_STATUS,                  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_LINK_COUNT,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
-       {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "addressbook_ids"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,              CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                                CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,                               CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
+       {CTSVC_PROPERTY_PERSON_STATUS,                          CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,                     CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_LINK_COUNT,                              CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
+       {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"},
        // contact
-       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_ID,                                             CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,                 CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
        // addressbook
-       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
 };
 
 const property_info_s __property_person_number[] = {           // _contacts_person_number
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,              CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                                CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,                               CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,                     CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,                 CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
+       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                               CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
        // number
-       {CTSVC_PROPERTY_NUMBER_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
-       {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT,        CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_primary_default"},
-       {CTSVC_PROPERTY_NUMBER_TYPE,                            CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
-       {CTSVC_PROPERTY_NUMBER_LABEL,                           CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
-       {CTSVC_PROPERTY_NUMBER_NUMBER,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
-       {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,           CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_FILTER,   "normalized_number"},
+       {CTSVC_PROPERTY_NUMBER_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
+       {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT,                CTSVC_SEARCH_PROPERTY_ALL,      "is_primary_default"},
+       {CTSVC_PROPERTY_NUMBER_TYPE,                                    CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
+       {CTSVC_PROPERTY_NUMBER_LABEL,                                   CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
+       {CTSVC_PROPERTY_NUMBER_NUMBER,                                  CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,                   CTSVC_SEARCH_PROPERTY_FILTER,   "normalized_number"},
 };
 
 const property_info_s __property_person_email[] = {    // _contacts_person_email
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,              CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                                CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,                               CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,                     CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,                 CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
+       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                               CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
        // email
-       {CTSVC_PROPERTY_EMAIL_ID,                                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "email_id"},
-       {CTSVC_PROPERTY_EMAIL_TYPE,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
-       {CTSVC_PROPERTY_EMAIL_LABEL,                            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
-       {CTSVC_PROPERTY_DATA_IS_PRIMARY_DEFAULT,        CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_primary_default"},
-       {CTSVC_PROPERTY_EMAIL_EMAIL,                            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "email"},
+       {CTSVC_PROPERTY_EMAIL_ID,                                               CTSVC_SEARCH_PROPERTY_ALL,      "email_id"},
+       {CTSVC_PROPERTY_EMAIL_TYPE,                                     CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
+       {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"},
 };
 
 const property_info_s __property_person_grouprel[] = { // _contacts_person_grouprel
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
-       {CTSVC_PROPERTY_PERSON_STATUS,                          CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_LINK_COUNT,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
-       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
-       {CTSVC_PROPERTY_PERSON_ADDRESSBOOK_IDS, CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "addressbook_ids"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,              CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                                CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,                               CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
+       {CTSVC_PROPERTY_PERSON_STATUS,                                  CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,                     CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_LINK_COUNT,                              CTSVC_SEARCH_PROPERTY_ALL,      "link_count"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID1,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id1"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID2,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id2"},
+       {CTSVC_PROPERTY_PERSON_ACCOUNT_ID3,                     CTSVC_SEARCH_PROPERTY_ALL,      "account_id3"},
+       {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"},
        // contacts
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,                 CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,                         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
        // group relation
-       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,                CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
+       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,                        CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
        // addressbook
-       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
-       {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "contact_id"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_NAME,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_name"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_MODE,                               CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_mode"},
+       {CTSVC_PROPERTY_GROUP_RELATION_CONTACT_ID,                      CTSVC_SEARCH_PROPERTY_PROJECTION,       "contact_id"},
 };
 
 const property_info_s __property_person_phonelog[] = { // _contacts_person_phone_log
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
        // phonelog
-       {CTSVC_PROPERTY_PHONELOG_ID,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "phonelog_id"},
-       {CTSVC_PROPERTY_PHONELOG_ADDRESS,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "address"},
-       {CTSVC_PROPERTY_DATA_DATA1,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "address_type"},
-       {CTSVC_PROPERTY_PHONELOG_LOG_TIME,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "log_time"},
-       {CTSVC_PROPERTY_PHONELOG_LOG_TYPE,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
-       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1,   CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "data1"},               // duration
-       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "data2"},               // message_id
+       {CTSVC_PROPERTY_PHONELOG_ID,                            CTSVC_SEARCH_PROPERTY_ALL,      "phonelog_id"},
+       {CTSVC_PROPERTY_PHONELOG_ADDRESS,                       CTSVC_SEARCH_PROPERTY_ALL,      "address"},
+       {CTSVC_PROPERTY_DATA_DATA1,                                     CTSVC_SEARCH_PROPERTY_PROJECTION,       "address_type"},
+       {CTSVC_PROPERTY_PHONELOG_LOG_TIME,                      CTSVC_SEARCH_PROPERTY_ALL,      "log_time"},
+       {CTSVC_PROPERTY_PHONELOG_LOG_TYPE,                      CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
+       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1,           CTSVC_SEARCH_PROPERTY_PROJECTION,       "data1"},               // duration
+       {CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2,           CTSVC_SEARCH_PROPERTY_PROJECTION,       "data2"},               // message_id
 };
 
 const property_info_s __property_person_usage[] = {    // _contacts_person_usage
-       {CTSVC_PROPERTY_PERSON_ID,                                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,                      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
-       {CTSVC_PROPERTY_PERSON_RINGTONE,                        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_PERSON_VIBRATION,                       CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
-       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,             CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
-       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,         CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
-       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
+       {CTSVC_PROPERTY_PERSON_ID,                                              CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME,                    CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX,                              CTSVC_SEARCH_PROPERTY_PROJECTION,       NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "name_contact_id"},
+       {CTSVC_PROPERTY_PERSON_RINGTONE,                                CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL,         CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_PERSON_VIBRATION,                               CTSVC_SEARCH_PROPERTY_PROJECTION,       "vibration"},
+       {CTSVC_PROPERTY_PERSON_IS_FAVORITE,                     CTSVC_SEARCH_PROPERTY_ALL,      "is_favorite"},
+       {CTSVC_PROPERTY_PERSON_HAS_PHONENUMBER,                 CTSVC_SEARCH_PROPERTY_ALL,      "has_phonenumber"},
+       {CTSVC_PROPERTY_PERSON_HAS_EMAIL,                               CTSVC_SEARCH_PROPERTY_ALL,      "has_email"},
        // contact_stat
-       {CTSVC_PROPERTY_PERSON_USAGE_TYPE,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "usage_type"},
-       {CTSVC_PROPERTY_PERSON_TIMES_USED,                      CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "times_used"},
+       {CTSVC_PROPERTY_PERSON_USAGE_TYPE,                              CTSVC_SEARCH_PROPERTY_ALL,      "usage_type"},
+       {CTSVC_PROPERTY_PERSON_TIMES_USED,                              CTSVC_SEARCH_PROPERTY_ALL,      "times_used"},
 };
 
 const property_info_s __property_contact_number[] = {          // _contacts_contact_number
-       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,                 CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,                       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,        CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
        // number
-       {CTSVC_PROPERTY_NUMBER_ID,                              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
-       {CTSVC_PROPERTY_NUMBER_TYPE,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
-       {CTSVC_PROPERTY_NUMBER_LABEL,                   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
-       {CTSVC_PROPERTY_NUMBER_IS_DEFAULT,              CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
-       {CTSVC_PROPERTY_NUMBER_NUMBER,                  CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
-       {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_FILTER,   "normalized_number"},
+       {CTSVC_PROPERTY_NUMBER_ID,                                      CTSVC_SEARCH_PROPERTY_ALL,      "number_id"},
+       {CTSVC_PROPERTY_NUMBER_TYPE,                            CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
+       {CTSVC_PROPERTY_NUMBER_LABEL,                           CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
+       {CTSVC_PROPERTY_NUMBER_IS_DEFAULT,                      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_NUMBER_NUMBER,                          CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_NUMBER_NUMBER_FILTER,           CTSVC_SEARCH_PROPERTY_FILTER,   "normalized_number"},
 };
 
 const property_info_s __property_contact_email[] = {           // _contacts_contact_email
-       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,                 CTSVC_SEARCH_PROPERTY_ALL,      "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,                       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,                CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
        // email
-       {CTSVC_PROPERTY_EMAIL_ID,                                       CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "email_id"},
-       {CTSVC_PROPERTY_EMAIL_TYPE,                                     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
-       {CTSVC_PROPERTY_EMAIL_LABEL,                            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
-       {CTSVC_PROPERTY_EMAIL_IS_DEFAULT,                       CTSVC_VIEW_DATA_TYPE_BOOL,      CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
-       {CTSVC_PROPERTY_EMAIL_EMAIL,                            CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "email"},
+       {CTSVC_PROPERTY_EMAIL_ID,                                               CTSVC_SEARCH_PROPERTY_ALL,      "email_id"},
+       {CTSVC_PROPERTY_EMAIL_TYPE,                                             CTSVC_SEARCH_PROPERTY_PROJECTION,       "type"},
+       {CTSVC_PROPERTY_EMAIL_LABEL,                                    CTSVC_SEARCH_PROPERTY_PROJECTION,       "label"},
+       {CTSVC_PROPERTY_EMAIL_IS_DEFAULT,                               CTSVC_SEARCH_PROPERTY_ALL,      "is_default"},
+       {CTSVC_PROPERTY_EMAIL_EMAIL,                                    CTSVC_SEARCH_PROPERTY_ALL,      "email"},
 };
 
 const property_info_s __property_contact_grouprel[] = {                // _contacts_contact_grouprel
-       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,                 CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,                       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,                CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
        // group relation
-       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
-       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME,      CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "group_name"},
+       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_ID,                CTSVC_SEARCH_PROPERTY_ALL,      "group_id"},
+       {CTSVC_PROPERTY_GROUP_RELATION_GROUP_NAME,              CTSVC_SEARCH_PROPERTY_PROJECTION,       "group_name"},
 };
 
 const property_info_s __property_contact_activity[] = {                // _contacts_contact_activity
-       {CTSVC_PROPERTY_CONTACT_ID,                             CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
-       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
-       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
-       {CTSVC_PROPERTY_CONTACT_PERSON_ID,              CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
-       {CTSVC_PROPERTY_CONTACT_RINGTONE,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
-       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,        CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
-       {CTSVC_PROPERTY_ACTIVITY_ID,                    CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "activity_id"},
-       {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME,   CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "source_name"},
-       {CTSVC_PROPERTY_ACTIVITY_STATUS,                CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
-       {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP,     CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "timestamp"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data1"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data2"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data3"},
-       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4,    CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data4"},
-       {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID, CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "account_id"},
+       {CTSVC_PROPERTY_CONTACT_ID,                                     CTSVC_SEARCH_PROPERTY_ALL,      "contact_id"},
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      NULL},  // "dispaly_name" or "reverse_dispaly_name"
+       {CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID,                 CTSVC_SEARCH_PROPERTY_PROJECTION,       "display_name_source"},
+       {CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "addressbook_id"},
+       {CTSVC_PROPERTY_CONTACT_PERSON_ID,                      CTSVC_SEARCH_PROPERTY_ALL,      "person_id"},
+       {CTSVC_PROPERTY_CONTACT_RINGTONE,                       CTSVC_SEARCH_PROPERTY_PROJECTION,       "ringtone_path"},
+       {CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL,                CTSVC_SEARCH_PROPERTY_PROJECTION,       "image_thumbnail_path"},
+       {CTSVC_PROPERTY_ACTIVITY_ID,                            CTSVC_SEARCH_PROPERTY_ALL,      "activity_id"},
+       {CTSVC_PROPERTY_ACTIVITY_SOURCE_NAME,           CTSVC_SEARCH_PROPERTY_ALL,      "source_name"},
+       {CTSVC_PROPERTY_ACTIVITY_STATUS,                        CTSVC_SEARCH_PROPERTY_PROJECTION,       "status"},
+       {CTSVC_PROPERTY_ACTIVITY_TIMESTAMP,             CTSVC_SEARCH_PROPERTY_ALL,      "timestamp"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA1,            CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data1"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA2,            CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data2"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA3,            CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data3"},
+       {CTSVC_PROPERTY_ACTIVITY_SYNC_DATA4,            CTSVC_SEARCH_PROPERTY_PROJECTION,       "sync_data4"},
+       {CTSVC_PROPERTY_ADDRESSBOOK_ACCOUNT_ID,         CTSVC_SEARCH_PROPERTY_ALL,      "account_id"},
 };
 
 const property_info_s __property_phonelog_number[] = {         //_contacts_phone_log_number
-       {CTSVC_PROPERTY_PHONELOG_ADDRESS,               CTSVC_VIEW_DATA_TYPE_STR,       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
+       {CTSVC_PROPERTY_PHONELOG_ADDRESS,                       CTSVC_SEARCH_PROPERTY_ALL,      "number"},
 };
 
 const property_info_s __property_phonelog_stat[] = {           //_contacts_phone_log_stat
-       {CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT,        CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_PROJECTION,       "log_count"},
-       {CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE,         CTSVC_VIEW_DATA_TYPE_INT,       CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
+       {CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT,                CTSVC_SEARCH_PROPERTY_PROJECTION,       "log_count"},
+       {CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE,                 CTSVC_SEARCH_PROPERTY_ALL,      "log_type"},
 };
 
 typedef struct {
@@ -1125,7 +1136,7 @@ typedef struct {
 static const view_uri_info_s __tables[] = {
        {CTSVC_VIEW_URI_ADDRESSBOOK,    CTSVC_RECORD_ADDRESSBOOK,               PTR_COUNT(__property_addressbook)},
        {CTSVC_VIEW_URI_GROUP,                  CTSVC_RECORD_GROUP,                             PTR_COUNT(__property_group)},
-       {CTSVC_VIEW_URI_PERSON,                 CTSVC_RECORD_PERSON,                    PTR_COUNT(__property_person)},
+       {CTSVC_VIEW_URI_PERSON,                 CTSVC_RECORD_PERSON,                    PTR_COUNT(__property_person)},
        {CTSVC_VIEW_URI_SIMPLE_CONTACT, CTSVC_RECORD_SIMPLE_CONTACT,    PTR_COUNT(__property_simple_contact)},
        {CTSVC_VIEW_URI_CONTACT,                CTSVC_RECORD_CONTACT,                   PTR_COUNT(__property_contact)},
        {CTSVC_VIEW_URI_MY_PROFILE,             CTSVC_RECORD_MY_PROFILE,                PTR_COUNT(__property_my_profile)},
@@ -1133,14 +1144,14 @@ static const view_uri_info_s __tables[] = {
        {CTSVC_VIEW_URI_ACTIVITY_PHOTO, CTSVC_RECORD_ACTIVITY_PHOTO,    PTR_COUNT(__property_activity_photo)},
        {CTSVC_VIEW_URI_PHONELOG,               CTSVC_RECORD_PHONELOG,                  PTR_COUNT(__property_phonelog)},
        {CTSVC_VIEW_URI_SPEEDDIAL,              CTSVC_RECORD_SPEEDDIAL,                 PTR_COUNT(__property_speeddial)},
-       {CTSVC_VIEW_URI_SDN,                    CTSVC_RECORD_SDN,                               PTR_COUNT(__property_snd)},
+       {CTSVC_VIEW_URI_SDN,                    CTSVC_RECORD_SDN,                               PTR_COUNT(__property_snd)},
 
        {CTSVC_VIEW_URI_NAME,                   CTSVC_RECORD_NAME,                              PTR_COUNT(__property_name)},
        {CTSVC_VIEW_URI_COMPANY,                CTSVC_RECORD_COMPANY,                   PTR_COUNT(__property_company)},
-       {CTSVC_VIEW_URI_NUMBER,                 CTSVC_RECORD_NUMBER,                    PTR_COUNT(__property_number)},
+       {CTSVC_VIEW_URI_NUMBER,         CTSVC_RECORD_NUMBER,                    PTR_COUNT(__property_number)},
        {CTSVC_VIEW_URI_EMAIL,                  CTSVC_RECORD_EMAIL,                             PTR_COUNT(__property_email)},
        {CTSVC_VIEW_URI_URL,                    CTSVC_RECORD_URL,                               PTR_COUNT(__property_url)},
-       {CTSVC_VIEW_URI_ADDRESS,                CTSVC_RECORD_ADDRESS,                   PTR_COUNT(__property_address)},
+       {CTSVC_VIEW_URI_ADDRESS,                CTSVC_RECORD_ADDRESS,                   PTR_COUNT(__property_address)},
        {CTSVC_VIEW_URI_PROFILE,                CTSVC_RECORD_PROFILE,                   PTR_COUNT(__property_profile)},
        {CTSVC_VIEW_URI_RELATIONSHIP,   CTSVC_RECORD_RELATIONSHIP,              PTR_COUNT(__property_relationship)},
        {CTSVC_VIEW_URI_IMAGE,                  CTSVC_RECORD_IMAGE,                             PTR_COUNT(__property_image)},
@@ -1151,10 +1162,11 @@ static const view_uri_info_s __tables[] = {
        {CTSVC_VIEW_URI_GROUP_RELATION, CTSVC_RECORD_GROUP_RELATION,    PTR_COUNT(__property_group_relation)},
        {CTSVC_VIEW_URI_EXTENSION,                      CTSVC_RECORD_EXTENSION,                 PTR_COUNT(__property_extension)},
 
-       {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)},
-       {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)},
-       {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO, PTR_COUNT(__property_updated_info)},
-       {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, CTSVC_RECORD_RESULT,    PTR_COUNT(__property_grouprel_updated_info)},
+       {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, NULL, 0},
+       {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO,  CTSVC_RECORD_UPDATED_INFO, NULL, 0},
+       {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO, NULL, 0},
+       {CTSVC_VIEW_URI_MY_PROFILE_UPDATED_INFO, CTSVC_RECORD_UPDATED_INFO,  NULL, 0},
+       {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, CTSVC_RECORD_RESULT, NULL, 0},
 
        {CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT,               CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_contact)},
        {CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER,                CTSVC_RECORD_RESULT, PTR_COUNT(__property_person_number)},
@@ -1175,55 +1187,16 @@ static GHashTable *__ctsvc_view_uri_hash = NULL;
 void ctsvc_view_uri_init()
 {
        int i;
+       int count;
        if (__ctsvc_view_uri_hash)
                return;
 
        __ctsvc_view_uri_hash = g_hash_table_new(g_str_hash, g_str_equal);
 
        i = 0;
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ADDRESSBOOK, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUP, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PERSON, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SIMPLE_CONTACT, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_CONTACT, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_MY_PROFILE, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ACTIVITY, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ACTIVITY_PHOTO, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PHONELOG, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SPEEDDIAL, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_SDN, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NAME, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_COMPANY, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NUMBER, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EMAIL, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_URL, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_ADDRESS, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_PROFILE, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_RELATIONSHIP, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_IMAGE, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NOTE, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_NICKNAME, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EVENT, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_MESSENGER, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUP_RELATION, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_EXTENSION, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, GINT_TO_POINTER(&__tables[i++]));
-
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, GINT_TO_POINTER(&__tables[i++]));
-       g_hash_table_insert(__ctsvc_view_uri_hash, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, GINT_TO_POINTER(&__tables[i++]));
+       count = sizeof(__tables)/sizeof(view_uri_info_s);
+       for (i=0;i<count;i++)
+               g_hash_table_insert(__ctsvc_view_uri_hash, __tables[i].view_uri, GINT_TO_POINTER(&__tables[i]));
 }
 
 void ctsvc_view_uri_deinit()
index 7dd1fd8..94f4d31 100644 (file)
@@ -38,6 +38,7 @@
 #define CTSVC_VIEW_URI_SPEEDDIAL               "tizen.contacts_view.speeddial"
 #define CTSVC_VIEW_URI_SDN                             "tizen.contacts_view.sdn"
 #define CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO   "tizen.contacts_view.contacts_updated_info"
+#define CTSVC_VIEW_URI_MY_PROFILE_UPDATED_INFO "tizen.contacts_view.my_profile_updated_info"
 #define CTSVC_VIEW_URI_GROUPS_UPDATED_INFO             "tizen.contacts_view.groups_updated_info"
 #define CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO "tizen.contacts_view.groups_member_updated_info"
 #define CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO          "tizen.contacts_view.group_relations_updated_info"
@@ -80,7 +81,7 @@ typedef enum
 } contacts_property_flag_e;
 
 
-// for type check                                                      // data_type mask 0x000FF000
+// for type check                                                                      // data_type mask 0x000FF000
 #define CTSVC_VIEW_DATA_TYPE_MASK             0x000F0000
 #define CTSVC_VIEW_DATA_TYPE_BOOL                0x00010000
 #define CTSVC_VIEW_DATA_TYPE_INT              0x00020000
@@ -93,53 +94,54 @@ typedef enum
 
 #define CTSVC_READ_WRITE_TYPE_MASK            0x0000F000
 #define CTSVC_READ_ONLY_PROPERTY                 0x00001000
-#define CTSVC_WRIET_ONCE_PROPERTY                0x00002000
+#define CTSVC_WRITE_ONCE_PROPERTY                0x00002000
 
 #define CTSVC_READ_ONLY_CHECK(property_id, data_type) \
        ((property_id & CTSVC_READ_WRITE_TYPE_MASK) == data_type ? true : false)
 
 
-// for property                                        //  0x0FF00000
+// for property                            //  0x0FF00000
 #define CTSVC_PROPERTY_MASK                      0x0FF00000
 
-#define CTSVC_PROPERTY_ADDRESSBOOK               0x00100000
-#define CTSVC_PROPERTY_GROUP                     0x00200000
-#define CTSVC_PROPERTY_PERSON                    0x00300000
-#define CTSVC_PROPERTY_ACTIVITY                        0x00500000
-#define CTSVC_PROPERTY_DATA                                    0x00600000
-#define CTSVC_PROPERTY_SPEEDDIAL               0x00700000
-#define CTSVC_PROPERTY_PHONELOG                0x00800000
-#define CTSVC_PROPERTY_UPDATE_INFO                     0x00900000
-#define CTSVC_PROPERTY_SDN                                     0x00A00000
-#define CTSVC_PROPERTY_PHONELOG_STAT                           0x00B00000
-
-#define CTSVC_PROPERTY_CONTACT                   0x01000000
-#define CTSVC_PROPERTY_NAME                      0x01100000
-#define CTSVC_PROPERTY_NUMBER                          0x01200000
-#define CTSVC_PROPERTY_EMAIL                                   0x01300000
-#define CTSVC_PROPERTY_ADDRESS                 0x01400000
-#define CTSVC_PROPERTY_URL                       0x01500000
-#define CTSVC_PROPERTY_EVENT                                   0x01600000
-#define CTSVC_PROPERTY_GROUP_RELATION            0x01700000
-#define CTSVC_PROPERTY_RELATIONSHIP              0x01800000
-#define CTSVC_PROPERTY_COMPANY                 0x01900000
-#define CTSVC_PROPERTY_NICKNAME                0x01A00000
-#define CTSVC_PROPERTY_MESSENGER               0x01B00000
-#define CTSVC_PROPERTY_NOTE                            0x01C00000
-#define CTSVC_PROPERTY_PROFILE                         0x01D00000
-#define CTSVC_PROPERTY_IMAGE                           0x01E00000
-#define CTSVC_PROPERTY_EXTENSION                       0x01F00000
-#define CTSVC_PROPERTY_MY_PROFILE                      0x02000000
-#define CTSVC_PROPERTY_ACTIVITY_PHOTO                          0x02100000
+#define CTSVC_PROPERTY_ADDRESSBOOK              0x00100000
+#define CTSVC_PROPERTY_GROUP                    0x00200000
+#define CTSVC_PROPERTY_PERSON                   0x00300000
+#define CTSVC_PROPERTY_ACTIVITY                                                0x00500000
+#define CTSVC_PROPERTY_DATA                                                    0x00600000
+#define CTSVC_PROPERTY_SPEEDDIAL                                               0x00700000
+#define CTSVC_PROPERTY_PHONELOG                                                0x00800000
+#define CTSVC_PROPERTY_UPDATE_INFO                                     0x00900000
+#define CTSVC_PROPERTY_SDN                                                             0x00A00000
+#define CTSVC_PROPERTY_PHONELOG_STAT                           0x00B00000
+
+
+#define CTSVC_PROPERTY_CONTACT                  0x01000000
+#define CTSVC_PROPERTY_NAME                     0x01100000
+#define CTSVC_PROPERTY_NUMBER                                                  0x01200000
+#define CTSVC_PROPERTY_EMAIL                                                   0x01300000
+#define CTSVC_PROPERTY_ADDRESS                                         0x01400000
+#define CTSVC_PROPERTY_URL                      0x01500000
+#define CTSVC_PROPERTY_EVENT                                                   0x01600000
+#define CTSVC_PROPERTY_GROUP_RELATION           0x01700000
+#define CTSVC_PROPERTY_RELATIONSHIP             0x01800000
+#define CTSVC_PROPERTY_COMPANY                                         0x01900000
+#define CTSVC_PROPERTY_NICKNAME                                                0x01A00000
+#define CTSVC_PROPERTY_MESSENGER                                               0x01B00000
+#define CTSVC_PROPERTY_NOTE                                                    0x01C00000
+#define CTSVC_PROPERTY_PROFILE                                         0x01D00000
+#define CTSVC_PROPERTY_IMAGE                                                   0x01E00000
+#define CTSVC_PROPERTY_EXTENSION                                               0x01F00000
+#define CTSVC_PROPERTY_MY_PROFILE                                      0x02000000
+#define CTSVC_PROPERTY_ACTIVITY_PHOTO                          0x02100000
 
 #define CTSVC_PROPERTY_CHECK(property_id,data_type) \
        ((property_id & CTSVC_PROPERTY_MASK) == data_type ? true : false)
 
-#define CTSVC_SEARCH_PROPERTY_MASK                0xF0000000
-#define CTSVC_SEARCH_PROPERTY_NONE                       0x10000000
-#define CTSVC_SEARCH_PROPERTY_FILTER                       0x20000000
-#define CTSVC_SEARCH_PROPERTY_PROJECTION                   0x30000000
-#define CTSVC_SEARCH_PROPERTY_ALL                  0x40000000
+#define CTSVC_SEARCH_PROPERTY_MASK              0xF0000000
+#define CTSVC_SEARCH_PROPERTY_NONE                           0x10000000
+#define CTSVC_SEARCH_PROPERTY_FILTER            0x20000000
+#define CTSVC_SEARCH_PROPERTY_PROJECTION        0x30000000
+#define CTSVC_SEARCH_PROPERTY_ALL               0x40000000
 #define CTSVC_SEARCH_PROPERTY_CHECK(property_id,data_type) \
        ((property_id & CTSVC_SEARCH_PROPERTY_MASK) == data_type ? true : false)
 
@@ -165,7 +167,7 @@ typedef enum {
        CTSVC_PROPERTY_PERSON_DISPLAY_NAME = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +1,
        CTSVC_PROPERTY_PERSON_DISPLAY_CONTACT_ID = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_INT ) +2,
        CTSVC_PROPERTY_PERSON_RINGTONE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +3,
-       CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +4,
+       CTSVC_PROPERTY_PERSON_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +4,
        CTSVC_PROPERTY_PERSON_VIBRATION = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_STR) +5,
        CTSVC_PROPERTY_PERSON_IS_FAVORITE = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_BOOL) +6,
        CTSVC_PROPERTY_PERSON_FAVORITE_PRIORITY = (CTSVC_PROPERTY_PERSON | CTSVC_VIEW_DATA_TYPE_DOUBLE | CTSVC_READ_ONLY_PROPERTY) +7,
@@ -191,7 +193,7 @@ typedef enum {
        CTSVC_PROPERTY_CONTACT_RINGTONE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +4,
        CTSVC_PROPERTY_CONTACT_IMAGE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_REC) +5,
        CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_STR) +6,
-       CTSVC_PROPERTY_CONTACT_IS_FAVORITE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +7,
+       CTSVC_PROPERTY_CONTACT_IS_FAVORITE = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL) +7,
        CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +8,
        CTSVC_PROPERTY_CONTACT_HAS_EMAIL = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_BOOL | CTSVC_READ_ONLY_PROPERTY) +9,
        CTSVC_PROPERTY_CONTACT_PERSON_ID = (CTSVC_PROPERTY_CONTACT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +10,
@@ -277,7 +279,7 @@ typedef enum {
        CTSVC_PROPERTY_ADDRESS_STREET = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +8,
        CTSVC_PROPERTY_ADDRESS_COUNTRY = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +9,
        CTSVC_PROPERTY_ADDRESS_EXTENDED = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +10,
-       CTSVC_PROPERTY_ADDRESS_IS_DEFAULT = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_STR) +11,
+       CTSVC_PROPERTY_ADDRESS_IS_DEFAULT = (CTSVC_PROPERTY_ADDRESS | CTSVC_VIEW_DATA_TYPE_BOOL) +11,
 
        // contact_url
        CTSVC_PROPERTY_URL_ID = (CTSVC_PROPERTY_URL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
@@ -416,12 +418,12 @@ typedef enum {
        // speeddial
        CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT),
        CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT) +1,
-       CTSVC_PROPERTY_SPEEDDIAL_NUMBER = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +2,
-       CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +3,
+       CTSVC_PROPERTY_SPEEDDIAL_NUMBER = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +2,
+       CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +3,
        CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +4,
        CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +5,
-       CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +6,
-       CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +7,
+       CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +6,
+       CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL = (CTSVC_PROPERTY_SPEEDDIAL | CTSVC_VIEW_DATA_TYPE_STR | CTSVC_READ_ONLY_PROPERTY) +7,
 
        // phonelog
        CTSVC_PROPERTY_PHONELOG_ID = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
@@ -432,11 +434,13 @@ typedef enum {
        CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1 = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_INT) +5,          // duration, message_id, email_id
        CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2 = (CTSVC_PROPERTY_PHONELOG | CTSVC_VIEW_DATA_TYPE_STR) +6,          // short message, subject
 
-       // contact_updated_info : read only
+       // updated_info : read only
        CTSVC_PROPERTY_UPDATE_INFO_ID = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT),
        CTSVC_PROPERTY_UPDATE_INFO_ADDRESSBOOK_ID = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +1,
        CTSVC_PROPERTY_UPDATE_INFO_TYPE = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +2,
        CTSVC_PROPERTY_UPDATE_INFO_VERSION = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT) +3,
+       CTSVC_PROPERTY_UPDATE_INFO_IMAGE_CHANGED = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_BOOL) +4,
+       CTSVC_PROPERTY_UPDATE_INFO_LAST_CHANGED_TYPE = (CTSVC_PROPERTY_UPDATE_INFO | CTSVC_VIEW_DATA_TYPE_INT)+5,               // now, it is used for _contacts_my_profile_updated_info
 
        // contact_sdn
        CTSVC_PROPERTY_SDN_ID = (CTSVC_PROPERTY_SDN | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
index 1b1b71b..6e4e2f8 100644 (file)
@@ -41,6 +41,8 @@ static int __ctsvc_ipc_unmarshal_contact(pims_ipc_data_h ipc_data, const char* v
                if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->reverse_display_name) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->display_source_type) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_int(ipc_data, &pcontact->display_name_language) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sort_name) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->reverse_sort_name) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->sortkey) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->reverse_sortkey) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_string(ipc_data, &pcontact->uid) != CONTACTS_ERROR_NONE) break;
@@ -99,6 +101,8 @@ static int __ctsvc_ipc_marshal_contact(const contacts_record_h record, pims_ipc_
                if (ctsvc_ipc_marshal_string((pcontact->reverse_display_name),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_int((pcontact->display_source_type),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_int((pcontact->display_name_language),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_string((pcontact->sort_name),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_string((pcontact->reverse_sort_name),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_string((pcontact->sortkey),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_string((pcontact->reverse_sortkey),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_string((pcontact->uid),ipc_data) != CONTACTS_ERROR_NONE) break;
index 84b0d54..34429aa 100644 (file)
@@ -61,6 +61,7 @@
 
 #define CTSVC_IPC_SERVER_GROUP_ADD_CONTACT              "group_add_contact"
 #define CTSVC_IPC_SERVER_GROUP_REMOVE_CONTACT            "group_remove_contact"
+#define CTSVC_IPC_SERVER_GROUP_SET_GROUP_ORDER       "group_set_group_order"
 
 #define CTSVC_IPC_SERVER_PERSON_LINK_PERSON            "person_link_person"
 #define CTSVC_IPC_SERVER_PERSON_UNLINK_CONTACT      "person_unlink_contact"
index acf76fc..65bd231 100644 (file)
@@ -29,6 +29,8 @@ static int __ctsvc_ipc_unmarshal_event(pims_ipc_data_h ipc_data, const char* vie
                if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->type) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_string(ipc_data, &event_p->label) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->date) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_bool(ipc_data, &event_p->is_lunar) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_int(ipc_data, &event_p->lunar_date) != CONTACTS_ERROR_NONE) break;
 
                return CONTACTS_ERROR_NONE;
        } while(0);
@@ -49,6 +51,8 @@ static int __ctsvc_ipc_marshal_event(const contacts_record_h record, pims_ipc_da
                if (ctsvc_ipc_marshal_int((event_p->type),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_string((event_p->label),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_int((event_p->date),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_bool((event_p->is_lunar),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_int((event_p->lunar_date),ipc_data) != CONTACTS_ERROR_NONE) break;
 
                return CONTACTS_ERROR_NONE;
        } while(0);
index bfbf3f1..2ac3874 100644 (file)
@@ -476,6 +476,7 @@ int ctsvc_ipc_unmarshal_record(const pims_ipc_data_h ipc_data, contacts_record_h
        int ret = CONTACTS_ERROR_NONE;
 
        ctsvc_record_s common = {0,};
+       ctsvc_record_s *precord_common = NULL;
 
        if (ctsvc_ipc_unmarshal_record_common(ipc_data, &common) != CONTACTS_ERROR_NONE)
        {
@@ -488,6 +489,11 @@ int ctsvc_ipc_unmarshal_record(const pims_ipc_data_h ipc_data, contacts_record_h
        ret = contacts_record_create(common.view_uri, precord);
        RETVM_IF(ret != CONTACTS_ERROR_NONE, ret, "create activity record fail");
 
+       precord_common = (ctsvc_record_s *)(*precord);
+       precord_common->property_max_count = common.property_max_count;
+       precord_common->properties_flags = common.properties_flags;
+       precord_common->property_flag = common.property_flag;
+
        ctsvc_ipc_marshal_record_plugin_cb_s *plugin_cb = __ctsvc_ipc_marshal_get_plugin_cb(common.r_type);
 
        RETVM_IF(NULL == plugin_cb || NULL == plugin_cb->unmarshal_record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
@@ -714,28 +720,19 @@ int ctsvc_ipc_unmarshal_record_common(const pims_ipc_data_h ipc_data, ctsvc_reco
        common->view_uri = ctsvc_view_get_uri(str);
        common->property_max_count = *(unsigned int*)pims_ipc_data_get(ipc_data,&size);
 
-       tmp = pims_ipc_data_get(ipc_data,&size);
-       if ( tmp == NULL ){
-               CTS_ERR("pims_ipc_data unmarshal fail");
-               return CONTACTS_ERROR_INVALID_PARAMETER;
-       }
-       int length = *(int*)tmp;
-       if(length == -1)
-       {
-               CTS_VERBOSE("properties_flags is null");
-       }
-       else {
-               tmp = (unsigned char*)pims_ipc_data_get(ipc_data,&size);
-               {
-                       common->properties_flags = calloc(common->property_max_count, sizeof(unsigned char));
-                       if (common->properties_flags == NULL)
-                       {
-                               CTS_ERR("calloc fail");
-                               return CONTACTS_ERROR_OUT_OF_MEMORY;
-                       }
-                       memcpy(common->properties_flags, tmp, sizeof(unsigned char)*(common->property_max_count));
+       if (common->property_max_count > 0) {
+               unsigned char *tmp_properties_flags;
+               tmp_properties_flags = (unsigned char*)pims_ipc_data_get(ipc_data, &size);
+               common->properties_flags  = calloc(common->property_max_count, sizeof(char));
+               if (common->properties_flags == NULL) {
+                       ERR("calloc fail");
+                       return CONTACTS_ERROR_OUT_OF_MEMORY;
                }
+               memcpy(common->properties_flags, tmp_properties_flags, sizeof(char)*common->property_max_count);
        }
+       tmp = pims_ipc_data_get(ipc_data,&size);
+       common->property_flag = *(unsigned char*)tmp;
+
        return CONTACTS_ERROR_NONE;
 }
 
@@ -855,35 +852,24 @@ int ctsvc_ipc_marshal_record_common(const ctsvc_record_s* common, pims_ipc_data_
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
 
-       if(pims_ipc_data_put(ipc_data,(void*)&common->property_max_count,sizeof(unsigned int)) < 0)
+       if (pims_ipc_data_put(ipc_data,(void*)&common->property_max_count,sizeof(unsigned int)) < 0)
        {
                return CONTACTS_ERROR_NO_DATA;
        }
 
-       if (common->properties_flags != NULL)
+       if (0 < common->property_max_count)
        {
-               int length = common->property_max_count;
-               if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0)
-               {
-                       CTS_ERR("_ctsvc_ipc_marshal fail");
-                       return CONTACTS_ERROR_OUT_OF_MEMORY;
-               }
-               if(pims_ipc_data_put(ipc_data,(void*)common->properties_flags,sizeof(unsigned char)*common->property_max_count) < 0)
+               if (pims_ipc_data_put(ipc_data,(void*)common->properties_flags,sizeof(unsigned char)*common->property_max_count) < 0)
                {
                        CTS_ERR("_ctsvc_ipc_marshal fail");
                        return CONTACTS_ERROR_NO_DATA;
                }
        }
-       else
+
+       if (pims_ipc_data_put(ipc_data,(void*)&common->property_flag,sizeof(char)) < 0)
        {
-               int length = -1;
-               if (pims_ipc_data_put(ipc_data,(void*)&length,sizeof(int)) != 0)
-               {
-                       CTS_ERR("_ctsvc_ipc_marshal fail");
-                       return CONTACTS_ERROR_OUT_OF_MEMORY;
-               }
+               return CONTACTS_ERROR_NO_DATA;
        }
-
        return CONTACTS_ERROR_NONE;
 }
 
@@ -923,7 +909,7 @@ int ctsvc_ipc_unmarshal_query(const pims_ipc_data_h ipc_data, contacts_query_h *
        }
        else
        {
-               contacts_filter_h filter = (contacts_filter_h)que->filter;
+               contacts_filter_h filter;
                if (contacts_filter_create(que->view_uri,&filter) != CONTACTS_ERROR_NONE)
                {
                        CTS_ERR("contacts_filter_create fail");
@@ -1105,6 +1091,7 @@ int ctsvc_ipc_unmarshal_list(const pims_ipc_data_h ipc_data, contacts_list_h* li
 
        if (ctsvc_ipc_unmarshal_unsigned_int(ipc_data,&(count)) != CONTACTS_ERROR_NONE)
        {
+               contacts_list_destroy(*list, true);
                CTS_ERR("_ctsvc_ipc_unmarshal fail");
                return CONTACTS_ERROR_INVALID_PARAMETER;
        }
index 382f904..239ae9b 100644 (file)
@@ -24,7 +24,6 @@ static int __ctsvc_ipc_unmarshal_person(pims_ipc_data_h ipc_data, const char* vi
 
        do {
                if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->name_contact_id_changed) != CONTACTS_ERROR_NONE) break;
-               if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->image_thumbnail_changed) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->ringtone_changed) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->vibration_changed) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_bool(ipc_data, &person_p->is_favorite_changed) != CONTACTS_ERROR_NONE) break;
@@ -61,7 +60,6 @@ static int __ctsvc_ipc_marshal_person(const contacts_record_h record, pims_ipc_d
 
        do {
                if (ctsvc_ipc_marshal_bool((person_p->name_contact_id_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
-               if (ctsvc_ipc_marshal_bool((person_p->image_thumbnail_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_bool((person_p->ringtone_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_bool((person_p->vibration_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_bool((person_p->is_favorite_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
index 6398128..92ff916 100644 (file)
@@ -26,6 +26,8 @@ static int __ctsvc_ipc_unmarshal_updated_info(pims_ipc_data_h ipc_data, const ch
                if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->id) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->changed_ver) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->addressbook_id) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_bool(ipc_data,&updated_info_p->image_changed) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_unmarshal_int(ipc_data,&updated_info_p->last_changed_type) != CONTACTS_ERROR_NONE) break;
 
                return CONTACTS_ERROR_NONE;
        } while(0);
@@ -46,6 +48,8 @@ static int __ctsvc_ipc_marshal_updated_info(const contacts_record_h record, pims
                if (ctsvc_ipc_marshal_int((updated_info_p->id),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_int((updated_info_p->changed_ver),ipc_data) != CONTACTS_ERROR_NONE) break;
                if (ctsvc_ipc_marshal_int((updated_info_p->addressbook_id),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_bool((updated_info_p->image_changed),ipc_data) != CONTACTS_ERROR_NONE) break;
+               if (ctsvc_ipc_marshal_int((updated_info_p->last_changed_type),ipc_data) != CONTACTS_ERROR_NONE) break;
 
                return CONTACTS_ERROR_NONE;
        } while(0);
index 6c867d6..7761304 100644 (file)
@@ -4,15 +4,22 @@
                <provide>
                        <label name="contacts-service::db"/>
                </provide>
+               <request>
+                       <smack request="sys-assert::core" type="rwxat"/>
+               </request>
        </define>
        <assign>
-               <filesystem path="/usr/lib/libcontacts-service2.so.0.9.24.8" label="_"/>
+               <filesystem path="/usr/lib/libcontacts-service2.so.0.9.45.3" label="_"/>
                <filesystem path="/usr/lib/libcontacts-service2.so.0" label="_"/>
-               <filesystem path="/usr/lib/libcontacts-service3.so.0.9.24.8" label="_"/>
+               <filesystem path="/usr/lib/libcontacts-service3.so.0.9.45.3" label="_"/>
                <filesystem path="/usr/lib/libcontacts-service3.so.0" label="_"/>
+               <filesystem path="/opt/usr/dbspace/.contacts-svc.db" label="contacts-service::db"/>
+               <filesystem path="/opt/usr/dbspace/.contacts-svc.db-journal" label="contacts-service::db"/>
                <filesystem path="/etc/rc.d/init.d/contacts-service-ipcd.sh" label="_" exec_label="none"/>
                <filesystem path="/etc/rc.d/rc3.d/S50contacts-svc-helper" label="_" exec_label="none"/>
                <filesystem path="/etc/rc.d/rc5.d/S50contacts-svc-helper" label="_" exec_label="none"/>
+               <filesystem path="/usr/lib/systemd/user/contacts-service.service" label="_" exec_label="none" />
+               <filesystem path="/usr/lib/systemd/user/tizen-middleware.target.wants/contacts-service.service" label="_" exec_label="none" />
        </assign>
        <request>
                <domain name="contacts-service" />
index 89e4c03..d859f91 100644 (file)
  * <tr><td>string</td><td> display_name_index </td><td>read only</td><td> The first character of first string for grouping. This is normalized using icu. </td></tr>
  * <tr><td>integer</td><td> display_contact_id </td><td>read only</td><td> </td></tr>
  * <tr><td>string</td><td> ringtone_path </td><td>read, write</td><td> </td></tr>
- * <tr><td>string</td><td> image_thumbnail_path </td><td>read, write</td><td> </td></tr>
+ * <tr><td>string</td><td> image_thumbnail_path </td><td>read only</td><td> </td></tr>
  * <tr><td>string</td><td> vibration </td><td>read, write</td><td> </td></tr>
  * <tr><td>string</td><td> status </td><td>read only</td><td> </td></tr>
  * <tr><td>boolean</td><td> is_favorite </td><td>read, write</td><td> </td></tr>
  * <tr><td>integer</td><td> contact_id </td><td>read, write once</td><td> </td></tr>
  * <tr><td>integer</td><td> type </td><td>read, write</td><td> </td></tr>
  * <tr><td>string</td><td> label </td><td>read, write</td><td> </td></tr>
- * <tr><td>integer</td><td> date </td><td>read, write</td><td> </td></tr>
+ * <tr><td>integer</td><td> date </td><td>read, write</td><td> year * 10000 + month * 100 + day </td></tr>
  * <tr><td>integer</td><td> is_lunar </td><td>read, write</td><td> </td></tr>
  * <tr><td>integer</td><td> lunar_date </td><td>read, write</td><td> </td></tr>
  * </table>
  * <tr><td>integer</td><td> contact_id </td><td>*</td><td> </td></tr>
  * <tr><td>integer</td><td> address_book_id </td><td></td><td> </td></tr>
  * <tr><td>integer</td><td> type </td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> version </td><td></td><td> </td></tr>
+ * <tr><td>boolean</td><td> image_changed </td><td></td><td> </td></tr>
+ * </table>
+ *
+ * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_my_profile_updated_info _contacts_my_profile_updated_info view
+ * <table>
+ * <tr>
+ *       <th>Type</th>
+ *       <th>Property ID</th>
+ *       <th>Primay Key</th>
+ *       <th>Description</th>
+ * </tr>
+ * <tr><td>string</td><td>_uri</td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> address_book_id </td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> last_changed_type </td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> version </td><td></td><td> </td></tr>
  * </table>
  *
  * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_group_updated_info _contacts_group_updated_info view
  * <tr><td>integer</td><td> group_id </td><td>*</td><td> </td></tr>
  * <tr><td>integer</td><td> address_book_id </td><td></td><td> </td></tr>
  * <tr><td>integer</td><td> type </td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> version </td><td></td><td> </td></tr>
+ * </table>
+ *
+ * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_group_member_updated_info _contacts_group_member_updated_info view
+ * <table>
+ * <tr>
+ *       <th>Type</th>
+ *       <th>Property ID</th>
+ *       <th>Primary Key</th>
+ *       <th>Description</th>
+ * </tr>
+ * <tr><td>string</td><td>_uri</td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> group_id </td><td>*</td><td> </td></tr>
+ * <tr><td>integer</td><td> address_book_id </td><td></td><td> </td></tr>
+ * <tr><td>integer</td><td> version </td><td></td><td> </td></tr>
  * </table>
  *
  * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_person_number _contacts_person_number view
index 73de2ca..da37a4f 100755 (executable)
@@ -254,6 +254,12 @@ API int contacts_db_insert_records( contacts_list_h record_list, int **ids, unsi
 /**
  * @brief   Inserts multiple records as batch operation to the contacts database.
  *
+ * @remarks     @The purpose of async API is for UI not to create thread.
+ * If you have to display progress during DB operation, you can use this API.
+ * The callback function will be called in main loop.
+ * Do not use this API in thread.
+ * During executint this API, you can not call the other DB operation API.
+ *
  * @param[in]   record_list                    The record list handle
  * @param[in]   callback                       The callback function to invoke which lets you know result of batch operation
  * @param[in]   user_data                      The user data to be passed to the callback function
@@ -580,6 +586,23 @@ API int contacts_db_get_count( const char* view_uri, int *count);
 API int contacts_db_get_count_with_query( contacts_query_h query, int *count);
 
 /**
+ * @brief   Gets the last change contacts database version on current connection.
+ *
+ * @param[out]  last_change_version    The contacts database version on current connection
+ *
+ * @return  0 on success, otherwise a negative error value.
+ * @retval  #CONTACTS_ERROR_NONE                Successful
+ * @retval  #CONTACTS_ERROR_INVALID_PARAMETER   Invalid parameter
+ * @retval  #CONTACTS_ERROR_DB_FAILED           Database operation failure
+ *
+ * @pre     This function requires an open connection to the contacts service by contacts_connect2().
+ *
+ * @see contacts_connect2()
+ * @see contacts_db_get_current_version()
+ */
+API int contacts_db_get_last_change_version(int* last_change_version);
+
+/**
  * @}
  */
 
index e6310ce..89ce4db 100755 (executable)
@@ -36,7 +36,7 @@ extern "C"
 
 typedef enum
 {
-       CONTACTS_MATCH_EXACTLY,                 /**< . */
+       CONTACTS_MATCH_EXACTLY,         /**< case-sensitive */
        CONTACTS_MATCH_FULLSTRING,              /**< . */
        CONTACTS_MATCH_CONTAINS,                /**< . */
        CONTACTS_MATCH_STARTSWITH,              /**< . */
index 2e0fe73..868a8f0 100644 (file)
@@ -71,6 +71,24 @@ API int contacts_group_add_contact(int group_id, int contact_id);
 API int contacts_group_remove_contact(int group_id, int contact_id);
 
 /**
+ * @brief      Sets a group place between a previous group and a next group.
+ *
+ * @param[in]  group_id                                The group ID to move
+ * @param[in]  previous_group_id               The previous group ID
+ * @param[in]  next_group_id                   The back group ID
+ *
+ * @return  0 on success, otherwise a negative error value.
+ * @retval  #CONTACTS_ERROR_NONE       Successful
+ * @retval  #CONTACTS_ERROR_DB Database operation failure
+ *
+ * @pre     This function requires an open connection to contacts service by contacts_connect2().
+ *
+ * @see  contacts_connect2()
+ */
+API int contacts_group_set_group_order(int group_id, int previous_group_id, int next_group_id);
+
+
+/**
  * @}
  */
 
index 9757b20..8ba7609 100644 (file)
@@ -45,6 +45,29 @@ extern "C"
 API int contacts_utils_get_index_characters(char **index_string);\r
 \r
 /**\r
+ * This function compares compares two strings which is not normalized.\r
+ * If search_str is included in str, this function return #sCONTACTS_ERROR_NONE. \n\r
+ * The behavior of this function cannot fix because of localization.\r
+ * So, The behavior can be different from each other.\r
+ *\r
+ * @param[in] haystack Base string.\r
+ * @param[in] needle searching string\r
+ * @param[out] len substring length\r
+ * @return a position of the beginning of the substring, Negative value(#cts_error) on error or difference.\r
+ * @par example\r
+ * @code\r
+       ret = contacts_strstr(str1, str2, &len);\r
+       if(CONTACTS_ERROR_NONE == ret) {\r
+               snprintf(first, ret+1, "%s", item_data->display);\r
+               snprintf(middle, len+1, "%s", item_data->display + ret);\r
+               printf("%s -> %s, %s, %s", item_data->display, first, middle, item_data->display + ret + len);\r
+       } else\r
+               printf("str1 doesn't has str2");\r
+ * @endcode\r
+ */\r
+API int contacts_utils_strstr(const char *haystack, const char *needle, int *len);\r
+\r
+/**\r
  * @}\r
  */\r
 \r
index 3f64535..9ff1628 100644 (file)
@@ -91,6 +91,20 @@ API int contacts_vcard_parse_to_contacts(const char *vcard_stream, contacts_list
 API int contacts_vcard_make_from_contact(contacts_record_h contact, char **vcard_stream);
 
 /**
+ * @brief      Retrieves vCard stream from a contact.
+ *
+ * @param[in]  my_profile                                      The my_profile record handle
+ * @param[out] vcard_stream                    The vCard stream
+ *
+ * @return  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
+ */
+API int contacts_vcard_make_from_my_profile(contacts_record_h my_profile, char **vcard_stream);
+
+
+/**
  * @brief      Retrieves vCard stream from a person.
  *
  * @param[in]  person                                  The person record handle
index 358dbb7..621f166 100755 (executable)
@@ -58,7 +58,7 @@ _CONTACTS_BEGIN_VIEW()
        _CONTACTS_PROPERTY_STR( display_name_index)             // read only
        _CONTACTS_PROPERTY_INT( display_contact_id )    // read, write
        _CONTACTS_PROPERTY_STR( ringtone_path )                 // read, write
-       _CONTACTS_PROPERTY_STR( image_thumbnail_path )  // read, write
+       _CONTACTS_PROPERTY_STR( image_thumbnail_path )  // read only
        _CONTACTS_PROPERTY_STR( vibration )                             // read, write
        _CONTACTS_PROPERTY_STR( status )                                // read only
        _CONTACTS_PROPERTY_BOOL( is_favorite )                  // read, write
@@ -376,8 +376,16 @@ _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_INT( address_book_id )
        _CONTACTS_PROPERTY_INT( type )                                  // insert/update/delete
        _CONTACTS_PROPERTY_INT( version )
+       _CONTACTS_PROPERTY_BOOL( image_changed )
 _CONTACTS_END_READ_ONLY_VIEW( _contacts_contact_updated_info )
 
+// my_profile_updated_info : read only
+_CONTACTS_BEGIN_READ_ONLY_VIEW()
+       _CONTACTS_PROPERTY_INT( address_book_id )
+       _CONTACTS_PROPERTY_INT( last_changed_type )
+       _CONTACTS_PROPERTY_INT( version )
+_CONTACTS_END_READ_ONLY_VIEW( _contacts_my_profile_updated_info )
+
 // group_updated_info : read only
 _CONTACTS_BEGIN_READ_ONLY_VIEW()
        _CONTACTS_PROPERTY_INT( group_id )
index 5b59a50..1c7cb25 100644 (file)
@@ -44,11 +44,7 @@ API int contacts_activity_delete_by_contact_id(int contact_id)
        }\r
 \r
        ctsvc_set_activity_noti();\r
-\r
-/* why notify twice?\r
-       ctsvc_set_contact_noti();\r
-       ctsvc_db_contact_update_changed_time(contact_id);\r
-*/\r
+       ctsvc_set_person_noti();\r
 \r
        ret = ctsvc_end_trans(true);\r
        return ret;\r
@@ -76,10 +72,7 @@ API int contacts_activity_delete_by_account_id(int account_id)
        }\r
 \r
        ctsvc_set_activity_noti();\r
-/*\r
-       ctsvc_set_contact_noti();\r
-       ctsvc_db_contact_update_changed_time(contact_id);\r
-*/\r
+       ctsvc_set_person_noti();\r
 \r
        ret = ctsvc_end_trans(true);\r
        return ret;\r
index 1d0441c..a5dd1fd 100644 (file)
@@ -79,7 +79,7 @@ static const db_table_info_s __db_tables[] = {
        {CTSVC_VIEW_URI_PERSON,                 CTSVC_DB_VIEW_PERSON},
        {CTSVC_VIEW_URI_SIMPLE_CONTACT, CTSVC_DB_VIEW_CONTACT},
        {CTSVC_VIEW_URI_CONTACT,                CTSVC_DB_VIEW_CONTACT},
-       {CTSVC_VIEW_URI_MY_PROFILE,             CTS_TABLE_MY_PROFILES},
+       {CTSVC_VIEW_URI_MY_PROFILE,     CTSVC_DB_VIEW_MY_PROFILE},
        {CTSVC_VIEW_URI_ACTIVITY,               CTSVC_DB_VIEW_ACTIVITY},
        {CTSVC_VIEW_URI_PHONELOG,               CTS_TABLE_PHONELOGS},
        {CTSVC_VIEW_URI_SPEEDDIAL,              CTSVC_DB_VIEW_SPEEDIDAL},
@@ -105,6 +105,7 @@ static const db_table_info_s __db_tables[] = {
 //     {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_UPDATED_INFO},
 //     {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO},
 //     {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO},
+//     {CTSVC_VIEW_URI_MY_PROFILE_UPDATED_INFO, NULL},
 //     {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, NULL,   NULL},
 
        {CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, CTSVC_DB_VIEW_PERSON_CONTACT},
@@ -136,53 +137,10 @@ int ctsvc_db_plugin_init()
        __ctsvc_db_view_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
 
        if (__ctsvc_db_view_hash_table) {
-               i = 0;
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ADDRESSBOOK, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUP, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PERSON, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SIMPLE_CONTACT, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_CONTACT, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_MY_PROFILE, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ACTIVITY, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PHONELOG, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SPEEDDIAL, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_SDN, GINT_TO_POINTER(&(__db_tables[i++])));
-
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NAME, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_COMPANY, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NUMBER, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EMAIL, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_URL, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_ADDRESS, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_PROFILE, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_RELATIONSHIP, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_IMAGE, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NOTE, GINT_TO_POINTER(&(__db_tables[i++])) );
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_NICKNAME, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EVENT, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_MESSENGER, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUP_RELATION, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_EXTENSION, GINT_TO_POINTER(&(__db_tables[i++])));
-
-//             g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) );
-//             g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) );
-//             g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) );
-//             g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, GINT_TO_POINTER(&(__db_tables[i++])) );
-
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, GINT_TO_POINTER(&(__db_tables[i++])));
-
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, GINT_TO_POINTER(&(__db_tables[i++])));
-
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_NUMBER, GINT_TO_POINTER(&(__db_tables[i++])));
-               g_hash_table_insert(__ctsvc_db_view_hash_table, CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, GINT_TO_POINTER(&(__db_tables[i++])));
+               int count = sizeof(__db_tables) /sizeof(db_table_info_s);
+               for (i=0;i<count;i++)
+                       g_hash_table_insert(__ctsvc_db_view_hash_table, __db_tables[i].view_uri, GINT_TO_POINTER(&(__db_tables[i])));
+
        }
        return CONTACTS_ERROR_NONE;
 }
@@ -226,6 +184,8 @@ ctsvc_db_plugin_info_s* ctsvc_db_get_plugin_info(ctsvc_record_type_e type)
                return &ctsvc_db_plugin_person;
        case CTSVC_RECORD_CONTACT:
                return &ctsvc_db_plugin_contact;
+       case CTSVC_RECORD_MY_PROFILE:
+               return &ctsvc_db_plugin_my_profile;
        case CTSVC_RECORD_SIMPLE_CONTACT:
                return &ctsvc_db_plugin_simple_contact;
        case CTSVC_RECORD_NAME:
@@ -287,6 +247,13 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT" AS "
                        "SELECT * FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0");
        ret = ctsvc_query_exec(query);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_execs() Failed(%d)", ret);
+
+       // CTSVC_DB_VIEW_MY_PROFILE
+       snprintf(query, sizeof(query),
+               "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MY_PROFILE" AS "
+                       "SELECT * FROM "CTS_TABLE_MY_PROFILES" WHERE deleted = 0");
+       ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret);
 
        // CTSVC_DB_VIEW_PERSON
@@ -295,6 +262,7 @@ static int __ctsvc_db_create_views()
                        "SELECT persons.person_id, "
                                        "display_name, reverse_display_name, "
                                        "display_name_language, "
+                                       "sort_name, reverse_sort_name, "
                                        "sortkey, reverse_sortkey, "
                                        "name_contact_id, "
                                        "persons.ringtone_path, "
@@ -320,14 +288,14 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NAME" AS "
                        "SELECT id, "
                                "data.contact_id, "
-                               "data2 first, "
-                               "data3 last, "
-                               "data4 addition, "
-                               "data5 prefix, "
-                               "data6 suffix, "
-                               "data7 phonetic_first, "
-                               "data8 phonetic_middle, "
-                               "data9 phonetic_last "
+                               "data2, "
+                               "data3, "
+                               "data4, "
+                               "data5, "
+                               "data6, "
+                               "data7, "
+                               "data8, "
+                               "data9 "
                        "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 ",
@@ -341,10 +309,10 @@ static int __ctsvc_db_create_views()
                        "SELECT id, "
                                        "data.contact_id, "
                                        "is_default, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 number, "
-                                       "data4 lookup "
+                                       "data1, "
+                                       "data2, "
+                                       "data3, "
+                                       "data4 "
                        "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 ",
@@ -358,9 +326,9 @@ static int __ctsvc_db_create_views()
                        "SELECT id, "
                                        "data.contact_id, "
                                        "is_default, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 email "
+                                       "data1, "
+                                       "data2, "
+                                       "data3 "
                        "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 ",
@@ -374,15 +342,15 @@ static int __ctsvc_db_create_views()
                        "SELECT id, "
                                        "data.contact_id, "
                                        "is_default, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 postbox, "
-                                       "data4 postal_code, "
-                                       "data5 region, "
-                                       "data6 locality, "
-                                       "data7 street, "
-                                       "data8 extend, "
-                                       "data9 country "
+                                       "data1, "
+                                       "data2, "
+                                       "data3, "
+                                       "data4, "
+                                       "data5, "
+                                       "data6, "
+                                       "data7, "
+                                       "data8, "
+                                       "data9 "
                        "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 ",
@@ -395,9 +363,9 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_URL" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 url "
+                                       "data1, "
+                                       "data2, "
+                                       "data3 "
                        "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 ",
@@ -410,9 +378,11 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EVENT" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 date "
+                                       "data1, "
+                                       "data2, "
+                                       "data3, "
+                                       "data4, "
+                                       "data5 "
                        "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 ",
@@ -428,7 +398,7 @@ static int __ctsvc_db_create_views()
                                        "group_name "
                        "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
                        "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND deleted = 0 "
-                       "ORDER BY group_name COLLATE NOCASE");
+                       "ORDER BY group_prio");
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret);
 
@@ -437,9 +407,9 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_RELATIONSHIP" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 name "
+                                       "data1, "
+                                       "data2, "
+                                       "data3  "
                        "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 ",
@@ -453,9 +423,9 @@ static int __ctsvc_db_create_views()
                        "SELECT id, "
                                        "is_default, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 path "
+                                       "data1, "
+                                       "data2, "
+                                       "data3 "
                        "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 ",
@@ -468,17 +438,17 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_COMPANY" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 name, "
-                                       "data4 department, "
-                                       "data5 job_title, "
-                                       "data6 assistant, "
-                                       "data7 role, "
-                                       "data8 logo, "
-                                       "data9 location, "
-                                       "data10 description, "
-                                       "data11 phonetic_name "
+                                       "data1, "
+                                       "data2, "
+                                       "data3, "
+                                       "data4, "
+                                       "data5, "
+                                       "data6, "
+                                       "data7, "
+                                       "data8, "
+                                       "data9, "
+                                       "data10, "
+                                       "data11 "
                        "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 ",
@@ -491,7 +461,7 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NICKNAME" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data3 nickname "
+                                       "data3 "
                        "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 ",
@@ -504,9 +474,9 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MESSENGER" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 im_id "
+                                       "data1, "
+                                       "data2, "
+                                       "data3 "
                        "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 ",
@@ -519,7 +489,7 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NOTE" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data3 note "
+                                       "data3 "
                        "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 ",
@@ -532,16 +502,16 @@ static int __ctsvc_db_create_views()
                "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PROFILE" AS "
                        "SELECT id, "
                                        "data.contact_id, "
-                                       "data1 type, "
-                                       "data2 label, "
-                                       "data3 uid, "
-                                       "data4 text, "
-                                       "data5 profile_order, "
-                                       "data6 appsvc_op, "
-                                       "data7 data1, "
-                                       "data8 data2, "
-                                       "data9 data3, "
-                                       "data10 data4 "
+                                       "data1, "
+                                       "data2, "
+                                       "data3, "
+                                       "data4, "
+                                       "data5, "
+                                       "data6, "
+                                       "data7, "
+                                       "data8, "
+                                       "data9, "
+                                       "data10 "
                        "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 ",
@@ -597,6 +567,7 @@ static int __ctsvc_db_create_views()
                        "SELECT persons.person_id, "
                                        "name_contacts.display_name, name_contacts.reverse_display_name, "
                                        "name_contacts.display_name_language, "
+                                       "name_contacts.sort_name, name_contacts.reverse_sort_name, "
                                        "name_contacts.sortkey, name_contacts.reverse_sortkey, "
                                        "persons.image_thumbnail_path, "
                                        "data.id number_id, "
@@ -644,7 +615,6 @@ static int __ctsvc_db_create_views()
                                CONTACTS_CHANGE_INSERTED, CONTACTS_CHANGE_UPDATED, CONTACTS_CHANGE_DELETED);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret);
-#endif
 
        // CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO
        snprintf(query, sizeof(query),
@@ -653,6 +623,7 @@ static int __ctsvc_db_create_views()
                                "FROM "CTS_TABLE_GROUPS);
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Failed(%d)", ret);
+#endif
 
        // CTSVC_DB_VIEW_PERSON_CONTACT
        snprintf(query, sizeof(query),
@@ -708,6 +679,7 @@ static int __ctsvc_db_create_views()
                        "SELECT C.id phonelog_id, "
                                        "F.display_name, F.reverse_display_name, "
                                        "F.display_name_language, "
+                                       "F.sort_name, F.reverse_sort_name, "
                                        "F.sortkey, F.reverse_sortkey, "
                                        "F.image_thumbnail_path, "
                                        "C.number address, "
@@ -735,7 +707,9 @@ static int __ctsvc_db_create_views()
                                                                                                        "AND A.normal_num = data4)) "
                                        "GROUP BY A.id) C "
                                "LEFT JOIN (SELECT D.person_id, D.display_name, D.reverse_display_name, "
-                                                       "D.display_name_language, D.sortkey, D.reverse_sortkey, "
+                                                       "D.display_name_language, "
+                                                       "D.sort_name, D.reverse_sort_name, "
+                                                       "D.sortkey, D.reverse_sortkey, "
                                                        "E.image_thumbnail_path "
                                                        "FROM "CTS_TABLE_CONTACTS" D, "CTS_TABLE_PERSONS" E "
                                                        "ON E.name_contact_id = D.contact_id) F "
@@ -825,6 +799,7 @@ static int __ctsvc_db_create_views()
                                        "A.display_name_source, "
                                        "A.reverse_display_name, "
                                        "A.display_name_language, "
+                                       "A.sort_name, A.reverse_sort_name, "
                                        "A.sortkey, A.reverse_sortkey, "
                                        "A.addressbook_id, "
                                        "AB.account_id, "
@@ -876,6 +851,10 @@ int ctsvc_db_init()
 
 #ifdef _CONTACTS_IPC_SERVER
        ret = __ctsvc_db_create_views();
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("__ctsvc_db_create_views() Failed(%d)", ret);
+               return ret;
+       }
 #endif
 
        return ret;
index fdab06f..960efaf 100644 (file)
@@ -71,7 +71,6 @@ static int __ctsvc_db_activity_photo_insert_record( ctsvc_activity_photo_s *phot
        stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
 
-
        cts_stmt_bind_text(stmt, 1, photo->photo_url);
 
        ret = cts_stmt_step(stmt);
@@ -174,14 +173,7 @@ static int __ctsvc_db_activity_insert_record( contacts_record_h record, int *id
        }
 
        ctsvc_set_activity_noti();
-       ctsvc_set_contact_noti();
-
-       ret = ctsvc_db_contact_update_changed_time(activity->contact_id);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_query_exec() Failed(%d)", ret);
-               ctsvc_end_trans(false);
-               return ret;
-       }
+       ctsvc_set_person_noti();
 
        if (id)
                *id = activity_id;
@@ -282,7 +274,6 @@ static int __ctsvc_db_activity_get_record( int id, contacts_record_h* out_record
        cts_stmt stmt = NULL;
        contacts_record_h record;
 
-
        snprintf(query, sizeof(query), "SELECT id, contact_id, source_name, status, "
                                        "timestamp, sync_data1, sync_data2, sync_data3, sync_data4 "
                                        "FROM "CTSVC_DB_VIEW_ACTIVITY" WHERE id = %d", id);
@@ -328,7 +319,7 @@ static int __ctsvc_db_activity_delete_record( int id )
        if (CONTACTS_ERROR_NONE != ret ) {
                CTS_ERR("No data : id (%d)", id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_NO_DATA;
+               return ret;
        }
 
        snprintf(query, sizeof(query),
@@ -341,14 +332,7 @@ static int __ctsvc_db_activity_delete_record( int id )
        }
 
        ctsvc_set_activity_noti();
-       ctsvc_set_contact_noti();
-
-       ret = ctsvc_db_contact_update_changed_time(contact_id);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_query_exec() Failed(%d)", ret);
-               ctsvc_end_trans(false);
-               return ret;
-       }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index d5d7440..92b027d 100644 (file)
@@ -28,6 +28,8 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
+
 
 static int __ctsvc_db_address_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_address_get_record( int id, contacts_record_h* out_record );
@@ -92,10 +94,11 @@ static int __ctsvc_db_address_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(address->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -104,7 +107,6 @@ static int __ctsvc_db_address_insert_record( contacts_record_h record, int *id )
                return CONTACTS_ERROR_NONE;
 }
 
-
 static int __ctsvc_db_address_update_record( contacts_record_h record )
 {
        int ret;
@@ -120,26 +122,28 @@ static int __ctsvc_db_address_update_record( contacts_record_h record )
 
        snprintf(query, sizeof(query),
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", address->contact_id);
+
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", address->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_address_update(record, address->contact_id, false);
+       ret = ctsvc_db_address_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("update record failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(address->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -157,26 +161,32 @@ static int __ctsvc_db_address_delete_record( int id )
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
-       snprintf(query, sizeof(query), "SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d", id);
+       snprintf(query, sizeof(query),
+                       "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" "
+                               "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret ) {
                CTS_ERR("No data : id (%d)", id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_NO_DATA;
+               return ret;
        }
 
-       ret = ctsvc_db_address_delete(id);
+       ret = ctsvc_db_address_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               ret = ctsvc_db_contact_update_changed_time(contact_id);
-               if (CONTACTS_ERROR_NONE != ret) {
-                       CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
-                       ctsvc_end_trans(false);
-                       return ret;
-               }
-               ret = ctsvc_end_trans(true);
+               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
        }
-       else
+
+       ret = ctsvc_db_contact_update_changed_time(contact_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
+               return ret;
+       }
+       ctsvc_set_person_noti();
+
+       ret = ctsvc_end_trans(true);
 
        if (ret < CONTACTS_ERROR_NONE)
                return ret;
@@ -192,7 +202,7 @@ static int __ctsvc_db_address_get_record( int id, contacts_record_h* out_record
        ctsvc_address_s *address;
 
        snprintf(query, sizeof(query),
-                               "SELECT data.contact_id, is_default, "
+                               "SELECT id, data.contact_id, is_default, "
                                                "data1, data2, data3, data4, data5, data6, data7, data8, data9 "
                                                "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
                                                "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
index 3bdc4b4..1bb6fba 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_address_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -67,7 +68,6 @@ int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my
        ctsvc_address_s *address = (ctsvc_address_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
 
-//     RETVM_IF(address->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted address record");
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert address record ", address->contact_id);
        RETVM_IF(0 < address->id, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -126,93 +126,59 @@ int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_address_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_address_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
-       cts_stmt stmt = NULL;
-       ctsvc_address_s *address = (ctsvc_address_s*)record;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_address_s *address =  (ctsvc_address_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
 
-//     RETVM_IF(address->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted address record");
+       RETVM_IF(address->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
+                               "Invalid parameter : id(%d), This record is already inserted", address->id);
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (address->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
        RETVM_IF(NULL == address->pobox && NULL == address->postalcode && address->region
                        && address->locality && address->street && address->extended && address->country,
                        CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : address is NULL");
-       RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
-                               "Invalid parameter : contact_id(%d) is mandatory field to insert address record ", address->contact_id);
-       RETVM_IF(address->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
-                               "Invalid parameter : id(%d), This record is already inserted", address->id);
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET is_my_profile=%d, is_default=?, data1 = ?, data2 = ?, data3 = ?, "
-                                       "data4 = ?, data5 = ?, data6 = ?, data7 = ?, data8 = ?, data9 = ? "
-                                       "WHERE id = %d", is_my_profile, address->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       sqlite3_bind_int(stmt, 1, address->is_default);
-       sqlite3_bind_int(stmt, 2, address->type);
-
-       if (address->label)
-               sqlite3_bind_text(stmt, 3, address->label,
-                               strlen(address->label), SQLITE_STATIC);
-       if (address->pobox)
-               sqlite3_bind_text(stmt, 4, address->pobox,
-                               strlen(address->pobox), SQLITE_STATIC);
-       if (address->postalcode)
-               sqlite3_bind_text(stmt, 5, address->postalcode,
-                               strlen(address->postalcode), SQLITE_STATIC);
-       if (address->region)
-               sqlite3_bind_text(stmt, 6, address->region,
-                               strlen(address->region), SQLITE_STATIC);
-       if (address->locality)
-               sqlite3_bind_text(stmt, 7, address->locality,
-                               strlen(address->locality), SQLITE_STATIC);
-       if (address->street)
-               sqlite3_bind_text(stmt, 8, address->street,
-                               strlen(address->street), SQLITE_STATIC);
-       if (address->extended)
-               sqlite3_bind_text(stmt, 9, address->extended,
-                               strlen(address->extended), SQLITE_STATIC);
-       if (address->country)
-               sqlite3_bind_text(stmt, 10, address->country,
-                               strlen(address->country), SQLITE_STATIC);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
-       }
-       cts_stmt_finalize(stmt);
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", address->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
 
-       if (!is_my_profile)
-               ctsvc_set_address_noti();
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, address->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_address_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
+       }
 
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_address_delete(int id)
+int ctsvc_db_address_delete(int id, bool is_my_profile)
 {
        int ret;
-       cts_stmt stmt;
        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);
 
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
+       ret = ctsvc_query_exec(query);
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : cts_query_exec() Fail(%d)", ret);
 
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
-       }
-       cts_stmt_finalize(stmt);
-
-       ctsvc_set_address_noti();
+       if (!is_my_profile)
+               ctsvc_set_address_noti();
 
        return ret;
 }
index 4af38f7..263e972 100644 (file)
@@ -24,8 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_address_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_address_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_address_delete(int id);
+int ctsvc_db_address_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_address_delete(int id, bool is_my_profile);
 int ctsvc_db_address_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_ADDRESS_HELPER_H__
index 56557fd..c338fa7 100644 (file)
@@ -189,65 +189,72 @@ static int __ctsvc_db_addressbook_insert_record( contacts_record_h record, int *
 
 static int __ctsvc_db_addressbook_update_record( contacts_record_h record )
 {
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_addressbook_s *addressbook = (ctsvc_addressbook_s *)record;
 
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (addressbook->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
        RETV_IF(NULL == addressbook->name, CONTACTS_ERROR_INVALID_PARAMETER);
        RETVM_IF(CTSVC_RECORD_ADDRESSBOOK != addressbook->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
                        "Invalid parameter : record is invalid type(%d)", addressbook->base.r_type);
 
-       cts_stmt stmt = NULL;
-       char query[CTS_SQL_MIN_LEN] = {0};
-
-       snprintf(query, sizeof(query),
-                       "UPDATE %s SET addressbook_name=?, account_id=%d, mode=%d "
-                       "WHERE addressbook_id=%d", CTS_TABLE_ADDRESSBOOKS,
-                       addressbook->account_id, addressbook->mode, addressbook->id);
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("DB error : cts_query_prepare() Failed");
-               return CONTACTS_ERROR_DB;
-       }
-
-       cts_stmt_bind_text(stmt, 1, addressbook->name);
+       do {
+               char query[CTS_SQL_MAX_LEN] = {0};
+               cts_stmt stmt = NULL;
 
-       /* BEGIN_TRANSACTION */
-       int ret = ctsvc_begin_trans();
-       if( ret < CONTACTS_ERROR_NONE )
-       {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
-       }
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (NULL == set || '\0' == *set)
+                       break;
 
-       /* DOING JOB */
-       do {
+               snprintf(query, sizeof(query), "UPDATE %s SET %s WHERE addressbook_id = %d", CTS_TABLE_ADDRESSBOOKS, set, addressbook->id);
+               stmt = cts_query_prepare(query);
+               if (NULL == stmt) {
+                       CTS_ERR("DB error : cts_query_prepare() Failed");
+                       ret = CONTACTS_ERROR_DB;
+                       break;
+               }
+               if (bind_text) {
+                       int i = 0;
+                       for (cursor=bind_text,i=1;cursor;cursor=cursor->next,i++) {
+                               const char *text = cursor->data;
+                               if (text && *text)
+                                       cts_stmt_bind_text(stmt, i, text);
+                       }
+               }
                ret = cts_stmt_step(stmt);
                if (CONTACTS_ERROR_NONE != ret) {
-                       CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
                        cts_stmt_finalize(stmt);
                        break;
                }
                cts_stmt_finalize(stmt);
 
                ctsvc_set_addressbook_noti();
+       } while (0);
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
+       }
 
-               ret = ctsvc_end_trans(true);
-               if(ret < CONTACTS_ERROR_NONE )
-               {
-                       CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
-                       return ret;
-               }
-
-               return CONTACTS_ERROR_NONE;
-
-       } while(0);
+       if (CONTACTS_ERROR_NONE != ret) {
+               ctsvc_end_trans(false);
+               return ret;
+       }
 
-       /* ROLLBACK TRANSACTION */
-       ctsvc_end_trans(false);
+       ret = ctsvc_end_trans(true);
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_end_trans() Failed(%d)", ret);
 
-       return ret;
+       return CONTACTS_ERROR_NONE;
 }
 
 static inline int __ctsvc_db_addressbook_reset_internal_addressbook(void)
@@ -313,6 +320,7 @@ static inline int __ctsvc_db_addressbook_reset_internal_addressbook(void)
 
                ctsvc_set_contact_noti();
                ctsvc_set_my_profile_noti();
+               // person noti will set in ctsvc_person_do_garbage_collection : ctsvc_set_person_noti();
                ctsvc_set_group_noti();
                ret = ctsvc_end_trans(true);
                if (ret < CONTACTS_ERROR_NONE) {
@@ -356,6 +364,7 @@ static int __ctsvc_db_addressbook_delete_record( int addressbook_id )
                if (0 < ret) {
                        ctsvc_set_my_profile_noti();
                        ctsvc_set_contact_noti();
+                       // person noti will set in ctsvc_person_do_garbage_collection : ctsvc_set_person_noti();
                        ctsvc_set_group_noti();
                        ctsvc_set_addressbook_noti();
                }
@@ -458,14 +467,13 @@ static int __ctsvc_db_addressbook_get_records_with_query( contacts_query_h query
                addressbook = (ctsvc_addressbook_s*)record;
                if (0 == s_query->projection_count)
                        field_count = s_query->property_count;
-               else
-               {
+               else {
                        field_count = s_query->projection_count;
+                       ret = ctsvc_record_set_projection_flags(record, s_query->projection,
+                                       s_query->projection_count, s_query->property_count);
 
-                       if( CONTACTS_ERROR_NONE != ctsvc_record_set_projection_flags(record, s_query->projection, s_query->projection_count, s_query->property_count) )
-                       {
+                       if (CONTACTS_ERROR_NONE != ret)
                                ASSERT_NOT_REACHED("To set projection is failed.\n");
-                       }
                }
 
                for(i=0;i<field_count;i++) {
index 7bd00a0..089c87f 100644 (file)
@@ -32,8 +32,6 @@
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
 
-#define CTS_LOGO_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/logo"
-
 static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record );
 static int __ctsvc_db_company_update_record( contacts_record_h record );
@@ -131,12 +129,11 @@ static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(company->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
-
-       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -165,14 +162,14 @@ static int __ctsvc_db_company_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", company->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
        ret = ctsvc_db_company_update(record, company->contact_id, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
@@ -180,12 +177,12 @@ static int __ctsvc_db_company_update_record( contacts_record_h record )
        // TODO ; contact display company update
        ret = ctsvc_db_contact_update_changed_time(company->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
-       ctsvc_set_contact_noti();
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
@@ -216,10 +213,10 @@ static int __ctsvc_db_company_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_company_delete(id);
+       ret = ctsvc_db_company_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -228,12 +225,11 @@ static int __ctsvc_db_company_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
-
-       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 31f48f0..3c46a28 100644 (file)
 #include "ctsvc_sqlite.h"
 #include "ctsvc_utils.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_company_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
 
 #define CTS_LOGO_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/logo"
 
-static int __ctsvc_company_add_logo_file(int index, char *src_img, char *dest_name, int dest_size)
+static int __ctsvc_company_add_logo_file(int parent_id, int company_id, char *src_img, char *dest_name, int dest_size)
 {
        int ret;
        char *ext;
@@ -45,26 +46,63 @@ static int __ctsvc_company_add_logo_file(int index, char *src_img, char *dest_na
        if (NULL == ext || strchr(ext, '/'))
                ext = "";
 
-       snprintf(dest, sizeof(dest), "%s/%d%s",
-                       CTS_LOGO_IMAGE_LOCATION, index, ext);
+       snprintf(dest, sizeof(dest), "%s/%d_%d%s",
+                       CTS_LOGO_IMAGE_LOCATION, parent_id, company_id, ext);
 
        ret = ctsvc_copy_image(src_img, dest);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_copy_file() Failed(%d)", ret);
 
-       snprintf(dest_name, dest_size, "%d%s", index, ext);
+       snprintf(dest_name, dest_size, "%d_%d%s", parent_id, company_id, ext);
        return CONTACTS_ERROR_NONE;
 }
 
-static int __ctsvc_company_update_logo_file(int index, char *src_img, char *dest_name, int dest_size)
+static int __ctsvc_company_delete_logo_file(int company_id)
+{
+       int ret;
+       cts_stmt stmt;
+       char *tmp_path;
+       char query[CTS_SQL_MIN_LEN] = {0};
+       snprintf(query, sizeof(query),
+                       "SELECT data8 FROM %s WHERE id = %d AND datatype = %d",
+                       CTS_TABLE_DATA, company_id, CTSVC_DATA_COMPANY);
+
+       stmt = cts_query_prepare(query);
+       if (NULL == stmt) {
+               CTS_ERR("cts_query_prepare() Failed");
+               cts_stmt_finalize(stmt);
+               return CONTACTS_ERROR_DB;
+       }
+
+       ret = cts_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/  != ret) {
+               CTS_DBG("cts_stmt_step() Failed(%d)", ret);
+               cts_stmt_finalize(stmt);
+               return CONTACTS_ERROR_NO_DATA;
+       }
+
+       tmp_path = ctsvc_stmt_get_text(stmt, 0);
+       if (tmp_path) {
+               char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
+               snprintf(full_path, sizeof(full_path), "%s/%s", CTS_LOGO_IMAGE_LOCATION, tmp_path);
+               ret = unlink(full_path);
+               WARN_IF(ret < 0, "unlink(%s) Failed(%d)", full_path, errno);
+       }
+       cts_stmt_finalize(stmt);
+
+       return CONTACTS_ERROR_NONE;
+}
+
+
+static int __ctsvc_company_update_logo_file(int parent_id, int company_id, char *src_img, char *dest_name, int dest_size)
 {
        int ret;
        dest_name[0] = '\0';
-       ret = ctsvc_company_delete_logo_file(index);
+       ret = __ctsvc_company_delete_logo_file(company_id);
        RETVM_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
                        ret, "ccts_company_delete_logo_file() Failed(%d)", ret);
 
        if (src_img) {
-               ret = __ctsvc_company_add_logo_file(index, src_img, dest_name, dest_size);
+               ret = __ctsvc_company_add_logo_file(parent_id, company_id, src_img, dest_name, dest_size);
                RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_company_add_logo_file() Failed(%d)", ret);
        }
        return ret;
@@ -111,11 +149,11 @@ static int __ctsvc_company_bind_stmt(cts_stmt stmt, ctsvc_company_s *company, in
 int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id)
 {
        int ret;
+       int company_id = 0;
        cts_stmt stmt = NULL;
        ctsvc_company_s *company = (ctsvc_company_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
 
-//     RETVM_IF(company->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted company record");
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert company record ", company->contact_id);
        RETVM_IF(0 < company->id, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -124,11 +162,20 @@ int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my
        if (company->name || company->department || company->job_title || company->role
                        || company->assistant_name || company->logo || company->location || company->description
                        || company->phonetic_name) {
+
+               ret = cts_db_get_next_id(CTS_TABLE_DATA);
+               if (ret < CONTACTS_ERROR_NONE) {
+                       CTS_ERR("cts_db_get_next_id() Failed(%d)", ret);
+                       ctsvc_end_trans(false);
+                       return ret;
+               }
+               company_id = ret;
+
                snprintf(query, sizeof(query),
-                       "INSERT INTO "CTS_TABLE_DATA"(contact_id, is_my_profile, datatype, is_default, data1, data2, data3, data4, "
+                       "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, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                                       contact_id, is_my_profile, CTSVC_DATA_COMPANY);
+                                       "VALUES(%d, %d, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+                                       company_id, contact_id, is_my_profile, CTSVC_DATA_COMPANY);
 
                stmt = cts_query_prepare(query);
                RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
@@ -136,7 +183,7 @@ int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my
                __ctsvc_company_bind_stmt(stmt, company, 1);
                if (company->logo) {
                        char image[CTS_SQL_MAX_LEN] = {0};
-                       ret = __ctsvc_company_add_logo_file(company->contact_id, company->logo, image, sizeof(image));
+                       ret = __ctsvc_company_add_logo_file(contact_id, company->id, company->logo, image, sizeof(image));
                        if (CONTACTS_ERROR_NONE != ret) {
                                CTS_ERR("__ctsvc_company_add_logo_file() Failed(%d)", ret);
                                cts_stmt_finalize(stmt);
@@ -151,10 +198,12 @@ int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my
                        cts_stmt_finalize(stmt);
                        return ret;
                }
-               if (id)
-                       *id = cts_db_get_last_insert_id();
                cts_stmt_finalize(stmt);
 
+               company->id = company_id;
+               if (id)
+                       *id = company_id;
+
                if (!is_my_profile)
                        ctsvc_set_company_noti();
        }
@@ -212,49 +261,52 @@ int ctsvc_db_company_get_value_from_stmt(cts_stmt stmt, contacts_record_h *recor
 
 int ctsvc_db_company_update(contacts_record_h record, int contact_id, bool is_my_profile)
 {
-       int ret;
-       ctsvc_company_s *company = (ctsvc_company_s*)record;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
+       ctsvc_company_s *company =  (ctsvc_company_s*)record;
 
        RETVM_IF(!company->id, CONTACTS_ERROR_INVALID_PARAMETER, "company of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (company->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
-       if (company->name || company->department || company->job_title || company->role
-                       || company->assistant_name || company->logo || company->location || company->description
-                       || company->phonetic_name) {
-               snprintf(query, sizeof(query),
-                       "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=?, data1=?, data2=?, data3=?, data4=?,"
-                                       "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d",
-                                       contact_id, is_my_profile, company->id);
-
-               stmt = cts_query_prepare(query);
-               RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", company->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
 
-               __ctsvc_company_bind_stmt(stmt, company, 1);
-               if (company->logo_changed) {
-                       char dest[CTS_SQL_MAX_LEN] = {0};
-                       __ctsvc_company_update_logo_file(contact_id, company->logo, dest, sizeof(dest));
-                       if (*dest)
-                               cts_stmt_bind_text(stmt, 9, dest);
-                       company->logo_changed = false;
-               }
 
-               ret = cts_stmt_step(stmt);
-               if (CONTACTS_ERROR_NONE != ret) {
-                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-                       cts_stmt_finalize(stmt);
-                       return ret;
+       if (company->logo_changed) {
+               char dest[CTS_SQL_MAX_LEN] = {0};
+               __ctsvc_company_update_logo_file(contact_id, company->id, company->logo, dest, sizeof(dest));
+               if (*dest) {
+                       free(company->logo);
+                       company->logo = strdup(dest);
                }
+               company->logo_changed = false;
+       }
 
-               cts_stmt_finalize(stmt);
-
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, company->id))) break;
                if (!is_my_profile)
                        ctsvc_set_company_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
-       return CONTACTS_ERROR_NONE;
+
+       return ret;
 }
 
-int ctsvc_db_company_delete(int id)
+int ctsvc_db_company_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -264,44 +316,31 @@ int ctsvc_db_company_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_company_noti();
+       if (!is_my_profile)
+               ctsvc_set_company_noti();
 
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_company_delete_logo_file(int index)
+void ctsvc_db_data_company_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv)
 {
        int ret;
-       cts_stmt stmt;
-       char *tmp_path;
-       char query[CTS_SQL_MIN_LEN] = {0};
-       snprintf(query, sizeof(query),
-               "SELECT data8 FROM %s WHERE contact_id = %d AND datatype = %d AND is_my_profile = 0",
-                       CTS_TABLE_DATA, index, CTSVC_DATA_COMPANY);
+       const unsigned char* logo_path;
 
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("cts_query_prepare() Failed");
-               cts_stmt_finalize(stmt);
-               return CONTACTS_ERROR_DB;
+       if (argc > 1) {
+               sqlite3_result_null(context);
+               return;
        }
+       logo_path = sqlite3_value_text(argv[0]);
 
-       ret = cts_stmt_step(stmt);
-       if (1 /*CTS_TRUE*/  != ret) {
-               CTS_DBG("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return CONTACTS_ERROR_NO_DATA;
-       }
-
-       tmp_path = ctsvc_stmt_get_text(stmt, 0);
-       if (tmp_path) {
+       if (logo_path) {
                char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
-               snprintf(full_path, sizeof(full_path), "%s/%s", CTS_LOGO_IMAGE_LOCATION, tmp_path);
+               snprintf(full_path, sizeof(full_path), "%s/%s", CTS_LOGO_IMAGE_LOCATION, logo_path);
                ret = unlink(full_path);
                WARN_IF(ret < 0, "unlink(%s) Failed(%d)", full_path, errno);
        }
-       cts_stmt_finalize(stmt);
 
-       return CONTACTS_ERROR_NONE;
+       return;
 }
 
+
index 93644be..68bb704 100644 (file)
@@ -25,9 +25,8 @@
 
 int ctsvc_db_company_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
 int ctsvc_db_company_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_company_delete(int id);
-
+int ctsvc_db_company_delete(int id, bool is_my_profile);
 int ctsvc_db_company_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
-int ctsvc_company_delete_logo_file(int index);
+void ctsvc_db_data_company_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv);
 
 #endif // __CTSVC_DB_PLUGIN_COMPANY_HELPER_H__
index f1b9516..1166bf3 100644 (file)
@@ -42,8 +42,6 @@
 
 #define CTSVC_MY_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/my"
 
-#define CTSVC_CONTACT_DISPLAY_NAME_MAX_LEN 1024
-#define CTSVC_CONTACT_SEARCH_DATA_MAX_LEN 1024
 #define CTSVC_CONTACT_INITIAL_DATA_MAX_LEN 128
 
 static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id );
@@ -302,18 +300,29 @@ static int __ctsvc_db_contact_delete_record( int id )
        char query[CTS_SQL_MAX_LEN] = {0};
        cts_stmt stmt = NULL;
 
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
+
        snprintf(query, sizeof(query),
                "SELECT addressbook_id, person_id "
                "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", id);
 
        stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
+       if (NULL == stmt) {
+               CTS_ERR("DB error : cts_query_prepare() Failed");
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_DB;
+       }
 
        ret = cts_stmt_step(stmt);
        if (1 != ret) {
                CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
                cts_stmt_finalize(stmt);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               ctsvc_end_trans(false);
+               if (CONTACTS_ERROR_NONE == ret)
+                       return CONTACTS_ERROR_NO_DATA;
+               else
+                       return ret;
        }
 
        addressbook_id = ctsvc_stmt_get_int(stmt, 0);
@@ -321,9 +330,6 @@ static int __ctsvc_db_contact_delete_record( int id )
        CTS_DBG("addressbook_id : %d, person_id : %d", addressbook_id, person_id);
        cts_stmt_finalize(stmt);
 
-       ret = ctsvc_begin_trans();
-       RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
-
        snprintf(query, sizeof(query),
                        "UPDATE %s SET member_changed_ver=%d "
                                "WHERE group_id IN (SELECT group_id FROM %s WHERE contact_id = %d AND deleted = 0) ",
@@ -377,205 +383,6 @@ static inline int __ctsvc_safe_strcmp(char *s1, char *s2)
                return strcmp(s1, s2);
 }
 
-static inline void __ctsvc_update_contact_display_name(ctsvc_contact_s *contact)
-{
-       char *temp_display_name = NULL;
-       char *display = NULL;
-       char *sortkey = NULL;
-       GList *cur;
-       int ret, len=0, display_len=0;
-
-       ctsvc_name_s *name = NULL;
-       if ( contact->name->count > 0 && contact->name->records != NULL && contact->name->records->data != NULL )
-       {
-               name = (ctsvc_name_s *)contact->name->records->data;
-       }
-
-       if ( name && ( name->first || name->last) ) {
-               if (name->first && name->last){
-                       temp_display_name = calloc(1, SAFE_STRLEN(name->first) + SAFE_STRLEN(name->first) + 2 );
-                       snprintf(temp_display_name, SAFE_STRLEN(name->first) + SAFE_STRLEN(name->first) + 2, "%s %s",name->first,name->last);
-               }
-               else if (name->first)
-                       temp_display_name = strdup(name->first);
-               else
-                       temp_display_name = strdup(name->last);
-
-               if (0 != __ctsvc_safe_strcmp(contact->display_name, temp_display_name)
-                               || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME != contact->display_source_type) {
-                       contact->display_name_changed = true;
-
-                       // make display name
-                       display_len = SAFE_STRLEN(name->first)
-                                                               + SAFE_STRLEN(name->addition)
-                                                               + SAFE_STRLEN(name->last)
-                                                               + SAFE_STRLEN(name->suffix) + 5;
-
-                       display = calloc(1, display_len);
-
-                       if(name->first)
-                               len += snprintf(display + len, display_len - len, "%s", name->first);
-
-                       if(name->addition) {
-                               if (*display)
-                                       len += snprintf(display + len, display_len - len, " ");
-                               len += snprintf(display + len, display_len - len, "%s", name->addition);
-                       }
-
-                       if(name->last) {
-                               if (*display)
-                                       len += snprintf(display + len, display_len - len, " ");
-                               len += snprintf(display + len, display_len - len, "%s", name->last);
-                       }
-
-                       if(name->suffix) {
-                               if (*display)
-                                       len += snprintf(display + len, display_len - len, " ");
-                               len += snprintf(display + len, display_len - len, "%s", name->suffix);
-                       }
-                       contact->display_name = display;
-
-                       display = calloc(1, display_len);
-                       // make reverse_display_name
-                       len = 0;
-                       if(name->last) {
-                               len += snprintf(display + len, display_len - len, "%s", name->last);
-
-                               if(name->first || name->addition)
-                                       len += snprintf(display + len, display_len - len, ",");
-                       }
-
-                       if(name->first) {
-                               if (*display)
-                                       len += snprintf(display + len, display_len - len, " ");
-                               len += snprintf(display + len, display_len - len, "%s", name->first);
-                       }
-
-                       if(name->addition) {
-                               if (*display)
-                                       len += snprintf(display + len, display_len - len, " ");
-                               len += snprintf(display + len, display_len - len, "%s", name->addition);
-                       }
-
-                       if(name->suffix) {
-                               if (*display)
-                                       len += snprintf(display + len, sizeof(display) - len, " ");
-                               len += snprintf(display + len, sizeof(display) - len, "%s", name->suffix);
-                       }
-
-
-                       contact->reverse_display_name = display;
-
-                       ret = ctsvc_check_language_type(contact->display_name);
-                       if (0 <= ret) {
-                               if (ctsvc_get_default_language() == ret)
-                                       contact->display_name_language = CTSVC_LANG_DEFAULT;
-                               else if (ctsvc_get_secondary_language() == ret)
-                                       contact->display_name_language = CTSVC_LANG_SECONDARY;
-                               else
-                                       contact->display_name_language = ret;
-                       }
-
-                       ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                       if (CONTACTS_ERROR_NONE == ret)
-                               contact->sortkey = sortkey;
-                       else
-                               free(sortkey);
-                       sortkey = NULL;
-
-                       ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey);
-                       if (CONTACTS_ERROR_NONE == ret)
-                               contact->reverse_sortkey = sortkey;
-                       else
-                               free(sortkey);
-                       contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME;
-               }
-
-               free(temp_display_name);
-       }
-
-       else {
-               if (contact->company && contact->company->records) {
-                       for (cur=contact->company->records;cur;cur=cur->next) {
-                               ctsvc_company_s *company = (ctsvc_company_s *)cur->data;
-                               if (company && company->name) {
-                                       if (__ctsvc_safe_strcmp(contact->display_name, company->name)
-                                               || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY != contact->display_source_type) {
-                                               contact->display_name_changed = true;
-                                               contact->display_name = SAFE_STRDUP(company->name);
-                                               contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               else if (contact->nicknames && contact->nicknames->records) {
-                       for (cur=contact->nicknames->records;cur;cur=cur->next) {
-                               ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data;
-                               if (nickname && nickname->nickname) {
-                                       if (__ctsvc_safe_strcmp(contact->display_name, nickname->nickname)
-                                               || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME != contact->display_source_type) {
-                                               contact->display_name = SAFE_STRDUP(nickname->nickname);
-                                               contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               else if (contact->numbers && contact->numbers->records) {
-                       for (cur=contact->numbers->records;cur;cur=cur->next) {
-                               ctsvc_number_s *number = (ctsvc_number_s *)cur->data;
-                               if (number && number->number) {
-                                       if (__ctsvc_safe_strcmp(contact->display_name, number->number)
-                                                       || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER != contact->display_source_type) {
-                                               contact->display_name_changed = true;
-                                               contact->display_name = SAFE_STRDUP(number->number);
-                                               contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               else if (contact->emails && contact->emails->records) {
-                       for (cur=contact->emails->records;cur;cur=cur->next) {
-                               ctsvc_email_s *email = (ctsvc_email_s*)cur->data;
-                               if (email && email->email_addr) {
-                                       if (__ctsvc_safe_strcmp(contact->display_name, email->email_addr)
-                                                       || CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL != contact->display_source_type) {
-                                               contact->display_name_changed = true;
-                                               contact->display_name = SAFE_STRDUP(email->email_addr);
-                                               contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-               if (contact->display_name_changed) {
-                       contact->reverse_display_name = SAFE_STRDUP(contact->display_name);
-
-                       ret = ctsvc_check_language_type(contact->display_name);
-                       if (0 <= ret) {
-                               if (ctsvc_get_default_language() == ret)
-                                       contact->display_name_language = CTSVC_LANG_DEFAULT;
-                               else if (ctsvc_get_secondary_language() == ret)
-                                       contact->display_name_language = CTSVC_LANG_SECONDARY;
-                               else
-                                       contact->display_name_language = ret;
-                       }
-
-                       ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                       if (CONTACTS_ERROR_NONE == ret) {
-                               contact->sortkey = sortkey;
-                               contact->reverse_sortkey = strdup(sortkey);
-                       }
-                       else
-                               free(sortkey);
-               }
-       }
-       return;
-}
-
 static inline int __ctsvc_update_contact_data(ctsvc_contact_s *contact)
 {
        int ret;
@@ -791,63 +598,84 @@ static inline int __ctsvc_contact_make_search_name(ctsvc_contact_s *contact, cha
 
        if (contact->display_name) {
                if (ctsvc_has_chinese(contact->display_name)) {
-                       pinyin_name_s *pinyinname;
-                       int size, i;
+                       if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->sort_name)) {
+                               char *normalized_display_name=NULL;
 
-                       ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
+                               ctsvc_normalize_str(contact->display_name, &normalized_display_name);
+                               buf_size = SAFE_STRLEN(normalized_display_name) + strlen(contact->sort_name) + 2;
+                               name = calloc(1, buf_size);
+                               snprintf(name, buf_size, "%s %s", normalized_display_name, contact->sort_name);
 
-                       if (CONTACTS_ERROR_NONE == ret) {
-                               char *name_nospace = calloc(1, CHINESE_PINYIN_SPELL_MAX_LEN);
-                               char *temp_name = NULL;
+                               free(normalized_display_name);
+                       }
+                       else {
+                               pinyin_name_s *pinyinname;
+                               int size, i, len;
 
-                               name = calloc(1, strlen(contact->display_name)* 5);
+                               ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
 
-                               ctsvc_normalize_str(contact->display_name, name, strlen(contact->display_name)* 5);
+                               if (CONTACTS_ERROR_NONE == ret) {
+                                       char *name_nospace = calloc(1, CHINESE_PINYIN_SPELL_MAX_LEN);
+                                       char *temp_name = NULL;
 
-                               for(i=0; i<size; i++) {
-                                       __ctsvc_remove_space(pinyinname[i].pinyin_name, name_nospace, CHINESE_PINYIN_SPELL_MAX_LEN*(CHINESE_PINYIN_MAX_LEN+1));
+                                       ctsvc_normalize_str(contact->display_name, &name);
 
-                                       buf_size = SAFE_STRLEN(name)
-                                                                               + SAFE_STRLEN(pinyinname[i].pinyin_name)
-                                                                               + SAFE_STRLEN(name_nospace) + 4;
-                                       temp_name = calloc(1, buf_size);
-                                       snprintf(temp_name, buf_size, "%s %s %s %s",
-                                                       name, pinyinname[i].pinyin_name, name_nospace, pinyinname[i].pinyin_initial);
+                                       for(i=0; i<size; i++) {
+                                               __ctsvc_remove_space(pinyinname[i].pinyin_name, name_nospace, CHINESE_PINYIN_SPELL_MAX_LEN*(CHINESE_PINYIN_MAX_LEN+1));
 
-                                       free(name);
-                                       name = temp_name;
-                               }
+                                               buf_size = SAFE_STRLEN(name)
+                                                                                       + SAFE_STRLEN(pinyinname[i].pinyin_name)
+                                                                                       + SAFE_STRLEN(name_nospace)
+                                                                                       + SAFE_STRLEN(pinyinname[i].pinyin_initial)
+                                                                                       + 4;
+                                               temp_name = calloc(1, buf_size);
+                                               snprintf(temp_name, buf_size, "%s %s %s %s",
+                                                               name, pinyinname[i].pinyin_name, name_nospace, pinyinname[i].pinyin_initial);
 
-                               free(name_nospace);
-                               free(pinyinname);
-                       }
-                       else {
-                               char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
-                               char *normalized_display_name = NULL;
+                                               free(name);
+                                               name = temp_name;
+                                       }
 
-                               normalized_display_name = calloc(1, strlen(contact->display_name)* 5);
+                                       len = ctsvc_check_utf8(contact->display_name[0]);
+                                       for(i=len; i < strlen(contact->display_name); i+=len) {
+                                               len = ctsvc_check_utf8(contact->display_name[i]);
 
-                               ctsvc_normalize_str(contact->display_name, normalized_display_name, strlen(contact->display_name)* 5);
-                               __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
-                               buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
-                               name = calloc(1, buf_size);
-                               snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
+                                               buf_size = SAFE_STRLEN(name) + SAFE_STRLEN(&contact->display_name[i]) + 2;
+                                               temp_name = calloc(1, buf_size);
 
-                               free(normalized_display_name);
+                                               snprintf(temp_name, buf_size, "%s %s", name, &contact->display_name[i]);
+
+                                               free(name);
+                                               name = temp_name;
+                                       }
+
+                                       free(name_nospace);
+                                       free(pinyinname);
+                               }
+                               else {
+                                       char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
+                                       char *normalized_display_name = NULL;
+
+                                       ctsvc_normalize_str(contact->display_name, &normalized_display_name);
+                                       __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
+                                       buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
+                                       name = calloc(1, buf_size);
+                                       snprintf(name, buf_size, "%s %s", normalized_display_name, initial);
+
+                                       free(normalized_display_name);
+                               }
                        }
                }
                else if (CTSVC_LANG_KOREAN == ctsvc_check_language_type(contact->display_name)) {
                        char *temp_name = NULL;
-                       char *chosung = calloc(1, strlen(contact->display_name) + 1);
+                       char *chosung = calloc(1, strlen(contact->display_name) * 5);
                        int count, i, j;
                        int full_len, chosung_len;
                        int total_len = strlen(contact->display_name);
 
-                       count = ctsvc_get_chosung(contact->display_name, chosung, strlen(contact->display_name) + 1 );
-
-                       name = calloc(1, strlen(contact->display_name)* 5);
+                       count = ctsvc_get_chosung(contact->display_name, chosung, strlen(contact->display_name) * 5 );
 
-                       ctsvc_normalize_str(contact->display_name, name, strlen(contact->display_name)* 5);
+                       ctsvc_normalize_str(contact->display_name, &name);
 
                        if (count > 0) {
                                for(i=0, j=0; i < total_len; i+=full_len, j+=chosung_len) {
@@ -865,13 +693,14 @@ static inline int __ctsvc_contact_make_search_name(ctsvc_contact_s *contact, cha
                        }
                        free(chosung);
                }
+               else if (CTSVC_LANG_JAPANESE == ctsvc_check_language_type(contact->display_name)) {
+                       ctsvc_convert_japanese_to_hiragana(contact->display_name, &name);
+               }
                else {
                        char initial[CTSVC_CONTACT_INITIAL_DATA_MAX_LEN] = {0,};
                        char *normalized_display_name=NULL;
 
-                       normalized_display_name = calloc(1, strlen(contact->display_name)* 5);
-
-                       ctsvc_normalize_str(contact->display_name, normalized_display_name, strlen(contact->display_name)* 5);
+                       ctsvc_normalize_str(contact->display_name, &normalized_display_name);
                        __ctsvc_contact_get_initial(contact->display_name, initial, sizeof(initial), false);
                        buf_size = SAFE_STRLEN(normalized_display_name) + strlen(initial) + 2;
                        name = calloc(1, buf_size);
@@ -1022,6 +851,131 @@ static inline int __ctsvc_contact_make_search_data(int contact_id, char **search
        return CONTACTS_ERROR_NONE;
 }
 
+static inline int __ctsvc_contact_refresh_lookup_data(int contact_id)
+{
+       int ret, len = 0, temp_len =0;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       ctsvc_contact_s *contact;
+
+       snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d",
+                       CTS_TABLE_NAME_LOOKUP, contact_id);
+       ret = ctsvc_query_exec(query);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d",
+                       CTS_TABLE_PHONE_LOOKUP, contact_id);
+       ret = ctsvc_query_exec(query);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+               return ret;
+       }
+
+       ret = contacts_db_get_record(_contacts_contact._uri, contact_id, (contacts_record_h*)&contact);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("contacts_db_get_record() Failed(%d)", ret);
+               return ret;
+       }
+
+       if (contact->name) {
+               contacts_list_h name_list = (contacts_list_h)contact->name;
+               ctsvc_name_s *name_record;
+               char *temp_name = NULL;
+               contacts_list_first(name_list);
+               len = 0;
+               do {
+                       contacts_list_get_current_record_p(name_list, (contacts_record_h*)&name_record);
+                       if (NULL != name_record) {
+                               char *normalized_name = NULL;
+                               // make display name
+                               temp_len = SAFE_STRLEN(name_record->first) + SAFE_STRLEN(name_record->addition)
+                                                                       + SAFE_STRLEN(name_record->last)+ SAFE_STRLEN(name_record->suffix) + 1;
+                               temp_name = calloc(1, temp_len);
+                               if(name_record->last)
+                                       len += snprintf(temp_name + len, temp_len - len, "%s", name_record->last);
+                               if(name_record->first)
+                                       len += snprintf(temp_name + len, temp_len - len, "%s", name_record->first);
+                               if(name_record->addition)
+                                       len += snprintf(temp_name + len, temp_len - len, "%s", name_record->addition);
+                               if(name_record->suffix)
+                                       len += snprintf(temp_name + len, temp_len - len, "%s", name_record->suffix);
+
+                               ctsvc_normalize_str(temp_name, &normalized_name);
+                               snprintf(query, sizeof(query), "INSERT INTO %s(data_id, contact_id, name, type) "
+                                                               "VALUES(%d, %d, '%s', %d)",     CTS_TABLE_NAME_LOOKUP, name_record->id,
+                                                               contact_id, normalized_name, 0);
+
+                               ret = ctsvc_query_exec(query);
+                               free(temp_name);
+                               free(normalized_name);
+
+                               if (CONTACTS_ERROR_NONE != ret) {
+                                       CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+                                       contacts_record_destroy((contacts_record_h)contact, true);
+                                       return CONTACTS_ERROR_DB;
+                               }
+                       }
+               }while(CONTACTS_ERROR_NONE == contacts_list_next(name_list));
+       }
+
+       if (contact->numbers) {
+               contacts_list_h number_list = (contacts_list_h)contact->numbers;
+               ctsvc_number_s *number_record;
+               contacts_list_first(number_list);
+               len = 0;
+               do {
+                       contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number_record);
+                       if (NULL != number_record) {
+                               char normalized_number[CTSVC_NUMBER_MAX_LEN];
+
+                               ctsvc_normalize_number(number_record->number, normalized_number, CTSVC_NUMBER_MAX_LEN, CTSVC_NUMBER_MAX_LEN -1);
+                               snprintf(query, sizeof(query), "INSERT INTO %s(data_id, contact_id, number, min_match) "
+                                                               "VALUES(%d, %d, '%s', '%s')",   CTS_TABLE_PHONE_LOOKUP, number_record->id,
+                                                               contact_id, normalized_number, number_record->lookup);
+
+                               ret = ctsvc_query_exec(query);
+
+                               if (CONTACTS_ERROR_NONE != ret) {
+                                       CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+                                       contacts_record_destroy((contacts_record_h)contact, true);
+                                       return CONTACTS_ERROR_DB;
+                               }
+                       }
+               }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list));
+       }
+
+       if (contact->nicknames) {
+               contacts_list_h nickname_list = (contacts_list_h)contact->nicknames;
+               ctsvc_nickname_s *nickname;
+               contacts_list_first(nickname_list);
+               do {
+                       contacts_list_get_current_record_p(nickname_list, (contacts_record_h*)&nickname);
+                       if (NULL != nickname && NULL != nickname->nickname) {
+                               char *normalized_nickname = NULL;
+                               ctsvc_normalize_str(nickname->nickname, &normalized_nickname);
+                               snprintf(query, sizeof(query), "INSERT INTO %s(data_id, contact_id, name, type) "
+                                                               "VALUES(%d, %d, '%s', %d)",     CTS_TABLE_NAME_LOOKUP, nickname->id,
+                                                               contact_id, normalized_nickname, 0);
+
+                               ret = ctsvc_query_exec(query);
+                               free(normalized_nickname);
+
+                               if (CONTACTS_ERROR_NONE != ret) {
+                                       CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+                                       contacts_record_destroy((contacts_record_h)contact, true);
+                                       return CONTACTS_ERROR_DB;
+                               }
+                       }
+               }while(CONTACTS_ERROR_NONE == contacts_list_next(nickname_list));
+       }
+
+       contacts_record_destroy((contacts_record_h)contact, true);
+
+       return CONTACTS_ERROR_NONE;
+}
+
 static inline int __ctsvc_update_contact_search_data(int contact_id)
 {
        int ret;
@@ -1075,6 +1029,14 @@ static inline int __ctsvc_update_contact_search_data(int contact_id)
        }
        cts_stmt_finalize(stmt);
 
+       ret = __ctsvc_contact_refresh_lookup_data(contact_id);
+
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("__ctsvc_contact_refresh_lookup_data() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        ret = ctsvc_end_trans(true);
        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Failed(%d)", ret);
 
@@ -1083,24 +1045,30 @@ static inline int __ctsvc_update_contact_search_data(int contact_id)
 
 static int __ctsvc_db_contact_update_record( contacts_record_h record )
 {
-       int i, ret, len;
+       int ret, len = 0;
        int rel_changed = 0;
        int count;
+       int version;
+       char *set = NULL;
        char query[CTS_SQL_MAX_LEN] = {0};
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
-       cts_stmt stmt;
+
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
        snprintf(query, sizeof(query),
                "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" "
                "WHERE contact_id = %d AND deleted = 0", contact->id);
        ret = ctsvc_query_get_first_int_result(query, &count);
-       RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA,
-                       "The index(%d) is Invalid. %d Record(s) is(are) found", contact->id, ret);
-
-       ret = ctsvc_begin_trans();
-       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("The index(%d) is Invalid. %d Record(s) is(are) found", contact->id, ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
 
-       __ctsvc_update_contact_display_name(contact);
+       ctsvc_make_contact_display_name(contact);
        __ctsvc_contact_check_default_data(contact);
 
        //update data
@@ -1128,7 +1096,7 @@ static int __ctsvc_db_contact_update_record( contacts_record_h record )
 
        if (contact->images) {
                int ret = CONTACTS_ERROR_NONE;
-               contacts_record_h record = NULL;
+               contacts_record_h record_image = NULL;
                unsigned int count = 0;
                ctsvc_list_s *list = (ctsvc_list_s*)contact->images;
                ctsvc_image_s *image;
@@ -1137,103 +1105,103 @@ static int __ctsvc_db_contact_update_record( contacts_record_h record )
                for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                        image = (ctsvc_image_s *)cursor->data;
                        contact->image_thumbnail_path = NULL;
+                       contact->image_thumbnail_changed = true;
                }
 
                contacts_list_get_count((contacts_list_h)contact->images, &count);
                if (count) {
                        contacts_list_first((contacts_list_h)contact->images);
-                       ret = contacts_list_get_current_record_p((contacts_list_h)contact->images, &record);
+                       ret = contacts_list_get_current_record_p((contacts_list_h)contact->images, &record_image);
 
                        if (CONTACTS_ERROR_NONE != ret) {
                                CTS_ERR("contacts_list_get_current_record_p() Failed(%d)", ret);
                                ctsvc_end_trans(false);
                                return CONTACTS_ERROR_DB;
                        }
-                       image = (ctsvc_image_s*)record;
+
+                       if (ctsvc_record_check_property_flag((ctsvc_record_s *)record_image, _contacts_image.path, CTSVC_PROPERTY_FLAG_DIRTY))
+                               contact->image_thumbnail_changed = true;
+
+                       image = (ctsvc_image_s*)record_image;
 
                        if ( image->path && *image->path && strstr(image->path, CTS_IMG_FULL_LOCATION) != NULL)
                                contact->image_thumbnail_path = SAFE_STRDUP( image->path + strlen(CTS_IMG_FULL_LOCATION) + 1);
                        else
                                contact->image_thumbnail_path = SAFE_STRDUP(image->path);
-
                }
-               contact->image_thumbnail_changed = true;
        }
        // this code will be removed.
        //////////////////////////////////////////////////////////////////////
 
-       len = snprintf(query, sizeof(query),
-                       "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d, changed_time=%d, "
-                                       "has_phonenumber=%d, has_email=%d ",
-                                       ctsvc_get_next_ver(), (int)time(NULL),
-                                       contact->has_phonenumber, contact->has_email);
-
        if (contact->display_name_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", display_name=?, "
-                                       "reverse_display_name=?, display_name_source=?, display_name_language=?, "
-                                       "sortkey=?, reverse_sortkey=?");
+               ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.display_name, CTSVC_PROPERTY_FLAG_DIRTY);
 
-       if (contact->uid_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", uid=?");
+       if (contact->image_thumbnail_changed)
+               ctsvc_record_set_property_flag((ctsvc_record_s *)contact, _contacts_contact.image_thumbnail_path, CTSVC_PROPERTY_FLAG_DIRTY);
 
-       if (contact->ringtone_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", ringtone_path=?");
+       do {
+               char query[CTS_SQL_MAX_LEN] = {0};
+               char query_set[CTS_SQL_MIN_LEN] = {0, };
+               cts_stmt stmt = NULL;
 
-       if (contact->vibration_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", vibration=?");
+               version = ctsvc_get_next_ver();
 
-       if (contact->image_thumbnail_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path=?");
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (set && *set)
+                       len = snprintf(query_set, sizeof(query_set), "%s, ", set);
+               len += snprintf(query_set+len, sizeof(query_set)-len, " changed_ver=%d, changed_time=%d, has_phonenumber=%d, has_email=%d",
+                               version, (int)time(NULL), contact->has_phonenumber, contact->has_email);
+               if (contact->display_name_changed) {
+                       len += snprintf(query_set+len, sizeof(query_set)-len,
+                                       ", display_name=?, reverse_display_name=?, display_name_source=%d, display_name_language=%d, sortkey=?, reverse_sortkey=?",
+                                       contact->display_source_type, contact->display_name_language);
+                       bind_text = g_slist_append(bind_text, strdup(SAFE_STR(contact->display_name)));
+                       bind_text = g_slist_append(bind_text, strdup(SAFE_STR(contact->reverse_display_name)));
+                       bind_text = g_slist_append(bind_text, strdup(SAFE_STR(contact->sortkey)));
+                       bind_text = g_slist_append(bind_text, strdup(SAFE_STR(contact->reverse_sortkey)));
+               }
 
-       snprintf(query+len, sizeof(query)-len, " WHERE contact_id=%d", contact->id);
+               if (contact->image_thumbnail_changed)
+                       len += snprintf(query_set+len, sizeof(query_set)-len, ", image_changed_ver=%d", version);
 
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("cts_query_prepare() Failed");
-               ctsvc_end_trans(false);
-               return CONTACTS_ERROR_DB;
-       }
+               snprintf(query, sizeof(query), "UPDATE %s SET %s WHERE contact_id = %d", CTS_TABLE_CONTACTS, query_set, contact->id);
 
-       i=1;
-       if (contact->display_name_changed) {
-               cts_stmt_bind_text(stmt, i++, contact->display_name);
-               cts_stmt_bind_text(stmt, i++, contact->reverse_display_name);
-               cts_stmt_bind_int(stmt, i++, contact->display_source_type);
-               cts_stmt_bind_int(stmt, i++, contact->display_name_language);
-               cts_stmt_bind_text(stmt, i++, contact->sortkey);
-               cts_stmt_bind_text(stmt, i++, contact->reverse_sortkey);
-       }
-       if (contact->uid_changed) {
-               if(contact->uid)
-                       cts_stmt_bind_text(stmt, i, contact->uid);
-               i++;
-       }
-       if (contact->ringtone_changed) {
-               if (contact->ringtone_path)
-                       cts_stmt_bind_text(stmt, i, contact->ringtone_path);
-               i++;
-       }
-       if (contact->vibration_changed) {
-               if (contact->vibration)
-                       cts_stmt_bind_text(stmt, i, contact->vibration);
-               i++;
-       }
+               stmt = cts_query_prepare(query);
+               if (NULL == stmt) {
+                       CTS_ERR("DB error : cts_query_prepare() Failed");
+                       ret = CONTACTS_ERROR_DB;
+                       break;
+               }
 
-       if (contact->image_thumbnail_changed ) {
-               if (contact->image_thumbnail_path) {
-                       cts_stmt_bind_text(stmt, i, contact->image_thumbnail_path);
+               if (bind_text) {
+                       int i = 0;
+                       for (cursor=bind_text,i=1;cursor;cursor=cursor->next,i++) {
+                               const char *text = cursor->data;
+                               if (*text)
+                                       cts_stmt_bind_text(stmt, i, text);
+                       }
                }
-               i++;
+               ret = cts_stmt_step(stmt);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
+                       cts_stmt_finalize(stmt);
+                       break;
+               }
+               cts_stmt_finalize(stmt);
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
                ctsvc_end_trans(false);
                return ret;
        }
-       cts_stmt_finalize(stmt);
 
        ctsvc_set_contact_noti();
        if (0 < rel_changed)
@@ -1243,13 +1211,9 @@ static int __ctsvc_db_contact_update_record( contacts_record_h record )
        ctsvc_db_update_person((contacts_record_h)contact);
 
        ret = ctsvc_end_trans(true);
-       if (ret < CONTACTS_ERROR_NONE)
-       {
-               CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
-               return ret;
-       }
-       else
-               return CONTACTS_ERROR_NONE;
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_end_trans() Failed(%d)", ret);
+
+       return CONTACTS_ERROR_NONE;
 }
 
 static int __ctsvc_db_contact_get_all_records( int offset, int limit, contacts_list_h* out_list )
@@ -1349,8 +1313,14 @@ static int __ctsvc_db_contact_get_records_with_query( contacts_query_h query, in
                contact = (ctsvc_contact_s*)record;
                if (0 == s_query->projection_count)
                        field_count = s_query->property_count;
-               else
+               else {
                        field_count = s_query->projection_count;
+                       ret = ctsvc_record_set_projection_flags(record, s_query->projection,
+                                       s_query->projection_count, s_query->property_count);
+
+                       if (CONTACTS_ERROR_NONE != ret)
+                               ASSERT_NOT_REACHED("To set projection is failed.\n");
+               }
 
                for(i=0;i<field_count;i++) {
                        char *temp;
@@ -1640,6 +1610,14 @@ static inline int __ctsvc_contact_insert_search_data(int contact_id)
        }
        cts_stmt_finalize(stmt);
 
+       ret = __ctsvc_contact_refresh_lookup_data(contact_id);
+
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("__ctsvc_contact_refresh_lookup_data() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        ret = ctsvc_end_trans(true);
        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Failed(%d)", ret);
 
@@ -1662,7 +1640,7 @@ static inline int __ctsvc_contact_insert_grouprel(int contact_id, contacts_list_
        contacts_list_first(group_list);
        do {
                contacts_list_get_current_record_p(group_list, (contacts_record_h*)&grouprel);
-               if (NULL == grouprel || grouprel->base.deleted)
+               if (NULL == grouprel)
                        continue;
 
                if (grouprel->group_id) {
@@ -1689,7 +1667,7 @@ inline static int __ctsvc_find_person_to_link_with_number(const char *normalized
 
        ret = ctsvc_clean_number(normalized_number, clean_num, sizeof(clean_num));
        if (0 < ret) {
-               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN);
+               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN, CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE);
                snprintf(query, sizeof(query),
                                "SELECT C.person_id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D "
                                "ON C.contact_id=D.contact_id AND D.datatype=%d AND C.deleted = 0 "
@@ -1753,7 +1731,6 @@ inline static int __ctsvc_find_person_to_link(contacts_record_h record, int *per
        return CONTACTS_ERROR_NO_DATA;
 }
 
-
 static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id)
 {
        int version;
@@ -1766,7 +1743,6 @@ static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id)
        cts_stmt stmt;
 
        // These check should be done in client side
-//     RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record");
        RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER,
                                        "Invalid parameter : contact is NULL");
        RETVM_IF(contact->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -1862,13 +1838,14 @@ static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id)
 
        snprintf(query, sizeof(query),
                "INSERT INTO "CTS_TABLE_CONTACTS"(contact_id, person_id, addressbook_id, is_restricted, "
-                       "created_ver, changed_ver, changed_time, has_phonenumber, has_email, "
+                       "created_ver, changed_ver, changed_time, image_changed_ver, has_phonenumber, has_email, "
                        "display_name, reverse_display_name, display_name_source, display_name_language, "
+                       "sort_name, reverse_sort_name, "
                        "sortkey, reverse_sortkey, "
                        "uid, ringtone_path, vibration, image_thumbnail_path) "
-                       "VALUES(%d, %d, %d, %d, %d, %d, %d, %d, %d, ?, ?, %d, %d, ?, ?, ?, ?, ?, ?)",
+                       "VALUES(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, ?, ?, %d, %d, ?, ?, ?, ?, ?, ?, ?, ?)",
                        contact->id, contact->person_id, contact->addressbook_id, contact->is_restricted,
-                       version, version, (int)time(NULL), contact->has_phonenumber, contact->has_email,
+                       version, version, (int)time(NULL), (NULL !=contact->image_thumbnail_path)?version:0, contact->has_phonenumber, contact->has_email,
                        contact->display_source_type, contact->display_name_language);
 
        stmt = cts_query_prepare(query);
@@ -1882,18 +1859,22 @@ static int __ctsvc_db_contact_insert_record( contacts_record_h record, int *id)
                cts_stmt_bind_text(stmt, 1, contact->display_name);
        if (contact->reverse_display_name)
                cts_stmt_bind_text(stmt, 2, contact->reverse_display_name);
+       if (contact->sort_name)
+               cts_stmt_bind_text(stmt, 3, contact->sort_name);
+       if (contact->reverse_sort_name)
+               cts_stmt_bind_text(stmt, 4, contact->reverse_sort_name);
        if (contact->sortkey)
-               cts_stmt_bind_text(stmt, 3, contact->sortkey);
+               cts_stmt_bind_text(stmt, 5, contact->sortkey);
        if (contact->reverse_sortkey)
-               cts_stmt_bind_text(stmt, 4, contact->reverse_sortkey);
+               cts_stmt_bind_text(stmt, 6, contact->reverse_sortkey);
        if (contact->uid)
-               cts_stmt_bind_text(stmt, 5, contact->uid);
+               cts_stmt_bind_text(stmt, 7, contact->uid);
        if (contact->ringtone_path)
-               cts_stmt_bind_text(stmt, 6, contact->ringtone_path);
+               cts_stmt_bind_text(stmt, 8, contact->ringtone_path);
        if (contact->vibration)
-               cts_stmt_bind_text(stmt, 7, contact->vibration);
+               cts_stmt_bind_text(stmt, 9, contact->vibration);
        if (contact->image_thumbnail_path)
-               cts_stmt_bind_text(stmt, 8, contact->image_thumbnail_path);
+               cts_stmt_bind_text(stmt, 10, contact->image_thumbnail_path);
 
        ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
@@ -1933,23 +1914,28 @@ static int __ctsvc_db_contact_replace_record( contacts_record_h record, int cont
        CTS_FN_CALL;
        int ret, len;
        int rel_changed = 0;
-       int count;
+       int person_id;
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
        cts_stmt stmt;
-
-       snprintf(query, sizeof(query),
-               "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" "
-               "WHERE contact_id = %d AND deleted = 0", contact_id);
-       ret = ctsvc_query_get_first_int_result(query, &count);
-       RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA,
-                       "The index(%d) is Invalid. %d Record(s) is(are) not found", contact->id, ret);
+       int version;
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query),
+               "SELECT person_id FROM "CTS_TABLE_CONTACTS" "
+               "WHERE contact_id = %d AND deleted = 0", contact_id);
+       ret = ctsvc_query_get_first_int_result(query, &person_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("The index(%d) is Invalid. %d Record(s) is(are) not found", contact->id, ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        contact->id = contact_id;
-       __ctsvc_update_contact_display_name(contact);
+       contact->person_id = person_id;
+       ctsvc_make_contact_display_name(contact);
        __ctsvc_contact_check_default_data(contact);
 
        //remove current child data
@@ -2027,17 +2013,23 @@ static int __ctsvc_db_contact_replace_record( contacts_record_h record, int cont
        }
        // this code will be removed.
        //////////////////////////////////////////////////////////////////////
+       version = ctsvc_get_next_ver();
 
        len = snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d, changed_time=%d, "
                                        "has_phonenumber=%d, has_email=%d , display_name=?, "
                                        "reverse_display_name=?, display_name_source=%d, display_name_language=%d, "
+                                       "sort_name=?, reverse_sort_name=?, "
                                        "sortkey=?, reverse_sortkey=?, uid=?, ringtone_path=?, vibration=?, "
-                                       "image_thumbnail_path=? WHERE contact_id=%d",
-                                       ctsvc_get_next_ver(), (int)time(NULL),
+                                       "image_thumbnail_path=?",
+                                       version, (int)time(NULL),
                                        contact->has_phonenumber, contact->has_email,
-                                       contact->display_source_type, contact->display_name_language,
-                                       contact->id);
+                                       contact->display_source_type, contact->display_name_language);
+
+       if (contact->image_thumbnail_changed)
+               len += snprintf(query+len, sizeof(query)-len, ", image_changed_ver = %d", version);
+
+       len += snprintf(query+len, sizeof(query)-len, " WHERE contact_id=%d", contact->id);
 
        stmt = cts_query_prepare(query);
        if (NULL == stmt) {
@@ -2050,18 +2042,22 @@ static int __ctsvc_db_contact_replace_record( contacts_record_h record, int cont
                cts_stmt_bind_text(stmt, 1, contact->display_name);
        if (contact->reverse_display_name)
                cts_stmt_bind_text(stmt, 2, contact->reverse_display_name);
+       if (contact->sort_name)
+               cts_stmt_bind_text(stmt, 3, contact->sort_name);
+       if (contact->reverse_sort_name)
+               cts_stmt_bind_text(stmt, 4, contact->reverse_sort_name);
        if (contact->sortkey)
-               cts_stmt_bind_text(stmt, 3, contact->sortkey);
+               cts_stmt_bind_text(stmt, 5, contact->sortkey);
        if (contact->reverse_sortkey)
-               cts_stmt_bind_text(stmt, 4, contact->reverse_sortkey);
+               cts_stmt_bind_text(stmt, 6, contact->reverse_sortkey);
        if (contact->uid)
-               cts_stmt_bind_text(stmt, 5, contact->uid);
+               cts_stmt_bind_text(stmt, 7, contact->uid);
        if (contact->ringtone_path)
-               cts_stmt_bind_text(stmt, 6, contact->ringtone_path);
+               cts_stmt_bind_text(stmt, 8, contact->ringtone_path);
        if (contact->vibration)
-               cts_stmt_bind_text(stmt, 7, contact->vibration);
+               cts_stmt_bind_text(stmt, 9, contact->vibration);
        if (contact->image_thumbnail_path)
-               cts_stmt_bind_text(stmt, 8, contact->image_thumbnail_path);
+               cts_stmt_bind_text(stmt, 10, contact->image_thumbnail_path);
 
        ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
index 05684a2..4042a1d 100644 (file)
@@ -19,6 +19,8 @@
 #include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <vconf.h>
+#include <vconf-keys.h>
 
 #include "contacts.h"
 #include "ctsvc_internal.h"
@@ -56,8 +58,8 @@
 
 #define CTSVC_MY_IMAGE_LOCATION "/opt/usr/data/contacts-svc/img/my"
 
-int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int index, char *src_img,
-               char *dest_name, int dest_size)
+int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int parent_id, int img_id,
+               char *src_img, char *dest_name, int dest_size)
 {
        int ret;
        char *ext;
@@ -69,13 +71,12 @@ int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int index, char *src_im
        if (NULL == ext || strchr(ext, '/'))
                ext = "";
 
-       snprintf(dest, sizeof(dest), "%s/%d-%d%s",
-                       CTS_IMG_FULL_LOCATION, index, image_type, ext);
+       snprintf(dest, sizeof(dest), "%s/%d_%d-%d%s", CTS_IMG_FULL_LOCATION, parent_id, img_id, image_type, ext);
 
        ret = ctsvc_copy_image(src_img, dest);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "cts_copy_file() Failed(%d)", ret);
 
-       snprintf(dest_name, dest_size, "%d-%d%s", index, image_type, ext);
+       snprintf(dest_name, dest_size, "%d_%d-%d%s", parent_id, img_id, image_type, ext);
        return CONTACTS_ERROR_NONE;
 }
 
@@ -91,15 +92,14 @@ static inline const char* __ctsvc_get_image_column_name(ctsvc_img_e image_type)
        }
 }
 
-int ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int index)
+static int __ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int image_id)
 {
        int ret;
        cts_stmt stmt;
        char *tmp_path;
        char query[CTS_SQL_MIN_LEN] = {0};
-       snprintf(query, sizeof(query),
-                       "SELECT %s FROM %s WHERE contact_id = %d",
-                       __ctsvc_get_image_column_name(image_type), CTS_TABLE_CONTACTS, index);
+
+       snprintf(query, sizeof(query), "SELECT data3 FROM %s WHERE id = %d", CTS_TABLE_DATA, image_id);
 
        stmt = cts_query_prepare(query);
        if (NULL == stmt) {
@@ -125,8 +125,8 @@ int ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int index)
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_contact_update_image_file(int image_type, int index, char *src_img,
-               char *dest_name, int dest_size)
+int ctsvc_contact_update_image_file(int image_type, int parent_id, int img_id,
+               char *src_img, char *dest_name, int dest_size)
 {
        int ret;
        if (src_img && strstr(src_img, CTS_IMG_FULL_LOCATION) != NULL) {
@@ -134,12 +134,12 @@ int ctsvc_contact_update_image_file(int image_type, int index, char *src_img,
                return CONTACTS_ERROR_NONE;
        }
 
-       ret = ctsvc_contact_delete_image_file(image_type, index);
+       ret = __ctsvc_contact_delete_image_file(image_type, img_id);
        WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
-                       "ctsvc_contact_delete_image_file() Failed(%d)", ret);
+                       "__ctsvc_contact_delete_image_file() Failed(%d)", ret);
 
        if (src_img) {
-               ret = ctsvc_contact_add_image_file(image_type, index, src_img, dest_name, dest_size);
+               ret = ctsvc_contact_add_image_file(image_type, parent_id, img_id, src_img, dest_name, dest_size);
                RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_add_image_file() Failed(%d)", ret);
        }
 
@@ -163,7 +163,7 @@ int ctsvc_db_contact_update_changed_time(int contact_id)
        return CONTACTS_ERROR_NONE;
 }
 
-static int __ctsvc_contact_delete_image_file_with_path(const unsigned char* image_path)
+int ctsvc_contact_delete_image_file_with_path(const unsigned char* image_path)
 {
        int ret;
 
@@ -177,51 +177,17 @@ static int __ctsvc_contact_delete_image_file_with_path(const unsigned char* imag
        return CONTACTS_ERROR_NONE;
 }
 
-void ctsvc_db_contact_delete_callback(sqlite3_context * context,
-               int argc, sqlite3_value ** argv)
-{
-       int ret;
-       int contact_id;
-       const unsigned char* image_thumbnail_path;
-       const unsigned char* image_path;
-
-       if (argc > 3) {
-               sqlite3_result_null(context);
-               return;
-       }
-
-       contact_id = sqlite3_value_int(argv[0]);
-       CTS_DBG("contact_id (%d), %c", sqlite3_value_int(argv[0]), contact_id);
-       image_thumbnail_path = sqlite3_value_text(argv[1]);
-       image_path = sqlite3_value_text(argv[2]);
-
-       ret = __ctsvc_contact_delete_image_file_with_path(image_thumbnail_path);
-       WARN_IF (CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
-                       "__ctsvc_contact_delete_image_file_with_path(NORMAL) Failed(%d)", ret);
-
-       ret = __ctsvc_contact_delete_image_file_with_path(image_path);
-       WARN_IF(CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
-                       "__ctsvc_contact_delete_image_file_with_path(FULL) Failed(%d)", ret);
-
-       ret = ctsvc_company_delete_logo_file(contact_id);
-       if (CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret) {
-               CTS_ERR("ctsvc_company_delete_logo_file_with_contact_id() Failed(%d)", ret);
-               return;
-       }
-
-       return;
-}
-
 void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
 {
        char *display = NULL;
        char *sortkey = NULL;
+       char *phonetic = NULL;
        GList *cur;
-       int ret, len, display_len;
+       int ret, len, display_len, temp_len = 0;
 
        ctsvc_name_s *name = NULL;
 
-       contact->display_name_language = CTSVC_LANG_OTHERS;
+       contact->display_name_language = CTSVC_SORT_OTHERS;
 
        if ( contact->name->count > 0 && contact->name->records != NULL && contact->name->records->data != NULL )
        {
@@ -231,15 +197,22 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
        if ( name && ( name->first || name->last) ) {
 
                // make display name
-               display_len = SAFE_STRLEN(name->first)
+               display_len = SAFE_STRLEN(name->prefix)
+                                               + SAFE_STRLEN(name->first)
                                                + SAFE_STRLEN(name->addition)
                                                + SAFE_STRLEN(name->last)
                                                + SAFE_STRLEN(name->suffix) + 5;
                display = calloc(1, display_len);
                len=0;
 
-               if(name->first)
+               if(name->prefix)
+                       len += snprintf(display + len, display_len - len, "%s", name->prefix);
+
+               if(name->first) {
+                       if (*display)
+                               len += snprintf(display + len, display_len - len, " ");
                        len += snprintf(display + len, display_len - len, "%s", name->first);
+               }
 
                if(name->addition) {
                        if (*display)
@@ -264,7 +237,14 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                // make reverse_display_name
                display = calloc(1, display_len);
                len = 0;
+
+               if(name->prefix)
+                       len += snprintf(display + len, display_len - len, "%s", name->prefix);
+
                if(name->last) {
+                       if (*display)
+                               len += snprintf(display + len, display_len - len, " ");
+
                        len += snprintf(display + len, display_len - len, "%s", name->last);
 
                        if(name->first || name->addition)
@@ -289,63 +269,10 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        len += snprintf(display + len, display_len - len, "%s", name->suffix);
                }
 
+               contact->display_name_changed = true;
                contact->reverse_display_name = display;
-
-               ret = ctsvc_check_language_type(contact->display_name);
-               if (0 <= ret) {
-                       if (ctsvc_get_default_language() == ret)
-                               contact->display_name_language = CTSVC_LANG_DEFAULT;
-                       else if (ctsvc_get_secondary_language() == ret)
-                               contact->display_name_language = CTSVC_LANG_SECONDARY;
-                       else
-                               contact->display_name_language = ret;
-               }
-
-               if (ctsvc_has_chinese(contact->display_name)) {
-                       pinyin_name_s *pinyinname = NULL;
-                       int size;
-
-                       ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
-
-                       if (CONTACTS_ERROR_NONE == ret) {
-                               ret = ctsvc_collation_str(pinyinname[0].pinyin_name, &sortkey);
-                               if (CONTACTS_ERROR_NONE == ret) {
-                                       contact->sortkey = sortkey;
-                                       contact->reverse_sortkey = strdup(sortkey);
-                               }
-                               free(pinyinname);
-                       }
-                       else {
-                               ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                               if (CONTACTS_ERROR_NONE == ret)
-                                       contact->sortkey = sortkey;
-                               else
-                                       free(sortkey);
-                               sortkey = NULL;
-
-                               ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey);
-                               if (CONTACTS_ERROR_NONE == ret)
-                                       contact->reverse_sortkey = sortkey;
-                               else
-                                       free(sortkey);
-                       }
-
-               }
-               else {
-                       ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                       if (CONTACTS_ERROR_NONE == ret)
-                               contact->sortkey = sortkey;
-                       else
-                               free(sortkey);
-                       sortkey = NULL;
-
-                       ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey);
-                       if (CONTACTS_ERROR_NONE == ret)
-                               contact->reverse_sortkey = sortkey;
-                       else
-                               free(sortkey);
-
-               }
+               contact->sort_name = SAFE_STRDUP(contact->display_name);
+               contact->reverse_sort_name = SAFE_STRDUP(contact->reverse_display_name);
                contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME;
        }
        else {
@@ -353,6 +280,7 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        for (cur=contact->company->records;cur;cur=cur->next) {
                                ctsvc_company_s *company = (ctsvc_company_s *)cur->data;
                                if (company && company->name) {
+                                       contact->display_name_changed = true;
                                        contact->display_name = SAFE_STRDUP(company->name);
                                        contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY;
                                        break;
@@ -360,10 +288,11 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        }
                }
 
-               if (NULL == contact->display_name && contact->nicknames->records) {
+               if (!contact->display_name_changed && contact->nicknames && contact->nicknames->records) {
                        for (cur=contact->nicknames->records;cur;cur=cur->next) {
                                ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)cur->data;
                                if (nickname && nickname->nickname) {
+                                       contact->display_name_changed = true;
                                        contact->display_name = SAFE_STRDUP(nickname->nickname);
                                        contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME;
                                        break;
@@ -371,10 +300,11 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        }
                }
 
-               if (NULL == contact->display_name && contact->numbers->records) {
+               if (!contact->display_name_changed && contact->numbers && contact->numbers->records) {
                        for (cur=contact->numbers->records;cur;cur=cur->next) {
                                ctsvc_number_s *number = (ctsvc_number_s *)cur->data;
                                if (number && number->number) {
+                                       contact->display_name_changed = true;
                                        contact->display_name = SAFE_STRDUP(number->number);
                                        contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NUMBER;
                                        break;
@@ -382,10 +312,11 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        }
                }
 
-               if (NULL == contact->display_name && contact->emails->records) {
+               if (!contact->display_name_changed && contact->emails && contact->emails->records) {
                        for (cur=contact->emails->records;cur;cur=cur->next) {
                                ctsvc_email_s *email = (ctsvc_email_s *)cur->data;
                                if (email && email->email_addr) {
+                                       contact->display_name_changed = true;
                                        contact->display_name = SAFE_STRDUP(email->email_addr);
                                        contact->display_source_type = CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL;
                                        break;
@@ -393,58 +324,87 @@ void ctsvc_make_contact_display_name(ctsvc_contact_s *contact)
                        }
                }
 
-               if (contact->display_name) {
+               if (contact->display_name_changed) {
                        contact->reverse_display_name = SAFE_STRDUP(contact->display_name);
-                       if (ctsvc_has_chinese(contact->display_name)) {
-                               pinyin_name_s *pinyinname;
-                               int size;
-                               ret = ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size);
-
-                               if (CONTACTS_ERROR_NONE == ret) {
-                                       ret = ctsvc_collation_str(pinyinname[0].pinyin_name, &sortkey);
-                                       if (CONTACTS_ERROR_NONE == ret) {
-                                               contact->sortkey = sortkey;
-                                               contact->reverse_sortkey = strdup(sortkey);
+                       contact->sort_name = SAFE_STRDUP(contact->display_name);
+                       contact->reverse_sort_name = SAFE_STRDUP(contact->display_name);
+               }
+       }
+
+       if (contact->display_name_changed) {
+               ret = ctsvc_get_name_sort_type(contact->display_name);
+               WARN_IF( ret < 0, "ctsvc_check_language_type Failed(%d)", ret);
+
+               switch (ret)
+               {
+               case CTSVC_SORT_CJK:
+                       if (contact->display_source_type == CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NAME) {
+                               len = SAFE_STRLEN(name->phonetic_first) + SAFE_STRLEN(name->phonetic_last) + SAFE_STRLEN(name->phonetic_middle);
+                               if (len > 0) {
+                                       len += 3; // for space and null string
+                                       phonetic = calloc(1, len);
+                                       if (name->phonetic_first)
+                                               temp_len += snprintf(phonetic, len, "%s", name->phonetic_first);
+                                       if (name->phonetic_middle) {
+                                               if (temp_len)
+                                                       temp_len += snprintf(phonetic + temp_len, len - temp_len, " ");
+                                               temp_len += snprintf(phonetic + temp_len, len - temp_len, "%s", name->phonetic_middle);
+                                       }
+                                       if (name->phonetic_last) {
+                                               if (temp_len)
+                                                       temp_len += snprintf(phonetic + temp_len, len - temp_len, " ");
+                                               temp_len += snprintf(phonetic + temp_len, len - temp_len, "%s", name->phonetic_last);
                                        }
-                                       else
-                                               free(sortkey);
-                                       free(pinyinname);
-                               }
-                               else {
-                                       ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                                       if (CONTACTS_ERROR_NONE == ret)
-                                               contact->sortkey = sortkey;
-                                       else
-                                               free(sortkey);
-                                       sortkey = NULL;
-
-                                       ret = ctsvc_collation_str(contact->reverse_display_name, &sortkey);
-                                       if (CONTACTS_ERROR_NONE == ret)
-                                               contact->reverse_sortkey = sortkey;
-                                       else
-                                               free(sortkey);
                                }
                        }
-                       else {
-                               ret = ctsvc_check_language_type(contact->display_name);
-                               if (0 <= ret) {
-                                       if (ctsvc_get_default_language() == ret)
-                                               contact->display_name_language = CTSVC_LANG_DEFAULT;
-                                       else if (ctsvc_get_secondary_language() == ret)
-                                               contact->display_name_language = CTSVC_LANG_SECONDARY;
-                                       else
-                                               contact->display_name_language = ret;
-                               }
 
-                               ret = ctsvc_collation_str(contact->display_name, &sortkey);
-                               if (CONTACTS_ERROR_NONE == ret) {
-                                       contact->sortkey = sortkey;
-                                       contact->reverse_sortkey = strdup(sortkey);
+                       if (phonetic && ctsvc_get_name_sort_type(phonetic) == CTSVC_SORT_JAPANESE) {
+                               ret = CTSVC_SORT_JAPANESE;
+                               FREEandSTRDUP(contact->sort_name, phonetic);
+                               FREEandSTRDUP(contact->reverse_sort_name, phonetic);
+                       }
+                       else {
+                               {
+                                       pinyin_name_s *pinyinname = NULL;
+                                       int size;
+
+                                       if (ctsvc_convert_chinese_to_pinyin(contact->display_name, &pinyinname, &size) == CONTACTS_ERROR_NONE) {
+                                               FREEandSTRDUP(contact->sort_name, pinyinname[0].pinyin_name);
+                                               FREEandSTRDUP(contact->reverse_sort_name, pinyinname[0].pinyin_name);
+                                               free(pinyinname);
+                                       }
+                                       ret = CTSVC_SORT_WESTERN;
                                }
-                               else
-                                       free(sortkey);
+                       }
+                       free(phonetic);
+                       break;
+               case CTSVC_SORT_JAPANESE:
+                       {
+                               ctsvc_convert_japanese_to_hiragana(contact->display_name, &contact->sort_name);
+                               ctsvc_convert_japanese_to_hiragana(contact->reverse_display_name, &contact->reverse_sort_name);
+                               break;
                        }
                }
+
+               if (ctsvc_get_default_language() == ret)
+                       contact->display_name_language = CTSVC_SORT_PRIMARY;
+               else if (ctsvc_get_secondary_language() == ret)
+                       contact->display_name_language = CTSVC_SORT_SECONDARY;
+               else
+                       contact->display_name_language = ret;
+
+               ret = ctsvc_collation_str(contact->sort_name, &sortkey);
+               if (CONTACTS_ERROR_NONE == ret)
+                       contact->sortkey = sortkey;
+               else
+                       free(sortkey);
+               sortkey = NULL;
+
+               ret = ctsvc_collation_str(contact->reverse_sort_name, &sortkey);
+               if (CONTACTS_ERROR_NONE == ret)
+                       contact->reverse_sortkey = sortkey;
+               else
+                       free(sortkey);
        }
 
        return;
@@ -612,7 +572,7 @@ bool ctsvc_contact_check_default_number(contacts_list_h number_list)
        contacts_list_first(number_list);
        do {
                contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number);
-               if (NULL != number && number->number && *number->number && !number->base.deleted) {
+               if (NULL != number && number->number && *number->number) {
                        if (number->is_default && false == has_default)
                                has_default = true;
                        else if (has_default)
@@ -624,7 +584,7 @@ bool ctsvc_contact_check_default_number(contacts_list_h number_list)
                contacts_list_first(number_list);
                do {
                        contacts_list_get_current_record_p(number_list, (contacts_record_h*)&number);
-                       if (NULL != number && number->number && *number->number && !number->base.deleted) {
+                       if (NULL != number && number->number && *number->number) {
                                number->is_default = true;
                                has_default = true;
                                break;
@@ -650,7 +610,7 @@ bool ctsvc_contact_check_default_email(contacts_list_h email_list)
        contacts_list_first(email_list);
        do {
                contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email);
-               if (NULL != email && email->email_addr && *email->email_addr && !email->base.deleted) {
+               if (NULL != email && email->email_addr && *email->email_addr) {
                        if (email->is_default && false == has_default)
                                has_default = true;
                        else if (has_default)
@@ -662,7 +622,7 @@ bool ctsvc_contact_check_default_email(contacts_list_h email_list)
                contacts_list_first(email_list);
                do {
                        contacts_list_get_current_record_p(email_list, (contacts_record_h*)&email);
-                       if (NULL != email && email->email_addr && *email->email_addr && !email->base.deleted) {
+                       if (NULL != email && email->email_addr && *email->email_addr) {
                                email->is_default = true;
                                has_default = true;
                                break;
@@ -724,7 +684,7 @@ int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bo
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                name = (ctsvc_name_s *)cursor->data;
-               ctsvc_db_name_delete(name->id);
+               ctsvc_db_name_delete(name->id, is_my_profile);
        }
 
        contacts_list_first(name_list);
@@ -734,9 +694,9 @@ int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bo
                if (0 < name->id) {
                        if (name->first || name->last || name->addition || name->prefix || name->suffix
                                        || name->phonetic_first || name->phonetic_middle || name->phonetic_last)
-                               ret = ctsvc_db_name_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_name_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_name_delete(name->id);
+                               ret = ctsvc_db_name_delete(name->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_name_insert(record, contact_id, is_my_profile, NULL);
@@ -761,7 +721,7 @@ int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                company = (ctsvc_company_s *)cursor->data;
-               ctsvc_db_company_delete(company->id);
+               ctsvc_db_company_delete(company->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(company_list, &count);
@@ -778,7 +738,7 @@ int ctsvc_contact_update_data_company(contacts_list_h company_list, int contact_
                                || company->phonetic_name)
                                ret = ctsvc_db_company_update(record, contact_id, is_my_profile);
                        else
-                               ret = ctsvc_db_company_delete(company->id);
+                               ret = ctsvc_db_company_delete(company->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_company_insert(record, contact_id, is_my_profile, NULL);
@@ -805,7 +765,7 @@ int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bo
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                note = (ctsvc_note_s *)cursor->data;
-               ctsvc_db_note_delete(note->id);
+               ctsvc_db_note_delete(note->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(note_list, &count);
@@ -818,9 +778,9 @@ int ctsvc_contact_update_data_note(contacts_list_h note_list, int contact_id, bo
                note = (ctsvc_note_s*)record;
                if (0 < note->id) {
                        if (note->note)
-                               ret = ctsvc_db_note_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_note_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_note_delete(note->id);
+                               ret = ctsvc_db_note_delete(note->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_note_insert(record, contact_id, is_my_profile, NULL);
@@ -847,7 +807,7 @@ int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id,
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                event = (ctsvc_event_s *)cursor->data;
-               ctsvc_db_event_delete(event->id);
+               ctsvc_db_event_delete(event->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(event_list, &count);
@@ -860,9 +820,9 @@ int ctsvc_contact_update_data_event(contacts_list_h event_list, int contact_id,
                event = (ctsvc_event_s*)record;
                if (0 < event->id) {
                        if (event->date > 0)
-                               ret = ctsvc_db_event_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_event_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_event_delete(event->id);
+                               ret = ctsvc_db_event_delete(event->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_event_insert(record, contact_id, is_my_profile, NULL);
@@ -889,7 +849,7 @@ int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int cont
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                messenger = (ctsvc_messenger_s *)cursor->data;
-               ctsvc_db_messenger_delete(messenger->id);
+               ctsvc_db_messenger_delete(messenger->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(messenger_list, &count);
@@ -902,9 +862,9 @@ int ctsvc_contact_update_data_messenger(contacts_list_h messenger_list, int cont
                messenger = (ctsvc_messenger_s*)record;
                if (0 < messenger->id) {
                        if (messenger->im_id)
-                               ret = ctsvc_db_messenger_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_messenger_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_messenger_delete(messenger->id);
+                               ret = ctsvc_db_messenger_delete(messenger->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_messenger_insert(record, contact_id, is_my_profile, NULL);
@@ -931,7 +891,7 @@ int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                address = (ctsvc_address_s *)cursor->data;
-               ctsvc_db_address_delete(address->id);
+               ctsvc_db_address_delete(address->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(address_list, &count);
@@ -945,9 +905,9 @@ int ctsvc_contact_update_data_address(contacts_list_h address_list, int contact_
                if (0 < address->id) {
                        if (address->pobox || address->postalcode || address->region || address->locality
                                || address->street || address->extended || address->country)
-                               ret = ctsvc_db_address_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_address_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_address_delete(address->id);
+                               ret = ctsvc_db_address_delete(address->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_address_insert(record, contact_id, is_my_profile, NULL);
@@ -974,7 +934,7 @@ int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                url = (ctsvc_url_s *)cursor->data;
-               ctsvc_db_url_delete(url->id);
+               ctsvc_db_url_delete(url->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(url_list, &count);
@@ -987,9 +947,9 @@ int ctsvc_contact_update_data_url(contacts_list_h url_list, int contact_id, bool
                url = (ctsvc_url_s*)record;
                if (0 < url->id) {
                        if (url->url)
-                               ret = ctsvc_db_url_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_url_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_url_delete(url->id);
+                               ret = ctsvc_db_url_delete(url->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_url_insert(record, contact_id, is_my_profile, NULL);
@@ -1016,7 +976,7 @@ int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                profile = (ctsvc_profile_s *)cursor->data;
-               ctsvc_db_profile_delete(profile->id);
+               ctsvc_db_profile_delete(profile->id, is_my_profile);
        }
        ret = contacts_list_get_count(profile_list, &count);
        if(0 == count)
@@ -1028,9 +988,9 @@ int ctsvc_contact_update_data_profile(contacts_list_h profile_list, int contact_
                profile = (ctsvc_profile_s*)record;
                if (0 < profile->id) {
                        if (profile->appsvc_operation)
-                               ret = ctsvc_db_profile_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_profile_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_profile_delete(profile->id);
+                               ret = ctsvc_db_profile_delete(profile->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_profile_insert(record, contact_id, is_my_profile, NULL);
@@ -1057,7 +1017,7 @@ int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, in
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                relationship = (ctsvc_relationship_s *)cursor->data;
-               ctsvc_db_relationship_delete(relationship->id);
+               ctsvc_db_relationship_delete(relationship->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(relationship_list, &count);
@@ -1070,9 +1030,9 @@ int ctsvc_contact_update_data_relationship(contacts_list_h relationship_list, in
                relationship = (ctsvc_relationship_s*)record;
                if (0 < relationship->id) {
                        if (relationship->name)
-                               ret = ctsvc_db_relationship_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_relationship_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_relationship_delete(relationship->id);
+                               ret = ctsvc_db_relationship_delete(relationship->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_relationship_insert(record, contact_id, is_my_profile, NULL);
@@ -1099,7 +1059,7 @@ int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id,
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                image = (ctsvc_image_s *)cursor->data;
-               ctsvc_db_image_delete(image->id);
+               ctsvc_db_image_delete(image->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(image_list, &count);
@@ -1115,7 +1075,7 @@ int ctsvc_contact_update_data_image(contacts_list_h image_list, int contact_id,
                                if (image->path)
                                        ret = ctsvc_db_image_update(record, contact_id, is_my_profile);
                                else
-                                       ret = ctsvc_db_image_delete(image->id);
+                                       ret = ctsvc_db_image_delete(image->id, is_my_profile);
                        }
                        else
                                ret = ctsvc_db_image_insert(record, contact_id, is_my_profile, NULL);
@@ -1143,7 +1103,7 @@ int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contac
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                nickname = (ctsvc_nickname_s *)cursor->data;
-               ctsvc_db_nickname_delete(nickname->id);
+               ctsvc_db_nickname_delete(nickname->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(nickname_list, &count);
@@ -1156,9 +1116,9 @@ int ctsvc_contact_update_data_nickname(contacts_list_h nickname_list, int contac
                nickname = (ctsvc_nickname_s*)record;
                if (0 < nickname->id) {
                        if (nickname->nickname)
-                               ret = ctsvc_db_nickname_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_nickname_update(record, is_my_profile);
                        else
-                               ret = ctsvc_db_nickname_delete(nickname->id);
+                               ret = ctsvc_db_nickname_delete(nickname->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_nickname_insert(record, contact_id, is_my_profile, NULL);
@@ -1185,7 +1145,7 @@ int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int cont
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                extension = (ctsvc_extension_s *)cursor->data;
-               ctsvc_db_extension_delete(extension->id);
+               ctsvc_db_extension_delete(extension->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(extension_list, &count);
@@ -1200,9 +1160,9 @@ int ctsvc_contact_update_data_extension(contacts_list_h extension_list, int cont
                        if (extension->data2 || extension->data3 || extension->data4 || extension->data5
                                || extension->data6 || extension->data7 || extension->data8 || extension->data9
                                || extension->data10 || extension->data11 || extension->data12)
-                               ret = ctsvc_db_extension_update(record, contact_id, is_my_profile);
+                               ret = ctsvc_db_extension_update(record);
                        else
-                               ret = ctsvc_db_extension_delete(extension->id);
+                               ret = ctsvc_db_extension_delete(extension->id, is_my_profile);
                }
                else
                        ret = ctsvc_db_extension_insert(record, contact_id, is_my_profile, NULL);
@@ -1232,7 +1192,7 @@ int ctsvc_contact_update_data_number(contacts_list_h number_list,
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                number = (ctsvc_number_s *)cursor->data;
-               ctsvc_db_number_delete(number->id);
+               ctsvc_db_number_delete(number->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(number_list, &count);
@@ -1246,9 +1206,9 @@ int ctsvc_contact_update_data_number(contacts_list_h number_list,
                if (number->number) {
                        if (0 < number->id) {
                                if (number->number)
-                                       ret = ctsvc_db_number_update(record, contact_id, is_my_profile);
+                                       ret = ctsvc_db_number_update(record, is_my_profile);
                                else
-                                       ret = ctsvc_db_number_delete(number->id);
+                                       ret = ctsvc_db_number_delete(number->id, is_my_profile);
                        }
                        else
                                ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
@@ -1281,7 +1241,7 @@ int ctsvc_contact_update_data_email(contacts_list_h email_list,
 
        for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
                email = (ctsvc_email_s *)cursor->data;
-               ctsvc_db_email_delete(email->id);
+               ctsvc_db_email_delete(email->id, is_my_profile);
        }
 
        ret = contacts_list_get_count(email_list, &count);
@@ -1295,9 +1255,9 @@ int ctsvc_contact_update_data_email(contacts_list_h email_list,
                if (email->email_addr) {
                        if (0 < email->id) {
                                if (email->email_addr)
-                                       ret = ctsvc_db_email_update(record, contact_id, is_my_profile);
+                                       ret = ctsvc_db_email_update(record, is_my_profile);
                                else
-                                       ret = ctsvc_db_email_delete(email->id);
+                                       ret = ctsvc_db_email_delete(email->id, is_my_profile);
                        }
                        else
                                ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
index 049ed8d..c449026 100644 (file)
@@ -30,15 +30,13 @@ typedef enum
 
 int ctsvc_db_contact_update_changed_time(int contact_id);
 
-int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int index, char *src_img,
-               char *dest_name, int dest_size);
-int ctsvc_contact_update_image_file(int image_type, int index, char *src_img,
-               char *dest_name, int dest_size);
-int ctsvc_contact_delete_image_file(ctsvc_img_e image_type, int index);
+int ctsvc_contact_add_image_file(ctsvc_img_e image_type, int parent_id, int img_id,
+               char *src_img, char *dest_name, int dest_size);
+int ctsvc_contact_update_image_file(int image_type, int parent_id, int img_id,
+               char *src_img, char *dest_name, int dest_size);
 void ctsvc_make_contact_display_name(ctsvc_contact_s *contact);
 
-void ctsvc_db_contact_delete_callback(sqlite3_context * context,
-               int argc, sqlite3_value ** argv);
+int ctsvc_contact_delete_image_file_with_path(const unsigned char* image_path);
 
 int ctsvc_get_data_info_name(cts_stmt stmt, contacts_list_h name_list);
 int ctsvc_get_data_info_event(cts_stmt stmt, contacts_list_h list);
index 1714c85..aca3f7c 100644 (file)
@@ -100,6 +100,7 @@ static int __ctsvc_db_email_insert_record( contacts_record_h record, int *id )
                return ret;
        }
        ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -162,14 +163,14 @@ static int __ctsvc_db_email_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", email->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", email->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_email_update(record, email->contact_id, false);
+       ret = ctsvc_db_email_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("update record failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
@@ -177,12 +178,12 @@ static int __ctsvc_db_email_update_record( contacts_record_h record )
        // TODO ; contact display email update
        ret = ctsvc_db_contact_update_changed_time(email->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
-       ctsvc_set_contact_noti();
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
@@ -212,10 +213,10 @@ static int __ctsvc_db_email_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_email_delete(id);
+       ret = ctsvc_db_email_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -224,12 +225,11 @@ static int __ctsvc_db_email_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
-
-       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 416093d..5a0dd50 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_email_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -55,7 +56,6 @@ int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_p
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_email_s *email = (ctsvc_email_s *)record;
 
-//     RETVM_IF(email->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted email record");
        RETV_IF(NULL == email->email_addr, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert email record ", email->contact_id);
@@ -93,43 +93,43 @@ int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_p
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_email_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_email_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
-       ctsvc_email_s *email = (ctsvc_email_s*)record;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_email_s *email =  (ctsvc_email_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!email->id, CONTACTS_ERROR_INVALID_PARAMETER, "email of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (email->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, email->type, email->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (email->label)
-               cts_stmt_bind_text(stmt, 1, email->label);
-       if (email->email_addr)
-               cts_stmt_bind_text(stmt, 2, email->email_addr);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", email->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, email->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_email_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_email_noti();
-
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_email_delete(int id)
+int ctsvc_db_email_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -139,7 +139,8 @@ int ctsvc_db_email_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_email_noti();
+       if (!is_my_profile)
+               ctsvc_set_email_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index aec0a87..298b539 100644 (file)
@@ -24,8 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_email_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_email_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_email_delete(int id);
+int ctsvc_db_email_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_email_delete(int id, bool is_my_profile);
 
 int ctsvc_db_email_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
index 216236f..71ec513 100644 (file)
@@ -28,6 +28,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_event_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_event_get_record( int id, contacts_record_h* out_record );
@@ -90,10 +91,11 @@ static int __ctsvc_db_event_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(event->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -156,14 +158,14 @@ static int __ctsvc_db_event_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", event->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", event->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_event_update(record, event->contact_id, false);
+       ret = ctsvc_db_event_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("update record failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
@@ -171,10 +173,11 @@ static int __ctsvc_db_event_update_record( contacts_record_h record )
        // TODO ; contact display event update
        ret = ctsvc_db_contact_update_changed_time(event->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -205,10 +208,10 @@ static int __ctsvc_db_event_delete_record( int id )
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_event_delete(id);
+       ret = ctsvc_db_event_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -217,10 +220,11 @@ static int __ctsvc_db_event_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 22ef48c..cd4fee4 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_event_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -34,7 +35,6 @@ int ctsvc_db_event_insert(contacts_record_h record, int contact_id, bool is_my_p
        ctsvc_event_s *event = (ctsvc_event_s *)record;
 
        // These check should be done in client side
-//     RETVM_IF(event->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted event record");
        RETV_IF(event->date <= 0, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert event record", event->contact_id);
@@ -97,42 +97,42 @@ int ctsvc_db_event_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record,
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_event_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_event_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
-       ctsvc_event_s *event = (ctsvc_event_s*)record;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_event_s *event =  (ctsvc_event_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!event->id, CONTACTS_ERROR_INVALID_PARAMETER, "event of contact has no ID.");
-
-       snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=%d, data5=? WHERE id=%d",
-                               contact_id, is_my_profile, event->type, event->is_lunar, event->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (event->label)
-               cts_stmt_bind_text(stmt, 1, event->label);
-       cts_stmt_bind_int(stmt, 2, event->date);
-       cts_stmt_bind_int(stmt, 3, event->lunar_date);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (event->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+       snprintf(query, sizeof(query), "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", event->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, event->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_event_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_event_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_event_delete(int id)
+int ctsvc_db_event_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -143,7 +143,8 @@ int ctsvc_db_event_delete(int id)
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
 
-       ctsvc_set_event_noti();
+       if (!is_my_profile)
+               ctsvc_set_event_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index e9b8a72..e5bf6bd 100644 (file)
@@ -24,8 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_event_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_event_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_event_delete(int id);
+int ctsvc_db_event_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_event_delete(int id, bool is_my_profile);
 
 int ctsvc_db_event_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
index 83528c4..5b2da3d 100644 (file)
@@ -28,6 +28,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_extension_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_extension_get_record( int id, contacts_record_h* out_record );
@@ -67,7 +68,7 @@ static int __ctsvc_db_extension_insert_record( contacts_record_h record, int *id
                        && NULL == extension->data5 && NULL == extension->data6 && NULL == extension->data7
                        && NULL == extension->data8 && NULL == extension->data9 && NULL == extension->data10
                        && NULL == extension->data11 && NULL == extension->data12,
-                       CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+                       CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        ret = ctsvc_begin_trans();
        if (CONTACTS_ERROR_NONE != ret) {
@@ -93,10 +94,11 @@ static int __ctsvc_db_extension_insert_record( contacts_record_h record, int *id
 
        ret = ctsvc_db_contact_update_changed_time(extension->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -160,24 +162,25 @@ static int __ctsvc_db_extension_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", extension->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", extension->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_extension_update(record, extension->contact_id, false);
+       ret = ctsvc_db_extension_update(record);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("update record failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(extension->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -208,10 +211,10 @@ static int __ctsvc_db_extension_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_extension_delete(id);
+       ret = ctsvc_db_extension_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -220,10 +223,11 @@ static int __ctsvc_db_extension_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 8815708..115f382 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_extension_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -101,7 +102,6 @@ int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_extension_s *extension = (ctsvc_extension_s *)record;
 
-//     RETVM_IF(extension->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted extension record");
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert extension record ", extension->contact_id);
        RETVM_IF(0 < extension->id, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -140,41 +140,40 @@ int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_extension_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_extension_update(contacts_record_h record)
 {
-       int ret;
-       ctsvc_extension_s *extension = (ctsvc_extension_s*)record;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_extension_s *extension =  (ctsvc_extension_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!extension->id, CONTACTS_ERROR_INVALID_PARAMETER, "extension of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (extension->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=?, "
-                               "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d",
-                               contact_id, is_my_profile, extension->data1, extension->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       __ctsvc_extension_bind_stmt(stmt, extension, 1);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", extension->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, extension->id))) break;
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
-
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_data_noti();
-
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_extension_delete(int id)
+int ctsvc_db_extension_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -184,7 +183,9 @@ int ctsvc_db_extension_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_data_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_data_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index e039f6a..e876f1a 100644 (file)
@@ -24,9 +24,9 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_extension_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_extension_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_extension_delete(int id);
+int ctsvc_db_extension_update(contacts_record_h record);
+int ctsvc_db_extension_delete(int id, bool is_my_profile);
 
 int ctsvc_db_extension_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
-#endif // __CTSVC_DB_PLUGIN_EXTENSION_HELPER_H__
\ No newline at end of file
+#endif // __CTSVC_DB_PLUGIN_EXTENSION_HELPER_H__
index 761cfd4..1734b09 100644 (file)
@@ -36,6 +36,7 @@ static int __ctsvc_db_group_update_record( contacts_record_h record );
 static int __ctsvc_db_group_delete_record( int id );
 static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_list_h* out_list );
 static int __ctsvc_db_group_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list );
+static double __ctsvc_db_group_get_next_group_prio(void);
 //static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids);
 //static int __ctsvc_db_group_update_records(const contacts_list_h in_list);
 //static int __ctsvc_db_group_delete_records( int ids[], int count);
@@ -62,6 +63,7 @@ static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id )
        int ret;
        int ver;
        cts_stmt stmt;
+       double group_prio = 0.0;
        ctsvc_group_s *group = (ctsvc_group_s *)record;
        char query[CTS_SQL_MAX_LEN] = {0};
        char image[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
@@ -79,15 +81,16 @@ static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id )
                return ret;
        }
 
+       group_prio = __ctsvc_db_group_get_next_group_prio();
        group->id = cts_db_get_next_id(CTS_TABLE_GROUPS);
        if (id)
                *id = group->id;
 
        snprintf(query, sizeof(query),
                        "INSERT INTO "CTS_TABLE_GROUPS"(group_id, addressbook_id, group_name, created_ver, changed_ver, ringtone_path, "
-                                               "vibration, image_thumbnail_path, system_id, is_read_only) "
-                       "VALUES(%d, %d, ?, ?, ?, ?, ?, ?, ?, %d)",
-                       group->id, group->addressbook_id, group->is_read_only);
+                                               "vibration, image_thumbnail_path, system_id, is_read_only, group_prio) "
+                       "VALUES(%d, %d, ?, ?, ?, ?, ?, ?, ?, %d, %lf)",
+                       group->id, group->addressbook_id, group->is_read_only, group_prio);
 
        stmt = cts_query_prepare(query);
        if (NULL == stmt) {
@@ -148,81 +151,94 @@ static int __ctsvc_db_group_insert_record( contacts_record_h record, int *id )
 
 static int __ctsvc_db_group_update_record( contacts_record_h record )
 {
-       int ret;
-       ctsvc_group_s *group = (ctsvc_group_s *)record;
-       char image[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
-       char query[CTS_SQL_MIN_LEN] = {0};
-       cts_stmt stmt;
-       int len;
+       int addressbook_id = 0;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_group_s *group =  (ctsvc_group_s*)record;
+       char query[CTS_SQL_MAX_LEN] = {0};
 
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
        RETVM_IF(CTSVC_RECORD_GROUP != group->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
                        "Invalid parameter : group is invalid type(%d)", group->base.r_type);
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (group->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
        RETVM_IF(NULL == group->name, CONTACTS_ERROR_INVALID_PARAMETER,
                        "Invalid parameter : The name of group is empty.");
 
-       len = snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_GROUPS" SET group_name=?, changed_ver=?, ringtone_path=?, vibration=? ");
-
-       if (group->image_thumbnail_changed)
-               len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path = ? ");
-
-       snprintf(query+len, sizeof(query)-len, "WHERE group_id=%d", group->id);
-
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("DB error : cts_query_prepare() Failed");
-               return CONTACTS_ERROR_DB;
-       }
-
-       ret = ctsvc_begin_trans();
-       if( ret < CONTACTS_ERROR_NONE ) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
+       snprintf(query, sizeof(query),
+                       "SELECT addressbook_id FROM %s WHERE group_id = %d",
+                       CTS_TABLE_GROUPS, group->id);
+       ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
+       if ( ret < CONTACTS_ERROR_NONE) {
+               CTS_ERR("DB error : The group record(%d) is Invalid(%d)", group->id, ret);
                return ret;
        }
 
-       cts_stmt_bind_text(stmt, 1, group->name);
-       cts_stmt_bind_int(stmt, 2, ctsvc_get_next_ver());
-
-       if (group->ringtone_path)
-               cts_stmt_bind_text(stmt, 3, group->ringtone_path);
-
-       if (group->vibration)
-               cts_stmt_bind_text(stmt, 4, group->vibration);
-
        if (group->image_thumbnail_changed) {
-               ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, group->id, group->image_thumbnail_path,
-                       image, sizeof(image));
-               if(CONTACTS_ERROR_NONE != ret) {
-                       CTS_ERR("DB error : ctsvc_change_image() Failed(%d)", ret);
-                       cts_stmt_finalize(stmt);
-                       ctsvc_end_trans(false);
-                       return ret;
-               }
+               char image[CTS_SQL_MAX_LEN] = {0};
+               ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, group->id, group->image_thumbnail_path, image, sizeof(image));
                if (*image) {
                        free(group->image_thumbnail_path);
                        group->image_thumbnail_path = strdup(image);
-                       cts_stmt_bind_text(stmt, 5, image);
                }
+               group->image_thumbnail_changed = false;
        }
 
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
+
+       do {
+               char query[CTS_SQL_MAX_LEN] = {0};
+               char query_set[CTS_SQL_MAX_LEN] = {0};
+               cts_stmt stmt = NULL;
+
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (NULL == set || '\0' == *set)
+                       break;
+               snprintf(query_set, sizeof(query_set), "%s, changed_ver=%d ", set, ctsvc_get_next_ver());
+
+               snprintf(query, sizeof(query), "UPDATE %s SET %s WHERE group_id = %d", CTS_TABLE_GROUPS, query_set, group->id);
+               stmt = cts_query_prepare(query);
+               if (NULL == stmt) {
+                       CTS_ERR("DB error : cts_query_prepare() Failed");
+                       ret = CONTACTS_ERROR_DB;
+                       break;
+               }
+               if (bind_text) {
+                       int i = 0;
+                       for (cursor=bind_text,i=1;cursor;cursor=cursor->next,i++) {
+                               const char *text = cursor->data;
+                               if (text && *text)
+                                       cts_stmt_bind_text(stmt, i, text);
+                       }
+               }
+               ret = cts_stmt_step(stmt);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
+                       cts_stmt_finalize(stmt);
+                       break;
+               }
                cts_stmt_finalize(stmt);
+
+               ctsvc_set_group_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
+       }
+
+       if (CONTACTS_ERROR_NONE != ret) {
                ctsvc_end_trans(false);
                return ret;
        }
-       cts_stmt_finalize(stmt);
-
-       ctsvc_set_group_noti();
 
        ret = ctsvc_end_trans(true);
-       if(ret < CONTACTS_ERROR_NONE ) {
-               CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
-               return ret;
-       }
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_end_trans() Failed(%d)", ret);
 
        return CONTACTS_ERROR_NONE;
 }
@@ -263,14 +279,7 @@ static int __ctsvc_db_group_delete_record( int index )
                return CONTACTS_ERROR_NO_DATA;
        }
 
-       snprintf(query, sizeof(query), "INSERT INTO %s VALUES(%d, %d, %d)",
-                       CTS_TABLE_GROUP_DELETEDS, index, addressbook_id, ctsvc_get_next_ver());
-       ret = ctsvc_query_exec(query);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
-               ctsvc_end_trans(false);
-               return ret;
-       }
+       ctsvc_get_next_ver();
 
        ret = ctsvc_change_image(CTS_GROUP_IMAGE_LOCATION, index, NULL, NULL, 0);
        if (ret < 0) {
@@ -372,7 +381,7 @@ static int __ctsvc_db_group_get_all_records( int offset, int limit, contacts_lis
        len = snprintf(query, sizeof(query),
                        "SELECT group_id, addressbook_id, group_name, system_id, is_read_only, "
                                "ringtone_path, vibration, image_thumbnail_path "
-                               "FROM "CTS_TABLE_GROUPS" ORDER BY addressbook_id, group_name COLLATE NOCASE");
+                               "FROM "CTS_TABLE_GROUPS" ORDER BY addressbook_id, group_prio");
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -500,6 +509,26 @@ static int __ctsvc_db_group_get_records_with_query( contacts_query_h query,
 
        return CONTACTS_ERROR_NONE;
 }
+
+double __ctsvc_db_group_get_next_group_prio(void)
+{
+       int ret;
+       double prio = 0.0;
+       cts_stmt stmt;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query), "SELECT MAX(group_prio) FROM "CTS_TABLE_GROUPS" ");
+
+       stmt = cts_query_prepare(query);
+       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed");
+
+       ret = cts_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/  == ret)
+               prio = ctsvc_stmt_get_dbl(stmt, 0);
+       cts_stmt_finalize(stmt);
+
+       return prio + 1.0;
+}
 //static int __ctsvc_db_group_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; }
 //static int __ctsvc_db_group_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; }
 //static int __ctsvc_db_group_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; }
index bd9acb3..d65126d 100644 (file)
@@ -28,6 +28,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_image_get_record( int id, contacts_record_h* out_record );
@@ -59,6 +60,7 @@ ctsvc_db_plugin_info_s ctsvc_db_plugin_image = {
 static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id )
 {
        int ret;
+       int version;
        int contact_id;
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_image_s *image = (ctsvc_image_s *)record;
@@ -88,13 +90,22 @@ static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id )
                return ret;
        }
 
-       ret = ctsvc_db_contact_update_changed_time(image->contact_id);
+       version = ctsvc_get_next_ver();
+       snprintf(query, sizeof(query),
+               "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d "
+                       "WHERE contact_id = %d",
+                       version, (int)time(NULL), version, image->contact_id);
+
+       ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("cts_query_exec() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
+       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
+
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
@@ -142,6 +153,7 @@ static int __ctsvc_db_image_get_record( int id, contacts_record_h* out_record )
 static int __ctsvc_db_image_update_record( contacts_record_h record )
 {
        int ret;
+       int version;
        int contact_id;
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_image_s *image = (ctsvc_image_s *)record;
@@ -156,9 +168,9 @@ static int __ctsvc_db_image_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", image->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
        ret = ctsvc_db_image_update(record, image->contact_id, false);
@@ -168,13 +180,22 @@ static int __ctsvc_db_image_update_record( contacts_record_h record )
                return ret;
        }
 
-       ret = ctsvc_db_contact_update_changed_time(image->contact_id);
+       version = ctsvc_get_next_ver();
+       snprintf(query, sizeof(query),
+               "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d "
+                       "WHERE contact_id = %d",
+                       version, (int)time(NULL), version, image->contact_id);
+
+       ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("cts_query_exec() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
+       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
+
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
@@ -188,6 +209,7 @@ static int __ctsvc_db_image_update_record( contacts_record_h record )
 static int __ctsvc_db_image_delete_record( int id )
 {
        int ret;
+       int version;
        int contact_id;
        char query[CTS_SQL_MAX_LEN] = {0};
 
@@ -204,22 +226,32 @@ static int __ctsvc_db_image_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_image_delete(id);
+       ret = ctsvc_db_image_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
-       ret = ctsvc_db_contact_update_changed_time(contact_id);
+       version = ctsvc_get_next_ver();
+       snprintf(query, sizeof(query),
+               "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d "
+                       "WHERE contact_id = %d",
+                       version, (int)time(NULL), version, contact_id);
+
+       ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("cts_query_exec() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+
+       ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
+
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
index 8e49099..63eab60 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_image_helper.h"
 #include "ctsvc_db_plugin_contact_helper.h"
 #include "ctsvc_record.h"
@@ -66,21 +67,22 @@ static inline int __ctsvc_image_bind_stmt(cts_stmt stmt, ctsvc_image_s *image, i
 int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id)
 {
        int ret;
+       int image_id;
        cts_stmt stmt = NULL;
        char query[CTS_SQL_MAX_LEN] = {0};
        char image_path[CTS_SQL_MAX_LEN] = {0};
        ctsvc_image_s *image = (ctsvc_image_s *)record;
 
        // These check should be done in client side
-//     RETVM_IF(image->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted image record");
        RETV_IF(NULL == image->path, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert image record", image->contact_id);
        RETVM_IF(0 < image->id, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : id(%d), This record is already inserted", image->id);
 
-       ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact_id, image->path,
-                       image_path, sizeof(image_path));
+       image_id = cts_db_get_next_id(CTS_TABLE_DATA);
+       ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact_id, image_id, image->path, image_path, sizeof(image_path));
+
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("ctsvc_contact_add_image_file(NORMAL) Failed(%d)", ret);
                return ret;
@@ -89,9 +91,9 @@ int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_p
        image->path = strdup(image_path);
 
        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_IMAGE, image->is_default, image->type);
+                       "INSERT INTO "CTS_TABLE_DATA"(id, contact_id, is_my_profile, datatype, is_default, data1, data2, data3) "
+                       "VALUES(%d, %d, %d, %d, %d, %d, ?, ?)",
+                       image_id, contact_id, is_my_profile, CTSVC_DATA_IMAGE, image->is_default, image->type);
 
        stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
@@ -118,50 +120,53 @@ int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_p
 
 int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_image_s *image = (ctsvc_image_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       char image_path[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!image->id, CONTACTS_ERROR_INVALID_PARAMETER, "image of contact has no ID.");
-
-       ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact_id,
-                               image->path, image_path, sizeof(image_path));
-
-       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_update_image_file() Failed(%d)", ret);
-
-       if (*image_path) {
-               free(image->path);
-               image->path = strdup(image_path);
-       }
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (image->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, image->is_default, image->type, image->id);
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", image->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
 
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
+       if (image->is_changed) {
+               char image_path[CTS_SQL_MAX_LEN] = {0};
 
-       __ctsvc_image_bind_stmt(stmt, image, 1);
+               ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact_id, image->id, image->path, image_path, sizeof(image_path));
+               RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_contact_update_image_file() Failed(%d)", ret);
 
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+               if (*image_path) {
+                       free(image->path);
+                       image->path = strdup(image_path);
+               }
+               image->is_changed = false;
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_image_noti();
-       image->is_changed = false;
-
-       return CONTACTS_ERROR_NONE;
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, image->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_image_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
+       }
+       return ret;
 }
 
-int ctsvc_db_image_delete(int id)
+int ctsvc_db_image_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -171,8 +176,29 @@ int ctsvc_db_image_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_image_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_image_noti();
 
        return CONTACTS_ERROR_NONE;
 }
 
+void ctsvc_db_data_image_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv)
+{
+       int ret;
+       const unsigned char* image_path;
+
+       if (argc > 1) {
+               sqlite3_result_null(context);
+               return;
+       }
+       image_path = sqlite3_value_text(argv[0]);
+
+       ret = ctsvc_contact_delete_image_file_with_path(image_path);
+       WARN_IF (CONTACTS_ERROR_NONE != ret && CONTACTS_ERROR_NO_DATA != ret,
+                       "ctsvc_contact_delete_image_file_with_path(NORMAL) Failed(%d)", ret);
+
+       return;
+}
+
+
index e06b54b..a7ca6b0 100644 (file)
@@ -25,8 +25,8 @@
 
 int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
 int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_image_delete(int id);
-
+int ctsvc_db_image_delete(int id, bool is_my_profile);
 int ctsvc_db_image_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
+void ctsvc_db_data_image_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv);
 
 #endif // __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__
index 6eca202..4d6f05b 100644 (file)
@@ -90,10 +90,11 @@ static int __ctsvc_db_messenger_insert_record( contacts_record_h record, int *id
 
        ret = ctsvc_db_contact_update_changed_time(messenger->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -156,24 +157,25 @@ static int __ctsvc_db_messenger_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", messenger->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", messenger->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_messenger_update(record, messenger->contact_id, false);
+       ret = ctsvc_db_messenger_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(messenger->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -204,10 +206,10 @@ static int __ctsvc_db_messenger_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_messenger_delete(id);
+       ret = ctsvc_db_messenger_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -216,10 +218,11 @@ static int __ctsvc_db_messenger_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 204513c..958bf00 100644 (file)
@@ -21,6 +21,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_messenger_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -55,7 +56,6 @@ int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_
        ctsvc_messenger_s *messenger =(ctsvc_messenger_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
 
-//     RETVM_IF(messenger->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted messenger record");
        RETV_IF(NULL == messenger->im_id, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert messenger record ", messenger->contact_id);
@@ -95,42 +95,43 @@ int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_messenger_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_messenger_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_messenger_s *messenger = (ctsvc_messenger_s*)record;
-       char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
+       char query[CTS_SQL_MIN_LEN] = {0};
 
        RETVM_IF(!messenger->id, CONTACTS_ERROR_INVALID_PARAMETER, "messenger of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (messenger->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, messenger->type, messenger->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (messenger->label)
-               cts_stmt_bind_text(stmt, 1, messenger->label);
-       if (messenger->im_id)
-               cts_stmt_bind_text(stmt, 2, messenger->im_id);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", messenger->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, messenger->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_messenger_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_messenger_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_messenger_delete(int id)
+int ctsvc_db_messenger_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -140,7 +141,9 @@ int ctsvc_db_messenger_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_messenger_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_messenger_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index c501fed..f7e3671 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_messenger_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_messenger_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_messenger_delete(int id);
-
+int ctsvc_db_messenger_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_messenger_delete(int id, bool is_my_profile);
 int ctsvc_db_messenger_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_MESSENGER_HELPER_H__
index 248b739..358bce7 100644 (file)
@@ -107,8 +107,6 @@ static int __ctsvc_db_get_my_profile_base_info(int id, ctsvc_my_profile_s *my_pr
        return CONTACTS_ERROR_NONE;
 }
 
-
-
 static int __ctsvc_db_my_profile_get_data(int id, ctsvc_my_profile_s *my_profile)
 {
        int ret, len;
@@ -223,12 +221,23 @@ static int __ctsvc_db_my_profile_delete_record( int id )
 {
        CTS_FN_CALL;
        int ret;
+       int addressbook_id;
        char query[CTS_SQL_MAX_LEN] = {0};
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
 
-       snprintf(query, sizeof(query), "DELETE FROM %s WHERE my_profile_id = %d", CTS_TABLE_MY_PROFILES, id);
+       snprintf(query, sizeof(query),
+               "SELECT addressbook_id FROM "CTSVC_DB_VIEW_MY_PROFILE" WHERE my_profile_id = %d", id);
+       ret  = ctsvc_query_get_first_int_result(query, &addressbook_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("ctsvc_query_get_first_int_result Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_MY_PROFILES" "
+                                       "SET deleted = 1, changed_ver = %d WHERE my_profile_id = %d", ctsvc_get_next_ver(), id);
        ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
@@ -490,15 +499,18 @@ static int __ctsvc_db_my_profile_update_record( contacts_record_h record )
        ctsvc_my_profile_s *my_profile = (ctsvc_my_profile_s*)record;
        cts_stmt stmt;
 
-       snprintf(query, sizeof(query),
-               "SELECT count(my_profile_id) FROM "CTS_TABLE_MY_PROFILES" WHERE my_profile_id = %d", my_profile->id);
-       ret = ctsvc_query_get_first_int_result(query, &count);
-       RETVM_IF(1 != count, CONTACTS_ERROR_NO_DATA,
-                       "The index(%d) is Invalid. %d Record(s) is(are) found", my_profile->id, ret);
-
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query),
+               "SELECT count(my_profile_id) FROM "CTSVC_DB_VIEW_MY_PROFILE" WHERE my_profile_id = %d", my_profile->id);
+       ret = ctsvc_query_get_first_int_result(query, &count);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("The index(%d) is Invalid. %d Record(s) is(are) found", my_profile->id, ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        __ctsvc_update_my_profile_display_name(my_profile);
        __ctsvc_my_profile_check_default_data(my_profile);
 
@@ -523,7 +535,7 @@ static int __ctsvc_db_my_profile_update_record( contacts_record_h record )
                ctsvc_image_s *image;
                GList *cursor;
 
-               for(cursor = list->deleted_records;cursor;cursor=cursor->next) {
+               for(cursor=list->deleted_records;cursor;cursor=cursor->next) {
                        image = (ctsvc_image_s *)cursor->data;
                        my_profile->image_thumbnail_path = NULL;
                }
@@ -600,7 +612,7 @@ static int __ctsvc_db_my_profile_get_all_records( int offset, int limit, contact
        contacts_list_h list;
 
        len = snprintf(query, sizeof(query),
-                       "SELECT my_profile_id FROM "CTS_TABLE_MY_PROFILES);
+                       "SELECT my_profile_id FROM "CTSVC_DB_VIEW_MY_PROFILE);
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -694,8 +706,14 @@ static int __ctsvc_db_my_profile_get_records_with_query( contacts_query_h query,
                my_profile = (ctsvc_my_profile_s*)record;
                if (0 == s_query->projection_count)
                        field_count = s_query->property_count;
-               else
+               else {
                        field_count = s_query->projection_count;
+                       ret = ctsvc_record_set_projection_flags(record, s_query->projection,
+                                       s_query->projection_count, s_query->property_count);
+
+                       if (CONTACTS_ERROR_NONE != ret)
+                               ASSERT_NOT_REACHED("To set projection is failed.\n");
+               }
 
                for(i=0;i<field_count;i++) {
                        char *temp;
@@ -985,7 +1003,6 @@ static int __ctsvc_db_my_profile_insert_record( contacts_record_h record, int *i
        cts_stmt stmt;
 
        // These check should be done in client side
-//     RETVM_IF(my_profile->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted my_profile record");
        RETVM_IF(NULL == my_profile, CONTACTS_ERROR_INVALID_PARAMETER,
                                        "Invalid parameter : my_profile is NULL");
        RETVM_IF(my_profile->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -996,6 +1013,10 @@ static int __ctsvc_db_my_profile_insert_record( contacts_record_h record, int *i
        ret = ctsvc_begin_trans();
        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_MY_PROFILES" WHERE addressbook_id = %d AND deleted = 1", my_profile->addressbook_id);
+       ret = ctsvc_query_exec(query);
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "Delete deleted my_profile of addressbook(%d) failed", my_profile->addressbook_id);
+
        ret = cts_db_get_next_id(CTS_TABLE_MY_PROFILES);
        if (ret < CONTACTS_ERROR_NONE) {
                CTS_ERR("cts_db_get_next_id() Failed(%d)", ret);
index 15ac142..a4c39d0 100644 (file)
@@ -29,6 +29,7 @@
 #include "ctsvc_db_plugin_name_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_name_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_name_get_record( int id, contacts_record_h* out_record );
@@ -89,10 +90,11 @@ static int __ctsvc_db_name_insert_record( contacts_record_h record, int *id )
        // TODO ; contact name update
        ret = ctsvc_db_contact_update_changed_time(name->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -155,12 +157,12 @@ static int __ctsvc_db_name_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", name->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", name->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_name_update(record, name->contact_id, false);
+       ret = ctsvc_db_name_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -170,10 +172,11 @@ static int __ctsvc_db_name_update_record( contacts_record_h record )
        // TODO ; contact display name update
        ret = ctsvc_db_contact_update_changed_time(name->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -205,10 +208,10 @@ static int __ctsvc_db_name_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_name_delete(id);
+       ret = ctsvc_db_name_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -218,10 +221,11 @@ static int __ctsvc_db_name_delete_record( int id )
        // TODO ; contact name update
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 527b504..7c6cde0 100644 (file)
@@ -23,6 +23,7 @@
 #include "ctsvc_sqlite.h"
 #include "ctsvc_normalize.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_name_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_setting.h"
@@ -99,15 +100,13 @@ static int __ctsvc_normalize_name(ctsvc_name_s *src, char *dest[])
        int language_type = 0;
 
        if (src->first) {
-               dest[CTSVC_NN_FIRST] = calloc(1, strlen(src->first)* 5);
-               ret = ctsvc_normalize_str(src->first, dest[CTSVC_NN_FIRST], strlen(src->first)*5);
+               ret = ctsvc_normalize_str(src->first, &dest[CTSVC_NN_FIRST]);
                RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "_cts_normalize_str() Failed(%d)", ret);
                language_type = ret;
        }
 
        if (src->last) {
-               dest[CTSVC_NN_LAST] = calloc(1, strlen(src->last)* 5);
-               ret = ctsvc_normalize_str(src->last, dest[CTSVC_NN_LAST], strlen(src->last)*5);
+               ret = ctsvc_normalize_str(src->last, &dest[CTSVC_NN_LAST]);
                RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "_cts_normalize_str() Failed(%d)", ret);
                if (language_type < ret)
                        language_type = ret;
@@ -128,7 +127,6 @@ int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_pr
 
        RETV_IF(NULL == name, CONTACTS_ERROR_INVALID_PARAMETER);
 
-//     RETVM_IF(name->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted name record");
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert name record ", name->contact_id);
        RETVM_IF(0 < name->id, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -199,9 +197,6 @@ int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_pr
                __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST,
                                                                        temp_normal_first, temp_normal_last, &name->reverse_lookup);
 
-//             CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)",
-//                             lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup));
-
                free(normal_name[CTSVC_NN_FIRST]);
                free(normal_name[CTSVC_NN_LAST]);
 
@@ -270,26 +265,28 @@ int ctsvc_db_name_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record,
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_name_update(contacts_record_h record, bool is_my_profile)
 {
        int ret, len=0;
+       int id;
+       char* set = NULL;
+       GSList *cursor = NULL;
+       GSList *bind_text = NULL;
        ctsvc_name_s *name = (ctsvc_name_s*)record;
        char *tmp_first, *tmp_last;
-       char query[CTS_SQL_MAX_LEN] = {0};
        char *normal_name[CTSVC_NN_MAX] = {NULL};
        char *temp_normal_first = NULL;
        char *temp_normal_last = NULL;
-       cts_stmt stmt;
+       char query[CTS_SQL_MIN_LEN] = {0};
 
        RETV_IF(false == name->is_changed, CONTACTS_ERROR_NONE);
        RETVM_IF(!name->id, CONTACTS_ERROR_INVALID_PARAMETER, "name of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (name->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, is_default=?, data1=?, data2=?, data3=?, data4=?,"
-                       "data5=?, data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=? WHERE id=%d", contact_id, is_my_profile, name->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", name->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
 
        tmp_first = name->first;
        tmp_last = name->last;
@@ -297,7 +294,6 @@ int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_pr
        ret = __ctsvc_normalize_name(name, normal_name);
        if (ret < CONTACTS_ERROR_NONE) {
                CTS_ERR("cts_normalize_name() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
                return ret;
        }
 
@@ -344,32 +340,36 @@ int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_pr
        __ctsvc_make_name_lookup(CONTACTS_NAME_DISPLAY_ORDER_LASTFIRST,
                                                                temp_normal_first, temp_normal_last, &name->reverse_lookup);
 
-//     CTS_DBG("lookup=%s(%d), reverse_lookup=%s(%d)",
-//                     lookup, strlen(lookup), reverse_lookup, strlen(reverse_lookup));
-
        free(normal_name[CTSVC_NN_FIRST]);
        free(normal_name[CTSVC_NN_LAST]);
 
-       __ctsvc_name_bind_stmt(stmt, name, 1);
-       name->contact_id = contact_id;
+       do {
+               char query_set[CTS_SQL_MAX_LEN] = {0};
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               snprintf(query_set, sizeof(query_set), "%s, is_default=%d, data1=%d, data11=?, data12=?",
+                               set, name->is_default, name->language_type);
+               bind_text = g_slist_append(bind_text, strdup(SAFE_STR(name->lookup)));
+               bind_text = g_slist_append(bind_text, strdup(SAFE_STR(name->reverse_lookup)));
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(query_set, bind_text, CTS_TABLE_DATA, name->id))) break;
 
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+               if (!is_my_profile)
+                       ctsvc_set_name_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
-       cts_stmt_finalize(stmt);
 
-       if (!is_my_profile)
-               ctsvc_set_name_noti();
        name->is_changed = false;
 
-
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_name_delete(int id)
+int ctsvc_db_name_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -378,7 +378,9 @@ int ctsvc_db_name_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_name_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_name_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index 4539a0f..f73f940 100644 (file)
@@ -24,8 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_name_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_name_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_name_delete(int id);
+int ctsvc_db_name_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_name_delete(int id, bool is_my_profile);
 
 int ctsvc_db_name_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
index 62b5be7..f427641 100644 (file)
@@ -27,6 +27,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_nickname_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_nickname_get_record( int id, contacts_record_h* out_record );
@@ -89,10 +90,11 @@ static int __ctsvc_db_nickname_insert_record( contacts_record_h record, int *id
 
        ret = ctsvc_db_contact_update_changed_time(nickname->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -155,24 +157,25 @@ static int __ctsvc_db_nickname_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", nickname->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", nickname->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_nickname_update(record, nickname->contact_id, false);
+       ret = ctsvc_db_nickname_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(nickname->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
 
@@ -204,10 +207,10 @@ static int __ctsvc_db_nickname_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_nickname_delete(id);
+       ret = ctsvc_db_nickname_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -216,10 +219,11 @@ static int __ctsvc_db_nickname_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index e1b59c0..57fdf92 100644 (file)
@@ -21,6 +21,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_nickname_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -54,7 +55,6 @@ int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_m
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_nickname_s *nickname = (ctsvc_nickname_s *)record;
 
-//     RETVM_IF(nickname->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted nickname record");
        RETV_IF(NULL == nickname->nickname, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert nickname record ", nickname->contact_id);
@@ -91,42 +91,42 @@ int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_m
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_nickname_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_nickname_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!nickname->id, CONTACTS_ERROR_INVALID_PARAMETER, "nickname of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (nickname->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, nickname->type, nickname->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (nickname->label)
-               cts_stmt_bind_text(stmt, 1, nickname->label);
-       if (nickname->nickname)
-               cts_stmt_bind_text(stmt, 2, nickname->nickname);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", nickname->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, nickname->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_nickname_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
-
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_nickname_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_nickname_delete(int id)
+int ctsvc_db_nickname_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -136,7 +136,9 @@ int ctsvc_db_nickname_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_nickname_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_nickname_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index f94fde4..0041f9e 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_nickname_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_nickname_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_nickname_delete(int id);
-
+int ctsvc_db_nickname_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_nickname_delete(int id, bool is_my_profile);
 int ctsvc_db_nickname_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_NICKNAME_HELPER_H__
index 6b6702f..6673cee 100644 (file)
 #include "ctsvc_sqlite.h"
 #include "ctsvc_utils.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_contact_helper.h"
 #include "ctsvc_db_plugin_note_helper.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
 #include "ctsvc_record.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_note_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_note_get_record( int id, contacts_record_h* out_record );
@@ -123,10 +125,11 @@ static int __ctsvc_db_note_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(note->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -155,14 +158,14 @@ static int __ctsvc_db_note_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", note->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", note->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_note_update(record, note->contact_id, false);
+       ret = ctsvc_db_note_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
@@ -170,10 +173,11 @@ static int __ctsvc_db_note_update_record( contacts_record_h record )
        // TODO ; contact display note update
        ret = ctsvc_db_contact_update_changed_time(note->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -205,10 +209,10 @@ static int __ctsvc_db_note_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_note_delete(id);
+       ret = ctsvc_db_note_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -218,10 +222,11 @@ static int __ctsvc_db_note_delete_record( int id )
        // TODO ; contact name update
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index d0d04f1..df3de40 100644 (file)
 #include "ctsvc_sqlite.h"
 #include "ctsvc_utils.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_note_helper.h"
 #include "ctsvc_notification.h"
+#include "ctsvc_record.h"
 
 int ctsvc_db_note_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count)
 {
@@ -54,7 +56,6 @@ int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_pr
        ctsvc_note_s *note = (ctsvc_note_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
 
-//     RETVM_IF(note->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted note record");
        RETV_IF(NULL == note->note, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert note record ", note->contact_id);
@@ -86,40 +87,44 @@ int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_pr
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_note_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_note_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_note_s *note = (ctsvc_note_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!note->id, CONTACTS_ERROR_INVALID_PARAMETER, "note of contact has no ID.");
-       snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, note->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (note->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
-       if (note->note)
-               sqlite3_bind_text(stmt, 1, note->note,
-                       strlen(note->note), SQLITE_STATIC);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", note->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, note->id))) break;
+
+               if (!is_my_profile)
+                       ctsvc_set_messenger_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_note_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_note_delete(int id)
+int ctsvc_db_note_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -129,7 +134,9 @@ int ctsvc_db_note_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_note_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_note_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index f0b3407..1fa1ef0 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_note_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_note_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_note_delete(int id);
-
+int ctsvc_db_note_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_note_delete(int id, bool is_my_profile);
 int ctsvc_db_note_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_NOTE_HELPER_H__
index d6d8335..52370d3 100644 (file)
@@ -57,11 +57,112 @@ ctsvc_db_plugin_info_s ctsvc_db_plugin_number = {
        .replace_records = NULL,
 };
 
+static int __ctsvc_db_number_get_person_id_by_contact_id(int contact_id)
+{
+       int ret;
+       int person_id;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query), "SELECT person_id FROM "CTS_TABLE_CONTACTS" WHERE contact_id=%d", contact_id);
+       ret = ctsvc_query_get_first_int_result(query, &person_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               return 0;
+       }
+       return person_id;
+}
+
+static int __ctsvc_db_number_get_person_default_number(int person_id)
+{
+       int ret;
+       int default_number_id;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       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 = %d",
+               person_id, CTSVC_DATA_NUMBER, 1);
+       ret = ctsvc_query_get_first_int_result(query, &default_number_id);
+       if (CONTACTS_ERROR_NONE != ret)
+               return 0;
+       return default_number_id;
+}
+
+
+static int __ctsvc_db_number_update_person_hasphonenumber(int person_id, bool has_phonenumber)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query),
+                       "UPDATE "CTS_TABLE_PERSONS" SET has_phonenumber = %d WHERE person_id = %d",
+                       has_phonenumber, person_id);
+
+       ret = ctsvc_query_exec(query);
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
+       return ret;
+}
+
+static int __ctsvc_db_number_reset_default(int number_id, int contact_id)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query),
+                       "UPDATE "CTS_TABLE_DATA" SET is_default = %d WHERE id != %d AND contact_id = %d AND is_default = %d AND datatype = %d",
+                       0, number_id, contact_id, 1, CTSVC_DATA_NUMBER);
+       ret = ctsvc_query_exec(query);
+
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
+       return ret;
+}
+
+static int __ctsvc_db_number_update_default(int number_id, int contact_id)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query),
+                       "UPDATE "CTS_TABLE_DATA" SET is_default = %d WHERE id = %d",
+                       1, number_id);
+       ret = ctsvc_query_exec(query);
+
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
+       return ret;
+}
+
+static int __ctsvc_db_number_get_primary_default(int contact_id)
+{
+       int ret;
+       int number_id = 0;
+       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);
+       ret = ctsvc_query_get_first_int_result(query, &number_id);
+       if (CONTACTS_ERROR_NONE != ret)
+               return 0;
+       return number_id;
+}
+
+static int __ctsvc_db_number_set_primary_default(int number_id, bool is_primary_default)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query),
+                       "UPDATE "CTS_TABLE_DATA" SET is_primary_default = %d WHERE id = %d",
+                       is_primary_default, number_id);
+       ret = ctsvc_query_exec(query);
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
+       return ret;
+}
 
 static int __ctsvc_db_number_insert_record( contacts_record_h record, int *id )
 {
        int ret;
        int contact_id;
+       int person_id;
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_number_s *number = (ctsvc_number_s *)record;
        RETVM_IF(NULL == number->number, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -101,8 +202,21 @@ static int __ctsvc_db_number_insert_record( contacts_record_h record, int *id )
                return ret;
        }
 
-       // should update person default number
+       person_id = __ctsvc_db_number_get_person_id_by_contact_id(contact_id);
+       __ctsvc_db_number_update_person_hasphonenumber(person_id, true);
+
+       if (number->is_default) {
+               int old_primary_default_number_id;
+               __ctsvc_db_number_reset_default(number->id, contact_id);
+               old_primary_default_number_id = __ctsvc_db_number_get_primary_default(contact_id);
+               if (old_primary_default_number_id) {
+                       __ctsvc_db_number_set_primary_default(old_primary_default_number_id, false);
+                       __ctsvc_db_number_set_primary_default(number->id, true);
+               }
+       }
+
        ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -121,7 +235,7 @@ static int __ctsvc_db_number_get_record( int id, contacts_record_h* out_record )
        cts_stmt stmt = NULL;
 
        snprintf(query, sizeof(query),
-               "SELECT id, contact_id, is_default, type, label, number, lookup "
+               "SELECT id, contact_id, is_default, data1, data2, data3, data4 "
                                "FROM "CTSVC_DB_VIEW_NUMBER" WHERE id = %d", id);
 
        stmt = cts_query_prepare(query);
@@ -159,10 +273,10 @@ static int __ctsvc_db_number_update_record( contacts_record_h record )
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_number_update(record, number->contact_id, false);
+       ret = ctsvc_db_number_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -181,8 +295,18 @@ static int __ctsvc_db_number_update_record( contacts_record_h record )
                return ret;
        }
 
-       // should update person default number
+       if (number->is_default) {
+               int old_primary_default_number_id;
+               __ctsvc_db_number_reset_default(number->id, contact_id);
+               old_primary_default_number_id = __ctsvc_db_number_get_primary_default(contact_id);
+               if (old_primary_default_number_id) {
+                       __ctsvc_db_number_set_primary_default(old_primary_default_number_id, false);
+                       __ctsvc_db_number_set_primary_default(number->id, true);
+               }
+       }
+
        ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -197,9 +321,14 @@ static int __ctsvc_db_number_update_record( contacts_record_h record )
 static int __ctsvc_db_number_delete_record( int id )
 {
        int ret;
+       int number_id;
        int contact_id;
+       int person_id;
+       int is_default;
+       int is_primary_default;
        char query[CTS_SQL_MAX_LEN] = {0};
        bool has_phonenumber = false;
+       cts_stmt stmt = NULL;
 
        ret = ctsvc_begin_trans();
        if (CONTACTS_ERROR_NONE != ret) {
@@ -217,7 +346,25 @@ static int __ctsvc_db_number_delete_record( int id )
                return ret;
        }
 
-       ret = ctsvc_db_number_delete(id);
+       snprintf(query, sizeof(query),
+                       "SELECT is_default, is_primary_default FROM "CTS_TABLE_DATA" WHERE id = %d", id);
+
+       stmt = cts_query_prepare(query);
+       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
+
+       ret = cts_stmt_step(stmt);
+       if (1 != ret) {
+               CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+               cts_stmt_finalize(stmt);
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_NO_DATA;
+       }
+       is_default = ctsvc_stmt_get_int(stmt, 0);
+       is_primary_default = ctsvc_stmt_get_int(stmt, 1);
+       cts_stmt_finalize(stmt);
+
+       ret = ctsvc_db_number_delete(id, false);
+
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -225,8 +372,9 @@ static int __ctsvc_db_number_delete_record( int id )
        }
 
        snprintf(query, sizeof(query),
-                       "SELECT COUNT(id) FROM "CTS_TABLE_DATA" WHERE contact_id = %d AND is_my_profile = 0", contact_id);
-       ret = ctsvc_query_get_first_int_result(query, &contact_id);
+                       "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);
+       ret = ctsvc_query_get_first_int_result(query, &number_id);
        if ( 0 < ret )
                has_phonenumber = true;
 
@@ -242,8 +390,25 @@ static int __ctsvc_db_number_delete_record( int id )
                return ret;
        }
 
-       // should update person default number
+       person_id = __ctsvc_db_number_get_person_id_by_contact_id(contact_id);
+
+       if (number_id) {
+               if (is_default)
+                       __ctsvc_db_number_update_default(number_id, contact_id);
+               if (is_primary_default)
+                       __ctsvc_db_number_set_primary_default(number_id, true);
+       }
+       else {
+               int default_number_id;
+               default_number_id = __ctsvc_db_number_get_person_default_number(person_id);
+               if (default_number_id)
+                       __ctsvc_db_number_set_primary_default(default_number_id, true);
+               else
+                       __ctsvc_db_number_update_person_hasphonenumber(person_id, false);
+       }
+
        ctsvc_set_contact_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -265,7 +430,7 @@ static int __ctsvc_db_number_get_all_records( int offset, int limit, contacts_li
        char query[CTS_SQL_MAX_LEN] = {0};
 
        len = snprintf(query, sizeof(query),
-                       "SELECT id, contact_id, is_default, type, label, number, lookup FROM "CTSVC_DB_VIEW_NUMBER);
+                       "SELECT id, contact_id, is_default, data1, data2, data3, data4 FROM "CTSVC_DB_VIEW_NUMBER);
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
                if (0 < offset)
index 4a27b34..4a11043 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_normalize.h"
 #include "ctsvc_db_plugin_number_helper.h"
 #include "ctsvc_record.h"
@@ -36,7 +37,6 @@ int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_
        char normal_num[CTSVC_NUMBER_MAX_LEN] = {0};
        char clean_num[CTSVC_NUMBER_MAX_LEN] = {0};
 
-//     RETVM_IF(number->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted number record");
        RETV_IF(NULL == number->number, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert number record ", number->contact_id);
@@ -57,7 +57,7 @@ int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_
        cts_stmt_bind_text(stmt, 2, number->number);
        ret = ctsvc_clean_number(number->number, clean_num, sizeof(clean_num));
        if (0 < ret) {
-               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN);
+               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN, CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE);
                if (CONTACTS_ERROR_NONE == ret)
                        cts_stmt_bind_text(stmt, 3, normal_num);
        }
@@ -105,52 +105,59 @@ int ctsvc_db_number_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_number_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_number_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
-       ctsvc_number_s *number = (ctsvc_number_s*)record;
-       char query[CTS_SQL_MAX_LEN] = {0};
-       char normal_num[CTSVC_NUMBER_MAX_LEN] = {0};
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_number_s *number = (ctsvc_number_s *)record;
        char clean_num[CTSVC_NUMBER_MAX_LEN] = {0};
-       cts_stmt stmt;
+       char normal_num[CTSVC_NUMBER_MAX_LEN] = {0};
+       char query[CTS_SQL_MAX_LEN] = {0};
 
        RETVM_IF(!number->id, CONTACTS_ERROR_INVALID_PARAMETER, "number of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (number->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=? WHERE id=%d",
-                               contact_id, is_my_profile, number->type, number->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (number->label)
-               cts_stmt_bind_text(stmt, 1, number->label);
-
-       if (number->number)
-               cts_stmt_bind_text(stmt, 2, number->number);
-       ret = ctsvc_clean_number(number->number, clean_num, sizeof(clean_num));
-       if (0 < ret) {
-               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN);
-               if (CONTACTS_ERROR_NONE == ret)
-                       cts_stmt_bind_text(stmt, 3, normal_num);
-       }
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", number->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (ctsvc_record_check_property_flag((ctsvc_record_s *)record, CTSVC_PROPERTY_NUMBER_NUMBER, CTSVC_PROPERTY_FLAG_DIRTY)) {
+                       ret = ctsvc_clean_number(number->number, clean_num, sizeof(clean_num));
+                       if (0 < ret) {
+                               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN, CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE);
+                               if (CONTACTS_ERROR_NONE == ret) {
+                                       char query_set[CTS_SQL_MAX_LEN] = {0};
+                                       snprintf(query_set, sizeof(query_set), "%s, data4=?", set);
+                                       free(set);
+                                       set = strdup(query_set);
+                                       bind_text = g_slist_append(bind_text, strdup(normal_num));
+                               }
+                       }
+               }
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, number->id))) break;
+
+               if (!is_my_profile)
+                       ctsvc_set_number_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_number_noti();
-
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_number_delete(int id)
+int ctsvc_db_number_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -160,7 +167,9 @@ int ctsvc_db_number_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_number_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_number_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index fe07513..4991391 100644 (file)
@@ -24,8 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_number_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_number_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_number_delete(int id);
+int ctsvc_db_number_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_number_delete(int id, bool is_my_profile);
 
 int ctsvc_db_number_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
index b7e4eee..7e2bd1c 100644 (file)
@@ -96,7 +96,7 @@ static int __ctsvc_db_person_get_record( int id, contacts_record_h* out_record )
                        "LEFT JOIN "CTS_TABLE_CONTACTS" "
                        "ON (name_contact_id = contacts.contact_id AND contacts.deleted = 0) "
                        "WHERE persons.person_id = %d",
-                       ctsvc_get_display_column(), ctsvc_get_display_column(), id);
+                       ctsvc_get_display_column(), ctsvc_get_sort_name_column(), id);
 
        stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
@@ -160,8 +160,6 @@ static inline int __ctsvc_db_person_set_favorite(int person_id, bool set)
        }
 
        ret = cts_db_change();
-       if (0 < ret)
-               ctsvc_set_favor_noti();
 
        snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_CONTACTS" SET is_favorite = %d "
@@ -177,10 +175,14 @@ static inline int __ctsvc_db_person_set_favorite(int person_id, bool set)
 
 static int __ctsvc_db_person_update_record( contacts_record_h record )
 {
-       int ret, i, len, len2;
+       int ret, i, len;
+       int person_id;
        cts_stmt stmt = NULL;
-       char query[CTS_SQL_MIN_LEN] = {0};
+       char *set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        char contact_query[CTS_SQL_MIN_LEN] = {0};
+       char query[CTS_SQL_MIN_LEN] = {0};
        ctsvc_person_s *person = (ctsvc_person_s *)record;
        const char *display_name = NULL;
 
@@ -190,11 +192,14 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
-       len = snprintf(query, sizeof(query),
-                       "UPDATE "CTS_TABLE_PERSONS" SET changed_ver=%d ", ctsvc_get_next_ver());
-
-       len2 = snprintf(contact_query, sizeof(contact_query),
-                       "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d ", ctsvc_get_next_ver());
+       snprintf(query, sizeof(query),
+                       "SELECT person_id FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", person->person_id);
+       ret = ctsvc_query_get_first_int_result(query, &person_id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
 
        if (person->name_contact_id_changed) {
                // check name_contact_id validation
@@ -213,7 +218,7 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
                ret = cts_stmt_step(stmt);
                if ( 1 != ret) {
                        if ( CONTACTS_ERROR_NONE == ret) {
-                               CTS_ERR("Invalid paramter : the name_contact_id(%d) is not linked with person_id(%d)",
+                               CTS_ERR("Invalid parameter : the name_contact_id(%d) is not linked with person_id(%d)",
                                        person->name_contact_id, person->person_id);
                                cts_stmt_finalize(stmt);
                                ctsvc_end_trans(false);
@@ -229,58 +234,80 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
                temp = ctsvc_stmt_get_text(stmt, 0);
                display_name = SAFE_STRDUP(temp);
 
-               len += snprintf(query + len, sizeof(query) - len, ", name_contact_id = %d ", person->name_contact_id);
-
                cts_stmt_finalize(stmt);
        }
-       if (person->image_thumbnail_changed)
-               len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
-       if (person->ringtone_changed) {
-               len += snprintf(query + len, sizeof(query) - len, ", ringtone_path=? ");
-               len2 += snprintf(contact_query + len2, sizeof(contact_query) - len2, ", ringtone_path=? ");
-       }
-       if (person->vibration_changed) {
-               len += snprintf(query + len, sizeof(query) - len, ", vibration=? ");
-               len2 += snprintf(contact_query + len2, sizeof(contact_query) - len2, ", vibration=? ");
+
+       // update favorite
+       int index_favorite = CTSVC_PROPERTY_PERSON_IS_FAVORITE & 0x000000FF;
+       if (person->base.properties_flags &&
+                       CTSVC_PROPERTY_FLAG_DIRTY == person->base.properties_flags[index_favorite]) {
+               ret = __ctsvc_db_person_set_favorite(person->person_id, person->is_favorite);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
+                       ctsvc_end_trans(false);
+                       return ret;
+               }
+               person->base.properties_flags[index_favorite] = 0;
        }
 
-       snprintf(query+len, sizeof(query)-len, " WHERE person_id=%d", person->person_id);
-       snprintf(contact_query+len2, sizeof(contact_query)-len2,
-                       " WHERE person_id=%d AND deleted = 0", person->person_id);
+       do {
+               int ret = CONTACTS_ERROR_NONE;
+               char query[CTS_SQL_MAX_LEN] = {0};
+               char query_set[CTS_SQL_MIN_LEN] = {0, };
+               GSList *cursor = NULL;
 
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("cts_query_prepare() Failed");
-               ctsvc_end_trans(false);
-               return CONTACTS_ERROR_DB;
-       }
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (NULL == set || '\0' == *set)
+                       break;
+               len = snprintf(query_set, sizeof(query_set), "%s, changed_ver=%d", set, ctsvc_get_next_ver());
 
-       i = 1;
-       if (person->image_thumbnail_changed) {
-               if (person->image_thumbnail_path)
-                       cts_stmt_bind_text(stmt, i, person->image_thumbnail_path);
-               i++;
-       }
+               snprintf(query, sizeof(query), "UPDATE %s SET %s WHERE person_id = %d", CTS_TABLE_PERSONS, query_set, person->person_id);
 
-       if (person->ringtone_changed) {
-               if (person->ringtone_path)
-                       cts_stmt_bind_text(stmt, i, person->ringtone_path);
-               i++;
-       }
-       if (person->vibration_changed) {
-               if (person->vibration)
-                       cts_stmt_bind_text(stmt, i, person->vibration);
-               i++;
+               stmt = cts_query_prepare(query);
+               if (NULL == stmt) {
+                       CTS_ERR("DB error : cts_query_prepare() Failed");
+                       ret = CONTACTS_ERROR_DB;
+                       break;
+               }
+
+               if (bind_text) {
+                       int i = 0;
+                       for (cursor=bind_text,i=1;cursor;cursor=cursor->next,i++) {
+                               const char *text = cursor->data;
+                               if (text && *text)
+                                       cts_stmt_bind_text(stmt, i, text);
+                       }
+               }
+               ret = cts_stmt_step(stmt);
+               if (CONTACTS_ERROR_NONE != ret) {
+                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
+                       cts_stmt_finalize(stmt);
+                       break;
+               }
+               cts_stmt_finalize(stmt);
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
                ctsvc_end_trans(false);
                return ret;
        }
-       cts_stmt_finalize(stmt);
+
+       len = snprintf(contact_query, sizeof(contact_query), "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver=%d ", ctsvc_get_next_ver());
+
+       if (person->ringtone_changed)
+               len += snprintf(contact_query + len, sizeof(contact_query) - len, ", ringtone_path=? ");
+       if (person->vibration_changed)
+               len += snprintf(contact_query + len, sizeof(contact_query) - len, ", vibration=? ");
+
+       snprintf(contact_query+len, sizeof(contact_query)-len, " WHERE person_id=%d AND deleted = 0", person->person_id);
 
        stmt = cts_query_prepare(contact_query);
        if (NULL == stmt) {
@@ -295,6 +322,7 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
                        cts_stmt_bind_text(stmt, i, person->ringtone_path);
                i++;
        }
+
        if (person->vibration_changed) {
                if (person->vibration)
                        cts_stmt_bind_text(stmt, i, person->vibration);
@@ -310,23 +338,15 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
        }
        cts_stmt_finalize(stmt);
 
-       // update favorite
-       if (person->is_favorite_changed) {
-               ret = __ctsvc_db_person_set_favorite(person->person_id, person->is_favorite);
-               if (CONTACTS_ERROR_NONE != ret) {
-                       CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-                       ctsvc_end_trans(false);
-                       return ret;
-               }
-       }
-
        // update person display_name
        if (display_name) {
-               char temp[CTS_SQL_MAX_LEN] = {0};
+               char *temp = NULL;
                person->display_name = SAFE_STRDUP(display_name);
-               ret = ctsvc_normalize_index(person->display_name, temp, sizeof(temp));
+               ret = ctsvc_normalize_index(person->display_name, &temp);
                if (0 <= ret)
                        person->display_name_index = strdup(temp);
+
+               free(temp);
                // TODO : update name primary_default??
        }
        ctsvc_set_person_noti();
@@ -342,7 +362,6 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
        }
        else {
                person->name_contact_id_changed = false;
-               person->image_thumbnail_changed = false;
                person->ringtone_changed = false;
                person->vibration_changed = false;
                person->is_favorite_changed = false;
@@ -353,12 +372,22 @@ static int __ctsvc_db_person_update_record( contacts_record_h record )
 static int __ctsvc_db_person_delete_record( int id )
 {
        int ret, rel_changed;
+       int person_id;
        char query[CTS_SQL_MAX_LEN] = {0};
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
 
        snprintf(query, sizeof(query),
+                       "SELECT person_id FROM "CTS_TABLE_PERSONS" WHERE person_id = %d", id);
+       ret = ctsvc_query_get_first_int_result(query, &person_id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_GROUPS" SET member_changed_ver=%d "
                                "WHERE group_id IN (SELECT distinct group_id "
                                                                        "FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_GROUP_RELATIONS" R "
@@ -432,7 +461,7 @@ static int __ctsvc_db_person_get_all_records( int offset, int limit, contacts_li
                                        "has_email, "
                                        "is_favorite "
                        "FROM "CTSVC_DB_VIEW_PERSON" ORDER BY %s",
-                               ctsvc_get_display_column(), ctsvc_get_display_column(), ctsvc_get_sort_column());
+                               ctsvc_get_display_column(), ctsvc_get_sort_name_column(),       ctsvc_get_sort_column());
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
index e86cca8..a0af89d 100755 (executable)
@@ -303,6 +303,7 @@ static inline int __ctsvc_db_update_person_default(int person_id, int datatype)
        int ret, data_id;
        cts_stmt stmt = NULL;
        char query[CTS_SQL_MIN_LEN] = {0};
+       char *temp = NULL;
 
        snprintf(query, sizeof(query),
                "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D "
@@ -314,7 +315,7 @@ static inline int __ctsvc_db_update_person_default(int person_id, int datatype)
        ret = ctsvc_query_get_first_int_result(query, &data_id);
        if (CONTACTS_ERROR_NO_DATA == ret ) {
                snprintf(query, sizeof(query),
-                       "SELECT D.id FROM "CTS_TABLE_CONTACTS" C, "CTS_TABLE_DATA" D "
+                       "SELECT D.id, D.data3 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 D.is_default=1 AND D.is_my_profile = 0 ORDER BY D.id",
                        person_id, datatype);
@@ -326,8 +327,7 @@ static inline int __ctsvc_db_update_person_default(int person_id, int datatype)
                        return CONTACTS_ERROR_DB;
                }
 
-               if ((ret = cts_stmt_step(stmt)))
-               {
+               if ((ret = cts_stmt_step(stmt))) {
                        data_id = ctsvc_stmt_get_int(stmt, 0);
 
                        snprintf(query, sizeof(query),
@@ -341,64 +341,94 @@ static inline int __ctsvc_db_update_person_default(int person_id, int datatype)
                                cts_stmt_finalize(stmt);
                                return ret;
                        }
+                       temp = ctsvc_stmt_get_text(stmt, 1);
                }
                cts_stmt_finalize(stmt);
+
+               if (CTSVC_DATA_IMAGE == datatype) {
+                       if (temp) {
+                               snprintf(query, sizeof(query),
+                                               "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id=%d", person_id);
+                               stmt = cts_query_prepare(query);
+                               cts_stmt_bind_text(stmt, 1, temp);
+                               ret = cts_stmt_step(stmt);
+                               cts_stmt_finalize(stmt);
+                               if (CONTACTS_ERROR_NONE != ret) {
+                                       CTS_ERR("cts_query_exec(%s) Failed(%d)", query, ret);
+                                       return ret;
+                               }
+                       }
+               }
        }
 
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_update_person(contacts_record_h record)
+static bool __ctsvc_get_has_column(int person_id, const char *culumn)
 {
-       int ret, i=1, contact_count=0, len=0;
-       cts_stmt stmt = NULL;
+       int ret;
+       int contact_count = 0;
        char query[CTS_SQL_MIN_LEN] = {0};
-       ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
-       bool has_phonenumber=false, has_email=false;
-
-       ret = ctsvc_begin_trans();
-       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
        snprintf(query, sizeof(query),
                                "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" "
-                               "WHERE person_id=%d AND has_phonenumber=1 AND deleted = 0",
-                               contact->person_id);
+                               "WHERE person_id=%d AND %s=1 AND deleted = 0",
+                               person_id, culumn);
 
        ret = ctsvc_query_get_first_int_result(query, &contact_count);
-       if (CONTACTS_ERROR_NONE != ret ) {
-               CTS_ERR("No Contacts : person_id (%d)", contact->person_id);
-               ctsvc_end_trans(false);
-               return CONTACTS_ERROR_NO_DATA;
-       }
+       RETV_IF(CONTACTS_ERROR_NONE != ret, false);
 
-       if(contact_count)
-               has_phonenumber = true;
+       if (contact_count)
+               return true;
+       return false;
+}
+
+static int __ctsvc_get_thumbnail_contact_id(int person_id)
+{
+       int ret;
+       int contact_id = 0;
+       char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query),
-                               "SELECT count(contact_id) FROM "CTS_TABLE_CONTACTS" "
-                               "WHERE person_id=%d AND has_email=1 AND deleted = 0",
-                               contact->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);
+       ret = ctsvc_query_get_first_int_result(query, &contact_id);
+       RETV_IF(CONTACTS_ERROR_NONE != ret, -1);
+       return contact_id;
+}
 
-       ret = ctsvc_query_get_first_int_result(query, &contact_count);
-       if (CONTACTS_ERROR_NONE != ret ) {
-               CTS_ERR("No Contacts : person_id (%d)", contact->person_id);
-               ctsvc_end_trans(false);
-               return CONTACTS_ERROR_NO_DATA;
-       }
 
-       if(contact_count)
-               has_email = true;
+int ctsvc_db_update_person(contacts_record_h record)
+{
+       int ret, i=1, len=0;
+       cts_stmt stmt = NULL;
+       char query[CTS_SQL_MIN_LEN] = {0};
+       ctsvc_contact_s *contact = (ctsvc_contact_s*)record;
+       bool has_phonenumber=false, has_email=false;
+       int thumbnail_contact_id = 0;
+
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%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);
+
+       has_phonenumber = __ctsvc_get_has_column(contact->person_id, "has_phonenumber");
+       has_email = __ctsvc_get_has_column(contact->person_id, "has_email");
+       thumbnail_contact_id = __ctsvc_get_thumbnail_contact_id(contact->person_id);
 
        len = snprintf(query, sizeof(query),
                        "UPDATE "CTS_TABLE_PERSONS" SET changed_ver=%d, has_phonenumber=%d, has_email=%d ",
                        ctsvc_get_next_ver(), has_phonenumber, has_email);
 
-
        if (contact->ringtone_changed)
                len += snprintf(query+len, sizeof(query)-len, ", ringtone_path=?");
        if (contact->vibration_changed)
                len += snprintf(query+len, sizeof(query)-len, ", vibration=?");
-       if (contact->image_thumbnail_changed)
+       if (contact->image_thumbnail_changed && (contact->id == thumbnail_contact_id || thumbnail_contact_id == -1))
                len += snprintf(query+len, sizeof(query)-len, ", image_thumbnail_path=?");
 
        snprintf(query+len, sizeof(query)-len,
@@ -411,12 +441,21 @@ int ctsvc_db_update_person(contacts_record_h record)
                return CONTACTS_ERROR_DB;
        }
 
-       if (contact->ringtone_changed)
-               cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->ringtone_path));
-       if (contact->vibration_changed)
-               cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->vibration));
-       if (contact->image_thumbnail_changed)
-               cts_stmt_bind_text(stmt, i++, SAFE_STR(contact->image_thumbnail_path));
+       if (contact->ringtone_changed) {
+               if (contact->ringtone_path)
+                       cts_stmt_bind_text(stmt, i, contact->ringtone_path);
+               i++;
+       }
+       if (contact->vibration_changed) {
+               if (contact->vibration)
+                       cts_stmt_bind_text(stmt, i, contact->vibration);
+               i++;
+       }
+       if (contact->image_thumbnail_changed && (contact->id == thumbnail_contact_id || thumbnail_contact_id == -1)) {
+               if (contact->image_thumbnail_path)
+                       cts_stmt_bind_text(stmt, i, contact->image_thumbnail_path);
+               i++;
+       }
 
        ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
@@ -427,12 +466,8 @@ int ctsvc_db_update_person(contacts_record_h record)
        }
 
        cts_stmt_finalize(stmt);
-
-       __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_set_person_noti();
+
 #ifdef _CONTACTS_IPC_SERVER
        ctsvc_change_subject_add_changed_person_id(CONTACTS_CHANGE_UPDATED, contact->person_id);
 #endif
@@ -450,9 +485,7 @@ int ctsvc_db_update_person(contacts_record_h record)
 void ctsvc_db_normalize_str_callback(sqlite3_context * context,
                int argc, sqlite3_value ** argv)
 {
-       int ret;
        const char *display_name;
-       char dest[CTS_SQL_MAX_LEN] = {0};
 
        if (argc < 1) {
                sqlite3_result_null(context);
@@ -461,17 +494,21 @@ void ctsvc_db_normalize_str_callback(sqlite3_context * context,
 
        display_name = (const char *)sqlite3_value_text(argv[0]);
        if (display_name) {
-               ret = ctsvc_normalize_index(display_name, dest, sizeof(dest));
+               int ret;
+               char *dest = NULL;
+               ret = ctsvc_normalize_index(display_name, &dest);
                if (ret < CONTACTS_ERROR_NONE) {
                        CTS_ERR("ctsvc_normalize_index() Failed(%d)", ret);
                        sqlite3_result_null(context);
                        return;
                }
                CTS_VERBOSE("normalize index : %s, %s", display_name, dest);
+               sqlite3_result_text(context, dest, strlen(dest), SQLITE_TRANSIENT);
+               free(dest);
+               return;
        }
 
-
-       sqlite3_result_text(context, dest, strlen(dest), SQLITE_STATIC);
+       sqlite3_result_null(context);
        return;
 }
 
index b5bc50a..dbca4bf 100644 (file)
@@ -100,7 +100,7 @@ static int __ctsvc_db_phonelog_get_record( int id, contacts_record_h* out_record
 
        len = snprintf(query, sizeof(query),
                        "SELECT id, number, person_id, log_type, log_time, data1, data2 "
-                               "FROM "CTS_TABLE_PHONELOGS" WHERE id = %d", id);
+                       "FROM "CTS_TABLE_PHONELOGS" WHERE id = %d", id);
 
        stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
@@ -127,59 +127,79 @@ static int __ctsvc_db_phonelog_get_record( int id, contacts_record_h* out_record
 
 static int __ctsvc_db_phonelog_update_record( contacts_record_h record )
 {
-       int ret;
-//     cts_stmt stmt;
+       int phonelog_id;
        char query[CTS_SQL_MIN_LEN] = {0};
        ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s *)record;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
 
        RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invaild parameter : record is null");
        RETVM_IF(phonelog->id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                        "Invalid parameter : The phone_log has ID(%d)", phonelog->id);
        RETVM_IF(phonelog->log_type != CONTACTS_PLOG_TYPE_VOICE_INCOMMING_SEEN &&
                        phonelog->log_type != CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN, CONTACTS_ERROR_INVALID_PARAMETER,
-                               "Invaild parameter : the type is can not updated(%d)", phonelog->log_type);
+                       "Invaild parameter : the type is can not updated(%d)", phonelog->log_type);
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (phonelog->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_PHONELOGS" WHERE id = %d", phonelog->id);
+       ret = ctsvc_query_get_first_int_result(query, &phonelog_id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+               return ret;
+       }
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
-       snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_PHONELOGS" SET log_type = %d WHERE id = %d",
-                       phonelog->log_type, phonelog->id);
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_PHONELOGS, phonelog->id))) break;
 
-       ret = ctsvc_query_exec(query);
-       if (CONTACTS_ERROR_NONE != ret ) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed");
-               ctsvc_end_trans(false);
-               return CONTACTS_ERROR_DB;
-       }
+               if (cts_db_change()) {
+                       ctsvc_set_phonelog_noti();
 
-       if (cts_db_change()) {
-               ctsvc_set_phonelog_noti();
-               ctsvc_set_missed_call_noti();
 #ifdef _CONTACTS_IPC_SERVER
-               // add id for subscribe
-               ctsvc_change_subject_add_changed_phone_log_id(CONTACTS_CHANGE_UPDATED, phonelog->id);
+                       ctsvc_change_subject_add_changed_phone_log_id(CONTACTS_CHANGE_UPDATED, phonelog->id);
 #endif
+               }
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
        ret = ctsvc_end_trans(true);
-       if (ret < CONTACTS_ERROR_NONE)
-       {
-               CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
-               return ret;
-       }
-       else
-               return CONTACTS_ERROR_NONE;
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_end_trans() Failed(%d)", ret);
+
+       return CONTACTS_ERROR_NONE;
 }
 
 static int __ctsvc_db_phonelog_delete_record( int id )
 {
        int ret;
+       int phonelog_id;
        char query[CTS_SQL_MAX_LEN] = {0};
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_PHONELOGS" WHERE id = %d", id);
+       ret = ctsvc_query_get_first_int_result(query, &phonelog_id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        snprintf(query, sizeof(query), "DELETE FROM %s WHERE id = %d",
                        CTS_TABLE_PHONELOGS, id);
 
@@ -211,7 +231,7 @@ static int __ctsvc_db_phonelog_get_all_records( int offset, int limit,
        contacts_list_h list;
 
        len = snprintf(query, sizeof(query),
-               "SELECT id, number, person_id, log_type, log_time, data1, data2 FROM "CTS_TABLE_PHONELOGS);
+                       "SELECT id, number, person_id, log_type, log_time, data1, data2 FROM "CTS_TABLE_PHONELOGS);
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -243,7 +263,7 @@ static int __ctsvc_db_phonelog_get_all_records( int offset, int limit,
 }
 
 static int __ctsvc_db_phonelog_get_records_with_query( contacts_query_h query, int offset,
-       int limit, contacts_list_h* out_list )
+               int limit, contacts_list_h* out_list )
 {
        int ret;
        int i;
@@ -340,19 +360,19 @@ static int __ctsvc_cb_phonelog_increase_outgoing_count(int person_id)
        char query[CTS_SQL_MIN_LEN] = {0};
 
        snprintf(query, sizeof(query),
-               "SELECT person_id FROM %s WHERE person_id = %d and usage_type = %d ",
-               CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
+                       "SELECT person_id FROM %s WHERE person_id = %d and usage_type = %d ",
+                       CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
 
        ret = ctsvc_query_get_first_int_result(query, &id);
        if (CONTACTS_ERROR_NO_DATA == ret) {
                snprintf(query, sizeof(query),
-                       "INSERT INTO %s(person_id, usage_type, times_used) VALUES(%d, %d, 1)",
-                       CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
+                               "INSERT INTO %s(person_id, usage_type, times_used) VALUES(%d, %d, 1)",
+                               CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
        }
        else {
                snprintf(query, sizeof(query),
-                       "UPDATE %s SET times_used = times_used + 1 WHERE person_id = %d and usage_type = %d",
-                       CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
+                               "UPDATE %s SET times_used = times_used + 1 WHERE person_id = %d and usage_type = %d",
+                               CTS_TABLE_CONTACT_STAT, person_id, CONTACTS_USAGE_STAT_TYPE_OUTGOING_CALL);
        }
 
        ret = ctsvc_query_exec(query);
@@ -386,7 +406,7 @@ static int  __ctsvc_db_phonelog_insert(ctsvc_phonelog_s *phonelog, int *id)
                if (phonelog->log_type < CONTACTS_PLOG_TYPE_EMAIL_RECEIVED) {
                        ret = ctsvc_clean_number(phonelog->address, clean_num, sizeof(clean_num));
                        if (0 < ret) {
-                               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN);
+                               ret = ctsvc_normalize_number(clean_num, normal_num, CTSVC_NUMBER_MAX_LEN, CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE);
                                cts_stmt_bind_text(stmt, 2, normal_num);
                        }
                }
@@ -409,10 +429,6 @@ static int  __ctsvc_db_phonelog_insert(ctsvc_phonelog_s *phonelog, int *id)
                *id = cts_db_get_last_insert_id();
        cts_stmt_finalize(stmt);
 
-       if (CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN == phonelog->log_type ||
-                       CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN == phonelog->log_type)
-               ctsvc_set_missed_call_noti();
-
        ctsvc_set_phonelog_noti();
        return CONTACTS_ERROR_NONE;
 }
@@ -451,7 +467,7 @@ static int __ctsvc_db_phonelog_insert_record( contacts_record_h record, int *id
        if(phonelog-> log_type == CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN || phonelog-> log_type == CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN) {
 
                #define PHONE_PACKAGE_NAME              "org.tizen.phone"
-               int call_cnt = 0;
+               unsigned int call_cnt = 0;
                bool    bBadgeExist = FALSE;
 
                badge_is_existing(PHONE_PACKAGE_NAME, &bBadgeExist);
index 0b65642..967c347 100644 (file)
@@ -28,6 +28,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_profile_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_profile_get_record( int id, contacts_record_h* out_record );
@@ -90,10 +91,11 @@ static int __ctsvc_db_profile_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(profile->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -157,24 +159,25 @@ static int __ctsvc_db_profile_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", profile->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", profile->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_profile_update(record, profile->contact_id, false);
+       ret = ctsvc_db_profile_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(profile->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -205,10 +208,10 @@ static int __ctsvc_db_profile_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_profile_delete(id);
+       ret = ctsvc_db_profile_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -217,10 +220,11 @@ static int __ctsvc_db_profile_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 083de56..d0074dc 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_profile_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -91,7 +92,6 @@ int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_profile_s *profile = (ctsvc_profile_s *)record;
 
-//     RETVM_IF(profile->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted profile record");
        RETV_IF(NULL == profile->appsvc_operation, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert profile record ", profile->contact_id);
@@ -128,40 +128,45 @@ int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my
 
 }
 
-int ctsvc_db_profile_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_profile_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_profile_s *profile = (ctsvc_profile_s*)record;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!profile->id, CONTACTS_ERROR_INVALID_PARAMETER, "profile of contact has no ID.");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=?, data4=?, data5=?, "
-                               "data6=?, data7=?, data8=?, data9=?, data10=?, data11=?, data12=?  WHERE id=%d",
-                               contact_id, is_my_profile, profile->type, profile->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       __ctsvc_profile_bind_stmt(stmt, profile, 1);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", profile->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (profile->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, profile->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_profile_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_profile_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_profile_delete(int id)
+
+int ctsvc_db_profile_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -171,7 +176,9 @@ int ctsvc_db_profile_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_profile_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_profile_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index 0b93afd..8c05e49 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_profile_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_profile_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_profile_delete(int id);
-
+int ctsvc_db_profile_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_profile_delete(int id, bool is_my_profile);
 int ctsvc_db_profile_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_PROFILE_HELPER_H__
index cbffc51..41b7363 100644 (file)
@@ -28,6 +28,8 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
+
 
 static int __ctsvc_db_relationship_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_relationship_get_record( int id, contacts_record_h* out_record );
@@ -90,10 +92,11 @@ static int __ctsvc_db_relationship_insert_record( contacts_record_h record, int
 
        ret = ctsvc_db_contact_update_changed_time(relationship->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -156,24 +159,25 @@ static int __ctsvc_db_relationship_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", relationship->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", relationship->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_relationship_update(record, relationship->contact_id, false);
+       ret = ctsvc_db_relationship_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(relationship->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -204,10 +208,10 @@ static int __ctsvc_db_relationship_delete_record( int id )
        if( ret != CONTACTS_ERROR_NONE ) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_relationship_delete(id);
+       ret = ctsvc_db_relationship_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -216,10 +220,11 @@ static int __ctsvc_db_relationship_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 1186fa2..971ff51 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_relationship_helper.h"
 #include "ctsvc_record.h"
 #include "ctsvc_notification.h"
@@ -66,7 +67,6 @@ int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool
        ctsvc_relationship_s *relationship = (ctsvc_relationship_s *)record;
 
        // These check should be done in client side
-//     RETVM_IF(relationship->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted relationship record");
        RETV_IF(NULL == relationship->name, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert relationship record", relationship->contact_id);
@@ -101,39 +101,45 @@ int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_relationship_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_relationship_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        ctsvc_relationship_s *relationship = (ctsvc_relationship_s*)record;
-       char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
+       char query[CTS_SQL_MIN_LEN] = {0};
 
        RETVM_IF(!relationship->id, CONTACTS_ERROR_INVALID_PARAMETER, "relationship of contact has no ID.");
-
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, relationship->type, relationship->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       __ctsvc_relationship_bind_stmt(stmt, relationship, 1);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", relationship->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (relationship->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, relationship->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_relationship_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
 
-       cts_stmt_finalize(stmt);
+       return ret;
 
-       if (!is_my_profile)
-               ctsvc_set_relationship_noti();
-       return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_relationship_delete(int id)
+
+int ctsvc_db_relationship_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -143,7 +149,9 @@ int ctsvc_db_relationship_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_relationship_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_relationship_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index c112431..7063397 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_relationship_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_relationship_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_relationship_delete(int id);
-
+int ctsvc_db_relationship_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_relationship_delete(int id, bool is_my_profile);
 int ctsvc_db_relationship_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__
index 409c7d2..64105ce 100644 (file)
@@ -172,53 +172,50 @@ static int __ctsvc_db_sdn_insert_record( contacts_record_h record, int *id )
 
 static int __ctsvc_db_sdn_update_record( contacts_record_h record )
 {
-       int ret;
-       ctsvc_sdn_s *sdn = (ctsvc_sdn_s *)record;
+       int sdn_id;
+       int ret = CONTACTS_ERROR_NONE;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
+       ctsvc_sdn_s *sdn =  (ctsvc_sdn_s*)record;
+       char query[CTS_SQL_MIN_LEN] = {0};
 
        RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == sdn->name, CONTACTS_ERROR_INVALID_PARAMETER);
        RETVM_IF(CTSVC_RECORD_SDN != sdn->base.r_type, CONTACTS_ERROR_INVALID_PARAMETER,
                        "Invalid parameter : record is invalid type(%d)", sdn->base.r_type);
 
-       cts_stmt stmt = NULL;
-       char query[CTS_SQL_MIN_LEN] = {0};
-
-       snprintf(query, sizeof(query),
-                       "UPDATE "CTS_TABLE_SDN" SET name=?, number=? WHERE id = %d", sdn->id);
-
-       stmt = cts_query_prepare(query);
-       if (NULL == stmt) {
-               CTS_ERR("DB error : cts_query_prepare() Failed");
-               return CONTACTS_ERROR_DB;
-       }
-
-       cts_stmt_bind_text(stmt, 1, sdn->name);
-       cts_stmt_bind_text(stmt, 2, sdn->number);
-
        ret = ctsvc_begin_trans();
-       if( ret < CONTACTS_ERROR_NONE ) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
-       }
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
 
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_SDN" WHERE id = %d", sdn->id);
+       ret = ctsvc_query_get_first_int_result(query, &sdn_id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
-       cts_stmt_finalize(stmt);
-
-       ctsvc_set_sdn_noti();
+       RETVM_IF(!sdn->id, CONTACTS_ERROR_INVALID_PARAMETER, "sdn of contact has no ID.");
+       RETV_IF(NULL == sdn->name, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (sdn->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_SDN, sdn->id))) break;
+               ctsvc_set_sdn_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
+       }
 
        ret = ctsvc_end_trans(true);
-       if(ret < CONTACTS_ERROR_NONE ) {
-               CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
-               return ret;
-       }
+       RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "DB error : ctsvc_end_trans() Failed(%d)", ret);
 
        return CONTACTS_ERROR_NONE;
 }
@@ -226,13 +223,22 @@ static int __ctsvc_db_sdn_update_record( contacts_record_h record )
 static int __ctsvc_db_sdn_delete_record( int sdn_id )
 {
        int ret;
-
+       int id;
        char query[CTS_SQL_MAX_LEN] = {0};
-       snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_SDN" WHERE id = %d", sdn_id);
 
        ret = ctsvc_begin_trans();
        RETVM_IF(CONTACTS_ERROR_NONE > ret, ret, "DB error : ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query),
+                       "SELECT id FROM "CTS_TABLE_SDN" WHERE id = %d", sdn_id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       if (ret != CONTACTS_ERROR_NONE) {
+               CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_SDN" WHERE id = %d", sdn_id);
        ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
index e68f4d7..ffccdca 100644 (file)
@@ -139,6 +139,22 @@ static int __ctsvc_db_simple_contact_get_record( int id, contacts_record_h* out_
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_db_simple_contact_get_default_image_id(int contact_id)
+{
+       int ret = 0;
+       int image_id = 0;
+       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);
+
+       ret = ctsvc_query_get_first_int_result(query, &image_id);
+       if (CONTACTS_ERROR_NONE != ret)
+               return 0;
+       return image_id;
+}
+
 static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
 {
        int ret;
@@ -151,7 +167,6 @@ static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
        cts_stmt stmt;
 
        // These check should be done in client side
-//     RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record");
        RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER,
                                        "Invalid parameter : contact is NULL");
        RETVM_IF(contact->addressbook_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -169,7 +184,8 @@ static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
        ret = ctsvc_query_get_first_int_result(query, &id);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("Invalid Parameter : contact_id (%d) is not exist", contact->contact_id);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               ctsvc_end_trans(false);
+               return ret;
        }
 
        len = snprintf(query, sizeof(query),
@@ -197,28 +213,41 @@ static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
                return CONTACTS_ERROR_DB;
        }
 
-       i = 0;
+       i = 1;
        if (contact->uid_changed) {
-               if(contact->uid)
-                       cts_stmt_bind_text(stmt, i++, contact->uid);
+               if (contact->uid)
+                       cts_stmt_bind_text(stmt, i, contact->uid);
                i++;
        }
+
        if (contact->ringtone_changed) {
                if (contact->ringtone_path)
                        cts_stmt_bind_text(stmt, i, contact->ringtone_path);
                i++;
        }
+
        if (contact->vibration_changed) {
                if (contact->vibration)
                        cts_stmt_bind_text(stmt, i, contact->vibration);
                i++;
        }
 
+       //////////////////////////////////////////////////////////////////////
+       // This code will be removed
        if (contact->image_thumbnail_changed) {
+               int img_id;
                image[0] = '\0';
-               ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact->contact_id,
-                                       contact->image_thumbnail_path, image, sizeof(image));
+               img_id = __ctsvc_db_simple_contact_get_default_image_id(contact->contact_id);
 
+               if (0 == img_id) {
+                       img_id = cts_db_get_next_id(CTS_TABLE_DATA);
+                       ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact->contact_id, img_id, contact->image_thumbnail_path,
+                                       image, sizeof(image));
+               }
+               else  {
+                       ret = ctsvc_contact_update_image_file(CTSVC_IMG_NORMAL, contact->contact_id, img_id,
+                                       contact->image_thumbnail_path, image, sizeof(image));
+               }
                if (*image) {
                        free(contact->image_thumbnail_path);
                        contact->image_thumbnail_path = strdup(image);
@@ -227,6 +256,7 @@ static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
                }
                i++;
        }
+       //////////////////////////////////////////////////////////////////////
 
        ret = cts_stmt_step(stmt);
        if (CONTACTS_ERROR_NONE != ret) {
@@ -248,11 +278,21 @@ static int __ctsvc_db_simple_contact_update_record( contacts_record_h record )
 static int __ctsvc_db_simple_contact_delete_record( int id )
 {
        int ret;
+       int addressbook_id;
        char query[CTS_SQL_MAX_LEN] = {0};
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
 
+       snprintf(query, sizeof(query),
+               "SELECT addressbook_id FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0", id);
+       ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        snprintf(query, sizeof(query), "DELETE FROM %s WHERE contact_id = %d AND deleted = 0",
                        CTS_TABLE_CONTACTS, id);
 
@@ -437,7 +477,6 @@ static int __ctsvc_db_simple_contact_insert_record( contacts_record_h record, in
        cts_stmt stmt;
 
        // These check should be done in client side
-//     RETVM_IF(contact->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted contact record");
        RETVM_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER,
                                        "Invalid parameter : contact is NULL");
        RETVM_IF(contact->addressbook_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,
@@ -459,8 +498,10 @@ static int __ctsvc_db_simple_contact_insert_record( contacts_record_h record, in
                *id = ret;
 
        if (contact->image_thumbnail_path) {
+               int image_id;
                image[0] = '\0';
-               ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact->contact_id, contact->image_thumbnail_path,
+               image_id = __ctsvc_db_simple_contact_get_default_image_id(contact->contact_id);
+               ret = ctsvc_contact_add_image_file(CTSVC_IMG_NORMAL, contact->contact_id, image_id, contact->image_thumbnail_path,
                                image, sizeof(image));
                if (CONTACTS_ERROR_NONE != ret) {
                        CTS_ERR("ctsvc_contact_add_image_file(NORMAL) Failed(%d)", ret);
index 13bec0b..629ed4e 100644 (file)
@@ -165,6 +165,7 @@ static int __ctsvc_db_speeddial_get_record( int id, contacts_record_h* out_recor
 static int __ctsvc_db_speeddial_update_record( contacts_record_h record )
 {
        int ret;
+       int speeddial_id;
        cts_stmt stmt;
        char query[CTS_SQL_MIN_LEN] = {0};
        ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s *)record;
@@ -173,19 +174,26 @@ static int __ctsvc_db_speeddial_update_record( contacts_record_h record )
                                "Invaild parameter : dial number (%d)", speeddial->dial_number);
        RETVM_IF (speeddial->number_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invaild parameter : number id (%d)", speeddial->number_id);
+       ret = ctsvc_begin_trans();
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "DB error : ctsvc_begin_trans() Fail(%d)", ret);
+
+       snprintf(query, sizeof(query),
+               "SELECT speed_number FROM "CTS_TABLE_SPEEDDIALS" WHERE speed_number = %d", speeddial->dial_number);
+       ret = ctsvc_query_get_first_int_result(query, &speeddial_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
 
        snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_SPEEDDIALS" "
                        "SET number_id = %d WHERE speed_number = %d",
                        speeddial->number_id, speeddial->dial_number);
-
        stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       ret = ctsvc_begin_trans();
-       if (ret) {
-               cts_stmt_finalize(stmt);
-               CTS_ERR("contacts_svc_begin_trans() Failed(%d)", ret);
-               return ret;
+       if (NULL == stmt) {
+               CTS_ERR("DB error : cts_query_prepare() Failed");
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_DB;
        }
 
        ret = cts_stmt_step(stmt);
@@ -216,20 +224,29 @@ static int __ctsvc_db_speeddial_update_record( contacts_record_h record )
 static int __ctsvc_db_speeddial_delete_record( int id )
 {
        int ret;
+       int speeddial_id;
        cts_stmt stmt;
        char query[CTS_SQL_MIN_LEN] = {0};
 
+       ret = ctsvc_begin_trans();
+       RETVM_IF(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "DB error : ctsvc_begin_trans() Fail(%d)", ret);
+
+       snprintf(query, sizeof(query),
+               "SELECT speed_number FROM "CTS_TABLE_SPEEDDIALS" WHERE speed_number = %d", id);
+       ret = ctsvc_query_get_first_int_result(query, &speeddial_id);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("DB error : ctsvc_query_get_first_int_result() Fail(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
        snprintf(query, sizeof(query), "DELETE FROM %s WHERE speed_number = %d",
                        CTS_TABLE_SPEEDDIALS, id);
-
        stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       ret = ctsvc_begin_trans();
-       if (ret) {
-               cts_stmt_finalize(stmt);
-               CTS_ERR("ctsvc_begin_trans() Failed(%d)", ret);
-               return ret;
+       if (NULL == stmt) {
+               CTS_ERR("DB error : cts_query_prepare() Failed");
+               ctsvc_end_trans(false);
+               return CONTACTS_ERROR_DB;
        }
 
        ret = cts_stmt_step(stmt);
index ae798b6..baa93cc 100644 (file)
@@ -28,6 +28,7 @@
 #include "ctsvc_record.h"
 #include "ctsvc_db_query.h"
 #include "ctsvc_list.h"
+#include "ctsvc_notification.h"
 
 static int __ctsvc_db_url_insert_record( contacts_record_h record, int *id );
 static int __ctsvc_db_url_get_record( int id, contacts_record_h* out_record );
@@ -98,10 +99,11 @@ static int __ctsvc_db_url_insert_record( contacts_record_h record, int *id )
 
        ret = ctsvc_db_contact_update_changed_time(url->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -164,24 +166,25 @@ static int __ctsvc_db_url_update_record( contacts_record_h record )
                        "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", url->contact_id);
        ret = ctsvc_query_get_first_int_result(query, &contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("No data : contact_id (%d) is not exist", contact_id);
+               CTS_ERR("No data : contact_id (%d) is not exist", url->contact_id);
                ctsvc_end_trans(false);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+               return ret;
        }
 
-       ret = ctsvc_db_url_update(record, url->contact_id, false);
+       ret = ctsvc_db_url_update(record, false);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
+               CTS_ERR("Update record Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
 
        ret = ctsvc_db_contact_update_changed_time(url->contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -212,10 +215,10 @@ static int __ctsvc_db_url_delete_record( int id )
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
                ctsvc_end_trans(false);
-               return contact_id;
+               return ret;
        }
 
-       ret = ctsvc_db_url_delete(id);
+       ret = ctsvc_db_url_delete(id, false);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
                ctsvc_end_trans(false);
@@ -224,10 +227,11 @@ static int __ctsvc_db_url_delete_record( int id )
 
        ret = ctsvc_db_contact_update_changed_time(contact_id);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("DB error : ctsvc_query_exec() Failed(%d)", ret);
+               CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
                ctsvc_end_trans(false);
                return ret;
        }
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index eaff3fe..829c375 100644 (file)
@@ -22,6 +22,7 @@
 #include "ctsvc_schema.h"
 #include "ctsvc_sqlite.h"
 #include "ctsvc_db_init.h"
+#include "ctsvc_db_query.h"
 #include "ctsvc_db_plugin_contact_helper.h"
 #include "ctsvc_db_plugin_url_helper.h"
 #include "ctsvc_record.h"
@@ -57,7 +58,6 @@ int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_pro
        char query[CTS_SQL_MAX_LEN] = {0};
        ctsvc_url_s *url = (ctsvc_url_s *)record;
 
-//     RETVM_IF(url->deleted, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : deleted url record");
        RETV_IF(NULL == url->url, CONTACTS_ERROR_NONE);
        RETVM_IF(contact_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER,
                                "Invalid parameter : contact_id(%d) is mandatory field to insert url record ", url->contact_id);
@@ -95,42 +95,42 @@ int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_pro
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_db_url_update(contacts_record_h record, int contact_id, bool is_my_profile)
+int ctsvc_db_url_update(contacts_record_h record, bool is_my_profile)
 {
-       int ret;
+       int id;
+       int ret = CONTACTS_ERROR_NONE;
        ctsvc_url_s *url = (ctsvc_url_s*)record;
+       char* set = NULL;
+       GSList *bind_text = NULL;
+       GSList *cursor = NULL;
        char query[CTS_SQL_MAX_LEN] = {0};
-       cts_stmt stmt;
 
        RETVM_IF(!url->id, CONTACTS_ERROR_INVALID_PARAMETER, "url of contact has no ID.");
+       RETVM_IF(CTSVC_PROPERTY_FLAG_DIRTY != (url->base.property_flag & CTSVC_PROPERTY_FLAG_DIRTY), CONTACTS_ERROR_NONE, "No update");
 
        snprintf(query, sizeof(query),
-               "UPDATE "CTS_TABLE_DATA" SET contact_id=%d, is_my_profile=%d, data1=%d, data2=?, data3=? WHERE id=%d",
-                               contact_id, is_my_profile, url->type, url->id);
-
-       stmt = cts_query_prepare(query);
-       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
-
-       if (url->label)
-               cts_stmt_bind_text(stmt, 1, url->label);
-       if (url->url)
-               cts_stmt_bind_text(stmt, 2, url->url);
-
-       ret = cts_stmt_step(stmt);
-       if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
-               cts_stmt_finalize(stmt);
-               return ret;
+                       "SELECT id FROM "CTS_TABLE_DATA" WHERE id = %d", url->id);
+       ret = ctsvc_query_get_first_int_result(query, &id);
+       RETV_IF(ret != CONTACTS_ERROR_NONE, ret);
+
+       do {
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_create_set_query(record, &set, &bind_text))) break;
+               if (CONTACTS_ERROR_NONE != (ret = ctsvc_db_update_record_with_set_query(set, bind_text, CTS_TABLE_DATA, url->id))) break;
+               if (!is_my_profile)
+                       ctsvc_set_url_noti();
+       } while (0);
+
+       CTSVC_RECORD_RESET_PROPERTY_FLAGS((ctsvc_record_s *)record);
+       CONTACTS_FREE(set);
+       if (bind_text) {
+               for (cursor=bind_text;cursor;cursor=cursor->next)
+                       CONTACTS_FREE(cursor->data);
+               g_slist_free(bind_text);
        }
-
-       cts_stmt_finalize(stmt);
-
-       if (!is_my_profile)
-               ctsvc_set_url_noti();
-       return CONTACTS_ERROR_NONE;
+       return ret;
 }
 
-int ctsvc_db_url_delete(int id)
+int ctsvc_db_url_delete(int id, bool is_my_profile)
 {
        int ret;
        char query[CTS_SQL_MIN_LEN] = {0};
@@ -140,7 +140,9 @@ int ctsvc_db_url_delete(int id)
 
        ret = ctsvc_query_exec(query);
        RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Failed(%d)", ret);
-       ctsvc_set_url_noti();
+
+       if (!is_my_profile)
+               ctsvc_set_url_noti();
 
        return CONTACTS_ERROR_NONE;
 }
index 1e06795..6d06362 100644 (file)
@@ -24,9 +24,8 @@
 #include "ctsvc_sqlite.h"
 
 int ctsvc_db_url_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id);
-int ctsvc_db_url_update(contacts_record_h record, int contact_id, bool is_my_profile);
-int ctsvc_db_url_delete(int id);
-
+int ctsvc_db_url_update(contacts_record_h record, bool is_my_profile);
+int ctsvc_db_url_delete(int id, bool is_my_profile);
 int ctsvc_db_url_get_value_from_stmt(cts_stmt stmt, contacts_record_h *record, int start_count);
 
 #endif // __CTSVC_DB_PLUGIN_URL_HELPER_H__
index 11a57d7..6727a07 100755 (executable)
@@ -35,6 +35,7 @@
 #include "ctsvc_db_init.h"
 #include "ctsvc_view.h"
 #include "ctsvc_inotify.h"
+#include "ctsvc_localize.h"
 
 #include "ctsvc_db_plugin_person_helper.h"
 
@@ -89,7 +90,7 @@ static inline int __ctsvc_db_get_property_type(const property_info_s *properties
        for (i=0;i<count;i++) {
                property_info_s *p = (property_info_s*)&(properties[i]);
                if (property_id == p->property_id) {
-                       return p->type;
+                       return (property_id & CTSVC_VIEW_DATA_TYPE_MASK);
                }
        }
        return -1;
@@ -265,7 +266,7 @@ static inline int __ctsvc_db_create_str_condition(ctsvc_composite_filter_s *com_
        if (filter->value.s) {
                if (filter->property_id == CTSVC_PROPERTY_NUMBER_NUMBER_FILTER) {
                        char dest[strlen(filter->value.s)+1];
-                       ret = ctsvc_normalize_number(filter->value.s, dest, sizeof(dest));
+                       ret = ctsvc_normalize_number(filter->value.s, dest, sizeof(dest), CTSVC_MIN_MATCH_NORMALIZED_NUMBER_SIZE);
                        if (CONTACTS_ERROR_NONE == ret)
                                *bind_text = g_slist_append(*bind_text, strdup(dest));
                        else
@@ -386,6 +387,119 @@ static inline int __ctsvc_db_create_composite_condition(ctsvc_composite_filter_s
        return CONTACTS_ERROR_NONE;
 }
 
+int ctsvc_db_update_record_with_set_query(const char *set, GSList *bind_text, const char *table, int id)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       sqlite3_stmt *stmt = NULL;
+       GSList *cursor = NULL;
+
+       snprintf(query, sizeof(query), "UPDATE %s SET %s WHERE id = %d", table, set, id);
+
+       stmt = cts_query_prepare(query);
+       if (NULL == stmt) {
+               CTS_ERR("DB error : cts_query_prepare() Failed");
+               return CONTACTS_ERROR_DB;
+       }
+
+       if (bind_text) {
+               int i = 0;
+               for (cursor=bind_text,i=1;cursor;cursor=cursor->next,i++) {
+                       const char *text = cursor->data;
+                       if (text && *text)
+                               cts_stmt_bind_text(stmt, i, text);
+               }
+       }
+       ret = cts_stmt_step(stmt);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("cts_stmt_step() Failed(%d)", ret);
+               cts_stmt_finalize(stmt);
+               return ret;
+       }
+       cts_stmt_finalize(stmt);
+       return ret;
+}
+
+int ctsvc_db_create_set_query(contacts_record_h record, char **set, GSList **bind_text)
+{
+       ctsvc_record_s *s_record;
+       int i = 0;
+       const property_info_s* property_info = NULL;
+       unsigned int property_info_count = 0;
+       char out_set[CTS_SQL_MAX_LEN] = {0};
+       int len = 0;
+       const char *field_name;
+       int ret = CONTACTS_ERROR_NONE;
+
+       RETV_IF(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER);
+
+       s_record = (ctsvc_record_s *)record;
+       if (0 == s_record->property_max_count || NULL == s_record->properties_flags) {
+               ERR("record don't have properties");
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+       }
+
+       property_info = ctsvc_view_get_all_property_infos(s_record->view_uri, &property_info_count);
+
+       for(i=0;i<property_info_count;i++) {
+               if (ctsvc_record_check_property_flag(s_record, property_info[i].property_id, CTSVC_PROPERTY_FLAG_DIRTY)) {
+                       field_name = property_info[i].fields;
+                       if (NULL == field_name)
+                               continue;
+
+                       if (CTSVC_VIEW_CHECK_DATA_TYPE(property_info[i].property_id, CTSVC_VIEW_DATA_TYPE_BOOL)) {
+                               bool tmp = false;
+                               ret = contacts_record_get_bool(record,property_info[i].property_id, &tmp);
+                               if (ret != CONTACTS_ERROR_NONE)
+                                       continue;
+                               if (len != 0)
+                                       len += snprintf(out_set+len, sizeof(out_set)-len, ", ");
+                               len += snprintf(out_set+len, sizeof(out_set)-len, "%s=%d", field_name, tmp);
+                       }
+                       else if (CTSVC_VIEW_CHECK_DATA_TYPE(property_info[i].property_id, CTSVC_VIEW_DATA_TYPE_INT)) {
+                               int tmp = 0;
+                               ret = contacts_record_get_int(record,property_info[i].property_id, &tmp);
+                               if (ret != CONTACTS_ERROR_NONE)
+                                       continue;
+                               if (len != 0)
+                                       len += snprintf(out_set+len, sizeof(out_set)-len, ", ");
+                               len += snprintf(out_set+len, sizeof(out_set)-len, "%s=%d", field_name, tmp);
+                       }
+                       else if (CTSVC_VIEW_CHECK_DATA_TYPE(property_info[i].property_id, CTSVC_VIEW_DATA_TYPE_LLI)) {
+                               long long int tmp = 0;
+                               ret = contacts_record_get_lli(record, property_info[i].property_id, &tmp);
+                               if (ret != CONTACTS_ERROR_NONE)
+                                       continue;
+                               if (len != 0)
+                                       len += snprintf(out_set+len, sizeof(out_set)-len, ", ");
+                               len += snprintf(out_set+len, sizeof(out_set)-len, "%s=%lld", field_name,tmp);
+                       }
+                       else if (CTSVC_VIEW_CHECK_DATA_TYPE(property_info[i].property_id, CTSVC_VIEW_DATA_TYPE_STR)) {
+                               char *tmp = NULL;
+                               ret = contacts_record_get_str_p(record,property_info[i].property_id, &tmp);
+                               if (ret != CONTACTS_ERROR_NONE)
+                                       continue;
+                               if (len != 0)
+                                       len += snprintf(out_set+len, sizeof(out_set)-len, ", ");
+                               len += snprintf(out_set+len, sizeof(out_set)-len, "%s=?", field_name);
+                               *bind_text = g_slist_append(*bind_text, strdup(SAFE_STR(tmp)));
+                       }
+                       else if (CTSVC_VIEW_CHECK_DATA_TYPE(property_info[i].property_id, CTSVC_VIEW_DATA_TYPE_DOUBLE)) {
+                               double tmp = 0;
+                               ret = contacts_record_get_double(record, property_info[i].property_id, &tmp);
+                               if (ret != CONTACTS_ERROR_NONE)
+                                       continue;
+                               if (len != 0)
+                                       len += snprintf(out_set+len, sizeof(out_set)-len, ", ");
+                               len += snprintf(out_set+len, sizeof(out_set)-len, "%s=%lf", field_name, tmp);
+                       }
+               }
+       }
+       *set = strdup(out_set);
+
+       return CONTACTS_ERROR_NONE;
+}
+
 static int __ctsvc_db_create_projection(const property_info_s *properties, int ids_count,
                unsigned int *projections, int pro_count, char **projection)
 {
@@ -401,7 +515,7 @@ static int __ctsvc_db_create_projection(const property_info_s *properties, int i
        if (0 < pro_count) {
                for (i=0;i<pro_count;i++) {
                        if (projections[i] == CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX) {
-                               snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)", ctsvc_get_display_column());
+                               snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)", ctsvc_get_sort_name_column());
                                field_name = temp;
                        }
                        else
@@ -419,12 +533,12 @@ static int __ctsvc_db_create_projection(const property_info_s *properties, int i
        }
        else {
                for (i=0;i<ids_count;i++) {
-                       if (CTSVC_VIEW_DATA_TYPE_REC == properties[i].type)
+                       if (CTSVC_VIEW_DATA_TYPE_REC == (properties[i].property_id & CTSVC_VIEW_DATA_TYPE_MASK))
                                continue;
                        if (properties[i].fields)
                                field_name = properties[i].fields;
                        else if (properties[i].property_id == CTSVC_PROPERTY_PERSON_DISPLAY_NAME_INDEX) {
-                               snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)", ctsvc_get_display_column());
+                               snprintf(temp, sizeof(temp), "_NORMALIZE_INDEX_(%s)", ctsvc_get_sort_name_column());
                                field_name = temp;
                                CTS_DBG("field_name : %s", field_name);
                        }
@@ -531,6 +645,8 @@ int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int
        }
        else if (sortkey)
                len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey);
+       else if (0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_GROUP))
+               len += snprintf(query+len, sizeof(query)-len, " ORDER BY group_prio");
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -649,7 +765,8 @@ static int __ctsvc_db_get_all_records_exec(const char *view_uri, const property_
        if (__ctsvc_db_view_has_display_name(view_uri, properties, ids_count)) {
                sortkey = ctsvc_get_sort_column();
                len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey);
-       }
+       } else if (0 == strcmp(view_uri, CTSVC_VIEW_URI_GROUP))
+               len += snprintf(query+len, sizeof(query)-len, " ORDER BY group_prio");
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -674,7 +791,7 @@ static int __ctsvc_db_get_all_records_exec(const char *view_uri, const property_
 
                contacts_record_create(view_uri, &record);
                for(i=0;i<ids_count;i++) {
-                       type = properties[i].type;
+                       type = (properties[i].property_id & CTSVC_VIEW_DATA_TYPE_MASK);
                        if (type == 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)
@@ -725,6 +842,87 @@ static inline bool __ctsvc_db_view_can_keyword_search(const char *view_uri)
        return false;
 }
 
+static int __ctsvc_db_append_search_query(const char *keyword, char *query, int size)
+{
+       bool emailaddress = false;
+       bool phonenumber = false;
+       int ret;
+       int len = 0, i;
+       if (strstr(keyword, "@") != NULL) {
+               emailaddress = true;
+       }
+       else {
+               len = strlen(keyword);
+
+               phonenumber = true;
+               for(i=0; i<len; i++) {
+                       if (keyword[i] < '0' || keyword[i] > '9') {
+                               phonenumber = false;
+                               break;
+                       }
+               }
+       }
+
+       if (emailaddress) {
+               ret = snprintf(query, size,
+                               "(SELECT contact_id FROM %s WHERE %s MATCH 'data:%s*') ",
+                               CTS_TABLE_SEARCH_INDEX, CTS_TABLE_SEARCH_INDEX,
+                               keyword );
+       }
+       else if (phonenumber) {
+               char normalized_number[CTSVC_NUMBER_MAX_LEN];
+
+               ctsvc_normalize_number(keyword, normalized_number, CTSVC_NUMBER_MAX_LEN, CTSVC_NUMBER_MAX_LEN -1);
+
+               ret =snprintf(query, size,
+                               "(SELECT contact_id FROM %s WHERE %s MATCH 'name:%s* OR number:%s* OR  data:%s*' "
+                                       "UNION "
+                                       "SELECT contact_id FROM %s WHERE number LIKE '%%%s%%') ",
+                               CTS_TABLE_SEARCH_INDEX, CTS_TABLE_SEARCH_INDEX,
+                               keyword, keyword, keyword, CTS_TABLE_PHONE_LOOKUP, normalized_number );
+       }
+       else {
+               char *normalized_name = NULL;
+               ret = ctsvc_normalize_str(keyword, &normalized_name);
+
+               if (CTSVC_LANG_KOREAN == ret) {
+                       char *chosung = calloc(1, strlen(keyword) * 5);
+                       char *korean_pattern = calloc(1, strlen(keyword) * 5);
+
+                       ctsvc_get_chosung(keyword, chosung, strlen(keyword) * 5 );
+                       ctsvc_get_korean_search_pattern(keyword, korean_pattern, strlen(keyword) * 5 );
+                       ret = snprintf(query, size,
+                                       "(SELECT contact_id FROM %s WHERE %s MATCH 'name:%s* OR number:%s* OR  data:%s*' "
+                                               "INTERSECT "
+                                               "SELECT contact_id FROM %s WHERE name GLOB '*%s*') ",
+                                       CTS_TABLE_SEARCH_INDEX, CTS_TABLE_SEARCH_INDEX,
+                                       chosung, keyword, keyword, CTS_TABLE_NAME_LOOKUP, korean_pattern );
+                       free(chosung);
+                       free(korean_pattern);
+               }
+               else if (CTSVC_LANG_JAPANESE == ret){
+                       char *hiragana = NULL;
+
+                       ctsvc_convert_japanese_to_hiragana(keyword, &hiragana);
+
+                       ret = snprintf(query, size,
+                                                               "(SELECT contact_id FROM %s WHERE %s MATCH 'name:%s* OR number:%s* OR  data:%s*') ",
+                                                               CTS_TABLE_SEARCH_INDEX, CTS_TABLE_SEARCH_INDEX,
+                                                               hiragana, hiragana, hiragana);
+                       free(hiragana);
+               }
+               else {
+                       ret = snprintf(query, size,
+                                       "(SELECT contact_id FROM %s WHERE %s MATCH 'name:%s* OR number:%s* OR  data:%s*') ",
+                                       CTS_TABLE_SEARCH_INDEX, CTS_TABLE_SEARCH_INDEX,
+                                       normalized_name, keyword, keyword);
+               }
+               free(normalized_name);
+       }
+
+       return ret;
+}
+
 static int __ctsvc_db_search_records_exec(const char *view_uri, const property_info_s* properties,
                int ids_count, const char *projection, const char *keyword, int offset, int limit, contacts_list_h* out_list )
 {
@@ -737,34 +935,28 @@ static int __ctsvc_db_search_records_exec(const char *view_uri, const property_i
        cts_stmt stmt = NULL;
        contacts_list_h list = NULL;
        ctsvc_record_type_e r_type;
-       char remake_val[CTS_SQL_MIN_LEN] = {0};
        const char *sortkey;
 
        ret = ctsvc_db_get_table_name(view_uri, &table);
        RETVM_IF (CONTACTS_ERROR_NONE != ret, ret, "Invalid parameter : view uri (%s)", view_uri);
 
-       ret = ctsvc_normalize_str(keyword, remake_val, sizeof(remake_val));
-
        if (CONTACTS_ERROR_NONE <= ret) {
                if (0 == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
                                || 0 == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)) {
-                       len = snprintf(query, sizeof(query), "SELECT %s FROM %s, %s "
-                                               "ON %s.contact_id = %s.contact_id "
-                                               "WHERE (%s MATCH 'name:%s* OR number:%s* OR  data:%s*') ",
-                                               projection, table, CTS_TABLE_SEARCH_INDEX,
-                                               table, CTS_TABLE_SEARCH_INDEX,
-                                               CTS_TABLE_SEARCH_INDEX, remake_val, keyword, keyword);
+                       len = snprintf(query, sizeof(query), "SELECT %s FROM %s "
+                                               "WHERE contact_id IN ",
+                                               projection, table);
+                       len += __ctsvc_db_append_search_query(keyword, query + len, sizeof(query) - len);
                }
                else {          // CTSVC_VIEW_URI_PERSON
                        len = snprintf(query, sizeof(query), "SELECT %s FROM %s, "
-                                       "(SELECT person_id person_id_in_contact "
-                                                       "FROM "CTS_TABLE_CONTACTS", "CTS_TABLE_SEARCH_INDEX" "
-                                                       "ON contacts.contact_id = search_index.contact_id AND deleted = 0 "
-                                                       "WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR  data:%s*') "
-                                                       "GROUP BY person_id_in_contact) temp_contacts "
-                                               "ON %s.person_id = temp_contacts.person_id_in_contact",
-                                               projection, table, remake_val, keyword, keyword, table);
-
+                                               "(SELECT person_id person_id_in_contact "
+                                                               "FROM "CTS_TABLE_CONTACTS " "
+                                                               "WHERE deleted = 0 AND contact_id IN ",
+                                                               projection, table);
+                       len += __ctsvc_db_append_search_query(keyword, query + len, sizeof(query) - len);
+                       len += snprintf(query + len, sizeof(query) - len, " GROUP BY person_id_in_contact) temp_contacts "
+                                                       "ON %s.person_id = temp_contacts.person_id_in_contact",  table);
                }
 /*
                len += snprintf(query+len, sizeof(query)-len, "FROM %s, %s "
@@ -778,29 +970,28 @@ static int __ctsvc_db_search_records_exec(const char *view_uri, const property_i
        else {
                if (0 == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
                                || 0 == strcmp(view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)) {
-                       len = snprintf(query, sizeof(query), "SELECT %s FROM %s, %s "
-                                               "ON %s.contact_id = %s.contact_id "
-                                               "WHERE (%s MATCH 'name:%s* OR number:%s* OR  data:%s*') ",
-                                               projection, table, CTS_TABLE_SEARCH_INDEX,
-                                               table, CTS_TABLE_SEARCH_INDEX,
-                                               CTS_TABLE_SEARCH_INDEX, keyword, keyword, keyword);
+                       len = snprintf(query, sizeof(query), "SELECT %s FROM %s "
+                                               "WHERE contact_id IN ",
+                                               projection, table);
+                       len += __ctsvc_db_append_search_query(keyword, query + len, sizeof(query) - len);
                }
                else {          // CTSVC_VIEW_URI_PERSON
                        len = snprintf(query, sizeof(query),
-                                               "SELECT %s FROM %s, "CTS_TABLE_SEARCH_INDEX", "
+                                               "SELECT %s FROM %s, "
                                                        "(SELECT contact_id, person_id person_id_in_contact FROM "CTS_TABLE_CONTACTS") temp_contacts "
                                                "ON %s.person_id = temp_contacts.person_id_in_contact "
-                                                       "AND temp_contacts.contact_id = "CTS_TABLE_SEARCH_INDEX".contact_id "
                                                        "AND temp_contacts.deleted = 0 "
-                                               "WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR  data:%s*') ",
-                                               projection, table, table, keyword, keyword, keyword);
+                                               "WHERE temp_contacts.contact_id IN ",
+                                               projection, table, table);
+                       len += __ctsvc_db_append_search_query(keyword, query + len, sizeof(query) - len);
                }
        }
 
        if (__ctsvc_db_view_has_display_name(view_uri, properties, ids_count)) {
                sortkey = ctsvc_get_sort_column();
                len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey);
-       }
+       } else if (0 == strcmp(view_uri, CTSVC_VIEW_URI_GROUP))
+               len += snprintf(query+len, sizeof(query)-len, " ORDER BY group_prio");
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -811,12 +1002,6 @@ static int __ctsvc_db_search_records_exec(const char *view_uri, const property_i
        stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
 
-/*
-       sqlite3_bind_text(stmt, 1, keyword, strlen(keyword), SQLITE_STATIC);
-       if (CONTACTS_ERROR_NONE <= ret)
-               sqlite3_bind_text(stmt, 2, remake_val, strlen(remake_val), SQLITE_STATIC);
-*/
-
        r_type = ctsvc_view_get_record_type(view_uri);
 
        contacts_list_create(&list);
@@ -851,7 +1036,7 @@ static int __ctsvc_db_search_records_exec(const char *view_uri, const property_i
                        contacts_record_create(view_uri, &record);
 
                        for(i=0;i<ids_count;i++) {
-                               type = properties[i].type;
+                               type = (properties[i].property_id & CTSVC_VIEW_DATA_TYPE_MASK);
                                if (type == 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)
@@ -869,6 +1054,7 @@ static int __ctsvc_db_search_records_exec(const char *view_uri, const property_i
 
                ctsvc_list_prepend(list, record);
        }
+
        cts_stmt_finalize(stmt);
        ctsvc_list_reverse(list);
        *out_list = (contacts_list_h)list;
@@ -914,7 +1100,6 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
        contacts_list_h list = NULL;
        const char *table;
        const char *sortkey = NULL;
-       char remake_val[CTS_SQL_MIN_LEN] = {0};
 
        RETV_IF(NULL == projection || '\0' == *projection, CONTACTS_ERROR_INVALID_PARAMETER);
 
@@ -928,30 +1113,20 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
 
        if (0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT)
                        || 0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP)) {
-               len += snprintf(query+len, sizeof(query)-len, "FROM %s, %s "
-                                       "ON %s.contact_id = %s.contact_id ",
-                                       table, CTS_TABLE_SEARCH_INDEX,
-                                       table, CTS_TABLE_SEARCH_INDEX);
+               len += snprintf(query+len, sizeof(query)-len, "FROM %s temp_contacts ", table);
        }
        else {          // CTSVC_VIEW_URI_PERSON
-               len += snprintf(query+len, sizeof(query)-len, "FROM %s, %s, "
+               len += snprintf(query+len, sizeof(query)-len, "FROM %s, "
                                                "(SELECT contact_id, person_id person_id_in_contact FROM %s WHERE deleted = 0) temp_contacts "
                                                "ON %s.person_id = temp_contacts.person_id_in_contact "
-                                                       "AND temp_contacts.contact_id = %s.contact_id",
-                                               table, CTS_TABLE_SEARCH_INDEX, CTS_TABLE_CONTACTS, table, CTS_TABLE_SEARCH_INDEX);
+                                               , table, CTS_TABLE_CONTACTS, table);
        }
 /*     len += snprintf(query+len, sizeof(query)-len, "FROM %s, "CTS_TABLE_SEARCH_INDEX" "
                                        "ON %s.contact_id = "CTS_TABLE_SEARCH_INDEX".contact_id", table, table);*/
 
-       ret = ctsvc_normalize_str(keyword, remake_val, sizeof(remake_val));
-
-       if (CONTACTS_ERROR_NONE <= ret) {
-               len += snprintf(query+len, sizeof(query)-len,
-                               " WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR  data:%s*') ", remake_val, keyword, keyword);
-       }
-       else
-               len += snprintf(query+len, sizeof(query)-len,
-                               " WHERE ("CTS_TABLE_SEARCH_INDEX" MATCH 'name:%s* OR number:%s* OR  data:%s*') ", keyword, keyword, keyword);
+       len += snprintf(query+len, sizeof(query)-len,
+                       " WHERE temp_contacts.contact_id IN ");
+       len += __ctsvc_db_append_search_query(keyword, query + len, sizeof(query) - len);
 
        if (condition && *condition)
                len += snprintf(query+len, sizeof(query)-len, " AND (%s)", condition);
@@ -984,6 +1159,8 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
        }
        else if (sortkey)
                len += snprintf(query+len, sizeof(query)-len, " ORDER BY %s", sortkey);
+       else if (0 == strcmp(s_query->view_uri, CTSVC_VIEW_URI_GROUP))
+               len += snprintf(query+len, sizeof(query)-len, " ORDER BY group_prio");
 
        if (0 < limit) {
                len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
@@ -996,9 +1173,6 @@ static inline int __ctsvc_db_search_records_with_query_exec(ctsvc_query_s *s_que
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
 
        i = 1;
-//     sqlite3_bind_text(stmt, i++, keyword, strlen(keyword), SQLITE_STATIC);
-//     if (*remake_val)
-//             sqlite3_bind_text(stmt, i++, remake_val, strlen(remake_val), SQLITE_STATIC);
 
        len = g_slist_length(bind);
        for (cursor=bind; cursor;cursor=cursor->next, i++)
@@ -1227,12 +1401,17 @@ static int __ctsvc_db_delete_records(const char* view_uri, int ids[], int count)
        index = 0;
        do {
                ret = contacts_db_delete_record(view_uri, ids[index++]);
-               if( ret != CONTACTS_ERROR_NONE ) {
+               if (CONTACTS_ERROR_NO_DATA == ret) {
+                       CTS_DBG("the record is not exist : %d", ret);
+                       continue;
+               }
+               else if( ret != CONTACTS_ERROR_NONE ) {
                        CTS_ERR("contacts_db_delete_record is faild(%d)", ret);
                        ctsvc_end_trans(false);
                        return ret;
                }
-       }while(index < count);
+       } while(index < count);
+
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
        {
@@ -1240,7 +1419,6 @@ static int __ctsvc_db_delete_records(const char* view_uri, int ids[], int count)
                return ret;
        }
 
-
        return CONTACTS_ERROR_NONE;
 }
 
@@ -1459,23 +1637,147 @@ API int contacts_db_get_records_with_query( contacts_query_h query, int offset,
        return __ctsvc_db_get_records_with_query_exec(s_query, offset, limit, out_list);
 }
 
+static int __ctsvc_db_get_contact_changes(const char* view_uri, int addressbook_id,
+               int version, contacts_list_h* out_list, int* out_current_version)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       contacts_list_h list;
+       cts_stmt stmt;
+
+       if (0 <= addressbook_id) {
+               snprintf(query, sizeof(query),
+                       "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id, image_changed_ver FROM %s "
+                       "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 0 "
+                       "UNION "
+                       "SELECT %d, contact_id, deleted_ver, -1, addressbook_id, 0 FROM %s "
+                       "WHERE deleted_ver > %d AND created_ver <= %d AND addressbook_id = %d "
+                       "UNION "
+                       "SELECT %d, contact_id, changed_ver, -1, addressbook_id, 0 FROM %s "
+                       "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 1",
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version, addressbook_id,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version, version, addressbook_id,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version, addressbook_id);
+       }
+       else {
+               snprintf(query, sizeof(query),
+                       "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id, image_changed_ver FROM %s "
+                       "WHERE changed_ver > %d AND deleted = 0 "
+                       "UNION "
+                       "SELECT %d, contact_id, deleted_ver, -1, addressbook_id, 0 FROM %s "
+                       "WHERE deleted_ver > %d AND created_ver <= %d "
+                       "UNION "
+                       "SELECT %d, contact_id, changed_ver, -1, addressbook_id, 0 FROM %s "
+                       "WHERE changed_ver > %d AND deleted = 1",
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version, version,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version);
+       }
+
+       stmt = cts_query_prepare(query);
+       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
+
+       contacts_list_create(&list);
+       while ((ret = cts_stmt_step(stmt))) {
+               contacts_record_h record;
+               ctsvc_updated_info_s *update_info;
+
+               if (1 != ret) {
+                       CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+                       cts_stmt_finalize(stmt);
+                       contacts_list_destroy(list, true);
+                       return ret;
+               }
+
+               ret = contacts_record_create(_contacts_contact_updated_info._uri, &record);
+               update_info = (ctsvc_updated_info_s *)record;
+               update_info->changed_type = ctsvc_stmt_get_int(stmt, 0);
+               update_info->id = ctsvc_stmt_get_int(stmt, 1);
+               update_info->changed_ver = ctsvc_stmt_get_int(stmt, 2);
+
+               if (ctsvc_stmt_get_int(stmt, 3) == update_info->changed_ver || version < ctsvc_stmt_get_int(stmt, 3))
+                       update_info->changed_type = CONTACTS_CHANGE_INSERTED;
+
+               update_info->addressbook_id = ctsvc_stmt_get_int(stmt, 4);
+
+               if (version < ctsvc_stmt_get_int(stmt, 5))
+                       update_info->image_changed = true;
+
+               ctsvc_list_prepend(list, record);
+       }
+       cts_stmt_finalize(stmt);
+       ctsvc_list_reverse(list);
+
+       *out_list = list;
+       snprintf(query, sizeof(query), "SELECT ver FROM "CTS_TABLE_VERSION);
+       ret = ctsvc_query_get_first_int_result(query, out_current_version);
+
+       return CONTACTS_ERROR_NONE;
+}
 
-static int __ctsvc_db_update_info_create_record_from_stmt(const char *view_uri,
-               cts_stmt stmt, int version, contacts_record_h* record)
+static int __ctsvc_db_get_group_changes(const char* view_uri, int addressbook_id,
+               int version, contacts_list_h* out_list, int* out_current_version)
 {
-       int ret = contacts_record_create(view_uri, record);
-       RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create is failed(%d)", ret);
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       contacts_list_h list;
+       cts_stmt stmt;
 
-       ctsvc_updated_info_s *update_info = (ctsvc_updated_info_s *)*record;
+       if (0 <= addressbook_id) {
+               snprintf(query, sizeof(query),
+                       "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s "
+                       "WHERE changed_ver > %d AND addressbook_id = %d "
+                       "UNION "
+                       "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s "
+                       "WHERE deleted_ver > %d AND created_ver <= %d AND addressbook_id = %d",
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version, addressbook_id,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version, version, addressbook_id);
+       }
+       else {
+               snprintf(query, sizeof(query),
+                       "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s "
+                       "WHERE changed_ver > %d "
+                       "UNION "
+                       "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s "
+                       "WHERE deleted_ver > %d AND created_ver <= %d",
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version, version);
+       }
 
-       update_info->changed_type = ctsvc_stmt_get_int(stmt, 0);
-       update_info->id = ctsvc_stmt_get_int(stmt, 1);
-       update_info->changed_ver = ctsvc_stmt_get_int(stmt, 2);
+       stmt = cts_query_prepare(query);
+       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
 
-       if (ctsvc_stmt_get_int(stmt, 3) == update_info->changed_ver || version < ctsvc_stmt_get_int(stmt, 3))
-               update_info->changed_type = CONTACTS_CHANGE_INSERTED;
+       contacts_list_create(&list);
+       while ((ret = cts_stmt_step(stmt))) {
+               contacts_record_h record;
+               ctsvc_updated_info_s *update_info;
+
+               if (1 != ret) {
+                       CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
+                       cts_stmt_finalize(stmt);
+                       contacts_list_destroy(list, true);
+                       return ret;
+               }
+
+               ret = contacts_record_create(_contacts_group_updated_info._uri, &record);
+               update_info = (ctsvc_updated_info_s *)record;
+               update_info->changed_type = ctsvc_stmt_get_int(stmt, 0);
+               update_info->id = ctsvc_stmt_get_int(stmt, 1);
+               update_info->changed_ver = ctsvc_stmt_get_int(stmt, 2);
+
+               if (ctsvc_stmt_get_int(stmt, 3) == update_info->changed_ver || version < ctsvc_stmt_get_int(stmt, 3))
+                       update_info->changed_type = CONTACTS_CHANGE_INSERTED;
+
+               update_info->addressbook_id = ctsvc_stmt_get_int(stmt, 4);
+
+               ctsvc_list_prepend(list, record);
+       }
+       cts_stmt_finalize(stmt);
+       ctsvc_list_reverse(list);
 
-       update_info->addressbook_id = ctsvc_stmt_get_int(stmt, 4);
+       *out_list = list;
+       snprintf(query, sizeof(query), "SELECT ver FROM "CTS_TABLE_VERSION);
+       ret = ctsvc_query_get_first_int_result(query, out_current_version);
 
        return CONTACTS_ERROR_NONE;
 }
@@ -1549,8 +1851,8 @@ static int __ctsvc_db_get_group_member_changes(const char* view_uri, int address
        cts_stmt stmt;
 
        len = snprintf(query, sizeof(query),
-                       "SELECT group_id, version, addressbook_id "
-                               "FROM "CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO" WHERE version > %d", version);
+                       "SELECT group_id, member_changed_ver, addressbook_id "
+                               "FROM "CTS_TABLE_GROUPS" WHERE member_changed_ver > %d", version);
 
        if (0 <= addressbook_id)
                len += snprintf(query+len, sizeof(query)-len, " AND addressbook_id = %d ", addressbook_id);
@@ -1585,101 +1887,47 @@ static int __ctsvc_db_get_group_member_changes(const char* view_uri, int address
        return CONTACTS_ERROR_NONE;
 }
 
-API int contacts_db_get_changes_by_version( const char* view_uri, int addressbook_id,
-               int version, contacts_list_h* out_list, int* out_current_version )
+static int __ctsvc_db_get_my_profile_changes(const char* view_uri, int addressbook_id,
+               int version, contacts_list_h* out_list, int* out_current_version)
 {
        int ret;
-       RETV_IF(version < 0, CONTACTS_ERROR_INVALID_PARAMETER);
-       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
-       *out_list = NULL;
-       RETV_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER);
-       *out_current_version = 0;
-
        char query[CTS_SQL_MAX_LEN] = {0};
-       if (0 == strcmp(view_uri, _contacts_contact_updated_info._uri))
-       {
-               if (0 <= addressbook_id)
-               {
-                       snprintf(query, sizeof(query),
-                               "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 0 "
-                               "UNION "
-                               "SELECT %d, contact_id, deleted_ver, -1, addressbook_id FROM %s "
-                               "WHERE deleted_ver > %d AND addressbook_id = %d "
-                               "UNION "
-                               "SELECT %d, contact_id, changed_ver, -1, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d AND addressbook_id = %d AND deleted = 1",
-                               CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version, addressbook_id,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version, addressbook_id,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version, addressbook_id);
-               }
-               else {
-                       snprintf(query, sizeof(query),
-                               "SELECT %d, contact_id, changed_ver, created_ver, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d AND deleted = 0 "
-                               "UNION "
-                               "SELECT %d, contact_id, deleted_ver, -1, addressbook_id FROM %s "
-                               "WHERE deleted_ver > %d "
-                               "UNION "
-                               "SELECT %d, contact_id, changed_ver, -1, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d AND deleted = 1",
-                               CONTACTS_CHANGE_UPDATED, CTS_TABLE_CONTACTS, version,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_DELETEDS, version,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_CONTACTS, version);
-               }
-       }
-       else if(0 == strcmp(view_uri, _contacts_group_updated_info._uri))
-       {
-               if (0 <= addressbook_id)
-               {
-                       snprintf(query, sizeof(query),
-                               "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d AND addressbook_id = %d "
-                               "UNION "
-                               "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s "
-                               "WHERE deleted_ver > %d AND addressbook_id = %d",
-                               CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version, addressbook_id,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version, addressbook_id);
-               }
-               else {
-                       snprintf(query, sizeof(query),
-                               "SELECT %d, group_id, changed_ver, created_ver, addressbook_id FROM %s "
-                               "WHERE changed_ver > %d "
-                               "UNION "
-                               "SELECT %d, group_id, deleted_ver, -1, addressbook_id FROM %s "
-                               "WHERE deleted_ver > %d ",
-                               CONTACTS_CHANGE_UPDATED, CTS_TABLE_GROUPS, version,
-                               CONTACTS_CHANGE_DELETED, CTS_TABLE_GROUP_DELETEDS, version);
-               }
-       }
-       else if(0 == strcmp(view_uri, _contacts_group_member_updated_info._uri)) {
-               ret = __ctsvc_db_get_group_member_changes(view_uri, addressbook_id,
-                                       version, out_list, out_current_version);
-               return ret;
-       }
-       else if(0 == strcmp(view_uri, _contacts_grouprel_updated_info._uri)) {
-               ret = __ctsvc_db_get_group_relations_changes(view_uri, addressbook_id,
-                                       version, out_list, out_current_version);
-               return ret;
-       }
-/*
-       else if(0 == strcmp(view_uri, CTSVC_VIEW_URI_PERSON_UPDATED_INFO))
-       {
+       contacts_list_h list;
+       cts_stmt stmt;
 
+       if (0 <= addressbook_id) {
+               snprintf(query, sizeof(query),
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND changed_ver == created_ver AND deleted = 0 AND addressbook_id = %d "
+                       "UNION "
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND changed_ver != created_ver AND deleted = 0 AND addressbook_id = %d "
+                       "UNION "
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND deleted = 1 AND addressbook_id = %d",
+                       CONTACTS_CHANGE_INSERTED, CTS_TABLE_MY_PROFILES, version, addressbook_id,
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_MY_PROFILES, version, addressbook_id,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_MY_PROFILES, version, addressbook_id);
        }
-*/
-       else
-       {
-               CTS_ERR("Invalid parameter : this API does not support uri(%s)", view_uri);
-               return CONTACTS_ERROR_INVALID_PARAMETER;
+       else {
+               snprintf(query, sizeof(query),
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND changed_ver == created_ver AND deleted = 0 "
+                       "UNION "
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND changed_ver != created_ver AND deleted = 0 "
+                       "UNION "
+                       "SELECT changed_ver, addressbook_id, %d FROM %s "
+                       "WHERE changed_ver > %d AND deleted = 1",
+                       CONTACTS_CHANGE_INSERTED, CTS_TABLE_MY_PROFILES, version,
+                       CONTACTS_CHANGE_UPDATED, CTS_TABLE_MY_PROFILES, version,
+                       CONTACTS_CHANGE_DELETED, CTS_TABLE_MY_PROFILES, version);
        }
 
-       cts_stmt stmt = cts_query_prepare(query);
+       stmt = cts_query_prepare(query);
        RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB , "DB error : cts_query_prepare() Failed");
 
-       contacts_list_h list;
        contacts_list_create(&list);
-
        while ((ret = cts_stmt_step(stmt))) {
                contacts_record_h record;
                if (1 != ret) {
@@ -1689,32 +1937,65 @@ API int contacts_db_get_changes_by_version( const char* view_uri, int addressboo
                        return ret;
                }
 
-               ret = __ctsvc_db_update_info_create_record_from_stmt(view_uri, stmt, version, &record);
-               if( ret != CONTACTS_ERROR_NONE )
-               {
-                       CTS_ERR("DB error : __ctsvc_db_update_info_create_record_from_stmt() Failed(%d)", ret);
-                       cts_stmt_finalize(stmt);
-                       contacts_list_destroy(list, true);
-                       return CONTACTS_ERROR_DB;
-               }
-
+               ret = contacts_record_create(view_uri, &record);
+               ctsvc_record_set_int(record, _contacts_my_profile_updated_info.version, ctsvc_stmt_get_int(stmt, 0));
+               ctsvc_record_set_int(record, _contacts_my_profile_updated_info.address_book_id, ctsvc_stmt_get_int(stmt, 1));
+               ctsvc_record_set_int(record, _contacts_my_profile_updated_info.last_changed_type, ctsvc_stmt_get_int(stmt, 2));
                ctsvc_list_prepend(list, record);
        }
        cts_stmt_finalize(stmt);
        ctsvc_list_reverse(list);
 
-       *out_list = (contacts_list_h)list;
-
-       // why should be return with current_version ??
-       const char *version_query = "SELECT ver FROM "CTS_TABLE_VERSION;
-       ret = ctsvc_query_get_first_int_result(version_query, out_current_version);
+       *out_list = list;
+       snprintf(query, sizeof(query), "SELECT ver FROM "CTS_TABLE_VERSION);
+       ret = ctsvc_query_get_first_int_result(query, out_current_version);
 
        return CONTACTS_ERROR_NONE;
 }
 
+API int contacts_db_get_changes_by_version( const char* view_uri, int addressbook_id,
+               int version, contacts_list_h* out_list, int* out_current_version )
+{
+       int ret;
+       RETV_IF(version < 0, CONTACTS_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_list = NULL;
+       RETV_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER);
+       *out_current_version = 0;
+
+       if (0 == strcmp(view_uri, _contacts_contact_updated_info._uri)) {
+               ret = __ctsvc_db_get_contact_changes(view_uri, addressbook_id,
+                                       version, out_list, out_current_version);
+               return ret;
+       }
+       else if (0 == strcmp(view_uri, _contacts_group_updated_info._uri)) {
+               ret = __ctsvc_db_get_group_changes(view_uri, addressbook_id,
+                                       version, out_list, out_current_version);
+               return ret;
+       }
+       else if (0 == strcmp(view_uri, _contacts_group_member_updated_info._uri)) {
+               ret = __ctsvc_db_get_group_member_changes(view_uri, addressbook_id,
+                                       version, out_list, out_current_version);
+               return ret;
+       }
+       else if (0 == strcmp(view_uri, _contacts_grouprel_updated_info._uri)) {
+               ret = __ctsvc_db_get_group_relations_changes(view_uri, addressbook_id,
+                                       version, out_list, out_current_version);
+               return ret;
+       }
+       else if (0 == strcmp(view_uri, _contacts_my_profile_updated_info._uri)) {
+               ret = __ctsvc_db_get_my_profile_changes(view_uri, addressbook_id,
+                                       version, out_list, out_current_version);
+               return ret;
+       }
+
+       CTS_ERR("Invalid parameter : this API does not support uri(%s)", view_uri);
+       return CONTACTS_ERROR_INVALID_PARAMETER;
+}
+
 API int contacts_db_get_current_version( int* out_current_version )
 {
-       RETVM_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == out_current_version, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        return ctsvc_get_current_version(out_current_version);
 }
@@ -1724,7 +2005,7 @@ API int contacts_db_search_records(const char* view_uri, const char *keyword,
 {
        RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_list = NULL;
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        return __ctsvc_db_search_records(view_uri, keyword, offset, limit, out_list);
 }
@@ -1734,7 +2015,7 @@ API int contacts_db_search_records_with_query( contacts_query_h query, const cha
 {
        RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_list = NULL;
-       RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        return __ctsvc_db_search_records_with_query(query, keyword, offset, limit, out_list);
 }
@@ -1746,7 +2027,7 @@ API int contacts_db_get_count( const char* view_uri, int *out_count)
 
        RETV_IF(NULL == out_count, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_count = 0;
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        if (( plugin_info = ctsvc_db_get_plugin_info(ctsvc_view_get_record_type(view_uri)))){
                if( plugin_info->get_count ) {
@@ -1768,7 +2049,7 @@ API int contacts_db_get_count_with_query( contacts_query_h query, int *out_count
        RETV_IF(NULL == out_count, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_count = 0;
 
-       RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
        s_query = (ctsvc_query_s*)query;
 
        type = ctsvc_view_get_record_type(s_query->view_uri);
@@ -1791,7 +2072,7 @@ API int contacts_db_insert_record(contacts_record_h record, int *id )
        if (id)
                *id = 0;
 
-       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type);
        RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
@@ -1804,7 +2085,7 @@ API int contacts_db_update_record(contacts_record_h record)
 {
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type);
        RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
@@ -1818,7 +2099,7 @@ API int contacts_db_delete_record(const char* view_uri, int id)
        ctsvc_record_type_e type = CTSVC_RECORD_INVALID;
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        type = ctsvc_view_get_record_type(view_uri);
        plugin_info = ctsvc_db_get_plugin_info(type);
@@ -1835,7 +2116,7 @@ API int contacts_db_get_record(const char* view_uri, int id, contacts_record_h*
 
        RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_record = NULL;
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        type = ctsvc_view_get_record_type(view_uri);
        plugin_info = ctsvc_db_get_plugin_info(type);
@@ -1850,7 +2131,7 @@ API int contacts_db_replace_record( contacts_record_h record, int id )
 {
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL");
+       RETVM_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : record is NULL");
 
        plugin_info = ctsvc_db_get_plugin_info(((ctsvc_record_s*)record)->r_type);
        RETVM_IF(NULL == plugin_info, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
@@ -1867,7 +2148,7 @@ API int contacts_db_get_all_records(const char* view_uri, int offset, int limit,
 
        RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER);
        *out_list = NULL;
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        type = ctsvc_view_get_record_type(view_uri);
        plugin_info = ctsvc_db_get_plugin_info(type);
@@ -1887,7 +2168,7 @@ int ctsvc_db_insert_records(contacts_list_h list, int **ids, unsigned int *count
        int ret = CONTACTS_ERROR_NONE;
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        if (count)
                contacts_list_get_count(list, count);
@@ -1904,7 +2185,7 @@ int ctsvc_db_insert_records(contacts_list_h list, int **ids, unsigned int *count
 API int contacts_db_insert_records_async( contacts_list_h list,
                contacts_db_insert_result_cb callback, void *user_data)
 {
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
 #ifdef _CONTACTS_NATIVE
        if (callback) {
@@ -1925,7 +2206,7 @@ int ctsvc_db_update_records(contacts_list_h list)
        int ret = CONTACTS_ERROR_NONE;
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        if (( plugin_info = ctsvc_db_get_plugin_info(((ctsvc_list_s*)list)->l_type))){
                if( plugin_info->update_records ) {
@@ -1940,7 +2221,7 @@ int ctsvc_db_update_records(contacts_list_h list)
 API int contacts_db_update_records_async( contacts_list_h list,
                contacts_db_result_cb callback, void *user_data)
 {
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
 #ifdef _CONTACTS_NATIVE
        if (callback) {
@@ -1976,8 +2257,8 @@ int ctsvc_db_delete_records(const char* view_uri, int* ids, int count)
 API int contacts_db_delete_records_async( const char* view_uri, int* ids, int count,
                contacts_db_result_cb callback, void *user_data)
 {
-       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
 #ifdef _CONTACTS_NATIVE
        if (callback) {
@@ -2061,8 +2342,8 @@ int ctsvc_db_replace_records(contacts_list_h list, int ids[], unsigned int count
        int ret = CONTACTS_ERROR_NONE;
        ctsvc_db_plugin_info_s* plugin_info = NULL;
 
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        if (( plugin_info = ctsvc_db_get_plugin_info(((ctsvc_list_s*)list)->l_type))){
                if( plugin_info->replace_records ) {
@@ -2077,8 +2358,8 @@ int ctsvc_db_replace_records(contacts_list_h list, int ids[], unsigned int count
 API int contacts_db_replace_records_async( contacts_list_h list, int ids[], unsigned int count,
                contacts_db_result_cb callback, void *user_data )
 {
-       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
-       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter");
+       RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       RETVM_IF(NULL == ids, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
 #ifdef _CONTACTS_NATIVE
        if (callback) {
@@ -2117,3 +2398,11 @@ API int contacts_db_replace_records( contacts_list_h list, int record_id_array[]
        return ctsvc_db_replace_records(list, record_id_array, count);
 }
 
+API int contacts_db_get_last_change_version(int* last_version)
+{
+       int ret = CONTACTS_ERROR_NONE;
+
+       RETVM_IF(NULL == last_version, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter");
+       *last_version = ctsvc_get_transaction_ver();
+       return ret;
+}
index b8031ae..7a8bc36 100644 (file)
@@ -33,6 +33,8 @@ int ctsvc_db_delete_records(const char* view_uri, int *ids, int count);
 int ctsvc_db_replace_records(contacts_list_h list, int ids[], unsigned int count);
 
 int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int limit, cts_stmt *stmt);
+int ctsvc_db_create_set_query(contacts_record_h record, char **set, GSList **bind_text);
+int ctsvc_db_update_record_with_set_query(const char *set, GSList *bind_text, const char *table, int id);
 
 #endif /*  __TIZEN_SOCIAL_CTSVC_DB_QUERY_H__ */
 
index c7f33a4..5ac41b6 100644 (file)
@@ -112,8 +112,7 @@ API int contacts_group_add_contact(int group_id, int contact_id)
                        ret = CONTACTS_ERROR_DB;
                        break;
                }
-
-               ctsvc_set_contact_noti();
+               ctsvc_set_person_noti();
 
                ret = ctsvc_end_trans(true);
                if(ret < CONTACTS_ERROR_NONE )
@@ -190,8 +189,7 @@ API int contacts_group_remove_contact(int group_id, int contact_id)
                        ret = CONTACTS_ERROR_DB;
                        break;
                }
-
-               ctsvc_set_contact_noti();
+               ctsvc_set_person_noti();
 
                ret = ctsvc_end_trans(true);
                if(ret < CONTACTS_ERROR_NONE )
@@ -210,6 +208,83 @@ API int contacts_group_remove_contact(int group_id, int contact_id)
        return ret;
 }
 
+
+API int contacts_group_set_group_order(int group_id, int previous_group_id, int next_group_id)
+{
+       int ret;
+       double previous_prio = 0.0;
+       double next_prio = 0.0;
+       int previous_addressbook_id = -1, next_addressbook_id = -1, addressbook_id = -1;
+       double prio;
+       cts_stmt stmt;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query), "SELECT group_prio, addressbook_id FROM "CTS_TABLE_GROUPS" WHERE group_id = ?");
+
+       stmt = cts_query_prepare(query);
+       RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "cts_query_prepare() Failed");
+
+       cts_stmt_bind_int(stmt, 1, previous_group_id);
+       ret = cts_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/  == ret) {
+               previous_prio = ctsvc_stmt_get_dbl(stmt, 0);
+               previous_addressbook_id = ctsvc_stmt_get_int(stmt, 1);
+       }
+       cts_stmt_reset(stmt);
+       cts_stmt_bind_int(stmt, 1, next_group_id);
+       ret = cts_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/ == ret) {
+               next_prio = ctsvc_stmt_get_dbl(stmt, 0);
+               next_addressbook_id = ctsvc_stmt_get_int(stmt, 1);
+       }
+       cts_stmt_reset(stmt);
+       cts_stmt_bind_int(stmt, 1, group_id);
+       ret = cts_stmt_step(stmt);
+       if (1 /*CTS_TRUE*/ == ret) {
+               addressbook_id = ctsvc_stmt_get_int(stmt, 1);
+       }
+       cts_stmt_finalize(stmt);
+
+       RETVM_IF(0.0 == previous_prio && 0.0 == next_prio, CONTACTS_ERROR_INVALID_PARAMETER,
+                       "The indexes for previous and next are invalid.");
+       RETVM_IF(previous_group_id && previous_addressbook_id != addressbook_id , CONTACTS_ERROR_INVALID_PARAMETER,
+                               "previous group(%d) and group(%d) are not the same addressbook(%d, %d) groups",
+                               previous_group_id, group_id, previous_addressbook_id, addressbook_id);
+       RETVM_IF(next_group_id && next_addressbook_id != addressbook_id , CONTACTS_ERROR_INVALID_PARAMETER,
+                               "next group(%d) and group(%d) are not the same addressbook(%d, %d) groups",
+                               next_group_id, group_id, next_addressbook_id, addressbook_id);
+
+       if (0.0 == next_prio)
+               prio = previous_prio + 1;
+       else
+               prio = (previous_prio + next_prio) / 2;
+
+       ret = ctsvc_begin_trans();
+       RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
+
+       snprintf(query, sizeof(query),
+                       "UPDATE %s SET group_prio = %f WHERE group_id = %d",
+                       CTS_TABLE_GROUPS, prio, group_id);
+
+       ret = ctsvc_query_exec(query);
+       if (CONTACTS_ERROR_NONE != ret) {
+               CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
+               ctsvc_end_trans(false);
+               return ret;
+       }
+
+       ctsvc_set_group_noti();
+
+       ret = ctsvc_end_trans(true);
+       if (ret < CONTACTS_ERROR_NONE)
+       {
+               CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
+               return ret;
+       }
+       else
+               return CONTACTS_ERROR_NONE;
+}
+
 /*
 API int contacts_group_add_person(int group_id, int person_id)
 {
index 702ffa9..31805f7 100644 (file)
@@ -31,8 +31,6 @@
 static TLS bool contact_change = false;\r
 static TLS bool my_profile_change = false;\r
 static TLS bool phonelog_change = false;\r
-static TLS bool missed_change = false;\r
-static TLS bool favor_change = false;\r
 static TLS bool speed_change = false;\r
 static TLS bool addressbook_change = false;\r
 static TLS bool group_change = false;\r
@@ -82,24 +80,6 @@ static inline void __ctsvc_noti_publish_phonelog_change(void)
        }\r
 }\r
 \r
-static inline void __ctsvc_noti_publish_missed_call_change(void)\r
-{\r
-       int fd = open(CTSVC_NOTI_MISSED_CALL_CHANGED, O_TRUNC | O_RDWR);\r
-       if (0 <= fd) {\r
-               close(fd);\r
-               missed_change = false;\r
-       }\r
-}\r
-\r
-static inline void __ctsvc_noti_publish_favor_change(void)\r
-{\r
-       int fd = open(CTSVC_NOTI_FAVORITE_CHANGED, O_TRUNC | O_RDWR);\r
-       if (0 <= fd) {\r
-               close(fd);\r
-               favor_change = false;\r
-       }\r
-}\r
-\r
 static inline void __ctsvc_noti_publish_speed_change(void)\r
 {\r
        int fd = open(CTSVC_NOTI_SPEEDDIAL_CHANGED, O_TRUNC | O_RDWR);\r
@@ -303,8 +283,6 @@ void ctsvc_nofitication_cancel(void)
        contact_change = false;\r
        my_profile_change = false;\r
        phonelog_change = false;\r
-       missed_change = false;\r
-       favor_change = false;\r
        speed_change = false;\r
        addressbook_change = false;\r
        group_change = false;\r
@@ -343,16 +321,6 @@ void ctsvc_set_phonelog_noti(void)
        phonelog_change = true;\r
 }\r
 \r
-void ctsvc_set_missed_call_noti(void)\r
-{\r
-       missed_change = true;\r
-}\r
-\r
-void ctsvc_set_favor_noti(void)\r
-{\r
-       favor_change = true;\r
-}\r
-\r
 void ctsvc_set_speed_noti(void)\r
 {\r
        speed_change = true;\r
@@ -463,8 +431,6 @@ void ctsvc_notification_send()
        if (contact_change) __ctsvc_noti_publish_contact_change();\r
        if (my_profile_change) __ctsvc_noti_publish_my_profile_change();\r
        if (phonelog_change) __ctsvc_noti_publish_phonelog_change();\r
-       if (missed_change) __ctsvc_noti_publish_missed_call_change();\r
-       if (favor_change) __ctsvc_noti_publish_favor_change();\r
        if (speed_change) __ctsvc_noti_publish_speed_change();\r
        if (addressbook_change) __ctsvc_noti_publish_addressbook_change();\r
        if (group_change) __ctsvc_noti_publish_group_change();\r
index 92e4e57..f059f57 100644 (file)
@@ -25,8 +25,6 @@
 void ctsvc_set_contact_noti(void);\r
 void ctsvc_set_my_profile_noti(void);\r
 void ctsvc_set_phonelog_noti(void);\r
-void ctsvc_set_missed_call_noti(void);\r
-void ctsvc_set_favor_noti(void);\r
 void ctsvc_set_speed_noti(void);\r
 void ctsvc_set_addressbook_noti(void);\r
 void ctsvc_set_group_noti(void);\r
index 1eb5240..ca4e858 100644 (file)
@@ -985,10 +985,9 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_p
 
        RETVM_IF(person_id <= 0 || contact_id <= 0 , CONTACTS_ERROR_INVALID_PARAMETER,
                "Invalid parameter : person_id(%d), person_id(%d)", person_id, person_id);
-       RETVM_IF(out_person_id == NULL , CONTACTS_ERROR_INVALID_PARAMETER,
-                       "Invalid parameter : out_person_id is NULL");
 
-       *out_person_id = 0;
+       if (out_person_id)
+               *out_person_id = 0;
 
        ret = ctsvc_begin_trans();
        RETVM_IF(ret, ret, "ctsvc_begin_trans() Failed(%d)", ret);
@@ -1008,17 +1007,17 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_p
                return ret;
        }
 
-       *out_person_id = ctsvc_db_insert_person(record);
-       if (CONTACTS_ERROR_NONE > *out_person_id) {
-               CTS_ERR("ctsvc_db_insert_person() Failed(%d)", *out_person_id);
+       id = ctsvc_db_insert_person(record);
+       if (CONTACTS_ERROR_NONE > id) {
+               CTS_ERR("ctsvc_db_insert_person() Failed(%d)", id);
                ctsvc_end_trans(false);
-               return *out_person_id;
+               return id;
        }
 
        snprintf(query, sizeof(query),
                        "INSERT INTO %s (person_id, usage_type, times_used) "
                        "SELECT %d, usage_type, times_used FROM %s WHERE person_id = %d",
-                       CTS_TABLE_CONTACT_STAT, *out_person_id, CTS_TABLE_CONTACT_STAT, person_id );
+                       CTS_TABLE_CONTACT_STAT, id, CTS_TABLE_CONTACT_STAT, person_id );
        ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
@@ -1030,7 +1029,7 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_p
 
        snprintf(query, sizeof(query),
                        "UPDATE %s SET person_id = %d WHERE contact_id = %d",
-                       CTS_TABLE_CONTACTS, *out_person_id, contact_id);
+                       CTS_TABLE_CONTACTS, id, contact_id);
        ret = ctsvc_query_exec(query);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
@@ -1047,7 +1046,7 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_p
 
        if (is_favorite && ((ctsvc_contact_s*)record)->is_favorite) {
                snprintf(query, sizeof(query),
-                               "INSERT INTO "CTS_TABLE_FAVORITES" values(%d, %f)", *out_person_id, priority);
+                               "INSERT INTO "CTS_TABLE_FAVORITES" values(%d, %f)", id, priority);
                ret = ctsvc_query_exec(query);
                if (CONTACTS_ERROR_NONE != ret) {
                        CTS_ERR("ctsvc_query_exec() Failed(%d)", ret);
@@ -1058,6 +1057,8 @@ API int contacts_person_unlink_contact(int person_id, int contact_id, int* out_p
 
        __ctsvc_update_primary_default_data(person_id);
 
+       if (out_person_id)
+               *out_person_id = id;
        ctsvc_set_person_noti();
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
@@ -1167,7 +1168,7 @@ API int contacts_person_set_favorite_order(int person_id, int front_person_id, i
                return ret;
        }
 
-       ctsvc_set_favor_noti();
+       ctsvc_set_person_noti();
 
        ret = ctsvc_end_trans(true);
        if (ret < CONTACTS_ERROR_NONE)
index 58cf8e1..44ebf66 100755 (executable)
@@ -53,6 +53,8 @@
 #define CTS_TABLE_VERSION "cts_version"
 #define CTS_TABLE_MY_PROFILES "my_profiles"
 #define CTS_TABLE_CONTACT_STAT "contact_stat"
+#define CTS_TABLE_NAME_LOOKUP "name_lookup"
+#define CTS_TABLE_PHONE_LOOKUP "phone_lookup"
 #define CTS_TABLE_SEARCH_INDEX "search_index"
 #define CTS_TABLE_ACTIVITIES "activities"
 #define CTS_TABLE_ACTIVITY_PHOTOS "activity_photos"
@@ -62,6 +64,7 @@
 // DB views /////////////////////////////////////////////////////////////////////
 #define CTSVC_DB_VIEW_PERSON                                   "view_person"
 #define CTSVC_DB_VIEW_CONTACT                                  "view_contact"
+#define CTSVC_DB_VIEW_MY_PROFILE                               "view_my_profile"
 
 #define CTSVC_DB_VIEW_NAME                                             "view_name"
 #define CTSVC_DB_VIEW_NUMBER                                   "view_number"
@@ -83,7 +86,7 @@
 #define CTSVC_DB_VIEW_SPEEDIDAL                                        "view_speeddial"
 
 //#define CTSVC_DB_VIEW_GROUPS_UPDATED_INFO            "view_group_changes"
-#define CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO       "view_group_member_changes"
+//#define CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO     "view_group_member_changes"
 //#define CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO          "view_contacts_changes"
 
 #define CTSVC_DB_VIEW_PERSON_CONTACT                   "view_person_contact"
index 391b6c5..5ec43d2 100644 (file)
@@ -94,7 +94,7 @@ API int contacts_connect_with_flags(unsigned int flags)
        if (flags & CONTACTS_CONNECT_FLAG_RETRY) {
                int i;
                int waiting_time = 500;
-               for (i=0;i<6;i++) {
+               for (i=0;i<7;i++) {
                        usleep(waiting_time * 1000);
                        DBG("retry cnt=%d, ret=%x, %d",(i+1), ret, waiting_time);
                        ret = contacts_connect2();
index f2bfdad..913a57a 100755 (executable)
@@ -19,6 +19,7 @@
 
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/time.h>
 #include <string.h>
 #include <db-util.h>
 
 #include "ctsvc_notification.h"
 
 #include "ctsvc_db_init.h"
-#include "ctsvc_db_plugin_contact_helper.h"
 #include "ctsvc_db_plugin_person_helper.h"
+#include "ctsvc_db_plugin_image_helper.h"
+#include "ctsvc_db_plugin_company_helper.h"
+
 
 #include "ctsvc_phonelog.h"
 #include "ctsvc_person.h"
@@ -57,14 +60,18 @@ int ctsvc_db_open(void) {
                ret = db_util_open(CTSVC_DB_PATH, &ctsvc_db, 0);
                RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/,
                                "DB error : db_util_open() Failed(%d)", ret);
-               ret = sqlite3_create_function(ctsvc_db, "_CONTACT_DELETE_", 3, SQLITE_UTF8, NULL,
-                                       ctsvc_db_contact_delete_callback, NULL, NULL);
-               RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
-                                               "sqlite3_create_function() Failed(%d)", ret);
                ret = sqlite3_create_function(ctsvc_db, "_DATA_DELETE_", 2, SQLITE_UTF8, NULL,
                                        ctsvc_db_data_delete_callback, NULL, NULL);
                RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
                                                "sqlite3_create_function() Failed(%d)", ret);
+               ret = sqlite3_create_function(ctsvc_db, "_DATA_IMAGE_DELETE_", 1, SQLITE_UTF8, NULL,
+                                       ctsvc_db_data_image_delete_callback, NULL, NULL);
+               RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                                               "sqlite3_create_function() Failed(%d)", ret);
+               ret = sqlite3_create_function(ctsvc_db, "_DATA_COMPANY_DELETE_", 1, SQLITE_UTF8, NULL,
+                                       ctsvc_db_data_company_delete_callback, NULL, NULL);
+               RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                                               "sqlite3_create_function() Failed(%d)", ret);
                ret = sqlite3_create_function(ctsvc_db, "_NORMALIZE_INDEX_", 1, SQLITE_UTF8, NULL,
                                        ctsvc_db_normalize_str_callback, NULL, NULL);
                RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
@@ -187,20 +194,33 @@ int ctsvc_query_exec(const char *query) {
 cts_stmt cts_query_prepare(char *query) {
        int ret = -1;
        cts_stmt stmt = NULL;
+       struct timeval from, now, diff;
+       bool retry = false;
 
-       RETVM_IF(NULL == ctsvc_db, NULL, "DB error : Database is not opended");
+       RETVM_IF(NULL == ctsvc_db, NULL, "DB error : Database is not opened");
        CTS_DBG("prepare query : %s", query);
 
-       ret = sqlite3_prepare_v2(ctsvc_db, query, strlen(query), &stmt, NULL);
-       RETVM_IF(SQLITE_OK != ret, NULL, "DB error : sqlite3_prepare_v2(%s) Failed(%s)",
-                       query, sqlite3_errmsg(ctsvc_db));
+       gettimeofday(&from, NULL);
+       do {
+               ret = sqlite3_prepare_v2(ctsvc_db, query, strlen(query), &stmt, NULL);
+
+               if (ret != SQLITE_OK)
+                       CTS_ERR("DB error : sqlite3_prepare_v2() Failed(%d, %s)", ret, sqlite3_errmsg(ctsvc_db));
+
+               if (ret == SQLITE_BUSY || ret == SQLITE_LOCKED) {
+                       usleep(50*1000); // 50 ms
+                       gettimeofday(&now, NULL);
+                       timersub(&now, &from, &diff);
+                       retry = (diff.tv_sec < 1)? true:false; // retry it during 1 second
+               }
+       }while(retry);
 
        return stmt;
 }
 
 int ctsvc_stmt_get_first_int_result(cts_stmt stmt, int *result) {
        int ret;
-       RETVM_IF(NULL == ctsvc_db, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, "DB error : Database is not opended");
+       RETVM_IF(NULL == ctsvc_db, CONTACTS_ERROR_DB /*CTS_ERR_DB_NOT_OPENED*/, "DB error : Database is not opened");
 
        ret = sqlite3_step(stmt);
        if (SQLITE_ROW != ret) {
@@ -219,7 +239,24 @@ int ctsvc_stmt_get_first_int_result(cts_stmt stmt, int *result) {
 
 int cts_stmt_step(cts_stmt stmt) {
        int ret;
-       ret = sqlite3_step(stmt);
+       struct timeval from, now, diff;
+       bool retry = false;
+
+       gettimeofday(&from, NULL);
+       do {
+               ret = sqlite3_step(stmt);
+
+               if (ret != SQLITE_ROW && ret != SQLITE_DONE)
+                       CTS_ERR("DB error : sqlite3_step() Failed(%d, %s)", ret, sqlite3_errmsg(ctsvc_db));
+
+               if (ret == SQLITE_BUSY || ret == SQLITE_LOCKED) {
+                       usleep(50*1000); // 50 ms
+                       gettimeofday(&now, NULL);
+                       timersub(&now, &from, &diff);
+                       retry = (diff.tv_sec < 1)? true:false; // retry it during 1 second
+               }
+       }while(retry);
+
        switch (ret) {
        case SQLITE_BUSY:
        case SQLITE_LOCKED:
index 2fb1051..cb20e46 100644 (file)
@@ -41,6 +41,8 @@ static __thread int transaction_count = 0;
 static __thread int transaction_ver = 0;
 static __thread bool version_up = false;
 
+#define CTS_SECURITY_IMAGE_PERMISSION 0440
+
 #define CTS_COMMIT_TRY_MAX 500000 // For 3second
 int ctsvc_begin_trans(void)
 {
@@ -169,6 +171,18 @@ const char* ctsvc_get_display_column(void)
                return "reverse_display_name";
 }
 
+const char* ctsvc_get_sort_name_column(void)
+{
+       contacts_name_display_order_e order;
+
+       contacts_setting_get_name_display_order(&order);
+       if (CONTACTS_NAME_DISPLAY_ORDER_FIRSTLAST == order)
+               return "sort_name";
+       else
+               return "reverse_sort_name";
+}
+
+
 const char* ctsvc_get_sort_column(void)
 {
        contacts_name_display_order_e order;
@@ -231,20 +245,35 @@ static inline bool ctsvc_check_available_image_space(void){
 }
 
 static int image_size = 480;
-static int __ctsvc_resize_and_copy_image(const char *src, const char *dest)
+
+typedef struct {
+       const char *src;
+       const char *dest;
+       int ret;
+}image_info;
+
+static bool __ctsvc_image_util_supported_jpeg_colorspace_cb(image_util_colorspace_e colorspace, void *user_data)
 {
+       image_info *info = (image_info*)user_data;
        image_util_error_e ret;
        int width = 0, height = 0;
        unsigned int size_decode = 0;
        int resized_width, resized_height;
        unsigned char * img_target = 0;
        unsigned char * img_source = 0;
-       const image_util_colorspace_e colorspace = IMAGE_UTIL_COLORSPACE_I420;
+       int dest_fd;
 
+       if (colorspace == IMAGE_UTIL_COLORSPACE_YV12 ) {
+               info->ret = CONTACTS_ERROR_NONE;
+               return true;
+       }
        // load jpeg sample file
-       CTS_DBG("src : %s, dest : %s", src, dest);
-       ret = image_util_decode_jpeg( src, colorspace, &img_source, &width, &height, &size_decode );
-       RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_decode_jpeg failed(%d)", ret);
+       CTS_DBG("colorspace %d src : %s, dest : %s", colorspace, info->src, info->dest);
+       ret = image_util_decode_jpeg( info->src, colorspace, &img_source, &width, &height, &size_decode );
+       if (ret!=IMAGE_UTIL_ERROR_NONE) {
+               info->ret = CONTACTS_ERROR_INTERNAL;
+               return true;
+       }
 
 #if 0
        if (0>image_size) {
@@ -265,7 +294,8 @@ static int __ctsvc_resize_and_copy_image(const char *src, const char *dest)
                if (image_size<=0 || width <=0 || height <= 0) {
                        free(img_source);
                        CTS_ERR("image size error(%d)", image_size);
-                       return CONTACTS_ERROR_INTERNAL;
+                       info->ret = CONTACTS_ERROR_INTERNAL;
+                       return false;
                }
 
                if (width>height) {
@@ -276,11 +306,18 @@ static int __ctsvc_resize_and_copy_image(const char *src, const char *dest)
                        resized_height = image_size;
                        resized_width = width*image_size/height;
                }
+
+               if (!resized_height%8)
+                       resized_height += 8 - (resized_height%8);
+               if (!resized_width%8)
+                       resized_width += 8 - (resized_width%8);
+
                CTS_DBG("size(%d, %d) -> resize(%d,%d)", width, height, resized_width, resized_height);
 
                image_util_calculate_buffer_size(resized_width, resized_height, colorspace , &size_decode);
 
                img_target = malloc( size_decode );
+
                // do resize
                ret = image_util_resize( img_target, &resized_width, &resized_height,
                                img_source, width, height, colorspace );
@@ -288,24 +325,73 @@ static int __ctsvc_resize_and_copy_image(const char *src, const char *dest)
                        CTS_ERR("image_util_resize failed(%d)", ret);
                        free( img_target );
                        free( img_source );
-                       return CONTACTS_ERROR_INTERNAL;
+                       info->ret = CONTACTS_ERROR_INTERNAL;
+                       return false;
                }
 
-               ret = image_util_encode_jpeg(img_target, resized_width, resized_height, colorspace, 100, dest );
+
+               //ret = image_util_encode_jpeg(img_source, width, height, colorspace, 100, info->dest );
+               ret = image_util_encode_jpeg(img_target, resized_width, resized_height, colorspace, 50, info->dest );
                free( img_target );
                free( img_source );
-               RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_encode_jpeg failed(%d)", ret);
+               if(ret!=IMAGE_UTIL_ERROR_NONE) {
+                       CTS_ERR("image_util_encode_jpeg failed(%d)", ret);
+                       info->ret = CONTACTS_ERROR_INTERNAL;
+                       return false;
+               }
        }
        else {
                resized_width = width;
                resized_height = height;
 
-               ret = image_util_encode_jpeg(img_source, resized_width, resized_height, colorspace, 100, dest );
+               ret = image_util_encode_jpeg(img_source, resized_width, resized_height, colorspace, 50, info->dest );
                free( img_source );
-               RETVM_IF(ret!=IMAGE_UTIL_ERROR_NONE, CONTACTS_ERROR_INTERNAL, "image_util_encode_jpeg failed(%d)", ret);
+               if(ret!=IMAGE_UTIL_ERROR_NONE) {
+                       CTS_ERR("image_util_encode_jpeg failed(%d)", ret);
+                       info->ret = CONTACTS_ERROR_INTERNAL;
+                       return false;
+               }
        }
 
-       return CONTACTS_ERROR_NONE;
+       dest_fd = open(info->dest, O_RDONLY);
+       if (dest_fd < 0) {
+               CTS_ERR("System : Open(dest:%s) Failed(%d)", info->dest, errno);
+               info->ret = CONTACTS_ERROR_SYSTEM;
+               return false;
+       }
+
+       ret = fchown(dest_fd, getuid(), CTS_SECURITY_FILE_GROUP);
+       if (0 != ret) {
+               CTS_ERR("fchown(%s) Failed(%d)", info->dest, errno);
+               info->ret = CONTACTS_ERROR_SYSTEM;
+               close(dest_fd);
+               return false;
+       }
+
+       ret = fchmod(dest_fd, CTS_SECURITY_IMAGE_PERMISSION);
+       if (0 != ret) {
+               CTS_ERR("fchmod(%s) Failed(%d)", info->dest, errno);
+               info->ret = CONTACTS_ERROR_SYSTEM;
+               close(dest_fd);
+               return false;
+       }
+       close(dest_fd);
+
+       info->ret = CONTACTS_ERROR_NONE;
+       return false;
+}
+
+static int __ctsvc_resize_and_copy_image(const char *src, const char *dest)
+{
+       int ret;
+       image_info info = {.src = src, .dest = dest, ret = CONTACTS_ERROR_NONE};
+
+       ret = image_util_foreach_supported_jpeg_colorspace(__ctsvc_image_util_supported_jpeg_colorspace_cb, &info);
+
+       if (ret != IMAGE_UTIL_ERROR_NONE)
+               return CONTACTS_ERROR_INVALID_PARAMETER;
+
+       return info.ret;
 }
 
 #define CTSVC_COPY_SIZE_MAX 4096
@@ -320,8 +406,11 @@ int ctsvc_copy_image(const char *src, const char *dest)
                return CONTACTS_ERROR_FILE_NO_SPACE;
 
        ret = __ctsvc_resize_and_copy_image(src, dest);
-       if (CONTACTS_ERROR_NONE == ret)
+       if (CONTACTS_ERROR_NONE == ret) {
                return ret;
+       }
+       else
+               CTS_ERR("__ctsvc_resize_and_copy_image Failed(%d)", ret);
 
        src_fd = open(src, O_RDONLY);
        RETVM_IF(src_fd < 0, CONTACTS_ERROR_SYSTEM, "System : Open(src:%s) Failed(%d)", src, errno);
@@ -354,7 +443,7 @@ int ctsvc_copy_image(const char *src, const char *dest)
        ret = fchown(dest_fd, getuid(), CTS_SECURITY_FILE_GROUP);
        if (0 != ret)
                CTS_ERR("fchown(%s) Failed(%d)", dest, ret);
-       ret = fchmod(dest_fd, CTS_SECURITY_DEFAULT_PERMISSION);
+       ret = fchmod(dest_fd, CTS_SECURITY_IMAGE_PERMISSION);
        if (0 != ret)
                CTS_ERR("fchmod(%s) Failed(%d)", dest, ret);
        close(src_fd);
@@ -425,4 +514,7 @@ int ctsvc_get_current_version( int* out_current_version ){
        return CONTACTS_ERROR_NONE;
 }
 
-
+int ctsvc_get_transaction_ver(void)
+{
+       return transaction_ver;
+}
index adbe165..c74c425 100644 (file)
 \r
 const char* ctsvc_get_display_column(void);\r
 const char* ctsvc_get_sort_column(void);\r
+const char* ctsvc_get_sort_name_column(void);\r
 \r
 int ctsvc_begin_trans(void);\r
 int ctsvc_end_trans(bool is_success);\r
 int ctsvc_get_next_ver(void);\r
 int ctsvc_get_current_version( int* out_current_version );\r
+int ctsvc_get_transaction_ver(void);\r
 \r
 char* ctsvc_get_image(const char *dir, int index, char *dest, int dest_size);\r
 int ctsvc_change_image(const char *dir, int index, const char *path, char *image, int image_len);\r
index dfd2c38..2221167 100644 (file)
@@ -1,6 +1,6 @@
 Name:       contacts-service
 Summary:    Contacts Service
-Version: 0.9.24.8
+Version: 0.9.45.3
 Release:    1
 Group:      TO_BE/FILLED_IN
 License:    Apache-2.0
@@ -23,6 +23,7 @@ Requires(post): /usr/bin/sqlite3, /bin/chmod, /bin/chown
 Requires(post): /usr/bin/vconftool
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
+Requires: sys-assert
 
 %description
 Contacts Service Library
@@ -49,10 +50,9 @@ New Contacts Service Library (devel)
 
 %build
 cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
-
-
 make %{?_smp_mflags}
 
+
 %install
 rm -rf %{buildroot}
 %make_install
@@ -70,15 +70,9 @@ ln -s ../contacts-service.service %{buildroot}%{_libdir}/systemd/user/tizen-midd
 %post -n contacts-service2
 /sbin/ldconfig
 
-# from contacts-service-bin.postinst
-contacts-service-ipcd schema
 chown :6005 /opt/usr/data/contacts-svc
 chown :6005 /opt/usr/dbspace/.contacts-svc.db
 chown :6005 /opt/usr/dbspace/.contacts-svc.db-journal
-if [ -f /usr/lib/rpm-plugins/msm.so ]
-then
-       chsmack -a 'contacts-service::db' /opt/usr/dbspace/.contacts-svc.db*
-fi
 chown :6005 -R /opt/usr/data/contacts-svc/img
 chown :6005 /opt/usr/data/contacts-svc/.CONTACTS_SVC_*_CHANGED
 
@@ -87,15 +81,13 @@ chmod 660 /opt/usr/dbspace/.contacts-svc.db-journal
 chmod 775 /opt/usr/data/contacts-svc
 chmod 770 -R /opt/usr/data/contacts-svc/img/
 chmod 660 /opt/usr/data/contacts-svc/.CONTACTS_SVC_*
-vconftool set -t int file/private/contacts-service/default_lang 1 -g 6005
-vconftool set -t int file/private/contacts-service/secondary_lang 2 -g 6005
-vconftool set -t string db/contacts-svc/secondary_lang en_US -g 6005
+vconftool set -t int file/private/contacts-service/default_lang 100
 
-# from libcontacts-service.postinst
 chown :6016 /opt/usr/data/contacts-svc/.CONTACTS_SVC_RESTRICTION_CHECK
 vconftool set -t int db/contacts-svc/name_sorting_order 0 -g 6005
 vconftool set -t int db/contacts-svc/name_display_order 0 -g 6005
 
+
 %postun -p /sbin/ldconfig
 
 
@@ -111,6 +103,7 @@ vconftool set -t int db/contacts-svc/name_display_order 0 -g 6005
 %attr(0755,root,root) /etc/rc.d/init.d/contacts-service-ipcd.sh
 %{_libdir}/systemd/user/contacts-service.service
 %{_libdir}/systemd/user/tizen-middleware.target.wants/contacts-service.service
+%config(noreplace) /opt/usr/dbspace/.contacts-svc.db*
 
 
 %files -n contacts-service2-devel
diff --git a/res/.CONTACTS_SVC_FAVOR_CHANGED b/res/.CONTACTS_SVC_FAVOR_CHANGED
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/res/.CONTACTS_SVC_GROUP_REL_CHANGED b/res/.CONTACTS_SVC_GROUP_REL_CHANGED
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/res/.CONTACTS_SVC_MISSED_CHANGED b/res/.CONTACTS_SVC_MISSED_CHANGED
deleted file mode 100644 (file)
index e69de29..0000000
index b021fa4..79233e2 100755 (executable)
@@ -83,11 +83,14 @@ CREATE TABLE contacts
        reverse_display_name            TEXT,
        display_name_source             INTEGER,
        display_name_language           INTEGER,
+       sort_name                       TEXT,
+       reverse_sort_name               TEXT,
        sortkey                         TEXT COLLATE NOCASE,
        reverse_sortkey                 TEXT COLLATE NOCASE,
        created_ver                     INTEGER NOT NULL,
        changed_ver                     INTEGER NOT NULL,
        changed_time                    INTEGER NOT NULL,
+       image_changed_ver       INTEGER NOT NULL,
        uid                             TEXT,
        ringtone_path                   TEXT,
        vibration                       TEXT,
@@ -102,19 +105,20 @@ CREATE INDEX contacts_idx4 ON contacts(display_name_language, reverse_sortkey);
 
 CREATE TRIGGER trg_contacts_del AFTER DELETE ON contacts
        BEGIN
-               SELECT _CONTACT_DELETE_(old.contact_id, old.image_thumbnail_path, old.image_path);
                DELETE FROM data WHERE contact_id = old.contact_id AND is_my_profile = 0;
                DELETE FROM group_relations WHERE old.addressbook_id != -1 AND contact_id = old.contact_id;
                DELETE FROM activities WHERE contact_id = old.contact_id;
                DELETE FROM persons WHERE person_id = old.person_id AND link_count = 1;
                DELETE FROM search_index WHERE contact_id = old.contact_id;
+               DELETE FROM name_lookup WHERE contact_id = old.contact_id;
+               DELETE FROM phone_lookup WHERE contact_id = old.contact_id;
                UPDATE persons SET dirty=1 WHERE person_id = old.person_id AND link_count > 1;
        END;
 
 CREATE TRIGGER trg_contacts_del2 AFTER DELETE ON contacts
        WHEN old.addressbook_id IN (SELECT addressbook_id from addressbooks WHERE addressbook_id = old.addressbook_id)
        BEGIN
-               INSERT INTO contact_deleteds VALUES(old.contact_id, old.addressbook_id, (SELECT ver FROM cts_version) + 1);
+               INSERT INTO contact_deleteds VALUES(old.contact_id, old.addressbook_id, old.created_ver, (SELECT ver FROM cts_version) + 1);
        END;
 
 CREATE TRIGGER trg_contacts_update AFTER UPDATE ON contacts
@@ -128,8 +132,9 @@ CREATE TRIGGER trg_contacts_update AFTER UPDATE ON contacts
 CREATE TABLE contact_deleteds
 (
        contact_id                      INTEGER PRIMARY KEY,
-       addressbook_id                  INTEGER,
-       deleted_ver                     INTEGER
+       addressbook_id          INTEGER NOT NULL,
+       created_ver                     INTEGER NOT NULL,
+       deleted_ver                     INTEGER NOT NULL
 );
 CREATE INDEX contact_deleteds_idx1 ON contact_deleteds(deleted_ver);
 
@@ -174,6 +179,18 @@ CREATE TRIGGER trg_data_del AFTER DELETE ON data
                SELECT _DATA_DELETE_(old.id, old.datatype);
        END;
 
+CREATE TRIGGER trg_data_image_del AFTER DELETE ON data
+       WHEN old.datatype = 13
+               BEGIN
+                       SELECT _DATA_IMAGE_DELETE_(old.data3);
+               END;
+
+CREATE TRIGGER trg_data_company_del AFTER DELETE ON data
+       WHEN old.datatype = 6
+               BEGIN
+                       SELECT _DATA_COMPANY_DELETE_(old.data8);
+               END;
+
 CREATE TRIGGER trg_data_number_del AFTER DELETE ON data
        WHEN old.datatype = 8
                BEGIN
@@ -205,26 +222,34 @@ CREATE TABLE groups
        ringtone_path                   TEXT,
        vibration                       TEXT,
        image_thumbnail_path            TEXT,
-       member_changed_ver              INTEGER
+       member_changed_ver              INTEGER,
+       group_prio                      REAL
 );
 
-INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver)
-       VALUES(0, 'family', 'family', 1, 0, 0);
-INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver)
-       VALUES(0, 'friends', 'friends',1, 0, 0);
-INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver)
-       VALUES(0, 'coworkers', 'coworkers', 1, 0, 0);
+INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio)
+       VALUES(0, 'coworkers', 'coworkers', 0, 0, 0, 1);
+INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio)
+       VALUES(0, 'family', 'family', 0, 0, 0, 2);
+INSERT INTO groups(addressbook_id, group_name, system_id, is_read_only, created_ver, changed_ver, group_prio)
+       VALUES(0, 'friends', 'friends',0, 0, 0, 3);
 
 CREATE TRIGGER trg_groups_del AFTER DELETE ON groups
  BEGIN
    DELETE FROM group_relations WHERE group_id = old.group_id;
  END;
 
+CREATE TRIGGER trg_groups_del2 AFTER DELETE ON groups
+       WHEN old.addressbook_id IN (SELECT addressbook_id from addressbooks WHERE addressbook_id = old.addressbook_id)
+       BEGIN
+               INSERT INTO group_deleteds VALUES(old.group_id, old.addressbook_id, old.created_ver, (SELECT ver FROM cts_version) + 1);
+       END;
+
 CREATE TABLE group_deleteds
 (
-       group_id                        INTEGER PRIMARY KEY,
-       addressbook_id                  INTEGER,
-       deleted_ver                     INTEGER
+       group_id                                INTEGER PRIMARY KEY,
+       addressbook_id          INTEGER NOT NULL,
+       created_ver                     INTEGER NOT NULL,
+       deleted_ver                     INTEGER NOT NULL
 );
 
 CREATE INDEX group_deleteds_idx1 ON group_deleteds(deleted_ver);
@@ -354,13 +379,30 @@ CREATE TRIGGER trg_activities_delete AFTER DELETE ON activities
 
 CREATE VIRTUAL TABLE search_index USING FTS4
 (
-       contact_id integer NOT NULL,
+       contact_id INTEGER NOT NULL,
        data TEXT,
        name TEXT,
        number TEXT,
        UNIQUE(contact_id)
 );
 
+CREATE TABLE name_lookup
+(
+       data_id INTEGER NOT NULL,
+       contact_id INTEGER NOT NULL,
+       name TEXT,
+       type INTEGER
+);
+
+CREATE TABLE phone_lookup
+(
+       data_id INTEGER NOT NULL,
+       contact_id INTEGER NOT NULL,
+       number TEXT,
+       min_match TEXT
+);
+
+
 CREATE TABLE my_profiles
 (
        my_profile_id                   INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -371,12 +413,18 @@ CREATE TABLE my_profiles
        changed_time                    INTEGER NOT NULL,
        uid                             TEXT,
        image_thumbnail_path            TEXT,
+       deleted                         INTEGER DEFAULT 0,
        UNIQUE(addressbook_id)
 );
 
 CREATE TRIGGER trg_my_profiles_del AFTER DELETE ON my_profiles
        BEGIN
--- It should be implemented            SELECT _MY_PROFILE_DELETE_(old.my_profile_id);
+               DELETE FROM data WHERE contact_id = old.my_profile_id AND is_my_profile = 1;
+       END;
+
+CREATE TRIGGER trg_my_profile_update AFTER UPDATE ON my_profiles
+       WHEN new.deleted = 1
+       BEGIN
                DELETE FROM data WHERE contact_id = old.my_profile_id AND is_my_profile = 1;
        END;
 
index fa38d82..246dc38 100644 (file)
@@ -26,6 +26,7 @@
 #include "ctsvc_ipc_marshal.h"
 #include "ctsvc_internal.h"
 #include "ctsvc_ipc_server.h"
+#include "ctsvc_utils.h"
 
 void ctsvc_ipc_server_connect(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
 {
@@ -124,13 +125,20 @@ void ctsvc_ipc_server_db_insert_record(pims_ipc_h ipc, pims_ipc_data_h indata, p
                        ERR("pims_ipc_data_put fail");
                        goto DATA_FREE;
                }
-               if (ret == CONTACTS_ERROR_NONE)
-               {
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
                        if (ctsvc_ipc_marshal_int(id,*outdata) != CONTACTS_ERROR_NONE)
                        {
                                pims_ipc_data_destroy(*outdata);
                                ERR("ctsvc_ipc_marshal fail");
-                               ret = CONTACTS_ERROR_INVALID_PARAMETER;
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
                                goto ERROR_RETURN;
                        }
                }
@@ -269,7 +277,36 @@ void ctsvc_ipc_server_db_update_record(pims_ipc_h ipc, pims_ipc_data_h indata, p
 
        ret = contacts_db_update_record(record);
 
-       // goto 주의..
+       if (outdata)
+       {
+               *outdata = pims_ipc_data_create(0);
+               if (!*outdata)
+               {
+                       ERR("pims_ipc_data_create fail");
+                       goto DATA_FREE;
+               }
+               if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0)
+               {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("pims_ipc_data_put fail");
+                       goto DATA_FREE;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
+               }
+       }
+
+       goto DATA_FREE;
+
 ERROR_RETURN:
        if (outdata)
        {
@@ -328,7 +365,36 @@ void ctsvc_ipc_server_db_delete_record(pims_ipc_h ipc, pims_ipc_data_h indata, p
 
        ret = contacts_db_delete_record(view_uri,id);
 
-       // goto 주의..
+       if (outdata)
+       {
+               *outdata = pims_ipc_data_create(0);
+               if (!*outdata)
+               {
+                       ERR("pims_ipc_data_create fail");
+                       goto DATA_FREE;
+               }
+               if (pims_ipc_data_put(*outdata,(void*)&ret,sizeof(int)) != 0)
+               {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("pims_ipc_data_put fail");
+                       goto DATA_FREE;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
+               }
+       }
+
+       goto DATA_FREE;
+
 ERROR_RETURN:
        if (outdata)
        {
@@ -350,6 +416,7 @@ ERROR_RETURN:
        {
                ERR("outdata is NULL");
        }
+
 DATA_FREE:
 
        CONTACTS_FREE(view_uri);
@@ -383,6 +450,35 @@ void ctsvc_ipc_server_db_replace_record(pims_ipc_h ipc, pims_ipc_data_h indata,
 
        ret = contacts_db_replace_record(record, id);
 
+       if (outdata) {
+               *outdata = pims_ipc_data_create(0);
+               if (!*outdata) {
+                       ERR("pims_ipc_data_create fail");
+                       goto DATA_FREE;
+               }
+               if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0) {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("pims_ipc_data_put fail");
+                       goto DATA_FREE;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
+               }
+       }
+       else {
+               ERR("outdata is NULL");
+       }
+       goto DATA_FREE;
+
 ERROR_RETURN:
        if (outdata) {
                *outdata = pims_ipc_data_create(0);
@@ -845,9 +941,16 @@ void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                        goto DATA_FREE;
                }
 
-               if(ret == CONTACTS_ERROR_NONE)
-               {
+               if(ret == CONTACTS_ERROR_NONE) {
                        contacts_record_h record = NULL;
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
                        // marshal : id_count+property_id+[ids]*id_count
                        // id_count
                        if (pims_ipc_data_put(*outdata,(void*)&id_count,sizeof(int)) != 0)
@@ -855,9 +958,10 @@ void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                                pims_ipc_data_destroy(*outdata);
                                *outdata = NULL;
                                ERR("pims_ipc_data_put fail");
-                               ret = CONTACTS_ERROR_INVALID_PARAMETER;
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
                                goto ERROR_RETURN;
                        }
+
                        for(i=0;i<id_count;i++)
                        {
                                record = NULL;
@@ -867,7 +971,7 @@ void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                                        pims_ipc_data_destroy(*outdata);
                                        *outdata = NULL;
                                        ERR("pims_ipc_data_put fail");
-                                       ret = CONTACTS_ERROR_INVALID_PARAMETER;
+                                       ret = CONTACTS_ERROR_OUT_OF_MEMORY;
                                        goto ERROR_RETURN;
                                }
                        }
@@ -879,7 +983,6 @@ void ctsvc_ipc_server_db_insert_records(pims_ipc_h ipc, pims_ipc_data_h indata,
        }
        goto DATA_FREE;
 
-       // goto 주의..
 ERROR_RETURN:
        if (outdata)
        {
@@ -948,6 +1051,17 @@ void ctsvc_ipc_server_db_update_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                        ERR("pims_ipc_data_put fail");
                        goto DATA_FREE;
                }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
+               }
        }
        else
        {
@@ -1044,6 +1158,18 @@ void ctsvc_ipc_server_db_delete_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       goto DATA_FREE;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
                }
        }
        else
@@ -1053,7 +1179,6 @@ void ctsvc_ipc_server_db_delete_records(pims_ipc_h ipc, pims_ipc_data_h indata,
 
        goto DATA_FREE;
 
-       // goto 주의..
 ERROR_RETURN:
        if (outdata)
        {
@@ -1136,6 +1261,16 @@ void ctsvc_ipc_server_db_replace_records(pims_ipc_h ipc, pims_ipc_data_h indata,
                        ERR("pims_ipc_data_put fail");
                        goto DATA_FREE;
                }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+                               goto ERROR_RETURN;
+                       }
+               }
        }
        else {
                ERR("outdata is NULL");
index f737743..e2a8622 100644 (file)
@@ -25,6 +25,7 @@
 #include "ctsvc_ipc_marshal.h"
 #include "ctsvc_internal.h"
 #include "ctsvc_ipc_server.h"
+#include "ctsvc_utils.h"
 
 
 void ctsvc_ipc_activity_delete_by_contact_id(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
@@ -65,6 +66,17 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -112,6 +124,17 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -166,6 +189,17 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -220,6 +254,88 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
+               }
+
+       }
+       else
+       {
+               ERR("outdata is NULL");
+       }
+
+       return;
+}
+
+void ctsvc_ipc_group_set_group_order(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+{
+       int ret = CONTACTS_ERROR_NONE;
+       int group_id = 0;
+       int previous_group_id;
+       int next_group_id;
+
+       if (indata)
+       {
+               ret = ctsvc_ipc_unmarshal_int(indata, &group_id);
+               if (ret != CONTACTS_ERROR_NONE)
+               {
+                       ERR("ctsvc_ipc_unmarshal_int fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &previous_group_id);
+               if (ret != CONTACTS_ERROR_NONE)
+               {
+                       ERR("ctsvc_ipc_unmarshal_int fail");
+                       goto ERROR_RETURN;
+               }
+               ret = ctsvc_ipc_unmarshal_int(indata, &next_group_id);
+               if (ret != CONTACTS_ERROR_NONE)
+               {
+                       ERR("ctsvc_ipc_unmarshal_int fail");
+                       goto ERROR_RETURN;
+               }
+       }
+       else
+       {
+               ERR("ctsvc_ipc_group_link_group fail");
+               goto ERROR_RETURN;
+       }
+
+       ret = contacts_group_set_group_order(group_id, previous_group_id, next_group_id );
+
+ERROR_RETURN:
+
+       if (outdata)
+       {
+               *outdata = pims_ipc_data_create(0);
+               if (!*outdata)
+               {
+                       ERR("pims_ipc_data_create fail");
+                       return;
+               }
+               if (pims_ipc_data_put(*outdata, (void*)&ret, sizeof(int)) != 0)
+               {
+                       pims_ipc_data_destroy(*outdata);
+                       *outdata = NULL;
+                       ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -274,6 +390,16 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -330,6 +456,15 @@ ERROR_RETURN:
                        ERR("pims_ipc_data_put fail");
                        return;
                }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
+               }
                if (pims_ipc_data_put(*outdata, (void*)&unlinked_person_id, sizeof(int)) != 0)
                {
                        pims_ipc_data_destroy(*outdata);
@@ -391,6 +526,16 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -451,6 +596,16 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -512,6 +667,16 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -594,6 +759,16 @@ void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc, pims_ipc_data_h indata
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
        else
@@ -655,6 +830,16 @@ ERROR_RETURN:
                        pims_ipc_data_destroy(*outdata);
                        *outdata = NULL;
                        ERR("pims_ipc_data_put fail");
+                       return;
+               }
+               if (ret == CONTACTS_ERROR_NONE) {
+                       int transaction_ver = ctsvc_get_transaction_ver();
+                       if (ctsvc_ipc_marshal_int(transaction_ver, *outdata) != CONTACTS_ERROR_NONE) {
+                               pims_ipc_data_destroy(*outdata);
+                               *outdata = NULL;
+                               ERR("ctsvc_ipc_marshal_int fail");
+                               return;
+                       }
                }
        }
 }
index a5486f9..e9a9c37 100644 (file)
@@ -26,6 +26,7 @@ void ctsvc_ipc_activity_delete_by_account_id(pims_ipc_h ipc, pims_ipc_data_h ind
 
 void ctsvc_ipc_group_add_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 void ctsvc_ipc_group_remove_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
+void ctsvc_ipc_group_set_group_order(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 
 void ctsvc_ipc_person_link_person(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
 void ctsvc_ipc_person_unlink_contact(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
index e4e9642..d564543 100755 (executable)
@@ -26,6 +26,7 @@
 #include "internal.h"
 #include "ctsvc_server_sqlite.h"
 #include "schema.h"
+#include "ctsvc_sqlite.h"
 #include "ctsvc_schema_recovery.h"
 #include "ctsvc_schema.h"
 
@@ -81,10 +82,45 @@ static inline int __ctsvc_server_remake_db_file()
        return CONTACTS_ERROR_NONE;
 }
 
+static int __ctsvc_server_check_table()
+{
+       int ret;
+       sqlite3 *db;
+       char query[CTS_SQL_MAX_LEN] = {0};
+       cts_stmt stmt = NULL;
+
+       ret = ctsvc_server_db_open(&db);
+       h_retvm_if(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_server_db_open() Failed(%d)", ret);
+
+       snprintf(query, sizeof(query),
+                       "SELECT name FROM sqlite_master WHERE type='table' AND name='%s'",
+                       CTS_TABLE_CONTACTS);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (SQLITE_OK != ret) {
+               ERR("DB error : sqlite3_prepare_v2(%s) Failed(%s)", query, sqlite3_errmsg(db));
+               ctsvc_server_db_close();
+               return CONTACTS_ERROR_DB;
+       }
+
+       ret = sqlite3_step(stmt);
+       if (SQLITE_ROW != ret) {
+               ERR("contacts table does not exist in contacts DB file : %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               ctsvc_server_db_close();
+               return CTSVC_ERR_NO_TABLE;
+       }
+
+       sqlite3_finalize(stmt);
+       ctsvc_server_db_close();
+       return CONTACTS_ERROR_NONE;
+}
+
 int ctsvc_server_check_schema(void)
 {
        if (CTSVC_ERR_NO_DB_FILE == __ctsvc_server_check_db_file())
                __ctsvc_server_remake_db_file();
+       else if (CTSVC_ERR_NO_TABLE == __ctsvc_server_check_table())
+               __ctsvc_server_remake_db_file();
 
        return CONTACTS_ERROR_NONE;
 }
index 593c1fc..0488aec 100644 (file)
@@ -73,6 +73,7 @@ static int __server_main(void)
 
                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;
index 9729deb..e30537a 100755 (executable)
@@ -37,7 +37,7 @@
 #define PHONE_ADDRESSBOOK_ID 0
 
 #define CTSVC_TAPI_SIM_PB_MAX 0xFFFF
-//#define CTSVC_SIM_DATA_MAX_LENGTH 1024
+#define CTSVC_SIM_DATA_MAX_LENGTH (255+1)
 
 #define TAPI_PB_MAX_FILE_CNT TAPI_PB_3G_PBC+1
 #define TAPI_PB_NAME_INDEX TAPI_PB_3G_NAME
@@ -224,15 +224,44 @@ static inline void* __ctsvc_server_get_return_data(void)
 
 static sim_contact_s * __ctsvc_server_sim_create_contact_record(TelSimPbRecord_t *sim_record)
 {
+       char temp[CTSVC_SIM_DATA_MAX_LENGTH] = {0,};
+
        sim_contact_s *record = calloc(1,sizeof(sim_contact_s));
        record->sim_index = sim_record->index;
        record->next_index = sim_record->next_index;
        record->name = SAFE_STRDUP((char*)sim_record->name);
        record->nickname = SAFE_STRDUP((char*)sim_record->sne);
-       record->number = SAFE_STRDUP((char*)sim_record->number);
-       record->anr1 = SAFE_STRDUP((char*)sim_record->anr1);
-       record->anr2 = SAFE_STRDUP((char*)sim_record->anr2);
-       record->anr3 = SAFE_STRDUP((char*)sim_record->anr3);
+       if(sim_record->ton == TAPI_SIM_TON_INTERNATIONAL){
+               snprintf(temp,sizeof(temp),"+%s",sim_record->number);
+               record->number = strdup(temp);
+       }
+       else
+               record->number = SAFE_STRDUP((char*)sim_record->number);
+
+       memset(temp,0,sizeof(temp));
+       if(sim_record->anr1_ton == TAPI_SIM_TON_INTERNATIONAL){
+               snprintf(temp,sizeof(temp),"+%s",sim_record->anr1);
+               record->anr1 = strdup(temp);
+       }
+       else
+               record->anr1 = SAFE_STRDUP((char*)sim_record->anr1);
+
+       memset(temp,0,sizeof(temp));
+       if(sim_record->anr2_ton == TAPI_SIM_TON_INTERNATIONAL){
+               snprintf(temp,sizeof(temp),"+%s",sim_record->anr2);
+               record->anr2 = strdup(temp);
+       }
+       else
+               record->anr2 = SAFE_STRDUP((char*)sim_record->anr2);
+
+       memset(temp,0,sizeof(temp));
+       if(sim_record->anr3_ton == TAPI_SIM_TON_INTERNATIONAL){
+               snprintf(temp,sizeof(temp),"+%s",sim_record->anr3);
+               record->anr3 = strdup(temp);
+       }
+       else
+               record->anr3 = SAFE_STRDUP((char*)sim_record->anr3);
+
        record->email1 = SAFE_STRDUP((char*)sim_record->email1);
        record->email2 = SAFE_STRDUP((char*)sim_record->email2);
        record->email3 = SAFE_STRDUP((char*)sim_record->email3);
@@ -280,10 +309,10 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
        contacts_record_h name = NULL;
        contacts_record_h number = NULL;
        contacts_record_h email = NULL;
-       contacts_record_h nick = NULL;
+//     contacts_record_h nick = NULL;
 
-       h_retvm_if(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : record is NULL");
-       h_retvm_if(contact_id == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid paramter : contact_id is NULL");
+       h_retvm_if(record == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : record is NULL");
+       h_retvm_if(contact_id == NULL, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : contact_id is NULL");
        h_retvm_if(record->sim_index <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "The index(%d) is invalid", record->sim_index);
 
        SERVER_DBG("insert record -> sim_index %d",record->sim_index);
@@ -302,7 +331,7 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
        }
        SERVER_DBG("insert record -> name %s", record->name);
 
-       if (record->nickname) {
+/*     if (record->nickname) {
                contacts_record_create(_contacts_nickname._uri, &nick);
                if (nick) {
                        contacts_record_set_str(nick, _contacts_nickname.name, (char *)record->nickname);
@@ -310,7 +339,7 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
                }
        }
        SERVER_DBG("insert record -> nick name %s", record->nickname);
-
+*/
        if (record->number) {
                contacts_record_create(_contacts_number._uri, &number);
                if (number) {
@@ -321,7 +350,7 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
        }
        SERVER_DBG("insert record ->number %s", record->number);
 
-       ret = __ctsvc_server_insert_db_num(&number, (char *)record->anr1);
+/*     ret = __ctsvc_server_insert_db_num(&number, (char *)record->anr1);
        if (CONTACTS_ERROR_NONE == ret)
                contacts_record_add_child_record(contact, _contacts_contact.number, number);
        SERVER_DBG("insert record ->anr1 %s", record->anr1);
@@ -335,12 +364,12 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
        if (CONTACTS_ERROR_NONE == ret)
                contacts_record_add_child_record(contact, _contacts_contact.number, number);
        SERVER_DBG("insert record ->anr3 %s", record->anr3);
-
+*/
        ret = __ctsvc_server_insert_db_email(&email, (char *)record->email1);
        if (CONTACTS_ERROR_NONE == ret)
                contacts_record_add_child_record(contact, _contacts_contact.email, email);
        SERVER_DBG("insert record ->email1 %s", record->email1);
-
+/*
        ret = __ctsvc_server_insert_db_email(&email, (char *)record->email2);
        if (CONTACTS_ERROR_NONE == ret)
                contacts_record_add_child_record(contact, _contacts_contact.email, email);
@@ -355,7 +384,7 @@ static int __ctsvc_server_insert_contact_to_db(sim_contact_s *record,int* contac
        if (CONTACTS_ERROR_NONE == ret)
                contacts_record_add_child_record(contact, _contacts_contact.email, email);
        SERVER_DBG("insert record ->email4 %s", record->email4);
-
+*/
        contacts_record_set_int(contact, _contacts_contact.address_book_id, addressbook_id);
        ret = contacts_db_insert_record(contact, contact_id);
        h_warn_if(ret < CONTACTS_ERROR_NONE, "contacts_db_insert_record() Failed(%d)", ret);
@@ -528,18 +557,34 @@ static void __ctsvc_server_sim_sdn_read_cb(TapiHandle *handle, int result, void
                }
        }
        else {
-               // read SDN done ( success )
-               // sim_data = NULL;
                ctsvc_server_trim_memory();
        }
        return;
 
 ERROR_RETURN:
-       // sim_data = NULL;
        ctsvc_server_trim_memory();
        return;
 }
+static void __ctsvc_server_sim_sdn_meta_info_cb(TapiHandle *handle, int result, void *data, void *user_data)
+{
+       SERVER_FN_CALL;
+       TelSimPbAccessResult_t sec_rt = result;
+       int ret=0;
+
+       if (TAPI_SIM_PB_SUCCESS != sec_rt) {
+               ERR("__ctsvc_server_sim_sdn_meta_info_cb() Failed(%d)", sec_rt);
+               goto ERROR_RETURN;
+       }
+       ret = tel_read_sim_pb_record(__ctsvc_server_get_tapi_handle(), TAPI_SIM_PB_SDN,1, __ctsvc_server_sim_sdn_read_cb, NULL);
+       if(TAPI_API_SUCCESS != ret) {
+               ERR("tel_read_sim_pb_record() Failed(%d)", ret);
+               goto ERROR_RETURN;
+       }
 
+ERROR_RETURN:
+       ctsvc_server_trim_memory();
+       return;
+}
 int ctsvc_server_sim_read_sdn(void* data)
 {
        SERVER_FN_CALL;
@@ -570,13 +615,15 @@ int ctsvc_server_sim_read_sdn(void* data)
                        goto ERROR_RETURN;
                }
 
-               ret = tel_read_sim_pb_record(__ctsvc_server_get_tapi_handle(), TAPI_SIM_PB_SDN,
-                                               1, __ctsvc_server_sim_sdn_read_cb, NULL);
+               ret = tel_get_sim_pb_meta_info(__ctsvc_server_get_tapi_handle(), TAPI_SIM_PB_SDN, __ctsvc_server_sim_sdn_meta_info_cb, NULL);
+               h_retvm_if(ret != TAPI_API_SUCCESS, CONTACTS_ERROR_SYSTEM, "tel_get_sim_(usim)_meta_info =%d",ret);
                if(TAPI_API_SUCCESS != ret) {
-                       ERR("tel_read_sim_pb_record() Failed(%d)", ret);
-                       ret = CONTACTS_ERROR_SYSTEM;
+                       ERR("tel_get_sim_pb_meta_info() Failed(%d)", ret);
                        goto ERROR_RETURN;
                }
+
+       else
+               ERR("sim_status Failed(%d)", sim_status);
        }
 
        return CONTACTS_ERROR_NONE;
@@ -632,19 +679,9 @@ static void __ctsvc_server_sim_initialize_cb(TapiHandle *handle, int result, voi
 int ctsvc_server_sim_initialize(void)
 {
        SERVER_FN_CALL;
-       contacts_error_e err = CONTACTS_ERROR_NONE;
        __ctsvc_server_get_tapi_handle();
        __ctsvc_server_set_sim_type();
-
-       err = contacts_connect2();
-       if(err != CONTACTS_ERROR_NONE ){
-               if (ghandle){
-                       tel_deinit(ghandle);
-                       ghandle = NULL;
-               }
-               ERR("contacts_connect2 fail");
-               return err;
-       }
+       contacts_connect2();
 
        int ret = TAPI_API_SUCCESS;
        TelSimPbType_t sim_type;
index b0b40f7..902ecdf 100755 (executable)
 #include "ctsvc_sqlite.h"
 #include "ctsvc_notify.h"
 #include "ctsvc_normalize.h"
+#include "ctsvc_localize.h"
 #include "ctsvc_server_utils.h"
 
 #include "ctsvc_notification.h"
-#include "ctsvc_db_plugin_contact_helper.h"
+#include "ctsvc_db_plugin_image_helper.h"
+#include "ctsvc_db_plugin_company_helper.h"
+
 #include "ctsvc_person.h"
 #include "ctsvc_phonelog.h"
 
@@ -46,14 +49,18 @@ int ctsvc_server_db_open(sqlite3 **db)
                h_retvm_if(ret != SQLITE_OK, CONTACTS_ERROR_DB,
                                "db_util_open() Failed(%d)", ret);
 
-               ret = sqlite3_create_function(server_db, "_CONTACT_DELETE_", 3, SQLITE_UTF8, NULL,
-                                       ctsvc_db_contact_delete_callback, NULL, NULL);
-               h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB,
-                                               "sqlite3_create_function() Failed(%d)", ret);
                ret = sqlite3_create_function(server_db, "_DATA_DELETE_", 2, SQLITE_UTF8, NULL,
                                        ctsvc_db_data_delete_callback, NULL, NULL);
                h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB,
                                                "sqlite3_create_function() Failed(%d)", ret);
+               ret = sqlite3_create_function(server_db, "_DATA_IMAGE_DELETE_", 1, SQLITE_UTF8, NULL,
+                                       ctsvc_db_data_image_delete_callback, NULL, NULL);
+               h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                                               "sqlite3_create_function() Failed(%d)", ret);
+               ret = sqlite3_create_function(server_db, "_DATA_COMPANY_DELETE_", 1, SQLITE_UTF8, NULL,
+                                       ctsvc_db_data_company_delete_callback, NULL, NULL);
+               h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                                               "sqlite3_create_function() Failed(%d)", ret);
                ret = sqlite3_create_function(server_db, "_PHONE_LOG_DELETE_", 1, SQLITE_UTF8, NULL,
                                        ctsvc_db_phone_log_delete_callback, NULL, NULL);
                h_retvm_if(SQLITE_OK != ret, CONTACTS_ERROR_DB,
@@ -132,7 +139,7 @@ int ctsvc_server_end_trans(bool success)
        return CONTACTS_ERROR_NONE;
 }
 
-int ctsvc_server_update_default_language(int prev_lang, int new_lang, int second_lang)
+int ctsvc_server_update_default_language(int prev_sort_primary, int prev_sort_secondary, int new_sort_primary, int new_sort_secondary)
 {
        SERVER_FN_CALL;
        int ret;
@@ -146,14 +153,8 @@ int ctsvc_server_update_default_language(int prev_lang, int new_lang, int second
        ret = ctsvc_server_begin_trans();
        h_retvm_if(ret, ret, "ctsvc_server_begin_trans() Failed(%d)", ret);
 
-       if (prev_lang == second_lang) {
-               snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language =%d" ,
-                               CTS_TABLE_CONTACTS, CTSVC_LANG_SECONDARY, CTSVC_LANG_DEFAULT);
-       }
-       else {
-               snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language = %d"        ,
-                                               CTS_TABLE_CONTACTS, prev_lang, CTSVC_LANG_DEFAULT);
-       }
+       snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language =%d" ,
+                       CTS_TABLE_CONTACTS, prev_sort_primary, CTSVC_SORT_PRIMARY);
        ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
        if (SQLITE_OK != ret) {
                ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
@@ -163,14 +164,30 @@ int ctsvc_server_update_default_language(int prev_lang, int new_lang, int second
                return CONTACTS_ERROR_DB;
        }
 
-       if (new_lang == second_lang) {
-               snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language=%d",
-                       CTS_TABLE_CONTACTS, CTSVC_LANG_DEFAULT, CTSVC_LANG_SECONDARY);
+       snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language = %d"        ,
+                       CTS_TABLE_CONTACTS, prev_sort_secondary, CTSVC_SORT_SECONDARY);
+       ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
+       if (SQLITE_OK != ret) {
+               ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
+               sqlite3_free(errmsg);
+               ctsvc_server_end_trans(false);
+               ctsvc_server_db_close();
+               return CONTACTS_ERROR_DB;
        }
-       else {
-               snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language=%d",
-                                       CTS_TABLE_CONTACTS, CTSVC_LANG_DEFAULT, new_lang);
+
+       snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language=%d",
+                               CTS_TABLE_CONTACTS, CTSVC_SORT_PRIMARY, new_sort_primary);
+       ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
+       if (SQLITE_OK != ret) {
+               ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
+               sqlite3_free(errmsg);
+               ctsvc_server_end_trans(false);
+               ctsvc_server_db_close();
+               return CONTACTS_ERROR_DB;
        }
+
+       snprintf(query, sizeof(query), "UPDATE %s SET display_name_language=%d WHERE display_name_language =%d" ,
+                       CTS_TABLE_CONTACTS, CTSVC_SORT_SECONDARY, new_sort_secondary);
        ret = sqlite3_exec(db, query, NULL, NULL, &errmsg);
        if (SQLITE_OK != ret) {
                ERR("sqlite3_exec(%s) Failed(%d, %s)", query, ret, errmsg);
@@ -180,13 +197,19 @@ int ctsvc_server_update_default_language(int prev_lang, int new_lang, int second
                return CONTACTS_ERROR_DB;
        }
 
-       ret = ctsvc_server_set_default_language(new_lang);
+       ret = ctsvc_server_set_default_language(new_sort_primary);
        if (CONTACTS_ERROR_NONE != ret) {
                ctsvc_server_end_trans(false);
                ctsvc_server_db_close();
                return ret;
        }
        ret = ctsvc_server_end_trans(true);
+
+       if (CONTACTS_ERROR_NONE == ret) {
+               int fd = open(CTSVC_NOTI_PERSON_CHANGED, O_TRUNC | O_RDWR);
+               if (0 <= fd)
+                       close(fd);
+       }
        ctsvc_server_db_close();
 
        return ret;
@@ -229,12 +252,6 @@ int ctsvc_server_update_secondary_language(int prev_lang, int new_lang)
                return CONTACTS_ERROR_DB;
        }
 
-       ret = ctsvc_server_set_secondary_language(new_lang);
-       if (CONTACTS_ERROR_NONE != ret) {
-               ctsvc_server_end_trans(false);
-               ctsvc_server_db_close();
-               return ret;
-       }
        ret = ctsvc_server_end_trans(true);
        ctsvc_server_db_close();
 
@@ -339,7 +356,7 @@ int ctsvc_server_update_collation()
        }
 
        snprintf(query, sizeof(query),
-                       "SELECT contact_id, display_name, reverse_display_name "
+                       "SELECT contact_id, sort_name, reverse_sort_name "
                                "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0");
        ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
        if(SQLITE_OK != ret) {
@@ -364,19 +381,23 @@ int ctsvc_server_update_collation()
        while (SQLITE_ROW == (ret = sqlite3_step(stmt))) {
 
                int contact_id = sqlite3_column_int(stmt, 0);
-               char *display_name = (char*)sqlite3_column_text(stmt, 1);
-               char *reverse_display_name = (char*)sqlite3_column_text(stmt, 2);
+               char *sort_name = (char*)sqlite3_column_text(stmt, 1);
+               char *reverse_sort_name = (char*)sqlite3_column_text(stmt, 2);
                char *sortkey = NULL;
                char *reverse_sortkey = NULL;
 
+               if (sort_name) {
+                       ret = ctsvc_collation_str(sort_name, &sortkey);
+                       if (CONTACTS_ERROR_NONE == ret && sortkey)
+                               sqlite3_bind_text(update_stmt, 1, sortkey, strlen(sortkey), SQLITE_STATIC);
+               }
 
-               ret = ctsvc_collation_str(display_name, &sortkey);
-               if (CONTACTS_ERROR_NONE == ret && sortkey)
-                       sqlite3_bind_text(update_stmt, 1, sortkey, strlen(sortkey), SQLITE_STATIC);
+               if (reverse_sort_name) {
+                       ret = ctsvc_collation_str(reverse_sort_name, &reverse_sortkey);
+                       if (CONTACTS_ERROR_NONE == ret && reverse_sortkey)
+                               sqlite3_bind_text(update_stmt, 2, reverse_sortkey, strlen(reverse_sortkey), SQLITE_STATIC);
+               }
 
-               ret = ctsvc_collation_str(reverse_display_name, &reverse_sortkey);
-               if (CONTACTS_ERROR_NONE == ret && reverse_sortkey)
-                       sqlite3_bind_text(update_stmt, 2, reverse_sortkey, strlen(reverse_sortkey), SQLITE_STATIC);
                sqlite3_bind_int(update_stmt, 3, contact_id);
 
                ret = sqlite3_step(update_stmt);
index 80bab7e..56be9db 100755 (executable)
@@ -23,7 +23,7 @@
 
 int ctsvc_server_db_open(sqlite3 **db);
 int ctsvc_server_db_close(void);
-int ctsvc_server_update_default_language(int system_lang, int default_lang, int second_lang);
+int ctsvc_server_update_default_language(int prev_sort_primary, int prev_sort_secondary, int new_sort_primary, int new_sort_secondary);
 int ctsvc_server_update_secondary_language(int prev_lang, int new_lang);
 int ctsvc_server_insert_sdn_contact(const char *name, const char *number);
 int ctsvc_server_delete_sdn_contact(void);
index 2de84f7..eae5f87 100755 (executable)
@@ -33,61 +33,66 @@ static const char *CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT = VCONFKEY_TELEPHONY_SIM_
 static const char *CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE = VCONFKEY_LANGSET;
 
 
-static int default_language = -1;
+static int primary_sort = -1;
 static int system_language = -1;
-static int secondary_language = -1;
+static int secondary_sort = -1;
 
 inline int ctsvc_server_set_default_language(int lang)
 {
        int ret = vconf_set_int(ctsvc_get_default_language_vconfkey(), lang);
        h_retvm_if(ret<0, CONTACTS_ERROR_INTERNAL, "vconf_set_int() Failed(%d)", ret);
 
-       default_language = lang;
-       return CONTACTS_ERROR_NONE;
-}
+       primary_sort = lang;
 
-inline int ctsvc_server_set_secondary_language(int lang)
-{
-       int ret = vconf_set_int(ctsvc_get_secondary_language_vconfkey(), lang);
-       h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_set_int() Failed(%d)", ret);
-
-       secondary_language = lang;
+       {
+               if (primary_sort==CTSVC_SORT_KOREAN)
+                       secondary_sort = CTSVC_SORT_WESTERN;
+               else if (primary_sort==CTSVC_SORT_WESTERN)
+                       secondary_sort = CTSVC_SORT_KOREAN;
+               else
+                       secondary_sort = CTSVC_SORT_WESTERN;
+       }
+       DBG("primary %d second %d", primary_sort, secondary_sort);
        return CONTACTS_ERROR_NONE;
 }
 
 static void ctsvc_server_change_language_cb(keynode_t *key, void *data)
 {
        int ret = -1;
+       int new_primary_sort, new_secondary_sort;
        const char *langset;
 
        langset = vconf_keynode_get_str(key);
-       if (!default_language) {
-               ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_language);
-               h_retm_if(ret<0, "vconf_get_int() Failed(%d)", ret);
-       }
-
-
        system_language = ctsvc_get_language_type(langset);
-       DBG("system language(%d, %s)", system_language, langset);
-       if (system_language != default_language)
-               ret = ctsvc_server_update_default_language(default_language, system_language, secondary_language);
-}
-
-static void ctsvc_server_change_secondary_language_cb(keynode_t *key, void *data)
-{
-       int ret = -1;
-       const char *langset;
-       int lang_type;
+       switch(system_language)
+       {
+       case CTSVC_LANG_KOREAN:
+               new_primary_sort = CTSVC_SORT_KOREAN;
+               break;
+       case CTSVC_LANG_JAPANESE:
+               new_primary_sort = CTSVC_SORT_JAPANESE;
+               break;
+       default:
+               new_primary_sort = CTSVC_SORT_WESTERN;
+                       break;
+       }
 
-       langset = vconf_keynode_get_str(key);
-       if (!secondary_language) {
-               ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_language);
+       if (primary_sort ==-1) {
+               ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &primary_sort);
                h_retm_if(ret<0, "vconf_get_int() Failed(%d)", ret);
        }
 
-       lang_type = ctsvc_get_language_type(langset);
-       if (lang_type != secondary_language)
-               ret = ctsvc_server_update_secondary_language(secondary_language, lang_type);
+       {
+               if (new_primary_sort==CTSVC_SORT_KOREAN)
+                       new_secondary_sort = CTSVC_SORT_WESTERN;
+               else if (new_primary_sort==CTSVC_SORT_WESTERN)
+                       new_secondary_sort = CTSVC_SORT_KOREAN;
+               else
+                       new_secondary_sort = CTSVC_SORT_WESTERN;
+       }
+
+       if (new_primary_sort != primary_sort)
+               ret = ctsvc_server_update_default_language(primary_sort, secondary_sort, new_primary_sort, new_secondary_sort);
 }
 
 static void ctsvc_server_update_collation_cb(keynode_t *key, void *data)
@@ -100,9 +105,6 @@ static void ctsvc_server_tapi_sim_complete_cb(keynode_t *key, void *data)
        int ret, init_stat;
        init_stat = vconf_keynode_get_int(key);
        if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == init_stat) {
-               ret = ctsvc_server_sim_read_sdn(NULL);
-               h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_read_sdn() Failed(%d)", ret);
-
                ret = ctsvc_server_sim_initialize();
                h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_initialize() Failed(%d)", ret);
 
@@ -126,57 +128,43 @@ int ctsvc_server_init_configuration(void)
 {
        int ret, sim_stat=-1;
        const char *langset;
-       int lang_type;
+       int sort_type;
 
-       ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &default_language);
-       if (ret < 0) {
+       langset = vconf_get_str(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE);
+       h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE);
+       system_language = ctsvc_get_language_type(langset);
+
+       ret = vconf_get_int(ctsvc_get_default_language_vconfkey(), &sort_type);
+       if (ret < 0 || sort_type == CTSVC_SORT_OTHERS) {
                ERR("vconf_get_int(%s) Failed(%d)", ctsvc_get_default_language_vconfkey() ,ret);
-               default_language = 0;
-       }
 
-       ret = vconf_get_int(ctsvc_get_secondary_language_vconfkey(), &secondary_language);
-       if (ret < 0) {
-               ERR("vconf_get_int(%s) Failed(%d)", ctsvc_get_secondary_language_vconfkey(),ret);
-               secondary_language = 0;
+               switch(system_language)
+               {
+               case CTSVC_LANG_KOREAN:
+                       sort_type = CTSVC_SORT_KOREAN;
+                       break;
+               case CTSVC_LANG_JAPANESE:
+                       sort_type = CTSVC_SORT_JAPANESE;
+                       break;
+               default:
+                       sort_type = CTSVC_SORT_WESTERN;
+               }
        }
 
+       ctsvc_server_set_default_language(sort_type);
+
        ret = vconf_notify_key_changed(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE,
                        ctsvc_server_change_language_cb, NULL);
        h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
                        CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE, ret);
 
-       ret = vconf_notify_key_changed(VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE,
-                       ctsvc_server_change_secondary_language_cb, NULL);
-       h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
-                       VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE, ret);
-
        ret = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT,
                        ctsvc_server_update_collation_cb, NULL);
        h_retvm_if(ret<0, CONTACTS_ERROR_SYSTEM, "vconf_notify_key_changed(%s) Failed(%d)",
                        VCONFKEY_REGIONFORMAT, ret);
 
-       langset = vconf_get_str(CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE);
-       h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE);
-       system_language = ctsvc_get_language_type(langset);
-
-       langset = vconf_get_str(VCONFKEY_CONTACTS_SVC_SECONDARY_LANGUAGE);
-       h_warn_if(NULL == langset, "vconf_get_str(%s) return NULL", CTSVC_SERVER_VCONF_SYSTEM_LANGUAGE);
-       lang_type = ctsvc_get_language_type(langset);
-       if (secondary_language != lang_type) {
-               ERR("system lang(%s, %d), default lang(%d)", langset, lang_type, secondary_language);
-               ctsvc_server_update_secondary_language(secondary_language, lang_type);
-       }
-
-       if (system_language != default_language) {
-               ERR("system lang(%s, %d), default lang(%d)", langset, system_language, default_language);
-               ctsvc_server_update_default_language(default_language, system_language, secondary_language);
-       }
-
        ret = vconf_get_int(CTSVC_SERVER_VCONF_TAPI_SIM_PB_INIT, &sim_stat);
        if (VCONFKEY_TELEPHONY_SIM_PB_INIT_COMPLETED == sim_stat) {
-               ret = ctsvc_server_sim_read_sdn(NULL);
-               h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_read_sdn() Failed(%d)", ret);
-
                ret = ctsvc_server_sim_initialize();
                h_warn_if(CONTACTS_ERROR_NONE != ret, "ctsvc_server_sim_initialize() Failed(%d)", ret);
        }
index 38c0cbb..9ec7bdf 100755 (executable)
@@ -24,7 +24,6 @@ void ctsvc_server_final_configuration(void);
 
 int ctsvc_server_get_default_language(void);
 int ctsvc_server_set_default_language(int lang);
-int ctsvc_server_set_secondary_language(int lang);
 
 void ctsvc_server_trim_memory(void);
 
index f99e8fe..6a55fb0 100755 (executable)
@@ -28,6 +28,7 @@
 // Additional Error
 enum {
        CTSVC_ERR_NO_DB_FILE = -10000,
+       CTSVC_ERR_NO_TABLE,
 };
 
 #define SERVER_DLOG_OUT