[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_nickname.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 "contacts.h"
20 #include "ctsvc_internal.h"
21 #include "ctsvc_db_schema.h"
22 #include "ctsvc_db_sqlite.h"
23 #include "ctsvc_db_utils.h"
24 #include "ctsvc_db_init.h"
25 #include "ctsvc_db_access_control.h"
26 #include "ctsvc_db_plugin_contact_helper.h"
27 #include "ctsvc_db_plugin_nickname_helper.h"
28 #include "ctsvc_record.h"
29 #include "ctsvc_db_query.h"
30 #include "ctsvc_list.h"
31 #include "ctsvc_notification.h"
32
33
34 static int __ctsvc_db_nickname_insert_record(contacts_record_h record, int *id)
35 {
36         int ret;
37         int addressbook_id;
38         char query[CTS_SQL_MAX_LEN] = {0};
39         ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record;
40
41         RETV_IF(NULL == nickname->nickname, CONTACTS_ERROR_INVALID_PARAMETER);
42
43         ret = ctsvc_begin_trans();
44         if (CONTACTS_ERROR_NONE != ret) {
45                 /* LCOV_EXCL_START */
46                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
47                 return ret;
48                 /* LCOV_EXCL_STOP */
49         }
50
51         snprintf(query, sizeof(query),
52                         "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", nickname->contact_id);
53         ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
54         if (CONTACTS_ERROR_NONE != ret) {
55                 ctsvc_end_trans(false);
56                 if (CONTACTS_ERROR_NO_DATA == ret) {
57                         /* LCOV_EXCL_START */
58                         ERR("No data : contact_id (%d) is not exist", nickname->contact_id);
59                         return CONTACTS_ERROR_INVALID_PARAMETER;
60                         /* LCOV_EXCL_STOP */
61                 } else {
62                         /* LCOV_EXCL_START */
63                         ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
64                         return ret;
65                         /* LCOV_EXCL_STOP */
66                 }
67         }
68
69         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
70                 /* LCOV_EXCL_START */
71                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
72                 ctsvc_end_trans(false);
73                 return CONTACTS_ERROR_PERMISSION_DENIED;
74                 /* LCOV_EXCL_STOP */
75         }
76
77         ret = ctsvc_db_nickname_insert(record, nickname->contact_id, false, id);
78         if (CONTACTS_ERROR_NONE != ret) {
79                 /* LCOV_EXCL_START */
80                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
81                 ctsvc_end_trans(false);
82                 return ret;
83                 /* LCOV_EXCL_STOP */
84         }
85
86         ctsvc_contact_update_display_name(nickname->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
87
88         ret = ctsvc_db_contact_update_changed_time(nickname->contact_id);
89         if (CONTACTS_ERROR_NONE != ret) {
90                 /* LCOV_EXCL_START */
91                 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
92                 ctsvc_end_trans(false);
93                 return ret;
94                 /* LCOV_EXCL_STOP */
95         }
96         ctsvc_set_person_noti();
97
98         ret = ctsvc_end_trans(true);
99         if (ret < CONTACTS_ERROR_NONE) {
100                 /* LCOV_EXCL_START */
101                 ERR("ctsvc_end_trans() Fail(%d)", ret);
102                 return ret;
103                 /* LCOV_EXCL_STOP */
104         } else {
105                 return CONTACTS_ERROR_NONE;
106         }
107 }
108
109 static int __ctsvc_db_nickname_get_record(int id, contacts_record_h *out_record)
110 {
111         int ret;
112         cts_stmt stmt = NULL;
113         char query[CTS_SQL_MAX_LEN] = {0};
114
115         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
116         *out_record = NULL;
117
118         snprintf(query, sizeof(query),
119                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
120                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
121                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
122                         "WHERE id = %d AND datatype = %d ",
123                         id, CONTACTS_DATA_TYPE_NICKNAME);
124
125         ret = ctsvc_query_prepare(query, &stmt);
126         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
127
128         ret = ctsvc_stmt_step(stmt);
129         if (1 /*CTS_TRUE*/ != ret) {
130                 /* LCOV_EXCL_START */
131                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
132                 ctsvc_stmt_finalize(stmt);
133                 if (CONTACTS_ERROR_NONE == ret)
134                         return CONTACTS_ERROR_NO_DATA;
135                 else
136                         return ret;
137                 /* LCOV_EXCL_STOP */
138         }
139
140         ctsvc_db_nickname_get_value_from_stmt(stmt, out_record, 0);
141
142         ctsvc_stmt_finalize(stmt);
143
144         return CONTACTS_ERROR_NONE;
145 }
146
147 static int __ctsvc_db_nickname_update_record(contacts_record_h record)
148 {
149         int ret;
150         int addressbook_id;
151         char query[CTS_SQL_MAX_LEN] = {0};
152         ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record;
153         RETVM_IF(NULL == nickname->nickname, CONTACTS_ERROR_INVALID_PARAMETER, "nickname is empty");
154
155         ret = ctsvc_begin_trans();
156         if (CONTACTS_ERROR_NONE != ret) {
157                 /* LCOV_EXCL_START */
158                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
159                 return ret;
160                 /* LCOV_EXCL_STOP */
161         }
162
163         snprintf(query, sizeof(query),
164                         "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", nickname->contact_id);
165         ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
166         if (CONTACTS_ERROR_NONE != ret) {
167                 /* LCOV_EXCL_START */
168                 ERR("No data : contact_id (%d) is not exist", nickname->contact_id);
169                 ctsvc_end_trans(false);
170                 return ret;
171                 /* LCOV_EXCL_STOP */
172         }
173
174         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
175                 /* LCOV_EXCL_START */
176                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
177                 ctsvc_end_trans(false);
178                 return CONTACTS_ERROR_PERMISSION_DENIED;
179                 /* LCOV_EXCL_STOP */
180         }
181
182         ret = ctsvc_db_nickname_update(record, false);
183         if (CONTACTS_ERROR_NONE != ret) {
184                 /* LCOV_EXCL_START */
185                 ERR("Update record Fail(%d)", ret);
186                 ctsvc_end_trans(false);
187                 return ret;
188                 /* LCOV_EXCL_STOP */
189         }
190
191         ctsvc_contact_update_display_name(nickname->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
192
193         ret = ctsvc_db_contact_update_changed_time(nickname->contact_id);
194         if (CONTACTS_ERROR_NONE != ret) {
195                 /* LCOV_EXCL_START */
196                 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
197                 ctsvc_end_trans(false);
198                 return ret;
199                 /* LCOV_EXCL_STOP */
200         }
201         ctsvc_set_person_noti();
202
203         ret = ctsvc_end_trans(true);
204
205         if (ret < CONTACTS_ERROR_NONE) {
206                 /* LCOV_EXCL_START */
207                 ERR("ctsvc_end_trans() Fail(%d)", ret);
208                 return ret;
209                 /* LCOV_EXCL_STOP */
210         } else {
211                 return CONTACTS_ERROR_NONE;
212         }
213 }
214
215 static int __ctsvc_db_nickname_delete_record(int id)
216 {
217         int ret;
218         int contact_id;
219         char query[CTS_SQL_MAX_LEN] = {0};
220         cts_stmt stmt;
221         int addressbook_id;
222
223         ret = ctsvc_begin_trans();
224         if (CONTACTS_ERROR_NONE != ret) {
225                 /* LCOV_EXCL_START */
226                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
227                 return ret;
228                 /* LCOV_EXCL_STOP */
229         }
230
231         snprintf(query, sizeof(query),
232                         "SELECT contact_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT " "
233                         "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
234         ret = ctsvc_query_prepare(query, &stmt);
235         if (NULL == stmt) {
236                 /* LCOV_EXCL_START */
237                 ERR("ctsvc_query_prepare Fail(%d)", ret);
238                 ctsvc_end_trans(false);
239                 return ret;
240                 /* LCOV_EXCL_STOP */
241         }
242         ret = ctsvc_stmt_step(stmt);
243         if (1 != ret) {
244                 /* LCOV_EXCL_START */
245                 ERR("The id(%d) is Invalid(%d)", id, ret);
246                 ctsvc_stmt_finalize(stmt);
247                 ctsvc_end_trans(false);
248                 if (CONTACTS_ERROR_NONE == ret)
249                         return CONTACTS_ERROR_NO_DATA;
250                 else
251                         return ret;
252                 /* LCOV_EXCL_STOP */
253         }
254
255         contact_id = ctsvc_stmt_get_int(stmt, 0);
256         addressbook_id = ctsvc_stmt_get_int(stmt, 1);
257         ctsvc_stmt_finalize(stmt);
258
259         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
260                 /* LCOV_EXCL_START */
261                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
262                 ctsvc_end_trans(false);
263                 return CONTACTS_ERROR_PERMISSION_DENIED;
264                 /* LCOV_EXCL_STOP */
265         }
266
267         ret = ctsvc_db_nickname_delete(id, false);
268         if (CONTACTS_ERROR_NONE != ret) {
269                 /* LCOV_EXCL_START */
270                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
271                 ctsvc_end_trans(false);
272                 return ret;
273                 /* LCOV_EXCL_STOP */
274         }
275
276         ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
277
278         ret = ctsvc_db_contact_update_changed_time(contact_id);
279         if (CONTACTS_ERROR_NONE != ret) {
280                 /* LCOV_EXCL_START */
281                 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
282                 ctsvc_end_trans(false);
283                 return ret;
284                 /* LCOV_EXCL_STOP */
285         }
286         ctsvc_set_person_noti();
287
288         ret = ctsvc_end_trans(true);
289         if (ret < CONTACTS_ERROR_NONE) {
290                 /* LCOV_EXCL_START */
291                 ERR("ctsvc_end_trans() Fail(%d)", ret);
292                 return ret;
293                 /* LCOV_EXCL_STOP */
294         } else {
295                 return CONTACTS_ERROR_NONE;
296         }
297 }
298
299 static int __ctsvc_db_nickname_get_all_records(int offset, int limit, contacts_list_h *out_list)
300 {
301         int len;
302         int ret;
303         contacts_list_h list;
304         ctsvc_nickname_s *nickname;
305         cts_stmt stmt = NULL;
306         char query[CTS_SQL_MAX_LEN] = {0};
307
308         len = snprintf(query, sizeof(query),
309                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
310                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
311                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
312                         "WHERE datatype = %d AND is_my_profile=0 ",
313                         CONTACTS_DATA_TYPE_NICKNAME);
314
315         if (0 != limit) {
316                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
317                 if (0 < offset)
318                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
319         }
320
321         ret = ctsvc_query_prepare(query, &stmt);
322         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
323
324         contacts_list_create(&list);
325         while ((ret = ctsvc_stmt_step(stmt))) {
326                 if (1 /*CTS_TRUE */ != ret) {
327                         /* LCOV_EXCL_START */
328                         ERR("DB : ctsvc_stmt_step fail(%d)", ret);
329                         ctsvc_stmt_finalize(stmt);
330                         contacts_list_destroy(list, true);
331                         return ret;
332                         /* LCOV_EXCL_STOP */
333                 }
334                 ctsvc_db_nickname_get_value_from_stmt(stmt, (contacts_record_h*)&nickname, 0);
335                 ctsvc_list_prepend(list, (contacts_record_h)nickname);
336         }
337         ctsvc_stmt_finalize(stmt);
338         ctsvc_list_reverse(list);
339
340         *out_list = list;
341         return CONTACTS_ERROR_NONE;
342 }
343
344 static int __ctsvc_db_nickname_get_records_with_query(contacts_query_h query, int offset,
345                 int limit, contacts_list_h *out_list)
346 {
347         int ret;
348         int i;
349         int field_count;
350         ctsvc_query_s *s_query;
351         cts_stmt stmt;
352         contacts_list_h list;
353         ctsvc_nickname_s *nickname;
354
355         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
356         s_query = (ctsvc_query_s*)query;
357
358         ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
359         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
360
361         contacts_list_create(&list);
362         while ((ret = ctsvc_stmt_step(stmt))) {
363                 contacts_record_h record;
364                 if (1 /*CTS_TRUE */ != ret) {
365                         /* LCOV_EXCL_START */
366                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
367                         ctsvc_stmt_finalize(stmt);
368                         contacts_list_destroy(list, true);
369                         return ret;
370                         /* LCOV_EXCL_STOP */
371                 }
372
373                 contacts_record_create(_contacts_nickname._uri, &record);
374                 nickname = (ctsvc_nickname_s*)record;
375                 if (0 == s_query->projection_count) {
376                         field_count = s_query->property_count;
377                 } else {
378                         field_count = s_query->projection_count;
379                         ret = ctsvc_record_set_projection_flags(record, s_query->projection,
380                                         s_query->projection_count, s_query->property_count);
381
382                         if (CONTACTS_ERROR_NONE != ret)
383                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
384                 }
385
386                 for (i = 0; i < field_count; i++) {
387                         char *temp;
388                         int property_id;
389                         if (0 == s_query->projection_count)
390                                 property_id = s_query->properties[i].property_id;
391                         else
392                                 property_id = s_query->projection[i];
393
394                         switch (property_id) {
395                         case CTSVC_PROPERTY_NICKNAME_ID:
396                                 nickname->id = ctsvc_stmt_get_int(stmt, i);
397                                 break;
398                         case CTSVC_PROPERTY_NICKNAME_CONTACT_ID:
399                                 nickname->contact_id = ctsvc_stmt_get_int(stmt, i);
400                                 break;
401                         case CTSVC_PROPERTY_NICKNAME_NAME:
402                                 temp = ctsvc_stmt_get_text(stmt, i);
403                                 free(nickname->nickname);
404                                 nickname->nickname = SAFE_STRDUP(temp);
405                                 break;
406                         default:
407                                 break;
408                         }
409                 }
410                 ctsvc_list_prepend(list, record);
411         }
412         ctsvc_stmt_finalize(stmt);
413         ctsvc_list_reverse(list);
414
415         *out_list = list;
416         return CONTACTS_ERROR_NONE;
417 }
418
419 ctsvc_db_plugin_info_s ctsvc_db_plugin_nickname = {
420         .is_query_only = false,
421         .insert_record = __ctsvc_db_nickname_insert_record,
422         .get_record = __ctsvc_db_nickname_get_record,
423         .update_record = __ctsvc_db_nickname_update_record,
424         .delete_record = __ctsvc_db_nickname_delete_record,
425         .get_all_records = __ctsvc_db_nickname_get_all_records,
426         .get_records_with_query = __ctsvc_db_nickname_get_records_with_query,
427         .insert_records = NULL,
428         .update_records = NULL,
429         .delete_records = NULL,
430         .get_count = NULL,
431         .get_count_with_query = NULL,
432         .replace_record = NULL,
433         .replace_records = NULL,
434 };
435