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_note_helper.h"
28 #include "ctsvc_db_query.h"
29 #include "ctsvc_list.h"
30 #include "ctsvc_record.h"
31 #include "ctsvc_notification.h"
34 static int __ctsvc_db_note_get_record(int id, contacts_record_h *out_record)
38 char query[CTS_SQL_MAX_LEN] = {0};
40 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
43 snprintf(query, sizeof(query),
44 "SELECT id, data.contact_id, is_default, data1, data2, data3 "
45 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
46 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
47 "WHERE id = %d AND datatype = %d ",
48 id, CONTACTS_DATA_TYPE_NOTE);
50 ret = ctsvc_query_prepare(query, &stmt);
51 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
53 ret = ctsvc_stmt_step(stmt);
54 if (1 /*CTS_TRUE*/ != ret) {
56 ERR("ctsvc_stmt_step() Fail(%d)", ret);
57 ctsvc_stmt_finalize(stmt);
58 if (CONTACTS_ERROR_NONE == ret)
59 return CONTACTS_ERROR_NO_DATA;
65 ctsvc_db_note_get_value_from_stmt(stmt, out_record, 0);
66 ctsvc_stmt_finalize(stmt);
68 return CONTACTS_ERROR_NONE;
71 static int __ctsvc_db_note_insert_record(contacts_record_h record, int *id)
75 char query[CTS_SQL_MAX_LEN] = {0};
76 ctsvc_note_s *note = (ctsvc_note_s*)record;
78 RETV_IF(NULL == note->note, CONTACTS_ERROR_INVALID_PARAMETER);
80 ret = ctsvc_begin_trans();
81 if (CONTACTS_ERROR_NONE != ret) {
83 ERR("ctsvc_begin_trans() Fail(%d)", ret);
88 snprintf(query, sizeof(query),
89 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", note->contact_id);
90 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
91 if (CONTACTS_ERROR_NONE != ret) {
92 ctsvc_end_trans(false);
93 if (CONTACTS_ERROR_NO_DATA == ret) {
95 ERR("No data : contact_id (%d) is not exist", note->contact_id);
96 return CONTACTS_ERROR_INVALID_PARAMETER;
100 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
106 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
107 /* LCOV_EXCL_START */
108 ERR("No permission in this addresbook_id(%d)", addressbook_id);
109 ctsvc_end_trans(false);
110 return CONTACTS_ERROR_PERMISSION_DENIED;
114 ret = ctsvc_db_note_insert(record, note->contact_id, false, id);
115 if (CONTACTS_ERROR_NONE != ret) {
116 /* LCOV_EXCL_START */
117 ERR("ctsvc_begin_trans() Fail(%d)", ret);
118 ctsvc_end_trans(false);
123 ret = ctsvc_db_contact_update_changed_time(note->contact_id);
124 if (CONTACTS_ERROR_NONE != ret) {
125 /* LCOV_EXCL_START */
126 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
127 ctsvc_end_trans(false);
131 ctsvc_set_person_noti();
133 ret = ctsvc_end_trans(true);
134 if (ret < CONTACTS_ERROR_NONE) {
135 /* LCOV_EXCL_START */
136 ERR("ctsvc_end_trans() Fail(%d)", ret);
140 return CONTACTS_ERROR_NONE;
144 static int __ctsvc_db_note_update_record(contacts_record_h record)
148 char query[CTS_SQL_MAX_LEN] = {0};
149 ctsvc_note_s *note = (ctsvc_note_s*)record;
151 RETVM_IF(NULL == note->note, CONTACTS_ERROR_INVALID_PARAMETER, "note is empty");
153 ret = ctsvc_begin_trans();
154 if (CONTACTS_ERROR_NONE != ret) {
155 /* LCOV_EXCL_START */
156 ERR("ctsvc_begin_trans() Fail(%d)", ret);
161 snprintf(query, sizeof(query),
162 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", note->contact_id);
163 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
164 if (CONTACTS_ERROR_NONE != ret) {
165 /* LCOV_EXCL_START */
166 ERR("No data : contact_id (%d) is not exist", note->contact_id);
167 ctsvc_end_trans(false);
172 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
173 /* LCOV_EXCL_START */
174 ERR("No permission in this addresbook_id(%d)", addressbook_id);
175 ctsvc_end_trans(false);
176 return CONTACTS_ERROR_PERMISSION_DENIED;
180 ret = ctsvc_db_note_update(record, false);
181 if (CONTACTS_ERROR_NONE != ret) {
182 /* LCOV_EXCL_START */
183 ERR("Update record Fail(%d)", ret);
184 ctsvc_end_trans(false);
189 /* TODO ; contact display note update */
190 ret = ctsvc_db_contact_update_changed_time(note->contact_id);
191 if (CONTACTS_ERROR_NONE != ret) {
192 /* LCOV_EXCL_START */
193 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
194 ctsvc_end_trans(false);
198 ctsvc_set_person_noti();
200 ret = ctsvc_end_trans(true);
201 if (ret < CONTACTS_ERROR_NONE) {
202 /* LCOV_EXCL_START */
203 ERR("ctsvc_end_trans() Fail(%d)", ret);
207 return CONTACTS_ERROR_NONE;
212 static int __ctsvc_db_note_delete_record(int id)
216 char query[CTS_SQL_MAX_LEN] = {0};
220 ret = ctsvc_begin_trans();
221 if (CONTACTS_ERROR_NONE != ret) {
222 /* LCOV_EXCL_START */
223 ERR("ctsvc_begin_trans() Fail(%d)", ret);
228 snprintf(query, sizeof(query),
229 "SELECT contact_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT " "
230 "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
231 ret = ctsvc_query_prepare(query, &stmt);
233 /* LCOV_EXCL_START */
234 ERR("ctsvc_query_prepare Fail(%d)", ret);
235 ctsvc_end_trans(false);
239 ret = ctsvc_stmt_step(stmt);
241 /* LCOV_EXCL_START */
242 ERR("The id(%d) is Invalid(%d)", id, ret);
243 ctsvc_stmt_finalize(stmt);
244 ctsvc_end_trans(false);
245 if (CONTACTS_ERROR_NONE == ret)
246 return CONTACTS_ERROR_NO_DATA;
252 contact_id = ctsvc_stmt_get_int(stmt, 0);
253 addressbook_id = ctsvc_stmt_get_int(stmt, 1);
254 ctsvc_stmt_finalize(stmt);
256 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
257 /* LCOV_EXCL_START */
258 ERR("No permission in this addresbook_id(%d)", addressbook_id);
259 ctsvc_end_trans(false);
260 return CONTACTS_ERROR_PERMISSION_DENIED;
264 ret = ctsvc_db_note_delete(id, false);
265 if (CONTACTS_ERROR_NONE != ret) {
266 /* LCOV_EXCL_START */
267 ERR("ctsvc_begin_trans() Fail(%d)", ret);
268 ctsvc_end_trans(false);
273 /* TODO ; contact name update */
274 ret = ctsvc_db_contact_update_changed_time(contact_id);
275 if (CONTACTS_ERROR_NONE != ret) {
276 /* LCOV_EXCL_START */
277 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
278 ctsvc_end_trans(false);
282 ctsvc_set_person_noti();
284 ret = ctsvc_end_trans(true);
285 if (ret < CONTACTS_ERROR_NONE) {
286 /* LCOV_EXCL_START */
287 ERR("ctsvc_end_trans() Fail(%d)", ret);
291 return CONTACTS_ERROR_NONE;
295 static int __ctsvc_db_note_get_all_records(int offset, int limit, contacts_list_h *out_list)
299 contacts_list_h list;
301 cts_stmt stmt = NULL;
302 char query[CTS_SQL_MAX_LEN] = {0};
304 len = snprintf(query, sizeof(query),
305 "SELECT id, data.contact_id, is_default, data1, data2, data3 "
306 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
307 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
308 "WHERE datatype = %d AND is_my_profile=0 ",
309 CONTACTS_DATA_TYPE_NOTE);
313 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
315 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
318 ret = ctsvc_query_prepare(query, &stmt);
319 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
321 contacts_list_create(&list);
322 while ((ret = ctsvc_stmt_step(stmt))) {
323 if (1 /*CTS_TRUE */ != ret) {
324 /* LCOV_EXCL_START */
325 ERR("DB : ctsvc_stmt_step fail(%d)", ret);
326 ctsvc_stmt_finalize(stmt);
327 contacts_list_destroy(list, true);
331 ctsvc_db_note_get_value_from_stmt(stmt, (contacts_record_h*)¬e, 0);
332 ctsvc_list_prepend(list, (contacts_record_h)note);
334 ctsvc_stmt_finalize(stmt);
335 ctsvc_list_reverse(list);
338 return CONTACTS_ERROR_NONE;
341 static int __ctsvc_db_note_get_records_with_query(contacts_query_h query, int offset,
342 int limit, contacts_list_h *out_list)
347 ctsvc_query_s *s_query;
349 contacts_list_h list;
352 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
353 s_query = (ctsvc_query_s*)query;
355 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
356 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
358 contacts_list_create(&list);
359 while ((ret = ctsvc_stmt_step(stmt))) {
360 contacts_record_h record;
361 if (1 /*CTS_TRUE */ != ret) {
362 /* LCOV_EXCL_START */
363 ERR("ctsvc_stmt_step() Fail(%d)", ret);
364 ctsvc_stmt_finalize(stmt);
365 contacts_list_destroy(list, true);
370 contacts_record_create(_contacts_note._uri, &record);
371 note = (ctsvc_note_s*)record;
372 if (0 == s_query->projection_count) {
373 field_count = s_query->property_count;
375 field_count = s_query->projection_count;
376 ret = ctsvc_record_set_projection_flags(record, s_query->projection,
377 s_query->projection_count, s_query->property_count);
379 if (CONTACTS_ERROR_NONE != ret)
380 ASSERT_NOT_REACHED("To set projection is Fail.\n");
383 for (i = 0; i < field_count; i++) {
386 if (0 == s_query->projection_count)
387 property_id = s_query->properties[i].property_id;
389 property_id = s_query->projection[i];
391 switch (property_id) {
392 case CTSVC_PROPERTY_NOTE_ID:
393 note->id = ctsvc_stmt_get_int(stmt, i);
395 case CTSVC_PROPERTY_NOTE_CONTACT_ID:
396 note->contact_id = ctsvc_stmt_get_int(stmt, i);
398 case CTSVC_PROPERTY_NOTE_NOTE:
399 temp = ctsvc_stmt_get_text(stmt, i);
401 note->note = SAFE_STRDUP(temp);
407 ctsvc_list_prepend(list, record);
409 ctsvc_stmt_finalize(stmt);
410 ctsvc_list_reverse(list);
413 return CONTACTS_ERROR_NONE;
416 ctsvc_db_plugin_info_s ctsvc_db_plugin_note = {
417 .is_query_only = false,
418 .insert_record = __ctsvc_db_note_insert_record,
419 .get_record = __ctsvc_db_note_get_record,
420 .update_record = __ctsvc_db_note_update_record,
421 .delete_record = __ctsvc_db_note_delete_record,
422 .get_all_records = __ctsvc_db_note_get_all_records,
423 .get_records_with_query = __ctsvc_db_note_get_records_with_query,
424 .insert_records = NULL,
425 .update_records = NULL,
426 .delete_records = NULL,
428 .get_count_with_query = NULL,
429 .replace_record = NULL,
430 .replace_records = NULL,