fix the issue that returns image file name not path
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_image.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_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"
32 #include "ctsvc_notify.h"
33
34
35 static int __ctsvc_db_image_get_default_image_id(int contact_id)
36 {
37         int ret;
38         int image_id = 0;
39         char query[CTS_SQL_MAX_LEN] = {0};
40         snprintf(query, sizeof(query),
41                         "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
42                         CONTACTS_DATA_TYPE_IMAGE, contact_id);
43         ret = ctsvc_query_get_first_int_result(query, &image_id);
44         if (CONTACTS_ERROR_NONE != ret)
45                 return 0;
46         return image_id;
47 }
48
49 static int __ctsvc_db_image_set_primary_default(int image_id, bool is_primary_default)
50 {
51         int ret;
52         char query[CTS_SQL_MAX_LEN] = {0};
53
54         snprintf(query, sizeof(query),
55                         "UPDATE "CTS_TABLE_DATA" SET is_primary_default = %d WHERE id = %d",
56                         is_primary_default, image_id);
57         ret = ctsvc_query_exec(query);
58         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
59         return ret;
60 }
61
62 static int __ctsvc_db_image_set_default(int image_id, int contact_id, bool is_default, bool is_primary_default)
63 {
64         int ret;
65         char query[CTS_SQL_MAX_LEN] = {0};
66
67         snprintf(query, sizeof(query),
68                         "UPDATE "CTS_TABLE_DATA" SET is_default = %d, is_primary_default = %d WHERE id = %d",
69                         is_default, is_primary_default, image_id);
70         ret = ctsvc_query_exec(query);
71         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
72         return ret;
73 }
74
75 static int __ctsvc_db_image_get_primary_default_image_id(int person_id, int *image_id, char** image_path)
76 {
77         int ret;
78         cts_stmt stmt;
79         char query[CTS_SQL_MAX_LEN] = {0};
80
81         snprintf(query, sizeof(query),
82                         "SELECT id d.data3 FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
83                         "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
84                         person_id, CONTACTS_DATA_TYPE_IMAGE);
85
86         ret = ctsvc_query_prepare(query, &stmt);
87         if (NULL == stmt) {
88                 /* LCOV_EXCL_START */
89                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
90                 return ret;
91                 /* LCOV_EXCL_STOP */
92         }
93
94         ret = ctsvc_stmt_step(stmt);
95         if (1 != ret) {
96                 /* LCOV_EXCL_START */
97                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
98                 ctsvc_stmt_finalize(stmt);
99                 if (ret == CONTACTS_ERROR_NONE)
100                         return CONTACTS_ERROR_NO_DATA;
101                 else
102                         return ret;
103                 /* LCOV_EXCL_STOP */
104         }
105
106         *image_id = ctsvc_stmt_get_int(stmt, 0);
107         *image_path = ctsvc_stmt_get_text(stmt, 1);
108         ctsvc_stmt_finalize(stmt);
109
110         return CONTACTS_ERROR_NONE;
111 }
112
113 static int __ctsvc_db_image_get_primary_default_contact_id(int person_id)
114 {
115         int ret;
116         int default_contact_id;
117         char query[CTS_SQL_MAX_LEN] = {0};
118
119         snprintf(query, sizeof(query),
120                         "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
121                         "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
122                         person_id, CONTACTS_DATA_TYPE_IMAGE);
123         ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
124         if (CONTACTS_ERROR_NONE != ret)
125                 return 0;
126         return default_contact_id;
127 }
128
129 static int __ctsvc_db_image_update_contact_image(int contact_id, const char *image_thumbnail_path)
130 {
131         int ret;
132         char query[CTS_SQL_MAX_LEN] = {0};
133         cts_stmt stmt;
134
135         snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_CONTACTS" SET image_thumbnail_path=? WHERE contact_id = %d", contact_id);
136
137         ret = ctsvc_query_prepare(query, &stmt);
138         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
139
140         if (image_thumbnail_path)
141                 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
142
143         ret = ctsvc_stmt_step(stmt);
144         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
145
146         ctsvc_stmt_finalize(stmt);
147
148         return ret;
149 }
150
151 static int __ctsvc_db_image_update_person_image(int person_id, const char *image_thumbnail_path)
152 {
153         int ret;
154         char query[CTS_SQL_MAX_LEN] = {0};
155         cts_stmt stmt;
156
157         snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id = %d", person_id);
158
159         ret = ctsvc_query_prepare(query, &stmt);
160         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
161
162         if (image_thumbnail_path)
163                 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
164
165         ret = ctsvc_stmt_step(stmt);
166         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
167
168         ctsvc_stmt_finalize(stmt);
169
170         return ret;
171 }
172
173 static int __ctsvc_db_image_insert_record(contacts_record_h record, int *id)
174 {
175         int len = 0;
176         int ret;
177         int version;
178         int addressbook_id;
179         int person_id;
180         int old_default_image_id;
181         char query[CTS_SQL_MAX_LEN] = {0};
182         ctsvc_image_s *image = (ctsvc_image_s*)record;
183         cts_stmt stmt = NULL;
184         char *thumbnail_path = NULL;
185
186         RETV_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER);
187
188         ret = ctsvc_begin_trans();
189         if (CONTACTS_ERROR_NONE != ret) {
190                 /* LCOV_EXCL_START */
191                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
192                 return ret;
193                 /* LCOV_EXCL_STOP */
194         }
195
196         snprintf(query, sizeof(query),
197                         "SELECT addressbook_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
198         ret = ctsvc_query_prepare(query, &stmt);
199         if (NULL == stmt) {
200                 /* LCOV_EXCL_START */
201                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
202                 ctsvc_end_trans(false);
203                 return ret;
204                 /* LCOV_EXCL_STOP */
205         }
206
207         ret = ctsvc_stmt_step(stmt);
208         if (1 != ret) {
209                 /* LCOV_EXCL_START */
210                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
211                 ctsvc_stmt_finalize(stmt);
212                 ctsvc_end_trans(false);
213                 if (ret == CONTACTS_ERROR_NONE)
214                         return CONTACTS_ERROR_INVALID_PARAMETER;
215                 else
216                         return ret;
217                 /* LCOV_EXCL_STOP */
218         }
219
220         addressbook_id = ctsvc_stmt_get_int(stmt, 0);
221         person_id = ctsvc_stmt_get_int(stmt, 1);
222         ctsvc_stmt_finalize(stmt);
223
224         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
225                 /* LCOV_EXCL_START */
226                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
227                 ctsvc_end_trans(false);
228                 return CONTACTS_ERROR_PERMISSION_DENIED;
229                 /* LCOV_EXCL_STOP */
230         }
231
232         old_default_image_id = __ctsvc_db_image_get_default_image_id(image->contact_id);
233         if (0 == old_default_image_id)
234                 image->is_default = true;
235
236         ret = ctsvc_db_image_insert(record, image->contact_id, false, id);
237         if (CONTACTS_ERROR_NONE != ret) {
238                 /* LCOV_EXCL_START */
239                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
240                 ctsvc_end_trans(false);
241                 return ret;
242                 /* LCOV_EXCL_STOP */
243         }
244
245         version = ctsvc_get_next_ver();
246         len = snprintf(query, sizeof(query),
247                         "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d ",
248                         version, (int)time(NULL), version);
249
250         if (image->is_default)
251                 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
252
253         snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
254
255         ret = ctsvc_query_prepare(query, &stmt);
256         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
257
258         if (image->is_default) {
259                 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
260                 if (thumbnail_path)
261                         ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
262         }
263         ret = ctsvc_stmt_step(stmt);
264         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
265         ctsvc_stmt_finalize(stmt);
266
267         if (image->is_default) {
268                 int primary_default_contact_id;
269                 __ctsvc_db_image_update_contact_image(image->contact_id, thumbnail_path);
270                 primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(person_id);
271                 if (primary_default_contact_id == 0 || primary_default_contact_id == image->contact_id) {
272                         __ctsvc_db_image_set_primary_default(*id, true);
273                         __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
274                 }
275         }
276         free(thumbnail_path);
277
278         ctsvc_set_contact_noti();
279         ctsvc_set_person_noti();
280
281         ret = ctsvc_end_trans(true);
282         if (ret < CONTACTS_ERROR_NONE) {
283                 /* LCOV_EXCL_START */
284                 ERR("ctsvc_end_trans() Fail(%d)", ret);
285                 return ret;
286                 /* LCOV_EXCL_STOP */
287         } else {
288                 return CONTACTS_ERROR_NONE;
289         }
290 }
291
292 static int __ctsvc_db_image_get_record(int id, contacts_record_h *out_record)
293 {
294         int ret;
295         cts_stmt stmt = NULL;
296         char query[CTS_SQL_MAX_LEN] = {0};
297
298         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
299         *out_record = NULL;
300
301         snprintf(query, sizeof(query),
302                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
303                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
304                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
305                         "WHERE id = %d AND datatype = %d ",
306                         id, CONTACTS_DATA_TYPE_IMAGE);
307
308         ret = ctsvc_query_prepare(query, &stmt);
309         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
310
311         ret = ctsvc_stmt_step(stmt);
312         if (1 /*CTS_TRUE*/ != ret) {
313                 /* LCOV_EXCL_START */
314                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
315                 ctsvc_stmt_finalize(stmt);
316                 if (CONTACTS_ERROR_NONE == ret)
317                         return CONTACTS_ERROR_NO_DATA;
318                 else
319                         return ret;
320                 /* LCOV_EXCL_STOP */
321         }
322
323         ctsvc_db_image_get_value_from_stmt(stmt, out_record, 0);
324
325         ctsvc_stmt_finalize(stmt);
326
327         return CONTACTS_ERROR_NONE;
328 }
329
330 static int __ctsvc_db_image_update_record(contacts_record_h record)
331 {
332         int len = 0;
333         int ret;
334         int version;
335         int person_id;
336         int addressbook_id;
337         char query[CTS_SQL_MAX_LEN] = {0};
338         ctsvc_image_s *image = (ctsvc_image_s*)record;
339         cts_stmt stmt = NULL;
340         char *thumbnail_path = NULL;
341
342         RETVM_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER, "path is empty");
343
344         ret = ctsvc_begin_trans();
345         if (CONTACTS_ERROR_NONE != ret) {
346                 /* LCOV_EXCL_START */
347                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
348                 return ret;
349                 /* LCOV_EXCL_STOP */
350         }
351
352         snprintf(query, sizeof(query),
353                         "SELECT addressbook_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", image->contact_id);
354         ret = ctsvc_query_prepare(query, &stmt);
355         if (NULL == stmt) {
356                 /* LCOV_EXCL_START */
357                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
358                 ctsvc_end_trans(false);
359                 return ret;
360                 /* LCOV_EXCL_STOP */
361         }
362
363         ret = ctsvc_stmt_step(stmt);
364         if (1 != ret) {
365                 /* LCOV_EXCL_START */
366                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
367                 ctsvc_stmt_finalize(stmt);
368                 ctsvc_end_trans(false);
369                 if (CONTACTS_ERROR_NONE == ret)
370                         return CONTACTS_ERROR_NO_DATA;
371                 else
372                         return ret;
373                 /* LCOV_EXCL_STOP */
374         }
375         addressbook_id = ctsvc_stmt_get_int(stmt, 0);
376         person_id = ctsvc_stmt_get_int(stmt, 1);
377         ctsvc_stmt_finalize(stmt);
378
379         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
380                 /* LCOV_EXCL_START */
381                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
382                 ctsvc_end_trans(false);
383                 return CONTACTS_ERROR_PERMISSION_DENIED;
384                 /* LCOV_EXCL_STOP */
385         }
386
387         ret = ctsvc_db_image_update(record, image->contact_id, false);
388         if (CONTACTS_ERROR_NONE != ret) {
389                 /* LCOV_EXCL_START */
390                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
391                 ctsvc_end_trans(false);
392                 return ret;
393                 /* LCOV_EXCL_STOP */
394         }
395
396         version = ctsvc_get_next_ver();
397         len = snprintf(query, sizeof(query),
398                         "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d ",
399                         version, (int)time(NULL), version);
400
401         if (image->is_default)
402                 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
403
404         snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
405
406         ret = ctsvc_query_prepare(query, &stmt);
407         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
408
409         if (image->is_default) {
410                 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
411                 ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
412         }
413
414         ret = ctsvc_stmt_step(stmt);
415         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
416         ctsvc_stmt_finalize(stmt);
417
418         if (image->is_default) {
419                 int primary_default_contact_id;
420                 __ctsvc_db_image_update_contact_image(image->contact_id, thumbnail_path);
421                 primary_default_contact_id = __ctsvc_db_image_get_primary_default_contact_id(person_id);
422                 if (primary_default_contact_id == image->contact_id) {
423                         __ctsvc_db_image_set_primary_default(image->id, true);
424                         __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
425                 }
426         }
427         free(thumbnail_path);
428
429         ctsvc_set_contact_noti();
430         ctsvc_set_person_noti();
431
432         ret = ctsvc_end_trans(true);
433         if (ret < CONTACTS_ERROR_NONE) {
434                 /* LCOV_EXCL_START */
435                 ERR("ctsvc_end_trans() Fail(%d)", ret);
436                 return ret;
437                 /* LCOV_EXCL_STOP */
438         } else {
439                 return CONTACTS_ERROR_NONE;
440         }
441 }
442
443 static int __ctsvc_db_image_delete_record(int id)
444 {
445         int ret;
446         int version;
447         int image_id = 0;
448         int contact_id;
449         int person_id;
450         int is_default;
451         int is_primary_default;
452         char query[CTS_SQL_MAX_LEN] = {0};
453         cts_stmt stmt = NULL;
454         int addressbook_id;
455
456         ret = ctsvc_begin_trans();
457         if (CONTACTS_ERROR_NONE != ret) {
458                 /* LCOV_EXCL_START */
459                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
460                 return ret;
461                 /* LCOV_EXCL_STOP */
462         }
463
464         snprintf(query, sizeof(query),
465                         "SELECT contact_id, person_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT " "
466                         "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
467         ret = ctsvc_query_prepare(query, &stmt);
468         if (NULL == stmt) {
469                 /* LCOV_EXCL_START */
470                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
471                 ctsvc_end_trans(false);
472                 return ret;
473                 /* LCOV_EXCL_STOP */
474         }
475
476         ret = ctsvc_stmt_step(stmt);
477         if (1 /*CTS_TRUE*/ != ret) {
478                 ctsvc_stmt_finalize(stmt);
479                 ctsvc_end_trans(false);
480                 /* LCOV_EXCL_START */
481                 ERR("The id(%d) is Invalid(%d)", id, ret);
482                 if (CONTACTS_ERROR_NONE == ret)
483                         return CONTACTS_ERROR_NO_DATA;
484                 else
485                         return ret;
486                 /* LCOV_EXCL_STOP */
487         }
488         contact_id = ctsvc_stmt_get_int(stmt, 0);
489         person_id = ctsvc_stmt_get_int(stmt, 1);
490         addressbook_id = ctsvc_stmt_get_int(stmt, 2);
491         ctsvc_stmt_finalize(stmt);
492
493         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
494                 /* LCOV_EXCL_START */
495                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
496                 ctsvc_end_trans(false);
497                 return CONTACTS_ERROR_PERMISSION_DENIED;
498                 /* LCOV_EXCL_STOP */
499         }
500
501         snprintf(query, sizeof(query),
502                         "SELECT is_default, is_primary_default FROM "CTS_TABLE_DATA" WHERE id = %d", id);
503
504         ret = ctsvc_query_prepare(query, &stmt);
505         if (NULL == stmt) {
506                 /* LCOV_EXCL_START */
507                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
508                 ctsvc_end_trans(false);
509                 return ret;
510                 /* LCOV_EXCL_STOP */
511         }
512
513         ret = ctsvc_stmt_step(stmt);
514         if (1 != ret) {
515                 /* LCOV_EXCL_START */
516                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
517                 ctsvc_stmt_finalize(stmt);
518                 ctsvc_end_trans(false);
519                 if (CONTACTS_ERROR_NONE == ret)
520                         return CONTACTS_ERROR_NO_DATA;
521                 else
522                         return ret;
523                 /* LCOV_EXCL_STOP */
524         }
525
526         is_default = ctsvc_stmt_get_int(stmt, 0);
527         is_primary_default = ctsvc_stmt_get_int(stmt, 1);
528         ctsvc_stmt_finalize(stmt);
529
530         ret = ctsvc_db_image_delete(id, false);
531
532         if (CONTACTS_ERROR_NONE != ret) {
533                 /* LCOV_EXCL_START */
534                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
535                 ctsvc_end_trans(false);
536                 return ret;
537                 /* LCOV_EXCL_STOP */
538         }
539
540         version = ctsvc_get_next_ver();
541         snprintf(query, sizeof(query),
542                         "UPDATE "CTS_TABLE_CONTACTS" SET changed_ver = %d, changed_time = %d, image_changed_ver = %d "
543                         "WHERE contact_id = %d",
544                         version, (int)time(NULL), version, contact_id);
545
546         ret = ctsvc_query_exec(query);
547         if (CONTACTS_ERROR_NONE != ret) {
548                 /* LCOV_EXCL_START */
549                 ERR("ctsvc_query_exec() Fail(%d)", ret);
550                 ctsvc_end_trans(false);
551                 return ret;
552                 /* LCOV_EXCL_STOP */
553         }
554
555         if (is_default) {
556                 char *image_path = NULL;
557                 char *thumbnail_path = NULL;
558
559                 //TODO : make function
560                 do {
561                         snprintf(query, sizeof(query),
562                                         "SELECT id data3 FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
563                                         CONTACTS_DATA_TYPE_IMAGE, contact_id);
564
565                         ret = ctsvc_query_prepare(query, &stmt);
566                         if (NULL == stmt) {
567                                 /* LCOV_EXCL_START */
568                                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
569                                 break;
570                                 /* LCOV_EXCL_STOP */
571                         }
572
573                         ret = ctsvc_stmt_step(stmt);
574                         if (1 != ret) {
575                                 /* LCOV_EXCL_START */
576                                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
577                                 ctsvc_stmt_finalize(stmt);
578                                 break;
579                                 /* LCOV_EXCL_STOP */
580                         }
581
582                         image_id = ctsvc_stmt_get_int(stmt, 0);
583                         image_path = ctsvc_stmt_get_text(stmt, 1);
584                         ctsvc_stmt_finalize(stmt);
585                 }  while (0);
586
587                 if (0 != image_id && NULL != image_path) {
588                         __ctsvc_db_image_set_default(image_id, contact_id, is_default, is_primary_default);
589                         thumbnail_path = ctsvc_utils_make_thumbnail(image_path);
590                         __ctsvc_db_image_update_contact_image(contact_id, thumbnail_path);
591
592                         if (is_primary_default)
593                                 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
594                 } else {
595                         __ctsvc_db_image_update_contact_image(contact_id, NULL);
596
597                         if (is_primary_default) {
598                                 image_id = 0;
599                                 image_path = NULL;
600                                 ret = __ctsvc_db_image_get_primary_default_image_id(person_id, &image_id, &image_path);
601                                 if (CONTACTS_ERROR_NONE == ret && 0 != image_id && NULL != image_path) {
602                                         __ctsvc_db_image_set_primary_default(image_id, true);
603                                         thumbnail_path = ctsvc_utils_get_thumbnail_path(image_path, TRUE);
604                                         __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
605                                 } else {
606                                         __ctsvc_db_image_update_person_image(person_id, NULL);
607                                 }
608                         }
609                 }
610                 free(thumbnail_path);
611         }
612
613         ctsvc_set_contact_noti();
614         ctsvc_set_person_noti();
615
616         ret = ctsvc_end_trans(true);
617         if (ret < CONTACTS_ERROR_NONE) {
618                 /* LCOV_EXCL_START */
619                 ERR("ctsvc_end_trans() Fail(%d)", ret);
620                 return ret;
621                 /* LCOV_EXCL_STOP */
622         } else {
623                 return CONTACTS_ERROR_NONE;
624         }
625 }
626
627 static int __ctsvc_db_image_get_all_records(int offset, int limit, contacts_list_h *out_list)
628 {
629         int len;
630         int ret;
631         contacts_list_h list;
632         ctsvc_image_s *image;
633         cts_stmt stmt = NULL;
634         char query[CTS_SQL_MAX_LEN] = {0};
635
636         len = snprintf(query, sizeof(query),
637                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
638                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
639                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
640                         "WHERE datatype = %d AND is_my_profile=0 ",
641                         CONTACTS_DATA_TYPE_IMAGE);
642
643         if (0 != limit) {
644                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
645                 if (0 < offset)
646                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
647         }
648
649         ret = ctsvc_query_prepare(query, &stmt);
650         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
651
652         contacts_list_create(&list);
653         while ((ret = ctsvc_stmt_step(stmt))) {
654                 if (1 /*CTS_TRUE */ != ret) {
655                         /* LCOV_EXCL_START */
656                         ERR("DB : ctsvc_stmt_step fail(%d)", ret);
657                         ctsvc_stmt_finalize(stmt);
658                         contacts_list_destroy(list, true);
659                         return ret;
660                         /* LCOV_EXCL_STOP */
661                 }
662                 ctsvc_db_image_get_value_from_stmt(stmt, (contacts_record_h*)&image, 0);
663                 ctsvc_list_prepend(list, (contacts_record_h)image);
664         }
665         ctsvc_stmt_finalize(stmt);
666         ctsvc_list_reverse(list);
667
668         *out_list = list;
669         return CONTACTS_ERROR_NONE;
670 }
671
672 static int __ctsvc_db_image_get_records_with_query(contacts_query_h query, int offset,
673                 int limit, contacts_list_h *out_list)
674 {
675         int ret;
676         int i;
677         int field_count;
678         ctsvc_query_s *s_query;
679         cts_stmt stmt;
680         contacts_list_h list;
681         ctsvc_image_s *image;
682
683         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
684         s_query = (ctsvc_query_s*)query;
685
686         ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
687         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
688
689         contacts_list_create(&list);
690         while ((ret = ctsvc_stmt_step(stmt))) {
691                 contacts_record_h record;
692                 if (1 /*CTS_TRUE */ != ret) {
693                         /* LCOV_EXCL_START */
694                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
695                         ctsvc_stmt_finalize(stmt);
696                         contacts_list_destroy(list, true);
697                         return ret;
698                         /* LCOV_EXCL_STOP */
699                 }
700
701                 contacts_record_create(_contacts_image._uri, &record);
702                 image = (ctsvc_image_s*)record;
703                 if (0 == s_query->projection_count) {
704                         field_count = s_query->property_count;
705                 } else {
706                         field_count = s_query->projection_count;
707                         ret = ctsvc_record_set_projection_flags(record, s_query->projection,
708                                         s_query->projection_count, s_query->property_count);
709
710                         if (CONTACTS_ERROR_NONE != ret)
711                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
712                 }
713
714                 for (i = 0; i < field_count; i++) {
715                         char *temp;
716                         int property_id;
717                         if (0 == s_query->projection_count)
718                                 property_id = s_query->properties[i].property_id;
719                         else
720                                 property_id = s_query->projection[i];
721
722                         switch (property_id) {
723                         case CTSVC_PROPERTY_IMAGE_ID:
724                                 image->id = ctsvc_stmt_get_int(stmt, i);
725                                 break;
726                         case CTSVC_PROPERTY_IMAGE_CONTACT_ID:
727                                 image->contact_id = ctsvc_stmt_get_int(stmt, i);
728                                 break;
729                         case CTSVC_PROPERTY_IMAGE_TYPE:
730                                 image->type = ctsvc_stmt_get_int(stmt, i);
731                                 break;
732                         case CTSVC_PROPERTY_IMAGE_LABEL:
733                                 temp = ctsvc_stmt_get_text(stmt, i);
734                                 free(image->label);
735                                 image->label = SAFE_STRDUP(temp);
736                                 break;
737                         case CTSVC_PROPERTY_IMAGE_PATH:
738                                 temp = ctsvc_stmt_get_text(stmt, i);
739                                 if (temp) {
740                                         char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
741                                         snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
742                                         free(image->path);
743                                         image->path = strdup(full_path);
744                                 }
745                                 break;
746                         case CTSVC_PROPERTY_IMAGE_IS_DEFAULT:
747                                 image->is_default = ctsvc_stmt_get_int(stmt, i);
748                                 break;
749                         default:
750                                 break;
751                         }
752                 }
753                 ctsvc_list_prepend(list, record);
754         }
755         ctsvc_stmt_finalize(stmt);
756         ctsvc_list_reverse(list);
757
758         *out_list = list;
759         return CONTACTS_ERROR_NONE;
760 }
761
762 ctsvc_db_plugin_info_s ctsvc_db_plugin_image = {
763         .is_query_only = false,
764         .insert_record = __ctsvc_db_image_insert_record,
765         .get_record = __ctsvc_db_image_get_record,
766         .update_record = __ctsvc_db_image_update_record,
767         .delete_record = __ctsvc_db_image_delete_record,
768         .get_all_records = __ctsvc_db_image_get_all_records,
769         .get_records_with_query = __ctsvc_db_image_get_records_with_query,
770         .insert_records = NULL,
771         .update_records = NULL,
772         .delete_records = NULL,
773         .get_count = NULL,
774         .get_count_with_query = NULL,
775         .replace_record = NULL,
776         .replace_records = NULL,
777 };
778