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_list.h"
25 #include "ctsvc_db_init.h"
26 #include "ctsvc_db_query.h"
27 #include "ctsvc_record.h"
28 #include "ctsvc_notification.h"
29 #include "ctsvc_notify.h"
32 static int __ctsvc_db_speeddial_insert_record(contacts_record_h record, int *id)
36 char query[CTS_SQL_MAX_LEN] = {0};
37 ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record;
39 ret = ctsvc_begin_trans();
40 RETVM_IF(ret, ret, "ctsvc_begin_trans() Fail(%d)", ret);
42 /* check number_id validation */
43 snprintf(query, sizeof(query),
44 "SELECT data.id FROM "CTS_TABLE_DATA", "CTS_TABLE_CONTACTS" "
45 "ON "CTS_TABLE_DATA".contact_id = "CTS_TABLE_CONTACTS".contact_id "
46 "AND contacts.deleted = 0 AND is_my_profile = 0 AND datatype = %d "
48 CONTACTS_DATA_TYPE_NUMBER, speeddial->number_id);
49 ret = ctsvc_query_get_first_int_result(query, &number_id);
50 if (CONTACTS_ERROR_NONE != ret) {
52 ERR("ctsvc_query_get_first_int_result() Fail(%d) : number_id is invalid", ret);
53 ctsvc_end_trans(false);
54 return CONTACTS_ERROR_INVALID_PARAMETER;
58 snprintf(query, sizeof(query),
59 "INSERT INTO "CTS_TABLE_SPEEDDIALS"(speed_number, number_id) VALUES(%d, %d)",
60 speeddial->dial_number, speeddial->number_id);
62 ret = ctsvc_query_exec(query);
63 if (CONTACTS_ERROR_NONE != ret) {
65 ERR("ctsvc_query_exec() Fail(%d)", ret);
66 ctsvc_end_trans(false);
71 ret = ctsvc_db_change();
74 *id = speeddial->dial_number;
75 ctsvc_set_speed_noti();
82 ret = ctsvc_end_trans(true);
83 if (ret < CONTACTS_ERROR_NONE)
86 return CONTACTS_ERROR_NONE;
89 static int __ctsvc_db_speeddial_value_set(cts_stmt stmt, contacts_record_h *record)
94 ctsvc_speeddial_s *speeddial;
96 ret = contacts_record_create(_contacts_speeddial._uri, record);
97 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
98 speeddial = (ctsvc_speeddial_s*)*record;
101 speeddial->person_id = ctsvc_stmt_get_int(stmt, i++);
102 temp = ctsvc_stmt_get_text(stmt, i++);
103 speeddial->display_name = SAFE_STRDUP(temp);
104 temp = ctsvc_stmt_get_text(stmt, i++);
106 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
107 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
108 speeddial->image_thumbnail_path = strdup(full_path);
111 speeddial->number_id = ctsvc_stmt_get_int(stmt, i++);
112 speeddial->number_type = ctsvc_stmt_get_int(stmt, i++);
113 temp = ctsvc_stmt_get_text(stmt, i++);
114 speeddial->label = SAFE_STRDUP(temp);
115 temp = ctsvc_stmt_get_text(stmt, i++);
116 speeddial->number = SAFE_STRDUP(temp);
117 speeddial->dial_number = ctsvc_stmt_get_int(stmt, i++);
118 speeddial->id = speeddial->dial_number; /* dial_number is an unique key */
120 return CONTACTS_ERROR_NONE;
123 static int __ctsvc_db_speeddial_get_record(int id, contacts_record_h *out_record)
126 cts_stmt stmt = NULL;
127 contacts_record_h record;
128 char query[CTS_SQL_MAX_LEN] = {0};
130 snprintf(query, sizeof(query),
131 "SELECT person_id, %s, image_thumbnail_path, number_id, "
132 "type, label, number, speed_number "
133 "FROM "CTSVC_DB_VIEW_SPEEDIDAL " "
134 "WHERE speed_number = %d",
135 ctsvc_get_display_column(), id);
137 ret = ctsvc_query_prepare(query, &stmt);
138 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
140 ret = ctsvc_stmt_step(stmt);
141 if (1 /*CTS_TRUE*/ != ret) {
142 /* LCOV_EXCL_START */
143 ERR("ctsvc_stmt_step() Fail(%d)", ret);
144 ctsvc_stmt_finalize(stmt);
145 if (CONTACTS_ERROR_NONE == ret)
146 return CONTACTS_ERROR_NO_DATA;
152 ret = __ctsvc_db_speeddial_value_set(stmt, &record);
154 ctsvc_stmt_finalize(stmt);
155 if (CONTACTS_ERROR_NONE != ret) {
156 /* LCOV_EXCL_START */
157 ERR("__ctsvc_db_speeddial_value_set(ALL) Fail(%d)", ret);
162 *out_record = record;
164 return CONTACTS_ERROR_NONE;
167 static int __ctsvc_db_speeddial_update_record(contacts_record_h record)
173 char query[CTS_SQL_MIN_LEN] = {0};
174 ctsvc_speeddial_s *speeddial = (ctsvc_speeddial_s*)record;
176 RETVM_IF(speeddial->dial_number < 0, CONTACTS_ERROR_INVALID_PARAMETER,
177 "dial number (%d)", speeddial->dial_number);
178 RETVM_IF(speeddial->number_id < 0, CONTACTS_ERROR_INVALID_PARAMETER,
179 "number id (%d)", speeddial->number_id);
180 ret = ctsvc_begin_trans();
181 RETVM_IF(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "ctsvc_begin_trans() Fail(%d)", ret);
183 /* check number_id validation */
184 snprintf(query, sizeof(query),
185 "SELECT data.id FROM "CTS_TABLE_DATA", "CTS_TABLE_CONTACTS" "
186 "ON "CTS_TABLE_DATA".contact_id = "CTS_TABLE_CONTACTS".contact_id "
187 "AND contacts.deleted = 0 AND is_my_profile = 0 AND datatype = %d "
189 CONTACTS_DATA_TYPE_NUMBER, speeddial->number_id);
190 ret = ctsvc_query_get_first_int_result(query, &number_id);
191 if (CONTACTS_ERROR_NONE != ret) {
192 /* LCOV_EXCL_START */
193 ERR("ctsvc_query_get_first_int_result() Fail(%d) : number_id is invalid", ret);
194 ctsvc_end_trans(false);
195 return CONTACTS_ERROR_INVALID_PARAMETER;
199 snprintf(query, sizeof(query),
200 "SELECT speed_number FROM "CTS_TABLE_SPEEDDIALS" WHERE speed_number = %d", speeddial->dial_number);
201 ret = ctsvc_query_get_first_int_result(query, &speeddial_id);
202 if (CONTACTS_ERROR_NONE != ret) {
203 /* LCOV_EXCL_START */
204 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
205 ctsvc_end_trans(false);
210 snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_SPEEDDIALS" "
211 "SET number_id = %d WHERE speed_number = %d",
212 speeddial->number_id, speeddial->dial_number);
213 ret = ctsvc_query_prepare(query, &stmt);
215 /* LCOV_EXCL_START */
216 ERR("ctsvc_query_prepare() Fail(%d)", ret);
217 ctsvc_end_trans(false);
222 ret = ctsvc_stmt_step(stmt);
223 if (CONTACTS_ERROR_NONE != ret) {
224 /* LCOV_EXCL_START */
225 ERR("ctsvc_stmt_step() Fail(%d)", ret);
226 ctsvc_stmt_finalize(stmt);
227 ctsvc_end_trans(false);
231 ret = ctsvc_db_change();
232 ctsvc_stmt_finalize(stmt);
235 ctsvc_set_speed_noti();
236 ret = ctsvc_end_trans(true);
238 ctsvc_end_trans(false);
239 ret = CONTACTS_ERROR_NO_DATA;
242 if (ret < CONTACTS_ERROR_NONE)
245 return CONTACTS_ERROR_NONE;
248 static int __ctsvc_db_speeddial_delete_record(int id)
253 char query[CTS_SQL_MIN_LEN] = {0};
255 ret = ctsvc_begin_trans();
256 RETVM_IF(CONTACTS_ERROR_NONE != ret, CONTACTS_ERROR_DB, "ctsvc_begin_trans() Fail(%d)", ret);
258 snprintf(query, sizeof(query),
259 "SELECT speed_number FROM "CTS_TABLE_SPEEDDIALS" WHERE speed_number = %d", id);
260 ret = ctsvc_query_get_first_int_result(query, &speeddial_id);
261 if (CONTACTS_ERROR_NONE != ret) {
262 /* LCOV_EXCL_START */
263 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
264 ctsvc_end_trans(false);
269 snprintf(query, sizeof(query), "DELETE FROM %s WHERE speed_number = %d",
270 CTS_TABLE_SPEEDDIALS, id);
271 ret = ctsvc_query_prepare(query, &stmt);
273 /* LCOV_EXCL_START */
274 ERR("ctsvc_query_prepare() Fail(%d)", ret);
275 ctsvc_end_trans(false);
280 ret = ctsvc_stmt_step(stmt);
281 if (CONTACTS_ERROR_NONE != ret) {
282 /* LCOV_EXCL_START */
283 ERR("ctsvc_stmt_step() Fail(%d)", ret);
284 ctsvc_stmt_finalize(stmt);
285 ctsvc_end_trans(false);
289 ret = ctsvc_db_change();
290 ctsvc_stmt_finalize(stmt);
293 ctsvc_set_speed_noti();
294 ret = ctsvc_end_trans(true);
296 ctsvc_end_trans(false);
297 ret = CONTACTS_ERROR_NO_DATA;
300 if (ret < CONTACTS_ERROR_NONE)
303 return CONTACTS_ERROR_NONE;
306 static int __ctsvc_db_speeddial_get_all_records(int offset, int limit, contacts_list_h *out_list)
311 char query[CTS_SQL_MAX_LEN] = {0};
312 contacts_list_h list;
314 len = snprintf(query, sizeof(query),
315 "SELECT person_id, %s, image_thumbnail_path, number_id, "
316 "type, label, number, speed_number "
317 "FROM "CTSVC_DB_VIEW_SPEEDIDAL " ", ctsvc_get_display_column());
320 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
322 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
325 ret = ctsvc_query_prepare(query, &stmt);
326 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
328 contacts_list_create(&list);
329 while ((ret = ctsvc_stmt_step(stmt))) {
330 contacts_record_h record;
332 /* LCOV_EXCL_START */
333 ERR("ctsvc_stmt_step() Fail(%d)", ret);
334 ctsvc_stmt_finalize(stmt);
335 contacts_list_destroy(list, true);
339 __ctsvc_db_speeddial_value_set(stmt, &record);
341 ctsvc_list_prepend(list, record);
343 ctsvc_stmt_finalize(stmt);
344 ctsvc_list_reverse(list);
346 *out_list = (contacts_list_h)list;
347 return CONTACTS_ERROR_NONE;
350 static int __ctsvc_db_speeddial_get_records_with_query(contacts_query_h query,
351 int offset, int limit, contacts_list_h *out_list)
356 ctsvc_query_s *s_query;
358 contacts_list_h list;
359 ctsvc_speeddial_s *speeddial;
360 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
362 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
363 s_query = (ctsvc_query_s*)query;
365 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
366 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt Fail(%d)", ret);
368 contacts_list_create(&list);
369 while ((ret = ctsvc_stmt_step(stmt))) {
370 contacts_record_h record;
372 /* LCOV_EXCL_START */
373 ERR("ctsvc_stmt_step() Fail(%d)", ret);
374 ctsvc_stmt_finalize(stmt);
375 contacts_list_destroy(list, true);
380 contacts_record_create(_contacts_speeddial._uri, &record);
381 speeddial = (ctsvc_speeddial_s*)record;
382 if (0 == s_query->projection_count) {
383 field_count = s_query->property_count;
385 field_count = s_query->projection_count;
387 int err = ctsvc_record_set_projection_flags(record, s_query->projection,
388 s_query->projection_count, s_query->property_count);
389 if (CONTACTS_ERROR_NONE != err)
390 ASSERT_NOT_REACHED("ctsvc_record_set_projection_flags() Fail(%d)", err);
393 for (i = 0; i < field_count; i++) {
396 if (0 == s_query->projection_count)
397 property_id = s_query->properties[i].property_id;
399 property_id = s_query->projection[i];
401 switch (property_id) {
402 case CTSVC_PROPERTY_SPEEDDIAL_DIAL_NUMBER:
403 speeddial->dial_number = ctsvc_stmt_get_int(stmt, i);
404 speeddial->id = speeddial->dial_number; /* dial_number is an unique key */
406 case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_ID:
407 speeddial->number_id = ctsvc_stmt_get_int(stmt, i);
409 case CTSVC_PROPERTY_SPEEDDIAL_NUMBER:
410 temp = ctsvc_stmt_get_text(stmt, i);
411 free(speeddial->number);
412 speeddial->number = SAFE_STRDUP(temp);
414 case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_LABEL:
415 temp = ctsvc_stmt_get_text(stmt, i);
416 free(speeddial->label);
417 speeddial->label = SAFE_STRDUP(temp);
419 case CTSVC_PROPERTY_SPEEDDIAL_NUMBER_TYPE:
420 speeddial->number_type = ctsvc_stmt_get_int(stmt, i);
422 case CTSVC_PROPERTY_SPEEDDIAL_PERSON_ID:
423 speeddial->person_id = ctsvc_stmt_get_int(stmt, i);
425 case CTSVC_PROPERTY_SPEEDDIAL_DISPLAY_NAME:
426 temp = ctsvc_stmt_get_text(stmt, i);
427 free(speeddial->display_name);
428 speeddial->display_name = SAFE_STRDUP(temp);
430 case CTSVC_PROPERTY_SPEEDDIAL_IMAGE_THUMBNAIL:
431 temp = ctsvc_stmt_get_text(stmt, i);
433 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
434 free(speeddial->image_thumbnail_path);
435 speeddial->image_thumbnail_path = strdup(full_path);
442 ctsvc_list_prepend(list, record);
444 ctsvc_stmt_finalize(stmt);
445 ctsvc_list_reverse(list);
447 *out_list = (contacts_list_h)list;
449 return CONTACTS_ERROR_NONE;
452 ctsvc_db_plugin_info_s ctsvc_db_plugin_speeddial = {
453 .is_query_only = false,
454 .insert_record = __ctsvc_db_speeddial_insert_record,
455 .get_record = __ctsvc_db_speeddial_get_record,
456 .update_record = __ctsvc_db_speeddial_update_record,
457 .delete_record = __ctsvc_db_speeddial_delete_record,
458 .get_all_records = __ctsvc_db_speeddial_get_all_records,
459 .get_records_with_query = __ctsvc_db_speeddial_get_records_with_query,
460 .insert_records = NULL,
461 .update_records = NULL,
462 .delete_records = NULL,
464 .get_count_with_query = NULL,
465 .replace_record = NULL,
466 .replace_records = NULL,