added sip view table
[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                 ERR("Please check contact_connect()");
192         }
193
194         return CONTACTS_ERROR_INVALID_PARAMETER;
195 }
196
197 int ctsvc_required_read_permission(const char *view_uri)
198 {
199         db_table_info_s *db_view_info = NULL;
200
201         RETV_IF(NULL == view_uri, CTSVC_PERMISSION_CONTACT_NONE);
202
203         if (__ctsvc_db_view_hash_table) {
204                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
205                 if (db_view_info)
206                         return db_view_info->read_permission;
207         } else {
208                 ERR("Please check contact_connect()");
209         }
210
211         return CTSVC_PERMISSION_CONTACT_NONE;
212 }
213
214 int ctsvc_required_write_permission(const char *view_uri)
215 {
216         db_table_info_s *db_view_info = NULL;
217
218         RETV_IF(NULL == view_uri, CTSVC_PERMISSION_CONTACT_NONE);
219
220         if (__ctsvc_db_view_hash_table) {
221                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
222                 if (db_view_info)
223                         return db_view_info->write_permission;
224         } else {
225                 ERR("Please check contact_connect()");
226         }
227
228         return CTSVC_PERMISSION_CONTACT_NONE;
229 }
230
231 bool ctsvc_should_ab_access_control(const char *view_uri)
232 {
233         db_table_info_s *db_view_info = NULL;
234
235         RETV_IF(NULL == view_uri, false);
236
237         if (__ctsvc_db_view_hash_table) {
238                 db_view_info = g_hash_table_lookup(__ctsvc_db_view_hash_table, view_uri);
239                 if (db_view_info)
240                         return db_view_info->need_ab_access_control;
241         } else {
242                 ERR("Please check contact_connect()");
243         }
244
245         return false;
246 }
247
248 ctsvc_db_plugin_info_s *ctsvc_db_get_plugin_info(ctsvc_record_type_e type)
249 {
250         switch ((int)type) {
251         case CTSVC_RECORD_ADDRESSBOOK:
252                 return &ctsvc_db_plugin_addressbook;
253         case CTSVC_RECORD_GROUP:
254                 return &ctsvc_db_plugin_group;
255         case CTSVC_RECORD_PERSON:
256                 return &ctsvc_db_plugin_person;
257         case CTSVC_RECORD_CONTACT:
258                 return &ctsvc_db_plugin_contact;
259         case CTSVC_RECORD_MY_PROFILE:
260                 return &ctsvc_db_plugin_my_profile;
261         case CTSVC_RECORD_SIMPLE_CONTACT:
262                 return &ctsvc_db_plugin_simple_contact;
263         case CTSVC_RECORD_NAME:
264                 return &ctsvc_db_plugin_name;
265         case CTSVC_RECORD_COMPANY:
266                 return &ctsvc_db_plugin_company;
267         case CTSVC_RECORD_NOTE:
268                 return &ctsvc_db_plugin_note;
269         case CTSVC_RECORD_NUMBER:
270                 return &ctsvc_db_plugin_number;
271         case CTSVC_RECORD_EMAIL:
272                 return &ctsvc_db_plugin_email;
273         case CTSVC_RECORD_URL:
274                 return &ctsvc_db_plugin_url;
275         case CTSVC_RECORD_EVENT:
276                 return &ctsvc_db_plugin_event;
277         case CTSVC_RECORD_NICKNAME:
278                 return &ctsvc_db_plugin_nickname;
279         case CTSVC_RECORD_ADDRESS:
280                 return &ctsvc_db_plugin_address;
281         case CTSVC_RECORD_MESSENGER:
282                 return &ctsvc_db_plugin_messenger;
283         case CTSVC_RECORD_GROUP_RELATION:
284                 return &ctsvc_db_plugin_grouprelation;
285         case CTSVC_RECORD_ACTIVITY:
286                 return &ctsvc_db_plugin_activity;
287         case CTSVC_RECORD_ACTIVITY_PHOTO:
288                 return &ctsvc_db_plugin_activity_photo;
289         case CTSVC_RECORD_PROFILE:
290                 return &ctsvc_db_plugin_profile;
291         case CTSVC_RECORD_RELATIONSHIP:
292                 return &ctsvc_db_plugin_relationship;
293         case CTSVC_RECORD_IMAGE:
294                 return &ctsvc_db_plugin_image;
295         case CTSVC_RECORD_EXTENSION:
296                 return &ctsvc_db_plugin_extension;
297 #ifdef ENABLE_LOG_FEATURE
298         case CTSVC_RECORD_PHONELOG:
299                 return &ctsvc_db_plugin_phonelog;
300 #endif /* ENABLE_LOG_FEATURE */
301         case CTSVC_RECORD_SPEEDDIAL:
302                 return &ctsvc_db_plugin_speeddial;
303         case CTSVC_RECORD_SDN:
304                 return &ctsvc_db_plugin_sdn;
305         case CTSVC_RECORD_SIP:
306                 return &ctsvc_db_plugin_sip;
307         case CTSVC_RECORD_UPDATED_INFO:
308         case CTSVC_RECORD_RESULT:
309         default:
310                 return NULL;
311         }
312 }
313
314 #ifdef _CONTACTS_IPC_SERVER
315 static int __ctsvc_db_create_views()
316 {
317         int ret;
318         char query[CTS_SQL_MAX_LEN] = {0};
319
320         if (__ctsvc_db_view_already_created)
321                 return CONTACTS_ERROR_NONE;
322
323         /* CTSVC_DB_VIEW_CONTACT */
324         snprintf(query, sizeof(query),
325                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT" AS "
326                         "SELECT * FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0");
327         ret = ctsvc_query_exec(query);
328         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_execs() Fail(%d)", ret);
329
330         /* CTSVC_DB_VIEW_MY_PROFILE */
331         snprintf(query, sizeof(query),
332                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MY_PROFILE" AS "
333                         "SELECT * FROM "CTS_TABLE_MY_PROFILES" WHERE deleted = 0");
334         ret = ctsvc_query_exec(query);
335         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
336
337         /* CTSVC_DB_VIEW_PERSON */
338         snprintf(query, sizeof(query),
339                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON" AS "
340                         "SELECT persons.person_id, "
341                         "display_name, reverse_display_name, "
342                         "display_name_language, "
343                         "reverse_display_name_language, "
344                         "sort_name, reverse_sort_name, "
345                         "sortkey, reverse_sortkey, "
346                         "name_contact_id, "
347                         "persons.ringtone_path, "
348                         "persons.image_thumbnail_path, "
349                         "persons.vibration, "
350                         "persons.message_alert, "
351                         "status, "
352                         "link_count, "
353                         "addressbook_ids, "
354                         "persons.has_phonenumber, "
355                         "persons.has_email, "
356                         "EXISTS(SELECT person_id FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) is_favorite, "
357                         "(SELECT favorite_prio FROM "CTS_TABLE_FAVORITES" WHERE person_id=persons.person_id) favorite_prio "
358                         "FROM "CTS_TABLE_CONTACTS", "CTS_TABLE_PERSONS" "
359                         "ON (name_contact_id = contacts.contact_id) ");
360         ret = ctsvc_query_exec(query);
361         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
362
363         /* CTSVC_DB_VIEW_NAME */
364         snprintf(query, sizeof(query),
365                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NAME" AS "
366                         "SELECT id, "
367                         "data.contact_id, "
368                         "addressbook_id, "
369                         "data2, "
370                         "data3, "
371                         "data4, "
372                         "data5, "
373                         "data6, "
374                         "data7, "
375                         "data8, "
376                         "data9 "
377                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
378                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
379                         "WHERE datatype = %d AND is_my_profile = 0 ",
380                         CTSVC_DATA_NAME);
381         ret = ctsvc_query_exec(query);
382         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
383
384         /* CTSVC_DB_VIEW_NUMBER */
385         snprintf(query, sizeof(query),
386                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NUMBER" AS "
387                         "SELECT id, "
388                         "data.contact_id, "
389                         "addressbook_id, "
390                         "is_default, "
391                         "data1, "
392                         "data2, "
393                         "data3, "
394                         "data4, "
395                         "data5, "
396                         "data6 "
397                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
398                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
399                         "WHERE datatype = %d AND is_my_profile = 0 ",
400                         CTSVC_DATA_NUMBER);
401         ret = ctsvc_query_exec(query);
402         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
403
404         /* CTSVC_DB_VIEW_EMAIL */
405         snprintf(query, sizeof(query),
406                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EMAIL" AS "
407                         "SELECT id, "
408                         "data.contact_id, "
409                         "addressbook_id, "
410                         "is_default, "
411                         "data1, "
412                         "data2, "
413                         "data3 "
414                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
415                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
416                         "WHERE datatype = %d AND is_my_profile = 0 ",
417                         CTSVC_DATA_EMAIL);
418         ret = ctsvc_query_exec(query);
419         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
420
421         /* CTSVC_DB_VIEW_ADDRESS */
422         snprintf(query, sizeof(query),
423                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ADDRESS" AS "
424                         "SELECT id, "
425                         "data.contact_id, "
426                         "addressbook_id, "
427                         "is_default, "
428                         "data1, "
429                         "data2, "
430                         "data3, "
431                         "data4, "
432                         "data5, "
433                         "data6, "
434                         "data7, "
435                         "data8, "
436                         "data9 "
437                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
438                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
439                         "WHERE datatype = %d AND is_my_profile = 0 ",
440                         CTSVC_DATA_POSTAL);
441         ret = ctsvc_query_exec(query);
442         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
443
444         /* CTSVC_DB_VIEW_URL */
445         snprintf(query, sizeof(query),
446                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_URL" AS "
447                         "SELECT id, "
448                         "data.contact_id, "
449                         "addressbook_id, "
450                         "data1, "
451                         "data2, "
452                         "data3 "
453                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
454                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
455                         "WHERE datatype = %d AND is_my_profile = 0 ",
456                         CTSVC_DATA_URL);
457         ret = ctsvc_query_exec(query);
458         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
459
460         /* CTSVC_DB_VIEW_EVENT */
461         snprintf(query, sizeof(query),
462                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EVENT" AS "
463                         "SELECT id, "
464                         "data.contact_id, "
465                         "addressbook_id, "
466                         "data1, "
467                         "data2, "
468                         "data3, "
469                         "data4, "
470                         "data5 "
471                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
472                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
473                         "WHERE datatype = %d AND is_my_profile = 0 ",
474                         CTSVC_DATA_EVENT);
475         ret = ctsvc_query_exec(query);
476         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
477
478         /* CTSVC_DB_VIEW_GROUP_RELATION */
479         snprintf(query, sizeof(query),
480                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_GROUP_RELATION" AS "
481                         "SELECT "CTS_TABLE_GROUP_RELATIONS".group_id, "
482                         "contact_id, "
483                         "addressbook_id, "
484                         "group_name "
485                         "FROM "CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
486                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND deleted = 0 "
487                         "ORDER BY group_prio");
488         ret = ctsvc_query_exec(query);
489         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
490
491         /* CTSVC_DB_VIEW_RELATIONSHIP */
492         snprintf(query, sizeof(query),
493                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_RELATIONSHIP" AS "
494                         "SELECT id, "
495                         "data.contact_id, "
496                         "addressbook_id, "
497                         "data1, "
498                         "data2, "
499                         "data3  "
500                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
501                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
502                         "WHERE datatype = %d AND is_my_profile = 0 ",
503                         CTSVC_DATA_RELATIONSHIP);
504         ret = ctsvc_query_exec(query);
505         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
506
507         /* CTSVC_DB_VIEW_IMAGE */
508         snprintf(query, sizeof(query),
509                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_IMAGE" AS "
510                         "SELECT id, "
511                         "is_default, "
512                         "data.contact_id, "
513                         "addressbook_id, "
514                         "data1, "
515                         "data2, "
516                         "data3 "
517                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
518                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
519                         "WHERE datatype = %d AND is_my_profile = 0 ",
520                         CTSVC_DATA_IMAGE);
521         ret = ctsvc_query_exec(query);
522         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
523
524         /* CTSVC_DB_VIEW_COMPANY */
525         snprintf(query, sizeof(query),
526                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_COMPANY" AS "
527                         "SELECT id, "
528                         "data.contact_id, "
529                         "addressbook_id, "
530                         "data1, "
531                         "data2, "
532                         "data3, "
533                         "data4, "
534                         "data5, "
535                         "data6, "
536                         "data7, "
537                         "data8, "
538                         "data9, "
539                         "data10, "
540                         "data11 "
541                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
542                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
543                         "WHERE datatype = %d AND is_my_profile = 0 ",
544                         CTSVC_DATA_COMPANY);
545         ret = ctsvc_query_exec(query);
546         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
547
548         /* CTSVC_DB_VIEW_NICKNAME */
549         snprintf(query, sizeof(query),
550                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NICKNAME" AS "
551                         "SELECT id, "
552                         "data.contact_id, "
553                         "addressbook_id, "
554                         "data3 "
555                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
556                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
557                         "WHERE datatype = %d AND is_my_profile = 0 ",
558                         CTSVC_DATA_NICKNAME);
559         ret = ctsvc_query_exec(query);
560         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
561
562         /* CTSVC_DB_VIEW_MESSENGER */
563         snprintf(query, sizeof(query),
564                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_MESSENGER" AS "
565                         "SELECT id, "
566                         "data.contact_id, "
567                         "addressbook_id, "
568                         "data1, "
569                         "data2, "
570                         "data3 "
571                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
572                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
573                         "WHERE datatype = %d AND is_my_profile = 0 ",
574                         CTSVC_DATA_MESSENGER);
575         ret = ctsvc_query_exec(query);
576         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
577
578         /* CTSVC_DB_VIEW_NOTE */
579         snprintf(query, sizeof(query),
580                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_NOTE" AS "
581                         "SELECT id, "
582                         "data.contact_id, "
583                         "addressbook_id, "
584                         "data3 "
585                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
586                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
587                         "WHERE datatype = %d AND is_my_profile = 0 ",
588                         CTSVC_DATA_NOTE);
589         ret = ctsvc_query_exec(query);
590         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
591
592         /* CTSVC_DB_VIEW_PROFILE */
593         snprintf(query, sizeof(query),
594                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PROFILE" AS "
595                         "SELECT id, "
596                         "data.contact_id, "
597                         "addressbook_id, "
598                         "data1, "
599                         "data2, "
600                         "data3, "
601                         "data4, "
602                         "data5, "
603                         "data6, "
604                         "data7, "
605                         "data8, "
606                         "data9, "
607                         "data10, "
608                         "data11 "
609                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
610                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
611                         "WHERE datatype = %d AND is_my_profile = 0 ",
612                         CTSVC_DATA_PROFILE);
613         ret = ctsvc_query_exec(query);
614         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
615
616         /* CTSVC_DB_VIEW_EXTENSION */
617         snprintf(query, sizeof(query),
618                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_EXTENSION" AS "
619                         "SELECT id, "
620                         "data.contact_id, "
621                         "addressbook_id, "
622                         "data1, "
623                         "data2, "
624                         "data3, "
625                         "data4, "
626                         "data5, "
627                         "data6, "
628                         "data7, "
629                         "data8, "
630                         "data9, "
631                         "data10, "
632                         "data11, "
633                         "data12 "
634                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
635                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
636                         "WHERE datatype = %d AND is_my_profile = 0 ",
637                         CTSVC_DATA_EXTENSION);
638         ret = ctsvc_query_exec(query);
639         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
640
641         /* CTSVC_DB_VIEW_ACTIVITY */
642         snprintf(query, sizeof(query),
643                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ACTIVITY" AS "
644                         "SELECT id, "
645                         "activities.contact_id, "
646                         "addressbook_id, "
647                         "source_name, "
648                         "status, "
649                         "timestamp, "
650                         "service_operation, "
651                         "uri "
652                         "FROM "CTS_TABLE_ACTIVITIES", "CTSVC_DB_VIEW_CONTACT" "
653                         "ON "CTS_TABLE_ACTIVITIES".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
654                         "ORDER BY timestamp DESC");
655         ret = ctsvc_query_exec(query);
656         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
657
658         /* CTSVC_DB_VIEW_ACTIVITY_PHOTOS */
659         snprintf(query, sizeof(query),
660                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_ACTIVITY_PHOTOS" AS "
661                         "SELECT "CTS_TABLE_ACTIVITY_PHOTOS".id, "
662                         "activity_id, "
663                         "photo_url, "
664                         "sort_index "
665                         "FROM "CTS_TABLE_ACTIVITY_PHOTOS", "CTSVC_DB_VIEW_ACTIVITY" "
666                         "ON "CTS_TABLE_ACTIVITY_PHOTOS".activity_id = "CTSVC_DB_VIEW_ACTIVITY".id");
667         ret = ctsvc_query_exec(query);
668         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
669
670         /* CTSVC_DB_VIEW_SPEEDIDAL */
671         snprintf(query, sizeof(query),
672                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SPEEDIDAL" AS "
673                         "SELECT persons.person_id, "
674                         "name_contacts.display_name, name_contacts.reverse_display_name, "
675                         "name_contacts.display_name_language, "
676                         "name_contacts.reverse_display_name_language, "
677                         "name_contacts.sort_name, name_contacts.reverse_sort_name, "
678                         "name_contacts.sortkey, name_contacts.reverse_sortkey, "
679                         "persons.image_thumbnail_path, "
680                         "data.id number_id, "
681                         "data.data1 type, "
682                         "data.data2 label, "
683                         "data.data3 number, "
684                         "data.data4 minmatch, "
685                         "data.data5 normalized_number, "
686                         "data.data6 cleaned_number, "
687                         "speeddials.speed_number  "
688                         "FROM "CTS_TABLE_PERSONS", "CTS_TABLE_CONTACTS" AS name_contacts, "
689                         CTSVC_DB_VIEW_CONTACT" AS temp_contacts, "
690                         CTS_TABLE_DATA", "CTS_TABLE_SPEEDDIALS" "
691                         "ON (persons.name_contact_id = name_contacts.contact_id "
692                         "AND persons.person_id = temp_contacts.person_id "
693                         "AND temp_contacts.contact_id = data.contact_id "
694                         "AND data.id = speeddials.number_id) "
695                         "ORDER BY speeddials.speed_number");
696         ret = ctsvc_query_exec(query);
697         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
698
699         /* CTSVC_DB_VIEW_PERSON_CONTACT */
700         snprintf(query, sizeof(query),
701                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_CONTACT" AS "
702                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON" "
703                         "JOIN (SELECT contact_id, "
704                         "addressbook_id, "
705                         "person_id person_id_in_contact "
706                         "FROM "CTSVC_DB_VIEW_CONTACT") temp_contacts "
707                         "JOIN (SELECT addressbook_id addressbook_id_in_addressbooks, addressbook_name, mode addressbook_mode "
708                         "FROM "CTS_TABLE_ADDRESSBOOKS") temp_addressbooks "
709                         "ON temp_contacts.person_id_in_contact = "CTSVC_DB_VIEW_PERSON".person_id "
710                         "AND addressbook_id = temp_addressbooks.addressbook_id_in_addressbooks");
711         ret = ctsvc_query_exec(query);
712         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
713
714         /* CTSVC_DB_VIEW_PERSON_NUMBER */
715         snprintf(query, sizeof(query),
716                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_NUMBER" AS "
717                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
718                         "JOIN (SELECT id number_id, "
719                         "contact_id, "
720                         "data1 type, "
721                         "is_primary_default, "
722                         "data2 label, "
723                         "data3 number, "
724                         "data4 minmatch, "
725                         "data5 normalized_number, "
726                         "data6 cleaned_number "
727                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
728                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
729                         CTSVC_DATA_NUMBER);
730         ret = ctsvc_query_exec(query);
731         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
732
733         /* CTSVC_DB_VIEW_PERSON_EMAIL */
734         snprintf(query, sizeof(query),
735                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_EMAIL" AS "
736                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
737                         "JOIN (SELECT id email_id, "
738                         "contact_id, "
739                         "data1 type, "
740                         "is_primary_default, "
741                         "data2 label, "
742                         "data3 email "
743                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
744                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id",
745                         CTSVC_DATA_EMAIL);
746         ret = ctsvc_query_exec(query);
747         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
748
749 #ifdef ENABLE_LOG_FEATURE
750         /* CTSVC_DB_VIEW_PERSON_PHONELOG */
751         snprintf(query, sizeof(query),
752                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_PHONELOG" AS "
753                         "SELECT L.id phonelog_id, "
754                         "C.display_name, "
755                         "C.reverse_display_name, "
756                         "C.display_name_language, "
757                         "C.reverse_display_name_language, "
758                         "C.sort_name, C.reverse_sort_name, "
759                         "C.sortkey, C.reverse_sortkey, "
760                         "P.image_thumbnail_path, "
761                         "L.number address, "
762                         "L.normal_num, "
763                         "L.minmatch, "
764                         "L.clean_num, "
765                         "L.log_type, "
766                         "L.log_time, "
767                         "L.data1, "
768                         "L.data2, "
769                         "L.sim_id, "
770                         "L.person_id id, "
771                         "L.number_type address_type "
772                         "FROM "CTS_TABLE_PHONELOGS" L "
773                         "LEFT JOIN "CTS_TABLE_PERSONS" P "
774                         "ON P.person_id = L.person_id "
775                         "LEFT JOIN "CTS_TABLE_CONTACTS" C "
776                         "ON P.name_contact_id = C.contact_id AND C.deleted = 0 "
777                         "ORDER BY L.log_time DESC");
778         ret = ctsvc_query_exec(query);
779         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
780 #endif /* ENABLE_LOG_FEATURE */
781
782         /* CTSVC_DB_VIEW_PERSON_USAGE */
783         snprintf(query, sizeof(query),
784                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_USAGE" AS "
785                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON" "
786                         "LEFT JOIN (SELECT usage_type, "
787                         "person_id, "
788                         "times_used "
789                         "FROM "CTS_TABLE_CONTACT_STAT") usage "
790                         "ON usage.person_id = "CTSVC_DB_VIEW_PERSON".person_id "
791                         "ORDER BY usage.times_used");
792         ret = ctsvc_query_exec(query);
793         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
794
795         /* CTSVC_DB_VIEW_PERSON_GROUP */
796         snprintf(query, sizeof(query),
797                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP" AS "
798                         "SELECT view_person_contact.*, groups.group_id, group_prio "
799                         "FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
800                         "LEFT JOIN "CTS_TABLE_GROUP_RELATIONS" "
801                         "ON "CTS_TABLE_GROUP_RELATIONS".deleted = 0 AND "
802                         CTS_TABLE_GROUP_RELATIONS".contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id "
803                         "LEFT JOIN "CTS_TABLE_GROUPS" "
804                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id "
805                         "ORDER BY group_prio");
806         ret = ctsvc_query_exec(query);
807         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
808
809         /* CTSVC_DB_VIEW_PERSON_GROUP_NOT_ASSIGNED */
810         snprintf(query, sizeof(query),
811                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP_NOT_ASSIGNED" AS "
812                         "SELECT * FROM "CTSVC_DB_VIEW_PERSON_CONTACT" "
813                         "WHERE contact_id NOT IN (select contact_id FROM "CTS_TABLE_GROUP_RELATIONS" WHERE deleted = 0)");
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_ASSIGNED */
818         snprintf(query, sizeof(query),
819                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_PERSON_GROUP_ASSIGNED" AS "
820                         "SELECT "CTSVC_DB_VIEW_PERSON_CONTACT".*, groups.group_id, group_prio "
821                         "FROM "CTSVC_DB_VIEW_PERSON_CONTACT", "
822                         CTS_TABLE_GROUP_RELATIONS", "CTS_TABLE_GROUPS" "
823                         "ON "
824                         CTS_TABLE_GROUP_RELATIONS".contact_id = "CTSVC_DB_VIEW_PERSON_CONTACT".contact_id AND "
825                         CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id AND "
826                         CTS_TABLE_GROUP_RELATIONS".deleted = 0 "
827                         "ORDER BY group_prio");
828         ret = ctsvc_query_exec(query);
829         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
830
831         /* CTSVC_DB_VIEW_CONTACT_NUMBER */
832         snprintf(query, sizeof(query),
833                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_NUMBER" AS "
834                         "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" "
835                         "JOIN (SELECT id number_id, "
836                         "contact_id, "
837                         "data1 type, "
838                         "is_default, "
839                         "data2 label, "
840                         "data3 number, "
841                         "data4 minmatch, "
842                         "data5 normalized_number, "
843                         "data6 cleaned_number "
844                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
845                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
846                         CTSVC_DATA_NUMBER);
847         ret = ctsvc_query_exec(query);
848         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
849
850         /* CTSVC_DB_VIEW_CONTACT_EMAIL */
851         snprintf(query, sizeof(query),
852                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_EMAIL" AS "
853                         "SELECT * FROM "CTSVC_DB_VIEW_CONTACT" "
854                         "JOIN (SELECT id email_id, "
855                         "contact_id, "
856                         "data1 type, "
857                         "is_default, "
858                         "data2 label, "
859                         "data3 email "
860                         "FROM "CTS_TABLE_DATA" WHERE datatype = %d AND is_my_profile = 0) temp_data "
861                         "ON temp_data.contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id",
862                         CTSVC_DATA_EMAIL);
863         ret = ctsvc_query_exec(query);
864         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
865
866         /* CTSVC_DB_VIEW_CONTACT_GROUP */
867         snprintf(query, sizeof(query),
868                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_GROUP" AS "
869                         "SELECT C.*, groups.group_id, group_name "
870                         "FROM "CTSVC_DB_VIEW_CONTACT" C "
871                         "LEFT JOIN "CTS_TABLE_GROUP_RELATIONS" "
872                         "ON "CTS_TABLE_GROUP_RELATIONS".deleted = 0 AND "
873                         CTS_TABLE_GROUP_RELATIONS".contact_id = C.contact_id "
874                         "LEFT JOIN "CTS_TABLE_GROUPS" "
875                         "ON "CTS_TABLE_GROUP_RELATIONS".group_id = "CTS_TABLE_GROUPS".group_id");
876         ret = ctsvc_query_exec(query);
877         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
878
879         /* CTSVC_DB_VIEW_CONTACT_ACTIVITY */
880         snprintf(query, sizeof(query),
881                         "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_CONTACT_ACTIVITY" AS "
882                         "SELECT A.contact_id, "
883                         "A.display_name, "
884                         "A.display_name_source, "
885                         "A.reverse_display_name, "
886                         "A.display_name_language, "
887                         "A.reverse_display_name_language, "
888                         "A.sort_name, A.reverse_sort_name, "
889                         "A.sortkey, A.reverse_sortkey, "
890                         "A.addressbook_id, "
891                         "AB.account_id, "
892                         "A.person_id, "
893                         "A.ringtone_path, "
894                         "A.image_thumbnail_path, "
895                         "AC.id activity_id, "
896                         "AC.source_name, "
897                         "AC.status, "
898                         "AC.timestamp, "
899                         "AC.service_operation, "
900                         "AC.uri "
901                         "FROM "CTSVC_DB_VIEW_CONTACT" A, "CTS_TABLE_ACTIVITIES" AC, "CTS_TABLE_ADDRESSBOOKS" AB "
902                         "ON A.contact_id = AC.contact_id "
903                         "AND A.addressbook_id = AB.addressbook_id "
904                         "ORDER BY timestamp DESC");
905         ret = ctsvc_query_exec(query);
906         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_query_exec() Fail(%d)", ret);
907
908         /* CTSVC_DB_VIEW_SIP */
909         snprintf(query, sizeof(query),
910                 "CREATE VIEW IF NOT EXISTS "CTSVC_DB_VIEW_SIP" AS "
911                         "SELECT id, "
912                                         "data.contact_id, "
913                                         "data1 address, "
914                                         "data2 type, "
915                                         "data3 label "
916                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
917                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
918                         "WHERE datatype = %d AND is_my_profile = 0 ",
919                                 CTSVC_DATA_SIP);
920         ret = ctsvc_query_exec(query);
921         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "DB error : ctsvc_query_exec() Fail(%d)", ret);
922
923         __ctsvc_db_view_already_created = true;
924
925         return CONTACTS_ERROR_NONE;
926 }
927
928 #endif
929
930 int ctsvc_db_init()
931 {
932         int ret = CONTACTS_ERROR_NONE;
933         ret = ctsvc_db_open();
934         if (ret != CONTACTS_ERROR_NONE) {
935                 ERR("ctsvc_db_open() Fail(%d)", ret);
936                 return ret;
937         }
938
939 #ifdef _CONTACTS_IPC_SERVER
940         ret = __ctsvc_db_create_views();
941         if (ret != CONTACTS_ERROR_NONE) {
942                 ERR("__ctsvc_db_create_views() Fail(%d)", ret);
943                 return ret;
944         }
945 #endif
946
947         return ret;
948 }
949
950 int ctsvc_db_deinit()
951 {
952         int ret = CONTACTS_ERROR_NONE;
953         ret = ctsvc_db_close();
954         if (ret != CONTACTS_ERROR_NONE) {
955                 ERR("ctsvc_db_close() Fail(%d)", ret);
956                 return ret;
957         }
958
959         return CONTACTS_ERROR_NONE;
960 }
961
962