[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_init.c
1 /*
2  * Contacts Service
3  *
4  * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 #include <glib.h>
20
21 #include "contacts.h"
22
23 #include "ctsvc_internal.h"
24 #include "ctsvc_db_schema.h"
25 #include "ctsvc_db_sqlite.h"
26 #include "ctsvc_db_init.h"
27 #include "ctsvc_db_utils.h"
28 #include "ctsvc_view.h"
29 #include "ctsvc_notification.h"
30 #include "ctsvc_db_access_control.h"
31
32 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_addressbook;
33 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_contact;
34 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_my_profile;
35 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_simple_contact;
36 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_group;
37 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_person;
38 #ifdef ENABLE_LOG_FEATURE
39 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_phonelog;
40 #endif /* ENABLE_LOG_FEATURE */
41 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_speeddial;
42 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_sdn;
43 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_activity;
44 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_activity_photo;
45 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_address;
46 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_company;
47 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_email;
48 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_event;
49 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_grouprelation;
50 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_relationship;
51 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_image;
52 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_messenger;
53 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_name;
54 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_nickname;
55 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_note;
56 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_number;
57 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_url;
58 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_extension;
59 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_profile;
60 extern ctsvc_db_plugin_info_s ctsvc_db_plugin_sip;
61
62
63 #ifdef _CONTACTS_NATIVE
64 static int __ctsvc_db_view_ref_count = 0;
65 #endif
66
67 static GHashTable *__ctsvc_db_view_hash_table = NULL;
68
69 #ifdef _CONTACTS_IPC_SERVER
70 static bool __ctsvc_db_view_already_created = false;
71 #endif
72
73 typedef struct {
74         char *view_uri;
75         const char * const table_name;
76         int read_permission;
77         int write_permission;
78         bool need_ab_access_control;
79 } db_table_info_s;
80
81 static const db_table_info_s __db_tables[] = {
82         {CTSVC_VIEW_URI_ADDRESSBOOK,    CTS_TABLE_ADDRESSBOOKS, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
83         {CTSVC_VIEW_URI_GROUP,                  CTS_TABLE_GROUPS, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
84         {CTSVC_VIEW_URI_PERSON,                 CTSVC_DB_VIEW_PERSON, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
85         {CTSVC_VIEW_URI_SIMPLE_CONTACT, CTSVC_DB_VIEW_CONTACT, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
86         {CTSVC_VIEW_URI_CONTACT,                CTSVC_DB_VIEW_CONTACT, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
87         {CTSVC_VIEW_URI_MY_PROFILE,     CTSVC_DB_VIEW_MY_PROFILE, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
88         {CTSVC_VIEW_URI_ACTIVITY,               CTSVC_DB_VIEW_ACTIVITY, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
89         {CTSVC_VIEW_URI_ACTIVITY_PHOTO, CTSVC_DB_VIEW_ACTIVITY_PHOTOS, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
90         {CTSVC_VIEW_URI_PHONELOG,               CTS_TABLE_PHONELOGS, CTSVC_PERMISSION_PHONELOG_READ, CTSVC_PERMISSION_PHONELOG_WRITE, false},
91         {CTSVC_VIEW_URI_SPEEDDIAL,              CTSVC_DB_VIEW_SPEEDIDAL, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, false},
92         {CTSVC_VIEW_URI_SDN,                            CTS_TABLE_SDN, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, false},
93
94         {CTSVC_VIEW_URI_NAME,                   CTSVC_DB_VIEW_NAME, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
95         {CTSVC_VIEW_URI_COMPANY,                CTSVC_DB_VIEW_COMPANY, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
96         {CTSVC_VIEW_URI_NUMBER,                 CTSVC_DB_VIEW_NUMBER, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
97         {CTSVC_VIEW_URI_EMAIL,                  CTSVC_DB_VIEW_EMAIL, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
98         {CTSVC_VIEW_URI_URL,                    CTSVC_DB_VIEW_URL, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
99         {CTSVC_VIEW_URI_ADDRESS,                CTSVC_DB_VIEW_ADDRESS, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
100         {CTSVC_VIEW_URI_PROFILE,                CTSVC_DB_VIEW_PROFILE, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
101         {CTSVC_VIEW_URI_RELATIONSHIP,   CTSVC_DB_VIEW_RELATIONSHIP, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
102         {CTSVC_VIEW_URI_IMAGE,                  CTSVC_DB_VIEW_IMAGE, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
103         {CTSVC_VIEW_URI_NOTE,                   CTSVC_DB_VIEW_NOTE, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
104         {CTSVC_VIEW_URI_NICKNAME,               CTSVC_DB_VIEW_NICKNAME, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
105         {CTSVC_VIEW_URI_EVENT,                  CTSVC_DB_VIEW_EVENT, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
106         {CTSVC_VIEW_URI_MESSENGER,              CTSVC_DB_VIEW_MESSENGER, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
107         {CTSVC_VIEW_URI_GROUP_RELATION, CTSVC_DB_VIEW_GROUP_RELATION, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
108         {CTSVC_VIEW_URI_EXTENSION,              CTSVC_DB_VIEW_EXTENSION, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
109         {CTSVC_VIEW_URI_SIP,                    CTSVC_DB_VIEW_SIP, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_WRITE, true},
110
111         /* Do not support get_all_records, get_records_with_query, get_count, get_count_with_query */
112         /*
113          * {CTSVC_VIEW_URI_GROUPS_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_UPDATED_INFO, false},
114          * {CTSVC_VIEW_URI_GROUPS_MEMBER_UPDATED_INFO, CTSVC_DB_VIEW_GROUPS_MEMBER_UPDATED_INFO, false},
115          * {CTSVC_VIEW_URI_CONTACTS_UPDATED_INFO, CTSVC_DB_VIEW_CONTACTS_UPDATED_INFO, false},
116          * {CTSVC_VIEW_URI_MY_PROFILE_UPDATED_INFO, NULL, false},
117          * {CTSVC_VIEW_URI_GROUPRELS_UPDATED_INFO, NULL, false},
118          */
119
120         {CTSVC_VIEW_URI_READ_ONLY_PERSON_CONTACT, CTSVC_DB_VIEW_PERSON_CONTACT, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
121         {CTSVC_VIEW_URI_READ_ONLY_PERSON_NUMBER, CTSVC_DB_VIEW_PERSON_NUMBER, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
122         {CTSVC_VIEW_URI_READ_ONLY_PERSON_EMAIL, CTSVC_DB_VIEW_PERSON_EMAIL, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
123         {CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP, CTSVC_DB_VIEW_PERSON_GROUP, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
124         {CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_ASSIGNED, CTSVC_DB_VIEW_PERSON_GROUP_ASSIGNED, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
125         {CTSVC_VIEW_URI_READ_ONLY_PERSON_GROUP_NOT_ASSIGNED, CTSVC_DB_VIEW_PERSON_GROUP_NOT_ASSIGNED, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
126         {CTSVC_VIEW_URI_READ_ONLY_PERSON_PHONELOG, CTSVC_DB_VIEW_PERSON_PHONELOG, CTSVC_PERMISSION_CONTACT_READ|CTSVC_PERMISSION_PHONELOG_READ, CTSVC_PERMISSION_CONTACT_NONE, false},
127         {CTSVC_VIEW_URI_READ_ONLY_PERSON_USAGE, CTSVC_DB_VIEW_PERSON_USAGE, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
128
129         {CTSVC_VIEW_URI_READ_ONLY_CONTACT_NUMBER, CTSVC_DB_VIEW_CONTACT_NUMBER, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
130         {CTSVC_VIEW_URI_READ_ONLY_CONTACT_EMAIL, CTSVC_DB_VIEW_CONTACT_EMAIL, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
131         {CTSVC_VIEW_URI_READ_ONLY_CONTACT_GROUP, CTSVC_DB_VIEW_CONTACT_GROUP, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
132         {CTSVC_VIEW_URI_READ_ONLY_CONTACT_ACTIVITY, CTSVC_DB_VIEW_CONTACT_ACTIVITY, CTSVC_PERMISSION_CONTACT_READ, CTSVC_PERMISSION_CONTACT_NONE, true},
133
134         {CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT, CTS_TABLE_PHONELOG_STAT, CTSVC_PERMISSION_PHONELOG_READ, CTSVC_PERMISSION_CONTACT_NONE, false},
135
136 };
137
138 /* this function is called in mutex lock */
139 int ctsvc_db_plugin_init()
140 {
141         int i;
142
143 #ifdef _CONTACTS_NATIVE
144         __ctsvc_db_view_ref_count++;
145 #endif
146
147         if (__ctsvc_db_view_hash_table)
148                 return CONTACTS_ERROR_NONE;
149
150         __ctsvc_db_view_hash_table = g_hash_table_new(g_str_hash, g_str_equal);
151
152         if (__ctsvc_db_view_hash_table) {
153                 int count = sizeof(__db_tables) /sizeof(db_table_info_s);
154                 for (i = 0; i < count; i++)
155                         g_hash_table_insert(__ctsvc_db_view_hash_table, __db_tables[i].view_uri, GINT_TO_POINTER(&(__db_tables[i])));
156         }
157         return CONTACTS_ERROR_NONE;
158 }
159
160 int ctsvc_db_plugin_deinit()
161 {
162 #ifdef _CONTACTS_NATIVE
163         __ctsvc_db_view_ref_count--;
164         if (__ctsvc_db_view_ref_count != 0)
165                 return;
166 #endif
167
168         if (NULL == __ctsvc_db_view_hash_table)
169                 return CONTACTS_ERROR_NONE;
170
171         g_hash_table_destroy(__ctsvc_db_view_hash_table);
172         __ctsvc_db_view_hash_table = NULL;
173
174         return CONTACTS_ERROR_NONE;
175 }
176
177 int ctsvc_db_get_table_name(const char *view_uri, const char **out_table)
178 {
179         db_table_info_s *db_view_info = NULL;
180
181         RETV_IF(NULL == view_uri, CONTACTS_ERROR_INVALID_PARAMETER);
182         RETV_IF(NULL == out_table, CONTACTS_ERROR_INVALID_PARAMETER);
183
184         if (__ctsvc_db_view_hash_table) {
185                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
186                 if (db_view_info) {
187                         *out_table = db_view_info->table_name;
188                         return CONTACTS_ERROR_NONE;
189                 }
190         } else {
191                 /* LCOV_EXCL_START */
192                 ERR("Please check contact_connect()");
193                 /* LCOV_EXCL_STOP */
194         }
195
196         return CONTACTS_ERROR_INVALID_PARAMETER;
197 }
198
199 int ctsvc_required_read_permission(const char *view_uri)
200 {
201         db_table_info_s *db_view_info = NULL;
202
203         RETV_IF(NULL == view_uri, CTSVC_PERMISSION_CONTACT_NONE);
204
205         if (__ctsvc_db_view_hash_table) {
206                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
207                 if (db_view_info)
208                         return db_view_info->read_permission;
209         } else {
210                 /* LCOV_EXCL_START */
211                 ERR("Please check contact_connect()");
212                 /* LCOV_EXCL_STOP */
213         }
214
215         return CTSVC_PERMISSION_CONTACT_NONE;
216 }
217
218 int ctsvc_required_write_permission(const char *view_uri)
219 {
220         db_table_info_s *db_view_info = NULL;
221
222         RETV_IF(NULL == view_uri, CTSVC_PERMISSION_CONTACT_NONE);
223
224         if (__ctsvc_db_view_hash_table) {
225                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
226                 if (db_view_info)
227                         return db_view_info->write_permission;
228         } else {
229                 /* LCOV_EXCL_START */
230                 ERR("Please check contact_connect()");
231                 /* LCOV_EXCL_STOP */
232         }
233
234         return CTSVC_PERMISSION_CONTACT_NONE;
235 }
236
237 bool ctsvc_should_ab_access_control(const char *view_uri)
238 {
239         db_table_info_s *db_view_info = NULL;
240
241         RETV_IF(NULL == view_uri, false);
242
243         if (__ctsvc_db_view_hash_table) {
244                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
245                 if (db_view_info)
246                         return db_view_info->need_ab_access_control;
247         } else {
248                 /* LCOV_EXCL_START */
249                 ERR("Please check contact_connect()");
250                 /* LCOV_EXCL_STOP */
251         }
252
253         return false;
254 }
255
256 ctsvc_db_plugin_info_s *ctsvc_db_get_plugin_info(ctsvc_record_type_e type)
257 {
258         switch ((int)type) {
259         case CTSVC_RECORD_ADDRESSBOOK:
260                 return &ctsvc_db_plugin_addressbook;
261         case CTSVC_RECORD_GROUP:
262                 return &ctsvc_db_plugin_group;
263         case CTSVC_RECORD_PERSON:
264                 return &ctsvc_db_plugin_person;
265         case CTSVC_RECORD_CONTACT:
266                 return &ctsvc_db_plugin_contact;
267         case CTSVC_RECORD_MY_PROFILE:
268                 return &ctsvc_db_plugin_my_profile;
269         case CTSVC_RECORD_SIMPLE_CONTACT:
270                 return &ctsvc_db_plugin_simple_contact;
271         case CTSVC_RECORD_NAME:
272                 return &ctsvc_db_plugin_name;
273         case CTSVC_RECORD_COMPANY:
274                 return &ctsvc_db_plugin_company;
275         case CTSVC_RECORD_NOTE:
276                 return &ctsvc_db_plugin_note;
277         case CTSVC_RECORD_NUMBER:
278                 return &ctsvc_db_plugin_number;
279         case CTSVC_RECORD_EMAIL:
280                 return &ctsvc_db_plugin_email;
281         case CTSVC_RECORD_URL:
282                 return &ctsvc_db_plugin_url;
283         case CTSVC_RECORD_EVENT:
284                 return &ctsvc_db_plugin_event;
285         case CTSVC_RECORD_NICKNAME:
286                 return &ctsvc_db_plugin_nickname;
287         case CTSVC_RECORD_ADDRESS:
288                 return &ctsvc_db_plugin_address;
289         case CTSVC_RECORD_MESSENGER:
290                 return &ctsvc_db_plugin_messenger;
291         case CTSVC_RECORD_GROUP_RELATION:
292                 return &ctsvc_db_plugin_grouprelation;
293         case CTSVC_RECORD_ACTIVITY:
294                 return &ctsvc_db_plugin_activity;
295         case CTSVC_RECORD_ACTIVITY_PHOTO:
296                 return &ctsvc_db_plugin_activity_photo;
297         case CTSVC_RECORD_PROFILE:
298                 return &ctsvc_db_plugin_profile;
299         case CTSVC_RECORD_RELATIONSHIP:
300                 return &ctsvc_db_plugin_relationship;
301         case CTSVC_RECORD_IMAGE:
302                 return &ctsvc_db_plugin_image;
303         case CTSVC_RECORD_EXTENSION:
304                 return &ctsvc_db_plugin_extension;
305 #ifdef ENABLE_LOG_FEATURE
306         case CTSVC_RECORD_PHONELOG:
307                 return &ctsvc_db_plugin_phonelog;
308 #endif /* ENABLE_LOG_FEATURE */
309         case CTSVC_RECORD_SPEEDDIAL:
310                 return &ctsvc_db_plugin_speeddial;
311         case CTSVC_RECORD_SDN:
312                 return &ctsvc_db_plugin_sdn;
313         case CTSVC_RECORD_SIP:
314                 return &ctsvc_db_plugin_sip;
315         case CTSVC_RECORD_UPDATED_INFO:
316         case CTSVC_RECORD_RESULT:
317         default:
318                 return NULL;
319         }
320 }
321
322 #ifdef _CONTACTS_IPC_SERVER
323 static int __ctsvc_db_create_views()
324 {
325         int ret;
326         char query[CTS_SQL_MAX_LEN] = {0};
327
328         if (__ctsvc_db_view_already_created)
329                 return CONTACTS_ERROR_NONE;
330
331         /* CTSVC_DB_VIEW_CONTACT */
332         snprintf(query, sizeof(query),
333                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT" AS "
334                         "SELECT * FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0");
335         ret = ctsvc_query_exec(query);
336         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_execs() Fail(%d)", ret);
337
338         /* CTSVC_DB_VIEW_MY_PROFILE */
339         snprintf(query, sizeof(query),
340                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MY_PROFILE" AS "
341                         "SELECT * FROM "CTS_TABLE_MY_PROFILES" WHERE deleted = 0");
342         ret = ctsvc_query_exec(query);
343         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
344
345         /* CTSVC_DB_VIEW_PERSON */
346         snprintf(query, sizeof(query),
347                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON" AS "
348                         "SELECT persons.person_id, "
349                         "display_name, reverse_display_name, "
350                         "display_name_language, "
351                         "reverse_display_name_language, "
352                         "sort_name, reverse_sort_name, "
353                         "sortkey, reverse_sortkey, "
354                         "name_contact_id, "
355                         "persons.ringtone_path, "
356                         "persons.image_thumbnail_path, "
357                         "persons.vibration, "
358                         "persons.message_alert, "
359                         "status, "
360                         "link_count, "
361                         "addressbook_ids, "
362                         "persons.has_phonenumber, "
363                         "persons.has_email, "
364                         "EXISTS(SELECT person_id FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) is_favorite, "
365                         "(SELECT favorite_prio FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) favorite_prio "
366                         "FROM "CTS_TABLE_CONTACTS", "CTS_TABLE_PERSONS" "
367                         "ON (name_contact_id = contacts.contact_id) ");
368         ret = ctsvc_query_exec(query);
369         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
370
371         /* CTSVC_DB_VIEW_NAME */
372         snprintf(query, sizeof(query),
373                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NAME" AS "
374                         "SELECT id, "
375                         "data.contact_id, "
376                         "addressbook_id, "
377                         "data2, "
378                         "data3, "
379                         "data4, "
380                         "data5, "
381                         "data6, "
382                         "data7, "
383                         "data8, "
384                         "data9 "
385                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
386                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
387                         "WHERE datatype = %d AND is_my_profile = 0 ",
388                         CONTACTS_DATA_TYPE_NAME);
389         ret = ctsvc_query_exec(query);
390         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
391
392         /* CTSVC_DB_VIEW_NUMBER */
393         snprintf(query, sizeof(query),
394                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NUMBER" AS "
395                         "SELECT id, "
396                         "data.contact_id, "
397                         "addressbook_id, "
398                         "is_default, "
399                         "data1, "
400                         "data2, "
401                         "data3, "
402                         "data4, "
403                         "data5, "
404                         "data6 "
405                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
406                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
407                         "WHERE datatype = %d AND is_my_profile = 0 ",
408                         CONTACTS_DATA_TYPE_NUMBER);
409         ret = ctsvc_query_exec(query);
410         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
411
412         /* CTSVC_DB_VIEW_EMAIL */
413         snprintf(query, sizeof(query),
414                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EMAIL" AS "
415                         "SELECT id, "
416                         "data.contact_id, "
417                         "addressbook_id, "
418                         "is_default, "
419                         "data1, "
420                         "data2, "
421                         "data3 "
422                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
423                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
424                         "WHERE datatype = %d AND is_my_profile = 0 ",
425                         CONTACTS_DATA_TYPE_EMAIL);
426         ret = ctsvc_query_exec(query);
427         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
428
429         /* CTSVC_DB_VIEW_ADDRESS */
430         snprintf(query, sizeof(query),
431                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ADDRESS" AS "
432                         "SELECT id, "
433                         "data.contact_id, "
434                         "addressbook_id, "
435                         "is_default, "
436                         "data1, "
437                         "data2, "
438                         "data3, "
439                         "data4, "
440                         "data5, "
441                         "data6, "
442                         "data7, "
443                         "data8, "
444                         "data9 "
445                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
446                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
447                         "WHERE datatype = %d AND is_my_profile = 0 ",
448                         CONTACTS_DATA_TYPE_POSTAL);
449         ret = ctsvc_query_exec(query);
450         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
451
452         /* CTSVC_DB_VIEW_URL */
453         snprintf(query, sizeof(query),
454                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_URL" AS "
455                         "SELECT id, "
456                         "data.contact_id, "
457                         "addressbook_id, "
458                         "data1, "
459                         "data2, "
460                         "data3 "
461                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
462                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
463                         "WHERE datatype = %d AND is_my_profile = 0 ",
464                         CONTACTS_DATA_TYPE_URL);
465         ret = ctsvc_query_exec(query);
466         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
467
468         /* CTSVC_DB_VIEW_EVENT */
469         snprintf(query, sizeof(query),
470                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EVENT" AS "
471                         "SELECT id, "
472                         "data.contact_id, "
473                         "addressbook_id, "
474                         "data1, "
475                         "data2, "
476                         "data3, "
477                         "data4, "
478                         "data5 "
479                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
480                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
481                         "WHERE datatype = %d AND is_my_profile = 0 ",
482                         CONTACTS_DATA_TYPE_EVENT);
483         ret = ctsvc_query_exec(query);
484         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
485
486         /* CTSVC_DB_VIEW_GROUP_RELATION */
487         snprintf(query, sizeof(query),
488                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_GROUP_RELATION" AS "
489                         "SELECT "CTS_TABLE_GROUP_RELATIONS".group_id, "
490                         "contact_id, "
491                         "addressbook_id, "
492                         "group_name "
493                         "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
494                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND deleted = 0 "
495                         "ORDER BY group_prio");
496         ret = ctsvc_query_exec(query);
497         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
498
499         /* CTSVC_DB_VIEW_RELATIONSHIP */
500         snprintf(query, sizeof(query),
501                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_RELATIONSHIP" AS "
502                         "SELECT id, "
503                         "data.contact_id, "
504                         "addressbook_id, "
505                         "data1, "
506                         "data2, "
507                         "data3  "
508                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
509                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
510                         "WHERE datatype = %d AND is_my_profile = 0 ",
511                         CONTACTS_DATA_TYPE_RELATIONSHIP);
512         ret = ctsvc_query_exec(query);
513         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
514
515         /* CTSVC_DB_VIEW_IMAGE */
516         snprintf(query, sizeof(query),
517                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_IMAGE" AS "
518                         "SELECT id, "
519                         "is_default, "
520                         "data.contact_id, "
521                         "addressbook_id, "
522                         "data1, "
523                         "data2, "
524                         "data3 "
525                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
526                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
527                         "WHERE datatype = %d AND is_my_profile = 0 ",
528                         CONTACTS_DATA_TYPE_IMAGE);
529         ret = ctsvc_query_exec(query);
530         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
531
532         /* CTSVC_DB_VIEW_COMPANY */
533         snprintf(query, sizeof(query),
534                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_COMPANY" AS "
535                         "SELECT id, "
536                         "data.contact_id, "
537                         "addressbook_id, "
538                         "data1, "
539                         "data2, "
540                         "data3, "
541                         "data4, "
542                         "data5, "
543                         "data6, "
544                         "data7, "
545                         "data8, "
546                         "data9, "
547                         "data10, "
548                         "data11 "
549                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
550                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
551                         "WHERE datatype = %d AND is_my_profile = 0 ",
552                         CONTACTS_DATA_TYPE_COMPANY);
553         ret = ctsvc_query_exec(query);
554         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
555
556         /* CTSVC_DB_VIEW_NICKNAME */
557         snprintf(query, sizeof(query),
558                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NICKNAME" AS "
559                         "SELECT id, "
560                         "data.contact_id, "
561                         "addressbook_id, "
562                         "data3 "
563                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
564                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
565                         "WHERE datatype = %d AND is_my_profile = 0 ",
566                         CONTACTS_DATA_TYPE_NICKNAME);
567         ret = ctsvc_query_exec(query);
568         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
569
570         /* CTSVC_DB_VIEW_MESSENGER */
571         snprintf(query, sizeof(query),
572                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MESSENGER" AS "
573                         "SELECT id, "
574                         "data.contact_id, "
575                         "addressbook_id, "
576                         "data1, "
577                         "data2, "
578                         "data3 "
579                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
580                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
581                         "WHERE datatype = %d AND is_my_profile = 0 ",
582                         CONTACTS_DATA_TYPE_MESSENGER);
583         ret = ctsvc_query_exec(query);
584         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
585
586         /* CTSVC_DB_VIEW_NOTE */
587         snprintf(query, sizeof(query),
588                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NOTE" AS "
589                         "SELECT id, "
590                         "data.contact_id, "
591                         "addressbook_id, "
592                         "data3 "
593                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
594                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
595                         "WHERE datatype = %d AND is_my_profile = 0 ",
596                         CONTACTS_DATA_TYPE_NOTE);
597         ret = ctsvc_query_exec(query);
598         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
599
600         /* CTSVC_DB_VIEW_PROFILE */
601         snprintf(query, sizeof(query),
602                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PROFILE" AS "
603                         "SELECT id, "
604                         "data.contact_id, "
605                         "addressbook_id, "
606                         "data1, "
607                         "data2, "
608                         "data3, "
609                         "data4, "
610                         "data5, "
611                         "data6, "
612                         "data7, "
613                         "data8, "
614                         "data9, "
615                         "data10, "
616                         "data11 "
617                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
618                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
619                         "WHERE datatype = %d AND is_my_profile = 0 ",
620                         CONTACTS_DATA_TYPE_PROFILE);
621         ret = ctsvc_query_exec(query);
622         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
623
624         /* CTSVC_DB_VIEW_EXTENSION */
625         snprintf(query, sizeof(query),
626                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EXTENSION" AS "
627                         "SELECT id, "
628                         "data.contact_id, "
629                         "addressbook_id, "
630                         "data1, "
631                         "data2, "
632                         "data3, "
633                         "data4, "
634                         "data5, "
635                         "data6, "
636                         "data7, "
637                         "data8, "
638                         "data9, "
639                         "data10, "
640                         "data11, "
641                         "data12 "
642                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
643                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
644                         "WHERE datatype = %d AND is_my_profile = 0 ",
645                         CONTACTS_DATA_TYPE_EXTENSION);
646         ret = ctsvc_query_exec(query);
647         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
648
649         /* CTSVC_DB_VIEW_ACTIVITY */
650         snprintf(query, sizeof(query),
651                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ACTIVITY" AS "
652                         "SELECT id, "
653                         "activities.contact_id, "
654                         "addressbook_id, "
655                         "source_name, "
656                         "status, "
657                         "timestamp, "
658                         "service_operation, "
659                         "uri "
660                         "FROM "CTS_TABLE_ACTIVITIES", "CTSVC_DB_VIEW_CONTACT" "
661                         "ON "CTS_TABLE_ACTIVITIES".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
662                         "ORDER BY timestamp DESC");
663         ret = ctsvc_query_exec(query);
664         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
665
666         /* CTSVC_DB_VIEW_ACTIVITY_PHOTOS */
667         snprintf(query, sizeof(query),
668                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ACTIVITY_PHOTOS" AS "
669                         "SELECT "CTS_TABLE_ACTIVITY_PHOTOS".id, "
670                         "activity_id, "
671                         "photo_url, "
672                         "sort_index "
673                         "FROM "CTS_TABLE_ACTIVITY_PHOTOS", "CTSVC_DB_VIEW_ACTIVITY" "
674                         "ON "CTS_TABLE_ACTIVITY_PHOTOS".activity_id = "CTSVC_DB_VIEW_ACTIVITY".id");
675         ret = ctsvc_query_exec(query);
676         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
677
678         /* CTSVC_DB_VIEW_SPEEDIDAL */
679         snprintf(query, sizeof(query),
680                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SPEEDIDAL" AS "
681                         "SELECT persons.person_id, "
682                         "name_contacts.display_name, name_contacts.reverse_display_name, "
683                         "name_contacts.display_name_language, "
684                         "name_contacts.reverse_display_name_language, "
685                         "name_contacts.sort_name, name_contacts.reverse_sort_name, "
686                         "name_contacts.sortkey, name_contacts.reverse_sortkey, "
687                         "persons.image_thumbnail_path, "
688                         "data.id number_id, "
689                         "data.data1 type, "
690                         "data.data2 label, "
691                         "data.data3 number, "
692                         "data.data4 minmatch, "
693                         "data.data5 normalized_number, "
694                         "data.data6 cleaned_number, "
695                         "speeddials.speed_number  "
696                         "FROM "CTS_TABLE_PERSONS", "CTS_TABLE_CONTACTS" AS name_contacts, "
697                         CTSVC_DB_VIEW_CONTACT" AS temp_contacts, "
698                         CTS_TABLE_DATA", "CTS_TABLE_SPEEDDIALS" "
699                         "ON (persons.name_contact_id = name_contacts.contact_id "
700                         "AND persons.person_id = temp_contacts.person_id "
701                         "AND temp_contacts.contact_id = data.contact_id "
702                         "AND data.id = speeddials.number_id) "
703                         "ORDER BY speeddials.speed_number");
704         ret = ctsvc_query_exec(query);
705         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
706
707         /* CTSVC_DB_VIEW_PERSON_CONTACT */
708         snprintf(query, sizeof(query),
709                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_CONTACT" AS "
710                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON" "
711                         "JOIN (SELECT contact_id, "
712                         "addressbook_id, "
713                         "person_id person_id_in_contact "
714                         "FROM "CTSVC_DB_VIEW_CONTACT") temp_contacts "
715                         "JOIN (SELECT addressbook_id addressbook_id_in_addressbooks, addressbook_name, mode addressbook_mode "
716                         "FROM "CTS_TABLE_ADDRESSBOOKS") temp_addressbooks "
717                         "ON temp_contacts.person_id_in_contact = "CTSVC_DB_VIEW_PERSON".person_id "
718                         "AND addressbook_id = temp_addressbooks.addressbook_id_in_addressbooks");
719         ret = ctsvc_query_exec(query);
720         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
721
722         /* CTSVC_DB_VIEW_PERSON_NUMBER */
723         snprintf(query, sizeof(query),
724                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_NUMBER" AS "
725                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
726                         "JOIN (SELECT id number_id, "
727                         "contact_id, "
728                         "data1 type, "
729                         "is_primary_default, "
730                         "data2 label, "
731                         "data3 number, "
732                         "data4 minmatch, "
733                         "data5 normalized_number, "
734                         "data6 cleaned_number "
735                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
736                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
737                         CONTACTS_DATA_TYPE_NUMBER);
738         ret = ctsvc_query_exec(query);
739         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
740
741         /* CTSVC_DB_VIEW_PERSON_EMAIL */
742         snprintf(query, sizeof(query),
743                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_EMAIL" AS "
744                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
745                         "JOIN (SELECT id email_id, "
746                         "contact_id, "
747                         "data1 type, "
748                         "is_primary_default, "
749                         "data2 label, "
750                         "data3 email "
751                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
752                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
753                         CONTACTS_DATA_TYPE_EMAIL);
754         ret = ctsvc_query_exec(query);
755         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
756
757 #ifdef ENABLE_LOG_FEATURE
758         /* CTSVC_DB_VIEW_PERSON_PHONELOG */
759         snprintf(query, sizeof(query),
760                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_PHONELOG" AS "
761                         "SELECT L.id phonelog_id, "
762                         "C.display_name, "
763                         "C.reverse_display_name, "
764                         "C.display_name_language, "
765                         "C.reverse_display_name_language, "
766                         "C.sort_name, C.reverse_sort_name, "
767                         "C.sortkey, C.reverse_sortkey, "
768                         "P.image_thumbnail_path, "
769                         "L.number address, "
770                         "L.normal_num, "
771                         "L.minmatch, "
772                         "L.clean_num, "
773                         "L.log_type, "
774                         "L.log_time, "
775                         "L.data1, "
776                         "L.data2, "
777                         "L.sim_id, "
778                         "L.person_id id, "
779                         "L.number_type address_type "
780                         "FROM "CTS_TABLE_PHONELOGS" L "
781                         "LEFT JOIN "CTS_TABLE_PERSONS" P "
782                         "ON P.person_id = L.person_id "
783                         "LEFT JOIN "CTS_TABLE_CONTACTS" C "
784                         "ON P.name_contact_id = C.contact_id AND C.deleted = 0 "
785                         "ORDER BY L.log_time DESC");
786         ret = ctsvc_query_exec(query);
787         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
788 #endif /* ENABLE_LOG_FEATURE */
789
790         /* CTSVC_DB_VIEW_PERSON_USAGE */
791         snprintf(query, sizeof(query),
792                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_USAGE" AS "
793                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON" "
794                         "LEFT JOIN (SELECT usage_type, "
795                         "person_id, "
796                         "times_used "
797                         "FROM "CTS_TABLE_CONTACT_STAT") usage "
798                         "ON usage.person_id = "CTSVC_DB_VIEW_PERSON".person_id "
799                         "ORDER BY usage.times_used");
800         ret = ctsvc_query_exec(query);
801         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
802
803         /* CTSVC_DB_VIEW_PERSON_GROUP */
804         snprintf(query, sizeof(query),
805                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP" AS "
806                         "SELECT view_person_contact.*, groups.group_id, group_prio "
807                         "FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
808                         "LEFT JOIN "CTS_TABLE_GROUP_RELATIONS" "
809                         "ON "CTS_TABLE_GROUP_RELATIONS".deleted = 0 AND "
810                         CTS_TABLE_GROUP_RELATIONS".contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id "
811                         "LEFT JOIN "CTS_TABLE_GROUPS" "
812                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id "
813                         "ORDER BY group_prio");
814         ret = ctsvc_query_exec(query);
815         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
816
817         /* CTSVC_DB_VIEW_PERSON_GROUP_NOT_ASSIGNED */
818         snprintf(query, sizeof(query),
819                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP_NOT_ASSIGNED" AS "
820                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
821                         "WHERE contact_id NOT IN (select contact_id FROM "CTS_TABLE_GROUP_RELATIONS" WHERE deleted = 0)");
822         ret = ctsvc_query_exec(query);
823         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
824
825         /* CTSVC_DB_VIEW_PERSON_GROUP_ASSIGNED */
826         snprintf(query, sizeof(query),
827                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP_ASSIGNED" AS "
828                         "SELECT "CTSVC_DB_VIEW_PERSON_CONTACT".*, groups.group_id, group_prio "
829                         "FROM "CTSVC_DB_VIEW_PERSON_CONTACT", "
830                         CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
831                         "ON "
832                         CTS_TABLE_GROUP_RELATIONS".contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id AND "
833                         CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND "
834                         CTS_TABLE_GROUP_RELATIONS".deleted = 0 "
835                         "ORDER BY group_prio");
836         ret = ctsvc_query_exec(query);
837         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
838
839         /* CTSVC_DB_VIEW_CONTACT_NUMBER */
840         snprintf(query, sizeof(query),
841                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_NUMBER" AS "
842                         "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" "
843                         "JOIN (SELECT id number_id, "
844                         "contact_id, "
845                         "data1 type, "
846                         "is_default, "
847                         "data2 label, "
848                         "data3 number, "
849                         "data4 minmatch, "
850                         "data5 normalized_number, "
851                         "data6 cleaned_number "
852                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
853                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
854                         CONTACTS_DATA_TYPE_NUMBER);
855         ret = ctsvc_query_exec(query);
856         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
857
858         /* CTSVC_DB_VIEW_CONTACT_EMAIL */
859         snprintf(query, sizeof(query),
860                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_EMAIL" AS "
861                         "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" "
862                         "JOIN (SELECT id email_id, "
863                         "contact_id, "
864                         "data1 type, "
865                         "is_default, "
866                         "data2 label, "
867                         "data3 email "
868                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
869                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
870                         CONTACTS_DATA_TYPE_EMAIL);
871         ret = ctsvc_query_exec(query);
872         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
873
874         /* CTSVC_DB_VIEW_CONTACT_GROUP */
875         snprintf(query, sizeof(query),
876                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_GROUP" AS "
877                         "SELECT C.*, groups.group_id, group_name "
878                         "FROM "CTSVC_DB_VIEW_CONTACT" C "
879                         "LEFT JOIN "CTS_TABLE_GROUP_RELATIONS" "
880                         "ON "CTS_TABLE_GROUP_RELATIONS".deleted = 0 AND "
881                         CTS_TABLE_GROUP_RELATIONS".contact_id = C.contact_id "
882                         "LEFT JOIN "CTS_TABLE_GROUPS" "
883                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id");
884         ret = ctsvc_query_exec(query);
885         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
886
887         /* CTSVC_DB_VIEW_CONTACT_ACTIVITY */
888         snprintf(query, sizeof(query),
889                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_ACTIVITY" AS "
890                         "SELECT A.contact_id, "
891                         "A.display_name, "
892                         "A.display_name_source, "
893                         "A.reverse_display_name, "
894                         "A.display_name_language, "
895                         "A.reverse_display_name_language, "
896                         "A.sort_name, A.reverse_sort_name, "
897                         "A.sortkey, A.reverse_sortkey, "
898                         "A.addressbook_id, "
899                         "AB.account_id, "
900                         "A.person_id, "
901                         "A.ringtone_path, "
902                         "A.image_thumbnail_path, "
903                         "AC.id activity_id, "
904                         "AC.source_name, "
905                         "AC.status, "
906                         "AC.timestamp, "
907                         "AC.service_operation, "
908                         "AC.uri "
909                         "FROM "CTSVC_DB_VIEW_CONTACT" A, "CTS_TABLE_ACTIVITIES" AC, "CTS_TABLE_ADDRESSBOOKS" AB "
910                         "ON A.contact_id = AC.contact_id "
911                         "AND A.addressbook_id = AB.addressbook_id "
912                         "ORDER BY timestamp DESC");
913         ret = ctsvc_query_exec(query);
914         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
915
916         /* CTSVC_DB_VIEW_SIP */
917         snprintf(query, sizeof(query),
918                 "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SIP" AS "
919                         "SELECT id, "
920                                         "data.contact_id, "
921                                         "data1, "
922                                         "data2, "
923                                         "data3 "
924                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
925                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
926                         "WHERE datatype = %d AND is_my_profile = 0 ",
927                                 CONTACTS_DATA_TYPE_SIP);
928         ret = ctsvc_query_exec(query);
929         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Fail(%d)", ret);
930
931         __ctsvc_db_view_already_created = true;
932
933         return CONTACTS_ERROR_NONE;
934 }
935
936 #endif
937
938 int ctsvc_db_init()
939 {
940         int ret = CONTACTS_ERROR_NONE;
941         ret = ctsvc_db_open();
942         if (ret != CONTACTS_ERROR_NONE) {
943                 /* LCOV_EXCL_START */
944                 ERR("ctsvc_db_open() Fail(%d)", ret);
945                 return ret;
946                 /* LCOV_EXCL_STOP */
947         }
948
949 #ifdef _CONTACTS_IPC_SERVER
950         ret = __ctsvc_db_create_views();
951         if (ret != CONTACTS_ERROR_NONE) {
952                 /* LCOV_EXCL_START */
953                 ERR("__ctsvc_db_create_views() Fail(%d)", ret);
954                 return ret;
955                 /* LCOV_EXCL_STOP */
956         }
957 #endif
958
959         return ret;
960 }
961
962 int ctsvc_db_deinit()
963 {
964         int ret = CONTACTS_ERROR_NONE;
965         ret = ctsvc_db_close();
966         if (ret != CONTACTS_ERROR_NONE) {
967                 /* LCOV_EXCL_START */
968                 ERR("ctsvc_db_close() Fail(%d)", ret);
969                 return ret;
970                 /* LCOV_EXCL_STOP */
971         }
972
973         return CONTACTS_ERROR_NONE;
974 }
975
976