7247d5751084dccc592700c42fff99d7b59080ad
[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
33
34 static int __ctsvc_db_image_get_default_image_id(int contact_id)
35 {
36         int ret;
37         int image_id = 0;
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)
44                 return 0;
45         return image_id;
46 }
47
48 static int __ctsvc_db_image_set_primary_default(int image_id, bool is_primary_default)
49 {
50         int ret;
51         char query[CTS_SQL_MAX_LEN] = {0};
52
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);
58         return ret;
59 }
60
61 static int __ctsvc_db_image_set_default(int image_id, int contact_id, bool is_default, bool is_primary_default)
62 {
63         int ret;
64         char query[CTS_SQL_MAX_LEN] = {0};
65
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);
71         return ret;
72 }
73
74 static int __ctsvc_db_image_get_primary_default_image_id(int person_id, int *image_id, char** image_path)
75 {
76         int ret;
77         cts_stmt stmt;
78         char query[CTS_SQL_MAX_LEN] = {0};
79
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);
84
85         ret = ctsvc_query_prepare(query, &stmt);
86         if (NULL == stmt) {
87                 /* LCOV_EXCL_START */
88                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
89                 return ret;
90                 /* LCOV_EXCL_STOP */
91         }
92
93         ret = ctsvc_stmt_step(stmt);
94         if (1 != ret) {
95                 /* LCOV_EXCL_START */
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;
100                 else
101                         return ret;
102                 /* LCOV_EXCL_STOP */
103         }
104
105         *image_id = ctsvc_stmt_get_int(stmt, 0);
106         *image_path = ctsvc_stmt_get_text(stmt, 1);
107         ctsvc_stmt_finalize(stmt);
108
109         return CONTACTS_ERROR_NONE;
110 }
111
112 static int __ctsvc_db_image_get_primary_default_contact_id(int person_id)
113 {
114         int ret;
115         int default_contact_id;
116         char query[CTS_SQL_MAX_LEN] = {0};
117
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)
124                 return 0;
125         return default_contact_id;
126 }
127
128 static int __ctsvc_db_image_update_contact_image(int contact_id, const char *image_thumbnail_path)
129 {
130         int ret;
131         char query[CTS_SQL_MAX_LEN] = {0};
132         cts_stmt stmt;
133
134         snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_CONTACTS" SET image_thumbnail_path=? WHERE contact_id = %d", contact_id);
135
136         ret = ctsvc_query_prepare(query, &stmt);
137         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
138
139         if (image_thumbnail_path)
140                 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
141
142         ret = ctsvc_stmt_step(stmt);
143         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
144
145         ctsvc_stmt_finalize(stmt);
146
147         return ret;
148 }
149
150 static int __ctsvc_db_image_update_person_image(int person_id, const char *image_thumbnail_path)
151 {
152         int ret;
153         char query[CTS_SQL_MAX_LEN] = {0};
154         cts_stmt stmt;
155
156         snprintf(query, sizeof(query), "UPDATE "CTS_TABLE_PERSONS" SET image_thumbnail_path=? WHERE person_id = %d", person_id);
157
158         ret = ctsvc_query_prepare(query, &stmt);
159         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
160
161         if (image_thumbnail_path)
162                 ctsvc_stmt_bind_text(stmt, 1, image_thumbnail_path);
163
164         ret = ctsvc_stmt_step(stmt);
165         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
166
167         ctsvc_stmt_finalize(stmt);
168
169         return ret;
170 }
171
172 static int __ctsvc_db_image_insert_record(contacts_record_h record, int *id)
173 {
174         int len = 0;
175         int ret;
176         int version;
177         int addressbook_id;
178         int person_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;
184
185         RETV_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER);
186
187         ret = ctsvc_begin_trans();
188         if (CONTACTS_ERROR_NONE != ret) {
189                 /* LCOV_EXCL_START */
190                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
191                 return ret;
192                 /* LCOV_EXCL_STOP */
193         }
194
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);
198         if (NULL == stmt) {
199                 /* LCOV_EXCL_START */
200                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
201                 ctsvc_end_trans(false);
202                 return ret;
203                 /* LCOV_EXCL_STOP */
204         }
205
206         ret = ctsvc_stmt_step(stmt);
207         if (1 != ret) {
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;
214                 else
215                         return ret;
216                 /* LCOV_EXCL_STOP */
217         }
218
219         addressbook_id = ctsvc_stmt_get_int(stmt, 0);
220         person_id = ctsvc_stmt_get_int(stmt, 1);
221         ctsvc_stmt_finalize(stmt);
222
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;
228                 /* LCOV_EXCL_STOP */
229         }
230
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;
234
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);
240                 return ret;
241                 /* LCOV_EXCL_STOP */
242         }
243
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);
248
249         if (image->is_default)
250                 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
251
252         snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
253
254         ret = ctsvc_query_prepare(query, &stmt);
255         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
256
257         if (image->is_default) {
258                 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
259                 if (thumbnail_path)
260                         ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
261         }
262         ret = ctsvc_stmt_step(stmt);
263         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
264         ctsvc_stmt_finalize(stmt);
265
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);
273                 }
274         }
275         free(thumbnail_path);
276
277         ctsvc_set_contact_noti();
278         ctsvc_set_person_noti();
279
280         ret = ctsvc_end_trans(true);
281         if (ret < CONTACTS_ERROR_NONE) {
282                 /* LCOV_EXCL_START */
283                 ERR("ctsvc_end_trans() Fail(%d)", ret);
284                 return ret;
285                 /* LCOV_EXCL_STOP */
286         } else {
287                 return CONTACTS_ERROR_NONE;
288         }
289 }
290
291 static int __ctsvc_db_image_get_record(int id, contacts_record_h *out_record)
292 {
293         int ret;
294         cts_stmt stmt = NULL;
295         char query[CTS_SQL_MAX_LEN] = {0};
296
297         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
298         *out_record = NULL;
299
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);
306
307         ret = ctsvc_query_prepare(query, &stmt);
308         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
309
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;
317                 else
318                         return ret;
319                 /* LCOV_EXCL_STOP */
320         }
321
322         ctsvc_db_image_get_value_from_stmt(stmt, out_record, 0);
323
324         ctsvc_stmt_finalize(stmt);
325
326         return CONTACTS_ERROR_NONE;
327 }
328
329 static int __ctsvc_db_image_update_record(contacts_record_h record)
330 {
331         int len = 0;
332         int ret;
333         int version;
334         int person_id;
335         int addressbook_id;
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;
340
341         RETVM_IF(NULL == image->path, CONTACTS_ERROR_INVALID_PARAMETER, "path is empty");
342
343         ret = ctsvc_begin_trans();
344         if (CONTACTS_ERROR_NONE != ret) {
345                 /* LCOV_EXCL_START */
346                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
347                 return ret;
348                 /* LCOV_EXCL_STOP */
349         }
350
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);
354         if (NULL == stmt) {
355                 /* LCOV_EXCL_START */
356                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
357                 ctsvc_end_trans(false);
358                 return ret;
359                 /* LCOV_EXCL_STOP */
360         }
361
362         ret = ctsvc_stmt_step(stmt);
363         if (1 != ret) {
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;
370                 else
371                         return ret;
372                 /* LCOV_EXCL_STOP */
373         }
374         addressbook_id = ctsvc_stmt_get_int(stmt, 0);
375         person_id = ctsvc_stmt_get_int(stmt, 1);
376         ctsvc_stmt_finalize(stmt);
377
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;
383                 /* LCOV_EXCL_STOP */
384         }
385
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);
391                 return ret;
392                 /* LCOV_EXCL_STOP */
393         }
394
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);
399
400         if (image->is_default)
401                 len += snprintf(query + len, sizeof(query) - len, ", image_thumbnail_path=? ");
402
403         snprintf(query + len, sizeof(query) - len, " WHERE contact_id = %d", image->contact_id);
404
405         ret = ctsvc_query_prepare(query, &stmt);
406         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
407
408         if (image->is_default) {
409                 thumbnail_path = ctsvc_utils_make_thumbnail(image->path);
410                 ctsvc_stmt_bind_text(stmt, 1, thumbnail_path);
411         }
412
413         ret = ctsvc_stmt_step(stmt);
414         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_stmt_step() Fail(%d)", ret);
415         ctsvc_stmt_finalize(stmt);
416
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);
424                 }
425         }
426         free(thumbnail_path);
427
428         ctsvc_set_contact_noti();
429         ctsvc_set_person_noti();
430
431         ret = ctsvc_end_trans(true);
432         if (ret < CONTACTS_ERROR_NONE) {
433                 /* LCOV_EXCL_START */
434                 ERR("ctsvc_end_trans() Fail(%d)", ret);
435                 return ret;
436                 /* LCOV_EXCL_STOP */
437         } else {
438                 return CONTACTS_ERROR_NONE;
439         }
440 }
441
442 static int __ctsvc_db_image_delete_record(int id)
443 {
444         int ret;
445         int version;
446         int image_id = 0;
447         int contact_id;
448         int person_id;
449         int is_default;
450         int is_primary_default;
451         char query[CTS_SQL_MAX_LEN] = {0};
452         cts_stmt stmt = NULL;
453         int addressbook_id;
454
455         ret = ctsvc_begin_trans();
456         if (CONTACTS_ERROR_NONE != ret) {
457                 /* LCOV_EXCL_START */
458                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
459                 return ret;
460                 /* LCOV_EXCL_STOP */
461         }
462
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);
467         if (NULL == stmt) {
468                 /* LCOV_EXCL_START */
469                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
470                 ctsvc_end_trans(false);
471                 return ret;
472                 /* LCOV_EXCL_STOP */
473         }
474
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;
483                 else
484                         return ret;
485                 /* LCOV_EXCL_STOP */
486         }
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);
491
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;
497                 /* LCOV_EXCL_STOP */
498         }
499
500         snprintf(query, sizeof(query),
501                         "SELECT is_default, is_primary_default FROM "CTS_TABLE_DATA" WHERE id = %d", id);
502
503         ret = ctsvc_query_prepare(query, &stmt);
504         if (NULL == stmt) {
505                 /* LCOV_EXCL_START */
506                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
507                 ctsvc_end_trans(false);
508                 return ret;
509                 /* LCOV_EXCL_STOP */
510         }
511
512         ret = ctsvc_stmt_step(stmt);
513         if (1 != ret) {
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;
520                 else
521                         return ret;
522                 /* LCOV_EXCL_STOP */
523         }
524
525         is_default = ctsvc_stmt_get_int(stmt, 0);
526         is_primary_default = ctsvc_stmt_get_int(stmt, 1);
527         ctsvc_stmt_finalize(stmt);
528
529         ret = ctsvc_db_image_delete(id, false);
530
531         if (CONTACTS_ERROR_NONE != ret) {
532                 /* LCOV_EXCL_START */
533                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
534                 ctsvc_end_trans(false);
535                 return ret;
536                 /* LCOV_EXCL_STOP */
537         }
538
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);
544
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);
550                 return ret;
551                 /* LCOV_EXCL_STOP */
552         }
553
554         if (is_default) {
555                 char *image_path = NULL;
556                 char *thumbnail_path = NULL;
557
558                 //TODO : make function
559                 do {
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);
563
564                         ret = ctsvc_query_prepare(query, &stmt);
565                         if (NULL == stmt) {
566                                 /* LCOV_EXCL_START */
567                                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
568                                 break;
569                                 /* LCOV_EXCL_STOP */
570                         }
571
572                         ret = ctsvc_stmt_step(stmt);
573                         if (1 != ret) {
574                                 /* LCOV_EXCL_START */
575                                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
576                                 ctsvc_stmt_finalize(stmt);
577                                 break;
578                                 /* LCOV_EXCL_STOP */
579                         }
580
581                         image_id = ctsvc_stmt_get_int(stmt, 0);
582                         image_path = ctsvc_stmt_get_text(stmt, 1);
583                         ctsvc_stmt_finalize(stmt);
584                 }  while (0);
585
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);
590
591                         if (is_primary_default)
592                                 __ctsvc_db_image_update_person_image(person_id, thumbnail_path);
593                 } else {
594                         __ctsvc_db_image_update_contact_image(contact_id, NULL);
595
596                         if (is_primary_default) {
597                                 image_id = 0;
598                                 image_path = NULL;
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);
604                                 } else {
605                                         __ctsvc_db_image_update_person_image(person_id, NULL);
606                                 }
607                         }
608                 }
609                 free(thumbnail_path);
610         }
611
612         ctsvc_set_contact_noti();
613         ctsvc_set_person_noti();
614
615         ret = ctsvc_end_trans(true);
616         if (ret < CONTACTS_ERROR_NONE) {
617                 /* LCOV_EXCL_START */
618                 ERR("ctsvc_end_trans() Fail(%d)", ret);
619                 return ret;
620                 /* LCOV_EXCL_STOP */
621         } else {
622                 return CONTACTS_ERROR_NONE;
623         }
624 }
625
626 static int __ctsvc_db_image_get_all_records(int offset, int limit, contacts_list_h *out_list)
627 {
628         int len;
629         int ret;
630         contacts_list_h list;
631         ctsvc_image_s *image;
632         cts_stmt stmt = NULL;
633         char query[CTS_SQL_MAX_LEN] = {0};
634
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);
641
642         if (0 != limit) {
643                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
644                 if (0 < offset)
645                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
646         }
647
648         ret = ctsvc_query_prepare(query, &stmt);
649         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
650
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);
658                         return ret;
659                         /* LCOV_EXCL_STOP */
660                 }
661                 ctsvc_db_image_get_value_from_stmt(stmt, (contacts_record_h*)&image, 0);
662                 ctsvc_list_prepend(list, (contacts_record_h)image);
663         }
664         ctsvc_stmt_finalize(stmt);
665         ctsvc_list_reverse(list);
666
667         *out_list = list;
668         return CONTACTS_ERROR_NONE;
669 }
670
671 static int __ctsvc_db_image_get_records_with_query(contacts_query_h query, int offset,
672                 int limit, contacts_list_h *out_list)
673 {
674         int ret;
675         int i;
676         int field_count;
677         ctsvc_query_s *s_query;
678         cts_stmt stmt;
679         contacts_list_h list;
680         ctsvc_image_s *image;
681
682         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
683         s_query = (ctsvc_query_s*)query;
684
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);
687
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);
696                         return ret;
697                         /* LCOV_EXCL_STOP */
698                 }
699
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;
704                 } else {
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);
708
709                         if (CONTACTS_ERROR_NONE != ret)
710                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
711                 }
712
713                 for (i = 0; i < field_count; i++) {
714                         char *temp;
715                         int property_id;
716                         if (0 == s_query->projection_count)
717                                 property_id = s_query->properties[i].property_id;
718                         else
719                                 property_id = s_query->projection[i];
720
721                         switch (property_id) {
722                         case CTSVC_PROPERTY_IMAGE_ID:
723                                 image->id = ctsvc_stmt_get_int(stmt, i);
724                                 break;
725                         case CTSVC_PROPERTY_IMAGE_CONTACT_ID:
726                                 image->contact_id = ctsvc_stmt_get_int(stmt, i);
727                                 break;
728                         case CTSVC_PROPERTY_IMAGE_TYPE:
729                                 image->type = ctsvc_stmt_get_int(stmt, i);
730                                 break;
731                         case CTSVC_PROPERTY_IMAGE_LABEL:
732                                 temp = ctsvc_stmt_get_text(stmt, i);
733                                 free(image->label);
734                                 image->label = SAFE_STRDUP(temp);
735                                 break;
736                         case CTSVC_PROPERTY_IMAGE_PATH:
737                                 temp = ctsvc_stmt_get_text(stmt, i);
738                                 free(image->path);
739                                 image->path = SAFE_STRDUP(temp);
740                                 break;
741                         case CTSVC_PROPERTY_IMAGE_IS_DEFAULT:
742                                 image->is_default = ctsvc_stmt_get_int(stmt, i);
743                                 break;
744                         default:
745                                 break;
746                         }
747                 }
748                 ctsvc_list_prepend(list, record);
749         }
750         ctsvc_stmt_finalize(stmt);
751         ctsvc_list_reverse(list);
752
753         *out_list = list;
754         return CONTACTS_ERROR_NONE;
755 }
756
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,
768         .get_count = NULL,
769         .get_count_with_query = NULL,
770         .replace_record = NULL,
771         .replace_records = NULL,
772 };
773