4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
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"
34 static int __ctsvc_db_nickname_insert_record(contacts_record_h record, int *id)
38 char query[CTS_SQL_MAX_LEN] = {0};
39 ctsvc_nickname_s *nickname = (ctsvc_nickname_s*)record;
41 RETV_IF(NULL == nickname->nickname, CONTACTS_ERROR_INVALID_PARAMETER);
43 ret = ctsvc_begin_trans();
44 if (CONTACTS_ERROR_NONE != ret) {
46 ERR("ctsvc_begin_trans() Fail(%d)", ret);
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) {
58 ERR("No data : contact_id (%d) is not exist", nickname->contact_id);
59 return CONTACTS_ERROR_INVALID_PARAMETER;
63 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
69 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
71 ERR("No permission in this addresbook_id(%d)", addressbook_id);
72 ctsvc_end_trans(false);
73 return CONTACTS_ERROR_PERMISSION_DENIED;
77 ret = ctsvc_db_nickname_insert(record, nickname->contact_id, false, id);
78 if (CONTACTS_ERROR_NONE != ret) {
80 ERR("ctsvc_begin_trans() Fail(%d)", ret);
81 ctsvc_end_trans(false);
86 ctsvc_contact_update_display_name(nickname->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
88 ret = ctsvc_db_contact_update_changed_time(nickname->contact_id);
89 if (CONTACTS_ERROR_NONE != ret) {
91 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
92 ctsvc_end_trans(false);
96 ctsvc_set_person_noti();
98 ret = ctsvc_end_trans(true);
99 if (ret < CONTACTS_ERROR_NONE) {
100 /* LCOV_EXCL_START */
101 ERR("ctsvc_end_trans() Fail(%d)", ret);
105 return CONTACTS_ERROR_NONE;
109 static int __ctsvc_db_nickname_get_record(int id, contacts_record_h *out_record)
112 cts_stmt stmt = NULL;
113 char query[CTS_SQL_MAX_LEN] = {0};
115 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
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);
125 ret = ctsvc_query_prepare(query, &stmt);
126 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
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;
140 ctsvc_db_nickname_get_value_from_stmt(stmt, out_record, 0);
142 ctsvc_stmt_finalize(stmt);
144 return CONTACTS_ERROR_NONE;
147 static int __ctsvc_db_nickname_update_record(contacts_record_h record)
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");
155 ret = ctsvc_begin_trans();
156 if (CONTACTS_ERROR_NONE != ret) {
157 /* LCOV_EXCL_START */
158 ERR("ctsvc_begin_trans() Fail(%d)", ret);
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);
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;
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);
191 ctsvc_contact_update_display_name(nickname->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
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);
201 ctsvc_set_person_noti();
203 ret = ctsvc_end_trans(true);
205 if (ret < CONTACTS_ERROR_NONE) {
206 /* LCOV_EXCL_START */
207 ERR("ctsvc_end_trans() Fail(%d)", ret);
211 return CONTACTS_ERROR_NONE;
215 static int __ctsvc_db_nickname_delete_record(int id)
219 char query[CTS_SQL_MAX_LEN] = {0};
223 ret = ctsvc_begin_trans();
224 if (CONTACTS_ERROR_NONE != ret) {
225 /* LCOV_EXCL_START */
226 ERR("ctsvc_begin_trans() Fail(%d)", ret);
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);
236 /* LCOV_EXCL_START */
237 ERR("ctsvc_query_prepare Fail(%d)", ret);
238 ctsvc_end_trans(false);
242 ret = ctsvc_stmt_step(stmt);
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;
255 contact_id = ctsvc_stmt_get_int(stmt, 0);
256 addressbook_id = ctsvc_stmt_get_int(stmt, 1);
257 ctsvc_stmt_finalize(stmt);
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;
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);
276 ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_NICKNAME);
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);
286 ctsvc_set_person_noti();
288 ret = ctsvc_end_trans(true);
289 if (ret < CONTACTS_ERROR_NONE) {
290 /* LCOV_EXCL_START */
291 ERR("ctsvc_end_trans() Fail(%d)", ret);
295 return CONTACTS_ERROR_NONE;
299 static int __ctsvc_db_nickname_get_all_records(int offset, int limit, contacts_list_h *out_list)
303 contacts_list_h list;
304 ctsvc_nickname_s *nickname;
305 cts_stmt stmt = NULL;
306 char query[CTS_SQL_MAX_LEN] = {0};
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);
316 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
318 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
321 ret = ctsvc_query_prepare(query, &stmt);
322 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
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);
334 ctsvc_db_nickname_get_value_from_stmt(stmt, (contacts_record_h*)&nickname, 0);
335 ctsvc_list_prepend(list, (contacts_record_h)nickname);
337 ctsvc_stmt_finalize(stmt);
338 ctsvc_list_reverse(list);
341 return CONTACTS_ERROR_NONE;
344 static int __ctsvc_db_nickname_get_records_with_query(contacts_query_h query, int offset,
345 int limit, contacts_list_h *out_list)
350 ctsvc_query_s *s_query;
352 contacts_list_h list;
353 ctsvc_nickname_s *nickname;
355 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
356 s_query = (ctsvc_query_s*)query;
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);
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);
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;
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);
382 if (CONTACTS_ERROR_NONE != ret)
383 ASSERT_NOT_REACHED("To set projection is Fail.\n");
386 for (i = 0; i < field_count; i++) {
389 if (0 == s_query->projection_count)
390 property_id = s_query->properties[i].property_id;
392 property_id = s_query->projection[i];
394 switch (property_id) {
395 case CTSVC_PROPERTY_NICKNAME_ID:
396 nickname->id = ctsvc_stmt_get_int(stmt, i);
398 case CTSVC_PROPERTY_NICKNAME_CONTACT_ID:
399 nickname->contact_id = ctsvc_stmt_get_int(stmt, i);
401 case CTSVC_PROPERTY_NICKNAME_NAME:
402 temp = ctsvc_stmt_get_text(stmt, i);
403 free(nickname->nickname);
404 nickname->nickname = SAFE_STRDUP(temp);
410 ctsvc_list_prepend(list, record);
412 ctsvc_stmt_finalize(stmt);
413 ctsvc_list_reverse(list);
416 return CONTACTS_ERROR_NONE;
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,
431 .get_count_with_query = NULL,
432 .replace_record = NULL,
433 .replace_records = NULL,