Insert/Update contact/my_profile error 48/9848/3
authorDonghee Ye <donghee.ye@samsung.com>
Sat, 7 Sep 2013 11:19:07 +0000 (20:19 +0900)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Tue, 17 Sep 2013 05:49:36 +0000 (22:49 -0700)
- Check is_default of address
- Check is_default of image
- Update number/email record if number/email is empty
- Return error when insert/update invalid group relation

Change-Id: I9d1a74250e5e41e52b33573490af761023d20914

native/ctsvc_db_plugin_contact.c
native/ctsvc_db_plugin_contact_helper.c
native/ctsvc_db_plugin_contact_helper.h
native/ctsvc_db_plugin_image.c
native/ctsvc_db_plugin_image_helper.c
native/ctsvc_db_plugin_image_helper.h
native/ctsvc_db_plugin_my_profile.c

index 7855e12..dac0d02 100644 (file)
@@ -263,7 +263,7 @@ static int __ctsvc_db_contact_get_record( int id, contacts_record_h* out_record
        contact = (ctsvc_contact_s *)record;
        ret = __ctsvc_db_get_contact_base_info(id, contact);
        if (CONTACTS_ERROR_NONE != ret) {
-               CTS_ERR("cts_get_main_contacts_info(ALL) Failed(%d)", ret);
+               CTS_ERR("__ctsvc_db_get_contact_base_info(ALL) Failed(%d)", ret);
                contacts_record_destroy(record, true);
                return ret;
        }
@@ -423,6 +423,8 @@ static void __ctsvc_contact_check_default_data(ctsvc_contact_s *contact)
                contact->has_email = ctsvc_contact_check_default_email((contacts_list_h)contact->emails);
        if (contact->images)
                ctsvc_contact_check_default_image((contacts_list_h)contact->images);
+       if (contact->postal_addrs)
+               ctsvc_contact_check_default_address((contacts_list_h)contact->postal_addrs);
 }
 
 static inline int __ctsvc_contact_update_grouprel(int contact_id, contacts_list_h group_list)
