get sorted group_name by collation cb func 54/49954/1
authorGukhwan Cho <gh78.cho@samsung.com>
Fri, 16 Oct 2015 07:10:19 +0000 (16:10 +0900)
committerGukhwan Cho <gh78.cho@samsung.com>
Thu, 22 Oct 2015 03:01:06 +0000 (12:01 +0900)
Change-Id: I9bb8835ffc3a5df5506420517bcd8f29dcbcb7b7
Signed-off-by: Gukhwan Cho <gh78.cho@samsung.com>
server/ctsvc_server_sqlite.c
server/db/ctsvc_db_plugin_group_helper.c
server/db/ctsvc_db_plugin_group_helper.h
server/db/ctsvc_db_query.c
server/db/ctsvc_db_sqlite.c

index 8de5548..b5615ff 100644 (file)
@@ -90,6 +90,10 @@ int ctsvc_server_db_open(sqlite3 **db)
                                        ctsvc_db_phone_number_equal_callback, NULL, NULL);
                RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
                                                "sqlite3_create_function() Fail(%d)", ret);
+               ret = sqlite3_create_collation(server_db, "_NAME_SORT_", SQLITE_UTF8, (void *)SQLITE_UTF8,
+                                       ctsvc_db_group_name_sort_callback);
+               RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                                               "sqlite3_create_collation() Fail(%d)", ret);
        }
        if (db)
                *db = server_db;
index 716844e..88525fc 100644 (file)
@@ -27,6 +27,9 @@
 #include "ctsvc_db_utils.h"
 #include "ctsvc_db_plugin_group_helper.h"
 #include "ctsvc_notify.h"
+#include "ctsvc_normalize.h"
+#include "ctsvc_server_setting.h"
+#include "ctsvc_localize.h"
 
 /*
  * Whenever deleting group, this function will be called
@@ -55,4 +58,79 @@ void ctsvc_db_group_delete_callback(sqlite3_context *context, int argc, sqlite3_
        return;
 }
 
+static int _ctsvc_db_group_name_collation_str(const char *str1, const char *str2)
+{
+       int ret;
+       int len1, len2;
+       char *str_dest1 = NULL;
+       char *str_dest2 = NULL;
+
+       ctsvc_collation_str((char *)str1, &str_dest1);
+       ctsvc_collation_str((char *)str2, &str_dest2);
+
+       len1 = strlen(str_dest1);
+       len2 = strlen(str_dest2);
+       if (len1 < len2)
+               ret = strncmp(str_dest1, str_dest2, len1);
+       else
+               ret = strncmp(str_dest1, str_dest2, len2);
+
+       free(str_dest1);
+       free(str_dest2);
+       return ret;
+}
+
+int ctsvc_db_group_name_sort_callback(void *context, int str1_len, const void *str1, int str2_len, const void *str2)
+{
+       int ret;
+       int str1_sort_type;
+       int str2_sort_type;
+       char str_src1[CTSVC_STR_SHORT_LEN] = {0};
+       char str_src2[CTSVC_STR_SHORT_LEN] = {0};
+       int prim_sort  = ctsvc_get_primary_sort();
+
+       strncpy(str_src1, str1, str1_len);
+       strncpy(str_src2, str2, str2_len);
+       str1_sort_type = ctsvc_get_name_sort_type(str_src1);
+       str2_sort_type = ctsvc_get_name_sort_type(str_src2);
+
+       switch (str1_sort_type) {
+       case CTSVC_SORT_NUMBER:
+               if (CTSVC_SORT_OTHERS == str2_sort_type)
+                       ret = 1;
+               else if (CTSVC_SORT_NUMBER == str2_sort_type)
+                       ret = _ctsvc_db_group_name_collation_str(str_src1, str_src2);
+               else
+                       ret = -1;
+               break;
+
+       case CTSVC_SORT_OTHERS:
+               if (CTSVC_SORT_OTHERS == str2_sort_type)
+                       ret = _ctsvc_db_group_name_collation_str(str_src1, str_src2);
+               else
+                       ret = -1;
+               break;
+
+       default:
+               if (CTSVC_SORT_NUMBER >= str2_sort_type) {
+                       ret = 1;
+               }
+               else {
+                       if (str1_sort_type != str2_sort_type) {
+                               if (str1_sort_type == prim_sort)
+                                       ret = -1;
+                               else if (str2_sort_type == prim_sort)
+                                       ret = 1;
+                               else
+                                       ret = _ctsvc_db_group_name_collation_str(str_src1, str_src2);
+                       }
+                       else {
+                               ret = _ctsvc_db_group_name_collation_str(str_src1, str_src2);
+                       }
+               }
+               break;
+       }
+
+       return ret;
+}
 
index 87ca39f..8d13174 100644 (file)
@@ -25,5 +25,6 @@
 #include <tzplatform_config.h>
 
 void ctsvc_db_group_delete_callback(sqlite3_context *context, int argc, sqlite3_value ** argv);
+int ctsvc_db_group_name_sort_callback(void *context, int str1_len, const void *str1, int str2_len, const void *str2);
 
 #endif /* __CTSVC_DB_PLUGIN_GROUP_HELPER_H__ */
index 60add16..7fb9d2d 100644 (file)
@@ -1026,6 +1026,11 @@ int ctsvc_db_make_get_records_query_stmt(ctsvc_query_s *s_query, int offset, int
                                temp_len = SAFE_SNPRINTF(&query, &query_size, len, field_name);
                                if (0 <= temp_len) len+= temp_len;
 
+                               if (CTSVC_PROPERTY_GROUP_NAME == s_query->sort_property_id) {
+                                       temp_len = SAFE_SNPRINTF(&query, &query_size, len, " COLLATE _NAME_SORT_ ");
+                                       if (0 <= temp_len) len+= temp_len;
+                               }
+
                                if (false == s_query->sort_asc) {
                                        temp_len = SAFE_SNPRINTF(&query, &query_size, len, " DESC ");
                                        if (0 <= temp_len) len+= temp_len;
index f196841..b559d7c 100644 (file)
@@ -89,6 +89,10 @@ int ctsvc_db_open(void)
                                ctsvc_db_phone_number_equal_callback, NULL, NULL);
                RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
                                "sqlite3_create_function() Fail(%d)", ret);
+               ret = sqlite3_create_collation(ctsvc_db, "_NAME_SORT_", SQLITE_UTF8, (void *)SQLITE_UTF8,
+                               ctsvc_db_group_name_sort_callback);
+               RETVM_IF(SQLITE_OK != ret, CONTACTS_ERROR_DB,
+                               "sqlite3_create_collation() Fail(%d)", ret);
        }
 
        return CONTACTS_ERROR_NONE /*CTS_SUCCESS*/;