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_image_helper.h"
27 #include "ctsvc_db_plugin_contact_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_image_get_default_image_id(int contact_id)
38 char query[CTS_SQL_MAX_LEN] = {0};
39 snprintf(query, sizeof(query),
40 "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
41 CONTACTS_DATA_TYPE_IMAGE, contact_id);
42 ret = ctsvc_query_get_first_int_result(query, &image_id);
43 if (CONTACTS_ERROR_NONE != ret)
48 static int __ctsvc_db_image_set_primary_default(int image_id, bool is_primary_default)
51 char query[CTS_SQL_MAX_LEN] = {0};
53 snprintf(query, sizeof(query),
54 "UPDATE "CTS_TABLE_DATA" SET is_primary_default = %d WHERE id = %d",
55 is_primary_default, image_id);
56 ret = ctsvc_query_exec(query);
57 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
61 static int __ctsvc_db_image_set_default(int image_id, int contact_id, bool is_default, bool is_primary_default)
64 char query[CTS_SQL_MAX_LEN] = {0};
66 snprintf(query, sizeof(query),
67 "UPDATE "CTS_TABLE_DATA" SET is_default = %d, is_primary_default = %d WHERE id = %d",
68 is_default, is_primary_default, image_id);
69 ret = ctsvc_query_exec(query);
70 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
74 static int __ctsvc_db_image_get_primary_default_image_id(int person_id, int *image_id, char** image_path)
78 char query[CTS_SQL_MAX_LEN] = {0};
80 snprintf(query, sizeof(query),
81 "SELECT id d.data3 FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
82 "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
83 person_id, CONTACTS_DATA_TYPE_IMAGE);
85 ret = ctsvc_query_prepare(query, &stmt);
88 ERR("ctsvc_query_prepare() Fail(%d)", ret);
93 ret = ctsvc_stmt_step(stmt);
96 ERR("ctsvc_stmt_step() Fail(%d)", ret);
97 ctsvc_stmt_finalize(stmt);
98 if (ret == CONTACTS_ERROR_NONE)
99 return CONTACTS_ERROR_NO_DATA;
105 *image_id = ctsvc_stmt_get_int(stmt, 0);
106 *image_path = ctsvc_stmt_get_text(stmt, 1);
107 ctsvc_stmt_finalize(stmt);
109 return CONTACTS_ERROR_NONE;
112 static int __ctsvc_db_image_get_primary_default_contact_id(int person_id)
115 int default_contact_id;
116 char query[CTS_SQL_MAX_LEN] = {0};
118 snprintf(query, sizeof(query),
119 "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
120 "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
121 person_id, CONTACTS_DATA_TYPE_IMAGE);
122 ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
123 if (CONTACTS_ERROR_NONE != ret)
125 return default_contact_id;
128 static int __ctsvc_db_image_update_contact_image(int contact_id, const char *image_thumbnail_path)
131 char query[CTS_SQL_MAX_LEN] = {0};
134 snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_CONTACTS" SET image_thumbnail_path=? WHERE contact_id = %d", contact_id);
136 ret = ctsvc_query_prepare(query, &stmt);
137 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
139 if (image_thumbnail_path)
140 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
142 ret = ctsvc_stmt_step(stmt);
143 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
145 ctsvc_stmt_finalize(stmt);
150 static int __ctsvc_db_image_update_person_image(int person_id, const char *image_thumbnail_path)
153 char query[CTS_SQL_MAX_LEN] = {0};
156 snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id = %d", person_id);
158 ret = ctsvc_query_prepare(query, &stmt);
159 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
161 if (image_thumbnail_path)
162 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
164 ret = ctsvc_stmt_step(stmt);
165 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
167 ctsvc_stmt_finalize(stmt);
172 static int __ctsvc_db_image_insert_record(contacts_record_h record, int *id)
179 int old_default_image_id;
180 char query[CTS_SQL_MAX_LEN] = {0};
181 ctsvc_image_s *image = (ctsvc_image_s*)record;
182 cts_stmt stmt = NULL;
183 char *thumbnail_path = NULL;
185 RETV_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER);
187 ret = ctsvc_begin_trans();
188 if (CONTACTS_ERROR_NONE != ret) {
189 /* LCOV_EXCL_START */
190 ERR("ctsvc_begin_trans() Fail(%d)", ret);
195 snprintf(query, sizeof(query),
196 "SELECT addressbook_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
197 ret = ctsvc_query_prepare(query, &stmt);
199 /* LCOV_EXCL_START */
200 ERR("ctsvc_query_prepare() Fail(%d)", ret);
201 ctsvc_end_trans(false);
206 ret = ctsvc_stmt_step(stmt);
208 /* LCOV_EXCL_START */
209 ERR("ctsvc_stmt_step() Fail(%d)", ret);
210 ctsvc_stmt_finalize(stmt);
211 ctsvc_end_trans(false);
212 if (ret == CONTACTS_ERROR_NONE)
213 return CONTACTS_ERROR_INVALID_PARAMETER;
219 addressbook_id = ctsvc_stmt_get_int(stmt, 0);
220 person_id = ctsvc_stmt_get_int(stmt, 1);
221 ctsvc_stmt_finalize(stmt);
223 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
224 /* LCOV_EXCL_START */
225 ERR("No permission in this addresbook_id(%d)", addressbook_id);
226 ctsvc_end_trans(false);
227 return CONTACTS_ERROR_PERMISSION_DENIED;
231 old_default_image_id = __ctsvc_db_image_get_default_image_id(image->contact_id);
232 if (0 == old_default_image_id)
233 image->is_default = true;
235 ret = ctsvc_db_image_insert(record, image->contact_id, false, id);
236 if (CONTACTS_ERROR_NONE != ret) {
237 /* LCOV_EXCL_START */
238 ERR("ctsvc_begin_trans() Fail(%d)", ret);
239 ctsvc_end_trans(false);
244 version = ctsvc_get_next_ver();
245 len = snprintf(query, sizeof(query),
246 "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d ",
247 version, (int)time(NULL), version);
249 if (image->is_default)
250 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
252 snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
254 ret = ctsvc_query_prepare(query, &stmt);
255 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
257 if (image->is_default) {
258 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
260 ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
262 ret = ctsvc_stmt_step(stmt);
263 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
264 ctsvc_stmt_finalize(stmt);
266 if (image->is_default) {
267 int primary_default_contact_id;
268 __ctsvc_db_image_update_contact_image(image->contact_id, thumbnail_path);
269 primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(person_id);
270 if (primary_default_contact_id == 0 || primary_default_contact_id == image->contact_id) {
271 __ctsvc_db_image_set_primary_default(*id, true);
272 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
275 free(thumbnail_path);
277 ctsvc_set_contact_noti();
278 ctsvc_set_person_noti();
280 ret = ctsvc_end_trans(true);
281 if (ret < CONTACTS_ERROR_NONE) {
282 /* LCOV_EXCL_START */
283 ERR("ctsvc_end_trans() Fail(%d)", ret);
287 return CONTACTS_ERROR_NONE;
291 static int __ctsvc_db_image_get_record(int id, contacts_record_h *out_record)
294 cts_stmt stmt = NULL;
295 char query[CTS_SQL_MAX_LEN] = {0};
297 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
300 snprintf(query, sizeof(query),
301 "SELECT id, data.contact_id, is_default, data1, data2, data3 "
302 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
303 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
304 "WHERE id = %d AND datatype = %d ",
305 id, CONTACTS_DATA_TYPE_IMAGE);
307 ret = ctsvc_query_prepare(query, &stmt);
308 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
310 ret = ctsvc_stmt_step(stmt);
311 if (1 /*CTS_TRUE*/ != ret) {
312 /* LCOV_EXCL_START */
313 ERR("ctsvc_stmt_step() Fail(%d)", ret);
314 ctsvc_stmt_finalize(stmt);
315 if (CONTACTS_ERROR_NONE == ret)
316 return CONTACTS_ERROR_NO_DATA;
322 ctsvc_db_image_get_value_from_stmt(stmt, out_record, 0);
324 ctsvc_stmt_finalize(stmt);
326 return CONTACTS_ERROR_NONE;
329 static int __ctsvc_db_image_update_record(contacts_record_h record)
336 char query[CTS_SQL_MAX_LEN] = {0};
337 ctsvc_image_s *image = (ctsvc_image_s*)record;
338 cts_stmt stmt = NULL;
339 char *thumbnail_path = NULL;
341 RETVM_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER, "path is empty");
343 ret = ctsvc_begin_trans();
344 if (CONTACTS_ERROR_NONE != ret) {
345 /* LCOV_EXCL_START */
346 ERR("ctsvc_begin_trans() Fail(%d)", ret);
351 snprintf(query, sizeof(query),
352 "SELECT addressbook_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
353 ret = ctsvc_query_prepare(query, &stmt);
355 /* LCOV_EXCL_START */
356 ERR("ctsvc_query_prepare() Fail(%d)", ret);
357 ctsvc_end_trans(false);
362 ret = ctsvc_stmt_step(stmt);
364 /* LCOV_EXCL_START */
365 ERR("ctsvc_stmt_step() Fail(%d)", ret);
366 ctsvc_stmt_finalize(stmt);
367 ctsvc_end_trans(false);
368 if (CONTACTS_ERROR_NONE == ret)
369 return CONTACTS_ERROR_NO_DATA;
374 addressbook_id = ctsvc_stmt_get_int(stmt, 0);
375 person_id = ctsvc_stmt_get_int(stmt, 1);
376 ctsvc_stmt_finalize(stmt);
378 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
379 /* LCOV_EXCL_START */
380 ERR("No permission in this addresbook_id(%d)", addressbook_id);
381 ctsvc_end_trans(false);
382 return CONTACTS_ERROR_PERMISSION_DENIED;
386 ret = ctsvc_db_image_update(record, image->contact_id, false);
387 if (CONTACTS_ERROR_NONE != ret) {
388 /* LCOV_EXCL_START */
389 ERR("ctsvc_begin_trans() Fail(%d)", ret);
390 ctsvc_end_trans(false);
395 version = ctsvc_get_next_ver();
396 len = snprintf(query, sizeof(query),
397 "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d ",
398 version, (int)time(NULL), version);
400 if (image->is_default)
401 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
403 snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
405 ret = ctsvc_query_prepare(query, &stmt);
406 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
408 if (image->is_default) {
409 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
410 ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
413 ret = ctsvc_stmt_step(stmt);
414 WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
415 ctsvc_stmt_finalize(stmt);
417 if (image->is_default) {
418 int primary_default_contact_id;
419 __ctsvc_db_image_update_contact_image(image->contact_id, thumbnail_path);
420 primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(person_id);
421 if (primary_default_contact_id == image->contact_id) {
422 __ctsvc_db_image_set_primary_default(image->id, true);
423 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
426 free(thumbnail_path);
428 ctsvc_set_contact_noti();
429 ctsvc_set_person_noti();
431 ret = ctsvc_end_trans(true);
432 if (ret < CONTACTS_ERROR_NONE) {
433 /* LCOV_EXCL_START */
434 ERR("ctsvc_end_trans() Fail(%d)", ret);
438 return CONTACTS_ERROR_NONE;
442 static int __ctsvc_db_image_delete_record(int id)
450 int is_primary_default;
451 char query[CTS_SQL_MAX_LEN] = {0};
452 cts_stmt stmt = NULL;
455 ret = ctsvc_begin_trans();
456 if (CONTACTS_ERROR_NONE != ret) {
457 /* LCOV_EXCL_START */
458 ERR("ctsvc_begin_trans() Fail(%d)", ret);
463 snprintf(query, sizeof(query),
464 "SELECT contact_id, person_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT " "
465 "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
466 ret = ctsvc_query_prepare(query, &stmt);
468 /* LCOV_EXCL_START */
469 ERR("ctsvc_query_prepare() Fail(%d)", ret);
470 ctsvc_end_trans(false);
475 ret = ctsvc_stmt_step(stmt);
476 if (1 /*CTS_TRUE*/ != ret) {
477 ctsvc_stmt_finalize(stmt);
478 ctsvc_end_trans(false);
479 /* LCOV_EXCL_START */
480 ERR("The id(%d) is Invalid(%d)", id, ret);
481 if (CONTACTS_ERROR_NONE == ret)
482 return CONTACTS_ERROR_NO_DATA;
487 contact_id = ctsvc_stmt_get_int(stmt, 0);
488 person_id = ctsvc_stmt_get_int(stmt, 1);
489 addressbook_id = ctsvc_stmt_get_int(stmt, 2);
490 ctsvc_stmt_finalize(stmt);
492 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
493 /* LCOV_EXCL_START */
494 ERR("No permission in this addresbook_id(%d)", addressbook_id);
495 ctsvc_end_trans(false);
496 return CONTACTS_ERROR_PERMISSION_DENIED;
500 snprintf(query, sizeof(query),
501 "SELECT is_default, is_primary_default FROM "CTS_TABLE_DATA" WHERE id = %d", id);
503 ret = ctsvc_query_prepare(query, &stmt);
505 /* LCOV_EXCL_START */
506 ERR("ctsvc_query_prepare() Fail(%d)", ret);
507 ctsvc_end_trans(false);
512 ret = ctsvc_stmt_step(stmt);
514 /* LCOV_EXCL_START */
515 ERR("ctsvc_stmt_step() Fail(%d)", ret);
516 ctsvc_stmt_finalize(stmt);
517 ctsvc_end_trans(false);
518 if (CONTACTS_ERROR_NONE == ret)
519 return CONTACTS_ERROR_NO_DATA;
525 is_default = ctsvc_stmt_get_int(stmt, 0);
526 is_primary_default = ctsvc_stmt_get_int(stmt, 1);
527 ctsvc_stmt_finalize(stmt);
529 ret = ctsvc_db_image_delete(id, false);
531 if (CONTACTS_ERROR_NONE != ret) {
532 /* LCOV_EXCL_START */
533 ERR("ctsvc_begin_trans() Fail(%d)", ret);
534 ctsvc_end_trans(false);
539 version = ctsvc_get_next_ver();
540 snprintf(query, sizeof(query),
541 "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d "
542 "WHERE contact_id = %d",
543 version, (int)time(NULL), version, contact_id);
545 ret = ctsvc_query_exec(query);
546 if (CONTACTS_ERROR_NONE != ret) {
547 /* LCOV_EXCL_START */
548 ERR("ctsvc_query_exec() Fail(%d)", ret);
549 ctsvc_end_trans(false);
555 char *image_path = NULL;
556 char *thumbnail_path = NULL;
558 //TODO : make function
560 snprintf(query, sizeof(query),
561 "SELECT id data3 FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
562 CONTACTS_DATA_TYPE_IMAGE, contact_id);
564 ret = ctsvc_query_prepare(query, &stmt);
566 /* LCOV_EXCL_START */
567 ERR("ctsvc_query_prepare() Fail(%d)", ret);
572 ret = ctsvc_stmt_step(stmt);
574 /* LCOV_EXCL_START */
575 ERR("ctsvc_stmt_step() Fail(%d)", ret);
576 ctsvc_stmt_finalize(stmt);
581 image_id = ctsvc_stmt_get_int(stmt, 0);
582 image_path = ctsvc_stmt_get_text(stmt, 1);
583 ctsvc_stmt_finalize(stmt);
586 if (0 != image_id && NULL != image_path) {
587 __ctsvc_db_image_set_default(image_id, contact_id, is_default, is_primary_default);
588 thumbnail_path = ctsvc_utils_make_thumbnail(image_path);
589 __ctsvc_db_image_update_contact_image(contact_id, thumbnail_path);
591 if (is_primary_default)
592 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
594 __ctsvc_db_image_update_contact_image(contact_id, NULL);
596 if (is_primary_default) {
599 ret = __ctsvc_db_image_get_primary_default_image_id(person_id, &image_id, &image_path);
600 if (CONTACTS_ERROR_NONE == ret && 0 != image_id && NULL != image_path) {
601 __ctsvc_db_image_set_primary_default(image_id, true);
602 thumbnail_path = ctsvc_utils_get_thumbnail_path(image_path);
603 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
605 __ctsvc_db_image_update_person_image(person_id, NULL);
609 free(thumbnail_path);
612 ctsvc_set_contact_noti();
613 ctsvc_set_person_noti();
615 ret = ctsvc_end_trans(true);
616 if (ret < CONTACTS_ERROR_NONE) {
617 /* LCOV_EXCL_START */
618 ERR("ctsvc_end_trans() Fail(%d)", ret);
622 return CONTACTS_ERROR_NONE;
626 static int __ctsvc_db_image_get_all_records(int offset, int limit, contacts_list_h *out_list)
630 contacts_list_h list;
631 ctsvc_image_s *image;
632 cts_stmt stmt = NULL;
633 char query[CTS_SQL_MAX_LEN] = {0};
635 len = snprintf(query, sizeof(query),
636 "SELECT id, data.contact_id, is_default, data1, data2, data3 "
637 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
638 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
639 "WHERE datatype = %d AND is_my_profile=0 ",
640 CONTACTS_DATA_TYPE_IMAGE);
643 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
645 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
648 ret = ctsvc_query_prepare(query, &stmt);
649 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
651 contacts_list_create(&list);
652 while ((ret = ctsvc_stmt_step(stmt))) {
653 if (1 /*CTS_TRUE */ != ret) {
654 /* LCOV_EXCL_START */
655 ERR("DB : ctsvc_stmt_step fail(%d)", ret);
656 ctsvc_stmt_finalize(stmt);
657 contacts_list_destroy(list, true);
661 ctsvc_db_image_get_value_from_stmt(stmt, (contacts_record_h*)&image, 0);
662 ctsvc_list_prepend(list, (contacts_record_h)image);
664 ctsvc_stmt_finalize(stmt);
665 ctsvc_list_reverse(list);
668 return CONTACTS_ERROR_NONE;
671 static int __ctsvc_db_image_get_records_with_query(contacts_query_h query, int offset,
672 int limit, contacts_list_h *out_list)
677 ctsvc_query_s *s_query;
679 contacts_list_h list;
680 ctsvc_image_s *image;
682 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
683 s_query = (ctsvc_query_s*)query;
685 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
686 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
688 contacts_list_create(&list);
689 while ((ret = ctsvc_stmt_step(stmt))) {
690 contacts_record_h record;
691 if (1 /*CTS_TRUE */ != ret) {
692 /* LCOV_EXCL_START */
693 ERR("ctsvc_stmt_step() Fail(%d)", ret);
694 ctsvc_stmt_finalize(stmt);
695 contacts_list_destroy(list, true);
700 contacts_record_create(_contacts_image._uri, &record);
701 image = (ctsvc_image_s*)record;
702 if (0 == s_query->projection_count) {
703 field_count = s_query->property_count;
705 field_count = s_query->projection_count;
706 ret = ctsvc_record_set_projection_flags(record, s_query->projection,
707 s_query->projection_count, s_query->property_count);
709 if (CONTACTS_ERROR_NONE != ret)
710 ASSERT_NOT_REACHED("To set projection is Fail.\n");
713 for (i = 0; i < field_count; i++) {
716 if (0 == s_query->projection_count)
717 property_id = s_query->properties[i].property_id;
719 property_id = s_query->projection[i];
721 switch (property_id) {
722 case CTSVC_PROPERTY_IMAGE_ID:
723 image->id = ctsvc_stmt_get_int(stmt, i);
725 case CTSVC_PROPERTY_IMAGE_CONTACT_ID:
726 image->contact_id = ctsvc_stmt_get_int(stmt, i);
728 case CTSVC_PROPERTY_IMAGE_TYPE:
729 image->type = ctsvc_stmt_get_int(stmt, i);
731 case CTSVC_PROPERTY_IMAGE_LABEL:
732 temp = ctsvc_stmt_get_text(stmt, i);
734 image->label = SAFE_STRDUP(temp);
736 case CTSVC_PROPERTY_IMAGE_PATH:
737 temp = ctsvc_stmt_get_text(stmt, i);
739 image->path = SAFE_STRDUP(temp);
741 case CTSVC_PROPERTY_IMAGE_IS_DEFAULT:
742 image->is_default = ctsvc_stmt_get_int(stmt, i);
748 ctsvc_list_prepend(list, record);
750 ctsvc_stmt_finalize(stmt);
751 ctsvc_list_reverse(list);
754 return CONTACTS_ERROR_NONE;
757 ctsvc_db_plugin_info_s ctsvc_db_plugin_image = {
758 .is_query_only = false,
759 .insert_record = __ctsvc_db_image_insert_record,
760 .get_record = __ctsvc_db_image_get_record,
761 .update_record = __ctsvc_db_image_update_record,
762 .delete_record = __ctsvc_db_image_delete_record,
763 .get_all_records = __ctsvc_db_image_get_all_records,
764 .get_records_with_query = __ctsvc_db_image_get_records_with_query,
765 .insert_records = NULL,
766 .update_records = NULL,
767 .delete_records = NULL,
769 .get_count_with_query = NULL,
770 .replace_record = NULL,
771 .replace_records = NULL,