@@ -454,6 +456,7 @@ static inline int __ctsvc_contact_update_grouprel(int contact_id, contacts_list_
                if (NULL == grouprel)
                        continue;
 
+               RETVM_IF(grouprel->group_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "group_id(%d) invalid", grouprel->group_id);
                if (grouprel->group_id) {
                        ret = ctsvc_group_add_contact_in_transaction(grouprel->group_id, contact_id);
                        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_db_group_set_relation() Failed(%d)", ret);
@@ -1757,6 +1760,7 @@ static inline int __ctsvc_contact_insert_grouprel(int contact_id, contacts_list_
                if (NULL == grouprel)
                        continue;
 
+               RETVM_IF(grouprel->group_id <= 0, CONTACTS_ERROR_INVALID_PARAMETER, "group_id(%d) invalid", grouprel->group_id);
                if (grouprel->group_id) {
                        int ret = ctsvc_group_add_contact_in_transaction(grouprel->group_id, contact_id);
                        RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_db_group_set_relation() Failed(%d)", ret);
index 5b6a36a..f8dadb0 100644 (file)
@@ -1012,6 +1012,7 @@ bool ctsvc_contact_check_default_image(contacts_list_h image_list)
                        contacts_list_get_current_record_p(image_list, (contacts_record_h*)&image);
                        if (NULL != image && image->path && *image->path) {
                                image->is_default = true;
+                               ctsvc_record_set_property_flag((ctsvc_record_s *)image, _contacts_image.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
                                has_default = true;
                                break;
                        }
@@ -1020,6 +1021,51 @@ bool ctsvc_contact_check_default_image(contacts_list_h image_list)
        return CONTACTS_ERROR_NONE;
 }
 
+bool ctsvc_contact_check_default_address(contacts_list_h address_list)
+{
+       bool has_default = false;
+       ctsvc_address_s* address;
+       unsigned int count;
+       int ret;
+
+       RETV_IF(NULL == address_list, false);
+
+       ret = contacts_list_get_count(address_list, &count);
+       if (CONTACTS_ERROR_NONE !=ret || 0 == count) {
+               CTS_DBG("list get count failed (%d)", count);
+               return false;
+       }
+
+       contacts_list_first(address_list);
+       do {
+               contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
+               if (NULL != address &&
+                                               (address->pobox || address->postalcode || address->region || address->locality
+                                                       || address->street || address->extended || address->country)) {
+                       if (address->is_default && false == has_default)
+                               has_default = true;
+                       else if (has_default)
+                               address->is_default = false;
+               }
+       }while(CONTACTS_ERROR_NONE == contacts_list_next(address_list));
+
+       if (false == has_default) {
+               contacts_list_first(address_list);
+               do {
+                       contacts_list_get_current_record_p(address_list, (contacts_record_h*)&address);
+                       if (NULL != address &&
+                                               (address->pobox || address->postalcode || address->region || address->locality
+                                                       || address->street || address->extended || address->country)) {
+                               address->is_default = true;
+                               ctsvc_record_set_property_flag((ctsvc_record_s *)address, _contacts_address.is_default, CTSVC_PROPERTY_FLAG_DIRTY);
+                               has_default = true;
+                               break;
+                       }
+               }while(CONTACTS_ERROR_NONE == contacts_list_next(address_list));
+       }
+       return CONTACTS_ERROR_NONE;
+}
+
 int ctsvc_contact_update_data_name(contacts_list_h name_list, int contact_id, bool is_my_profile)
 {
        CTS_FN_CALL;
@@ -1551,21 +1597,22 @@ int ctsvc_contact_update_data_number(contacts_list_h number_list,
        do {
                contacts_list_get_current_record_p(number_list, &record);
                number = (ctsvc_number_s*)record;
-               if (number->number) {
-                       if (0 < number->id) {
-                               if (number->number)
-                                       ret = ctsvc_db_number_update(record, is_my_profile);
-                               else
-                                       ret = ctsvc_db_number_delete(number->id, is_my_profile);
+               if (0 < number->id) {
+                       if (number->number) {
+                               ret = ctsvc_db_number_update(record, is_my_profile);
+                               had = true;
                        }
                        else
-                               ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
-                       if (CONTACTS_ERROR_DB == ret) {
-                               CTS_ERR("DB error : return (%d)", ret);
-                               break;
-                       }
+                               ret = ctsvc_db_number_delete(number->id, is_my_profile);
+               }
+               else if (number->number) {
+                       ret = ctsvc_db_number_insert(record, contact_id, is_my_profile, NULL);
                        had = true;
                }
+               if (CONTACTS_ERROR_DB == ret) {
+                       CTS_ERR("DB error : return (%d)", ret);
+                       break;
+               }
        }while(CONTACTS_ERROR_NONE == contacts_list_next(number_list));
 
        *had_phonenumber = had;
@@ -1600,21 +1647,23 @@ int ctsvc_contact_update_data_email(contacts_list_h email_list,
        do {
                contacts_list_get_current_record_p(email_list, &record);
                email = (ctsvc_email_s*)record;
-               if (email->email_addr) {
-                       if (0 < email->id) {
-                               if (email->email_addr)
-                                       ret = ctsvc_db_email_update(record, is_my_profile);
-                               else
-                                       ret = ctsvc_db_email_delete(email->id, is_my_profile);
+
+               if (0 < email->id) {
+                       if (email->email_addr) {
+                               ret = ctsvc_db_email_update(record, is_my_profile);
+                               had = true;
                        }
                        else
-                               ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
-                       if (CONTACTS_ERROR_DB == ret){
-                               CTS_ERR("DB error : return (%d)", ret);
-                               break;
-                       }
+                               ret = ctsvc_db_email_delete(email->id, is_my_profile);
+               }
+               else if (email->email_addr) {
+                       ret = ctsvc_db_email_insert(record, contact_id, is_my_profile, NULL);
                        had = true;
                }
+               if (CONTACTS_ERROR_DB == ret){
+                       CTS_ERR("DB error : return (%d)", ret);
+                       break;
+               }
        }while(CONTACTS_ERROR_NONE == contacts_list_next(email_list));
 
        *had_email = had;
index 90b16d7..b0704c5 100644 (file)
@@ -51,6 +51,7 @@ int ctsvc_get_data_info_extension(cts_stmt stmt, contacts_list_h list);
 
 bool ctsvc_contact_check_default_number(contacts_list_h number_list);
 bool ctsvc_contact_check_default_email(contacts_list_h email_list);
+bool ctsvc_contact_check_default_address(contacts_list_h address_list);
 bool ctsvc_contact_check_default_image(contacts_list_h image_list);
 bool ctsvc_contact_check_image_location(const char *path);
 
index 835016b..98a9f75 100644 (file)
@@ -57,21 +57,6 @@ ctsvc_db_plugin_info_s ctsvc_db_plugin_image = {
        .replace_records = NULL,
 };
 
-
-static int __ctsvc_db_image_reset_default(int image_id, int contact_id)
-{
-       int ret;
-       char query[CTS_SQL_MAX_LEN] = {0};
-
-       snprintf(query, sizeof(query),
-                       "UPDATE "CTS_TABLE_DATA" SET is_default=0, is_primary_default=0 WHERE id != %d AND contact_id = %d AND datatype=%d",
-                       image_id, contact_id, CTSVC_DATA_IMAGE);
-       ret = ctsvc_query_exec(query);
-
-       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
-       return ret;
-}
-
 static int __ctsvc_db_image_get_default_image_id(int contact_id)
 {
        int ret;
@@ -215,10 +200,6 @@ static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id )
                return ret;
        }
 
-       old_default_image_id = __ctsvc_db_image_get_default_image_id(image->contact_id);
-       if (0 == old_default_image_id)
-               image->is_default = true;
-
        snprintf(query, sizeof(query),
                        "SELECT contact_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
        stmt = cts_query_prepare(query);
@@ -239,6 +220,10 @@ static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id )
        person_id = ctsvc_stmt_get_int(stmt, 1);
        cts_stmt_finalize(stmt);
 
+       old_default_image_id = __ctsvc_db_image_get_default_image_id(image->contact_id);
+       if (0 == old_default_image_id)
+               image->is_default = true;
+
        ret = ctsvc_db_image_insert(record, image->contact_id, false, id);
        if (CONTACTS_ERROR_NONE != ret) {
                CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
@@ -273,7 +258,7 @@ static int __ctsvc_db_image_insert_record( contacts_record_h record, int *id )
                int primary_default_contact_id;
 
                primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(person_id);
-               __ctsvc_db_image_reset_default(*id, contact_id);
+               ctsvc_db_image_reset_default(*id, contact_id);
 
                if (primary_default_contact_id == 0 || primary_default_contact_id == contact_id) {
                        __ctsvc_db_image_set_primary_default(*id, true);
@@ -401,7 +386,7 @@ static int __ctsvc_db_image_update_record( contacts_record_h record )
                int primary_default_contact_id;
 
                primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(contact_id);
-               __ctsvc_db_image_reset_default(image->id, contact_id);
+               ctsvc_db_image_reset_default(image->id, contact_id);
 
                if (contact_id == primary_default_contact_id) {
                        __ctsvc_db_image_set_primary_default(image->id, true);
index 3b21529..449cced 100644 (file)
@@ -64,6 +64,20 @@ static inline int __ctsvc_image_bind_stmt(cts_stmt stmt, ctsvc_image_s *image, i
        return CONTACTS_ERROR_NONE;
 }
 
+int ctsvc_db_image_reset_default(int image_id, int contact_id)
+{
+       int ret;
+       char query[CTS_SQL_MAX_LEN] = {0};
+
+       snprintf(query, sizeof(query),
+                       "UPDATE "CTS_TABLE_DATA" SET is_default=0, is_primary_default=0 WHERE id != %d AND contact_id = %d AND datatype=%d",
+                       image_id, contact_id, CTSVC_DATA_IMAGE);
+       ret = ctsvc_query_exec(query);
+
+       WARN_IF(CONTACTS_ERROR_NONE != ret, "cts_query_exec() Failed(%d)", ret);
+       return ret;
+}
+
 int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_profile, int *id)
 {
        int ret;
@@ -82,9 +96,8 @@ int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_p
 
        image_id = cts_db_get_next_id(CTS_TABLE_DATA);
        ret = ctsvc_contact_add_image_file(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);
+               CTS_ERR("ctsvc_contact_add_image_file() Failed(%d)", ret);
                return ret;
        }
        free(image->path);
@@ -109,9 +122,14 @@ int ctsvc_db_image_insert(contacts_record_h record, int contact_id, bool is_my_p
 
        //image->id = cts_db_get_last_insert_id();
        if (id)
-               *id = cts_db_get_last_insert_id();
+               *id = image_id;
        cts_stmt_finalize(stmt);
 
+       if (ctsvc_record_check_property_flag((ctsvc_record_s *)record, _contacts_image.is_default, CTSVC_PROPERTY_FLAG_DIRTY)) {
+               if (image->is_default)
+                       ctsvc_db_image_reset_default(image_id, contact_id);
+       }
+
        if (!is_my_profile)
                ctsvc_set_image_noti();
 
@@ -148,6 +166,11 @@ int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_p
                }
        }
 
+       if (ctsvc_record_check_property_flag((ctsvc_record_s *)record, _contacts_image.is_default, CTSVC_PROPERTY_FLAG_DIRTY)) {
+               if (image->is_default)
+                       ctsvc_db_image_reset_default(image->id, contact_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_DATA, image->id))) break;
index 6a6daac..7cfe033 100644 (file)
@@ -28,5 +28,6 @@ int ctsvc_db_image_update(contacts_record_h record, int contact_id, bool is_my_p
 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_image_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv);
+int ctsvc_db_image_reset_default(int image_id, int contact_id);
 
 #endif // __CTSVC_DB_PLUGIN_RELATIONSHIP_HELPER_H__
index 8eb468d..050d98b 100644 (file)
@@ -383,6 +383,7 @@ static void __ctsvc_my_profile_check_default_data(ctsvc_my_profile_s *my_profile
        ctsvc_contact_check_default_number((contacts_list_h)my_profile->numbers);
        ctsvc_contact_check_default_email((contacts_list_h)my_profile->emails);
        ctsvc_contact_check_default_image((contacts_list_h)my_profile->images);
+       ctsvc_contact_check_default_address((contacts_list_h)my_profile->postal_addrs);
 }
 
 static void __ctsvc_make_my_profile_display_name(ctsvc_my_profile_s *my_profile)