[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_email.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_contact_helper.h"
27 #include "ctsvc_db_plugin_email_helper.h"
28 #include "ctsvc_record.h"
29 #include "ctsvc_notification.h"
30 #include "ctsvc_db_query.h"
31 #include "ctsvc_list.h"
32
33
34 static int __ctsvc_db_email_get_person_default_email(int person_id)
35 {
36         int ret;
37         int default_email_id;
38         char query[CTS_SQL_MAX_LEN] = {0};
39
40         snprintf(query, sizeof(query),
41                         "SELECT id FROM "CTSVC_DB_VIEW_CONTACT" c, "CTS_TABLE_DATA" d "
42                         "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_default = 1",
43                         person_id, CONTACTS_DATA_TYPE_EMAIL);
44         ret = ctsvc_query_get_first_int_result(query, &default_email_id);
45         if (CONTACTS_ERROR_NONE != ret)
46                 return 0;
47         return default_email_id;
48 }
49
50 static int __ctsvc_db_email_update_person_has_email(int person_id, bool has_email)
51 {
52         int ret;
53         char query[CTS_SQL_MAX_LEN] = {0};
54
55         snprintf(query, sizeof(query),
56                         "UPDATE "CTS_TABLE_PERSONS" SET has_email = %d WHERE person_id = %d",
57                         has_email, person_id);
58
59         ret = ctsvc_query_exec(query);
60         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
61         return ret;
62 }
63
64 static int __ctsvc_db_email_update_default(int email_id, int contact_id, bool is_default, bool is_primary_default)
65 {
66         int ret;
67         char query[CTS_SQL_MAX_LEN] = {0};
68
69         snprintf(query, sizeof(query),
70                         "UPDATE "CTS_TABLE_DATA" SET is_default = %d, is_primary_default = %d WHERE id = %d",
71                         is_default, is_primary_default, email_id);
72         ret = ctsvc_query_exec(query);
73
74         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
75         return ret;
76 }
77
78 static int __ctsvc_db_email_get_default_email_id(int contact_id)
79 {
80         int ret;
81         int email_id = 0;
82         char query[CTS_SQL_MAX_LEN] = {0};
83         snprintf(query, sizeof(query),
84                         "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_default=1",
85                         CONTACTS_DATA_TYPE_EMAIL, contact_id);
86         ret = ctsvc_query_get_first_int_result(query, &email_id);
87         if (CONTACTS_ERROR_NONE != ret)
88                 return 0;
89         return email_id;
90 }
91
92 static int __ctsvc_db_email_get_primary_default_email_id(int contact_id)
93 {
94         int ret;
95         int email_id = 0;
96         char query[CTS_SQL_MAX_LEN] = {0};
97         snprintf(query, sizeof(query),
98                         "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype=%d AND contact_id=%d AND is_primary_default=1",
99                         CONTACTS_DATA_TYPE_EMAIL, contact_id);
100         ret = ctsvc_query_get_first_int_result(query, &email_id);
101         if (CONTACTS_ERROR_NONE != ret)
102                 return 0;
103         return email_id;
104 }
105
106 static int __ctsvc_db_email_get_primary_default_contact_id(int person_id)
107 {
108         int ret;
109         int default_contact_id;
110         char query[CTS_SQL_MAX_LEN] = {0};
111
112         snprintf(query, sizeof(query),
113                         "SELECT c.contact_id FROM "CTS_TABLE_CONTACTS" c, "CTS_TABLE_DATA" d "
114                         "WHERE c.person_id = %d AND d.datatype = %d AND c.contact_id = d.contact_id AND d.is_primary_default = 1",
115                         person_id, CONTACTS_DATA_TYPE_EMAIL);
116         ret = ctsvc_query_get_first_int_result(query, &default_contact_id);
117         if (CONTACTS_ERROR_NONE != ret)
118                 return 0;
119         return default_contact_id;
120 }
121
122 static int __ctsvc_db_email_set_primary_default(int email_id, bool is_primary_default)
123 {
124         int ret;
125         char query[CTS_SQL_MAX_LEN] = {0};
126
127         snprintf(query, sizeof(query),
128                         "UPDATE "CTS_TABLE_DATA" SET is_primary_default = %d WHERE id = %d",
129                         is_primary_default, email_id);
130         ret = ctsvc_query_exec(query);
131         WARN_IF(CONTACTS_ERROR_NONE != ret, "ctsvc_query_exec() Fail(%d)", ret);
132         return ret;
133 }
134
135 static int __ctsvc_db_email_insert_record(contacts_record_h record, int *id)
136 {
137         int ret;
138         int addressbook_id = 0;
139         int person_id = 0;
140         int old_default_email_id = 0;
141         char query[CTS_SQL_MAX_LEN] = {0};
142         cts_stmt stmt = NULL;
143         ctsvc_email_s *email = (ctsvc_email_s*)record;
144         RETV_IF(NULL == email->email_addr, CONTACTS_ERROR_INVALID_PARAMETER);
145
146         ret = ctsvc_begin_trans();
147         if (CONTACTS_ERROR_NONE != ret) {
148                 /* LCOV_EXCL_START */
149                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
150                 return ret;
151                 /* LCOV_EXCL_STOP */
152         }
153
154         snprintf(query, sizeof(query),
155                         "SELECT addressbook_id, person_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", email->contact_id);
156         ret = ctsvc_query_prepare(query, &stmt);
157         if (NULL == stmt) {
158                 /* LCOV_EXCL_START */
159                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
160                 ctsvc_end_trans(false);
161                 return ret;
162                 /* LCOV_EXCL_STOP */
163         }
164
165         ret = ctsvc_stmt_step(stmt);
166         if (1 != ret) {
167                 /* LCOV_EXCL_START */
168                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
169                 ctsvc_stmt_finalize(stmt);
170                 ctsvc_end_trans(false);
171                 if (CONTACTS_ERROR_NONE == ret)
172                         return CONTACTS_ERROR_INVALID_PARAMETER;
173                 else
174                         return ret;
175                 /* LCOV_EXCL_STOP */
176         }
177         addressbook_id = ctsvc_stmt_get_int(stmt, 0);
178         person_id = ctsvc_stmt_get_int(stmt, 1);
179         ctsvc_stmt_finalize(stmt);
180
181         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
182                 /* LCOV_EXCL_START */
183                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
184                 ctsvc_end_trans(false);
185                 return CONTACTS_ERROR_PERMISSION_DENIED;
186                 /* LCOV_EXCL_STOP */
187         }
188
189         old_default_email_id = __ctsvc_db_email_get_default_email_id(email->contact_id);
190         if (0 == old_default_email_id)
191                 email->is_default = true;
192
193         ret = ctsvc_db_email_insert(record, email->contact_id, false, id);
194         if (CONTACTS_ERROR_NONE != ret) {
195                 /* LCOV_EXCL_START */
196                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
197                 ctsvc_end_trans(false);
198                 return ret;
199                 /* LCOV_EXCL_STOP */
200         }
201
202         snprintf(query, sizeof(query),
203                         "UPDATE "CTS_TABLE_CONTACTS" SET has_email = %d, changed_ver = %d, changed_time = %d "
204                         "WHERE contact_id = %d",
205                         1, ctsvc_get_next_ver(), (int)time(NULL), email->contact_id);
206
207         ret = ctsvc_query_exec(query);
208         if (CONTACTS_ERROR_NONE != ret) {
209                 /* LCOV_EXCL_START */
210                 ERR("ctsvc_query_exec() Fail(%d)", ret);
211                 ctsvc_end_trans(false);
212                 return ret;
213                 /* LCOV_EXCL_STOP */
214         }
215
216         if (email->is_default) {
217                 int primary_default_contact_id = 0;
218
219                 __ctsvc_db_email_update_person_has_email(person_id, true);
220
221                 primary_default_contact_id = __ctsvc_db_email_get_primary_default_contact_id(person_id);
222                 if (0 == primary_default_contact_id || email->contact_id == primary_default_contact_id)
223                         __ctsvc_db_email_set_primary_default(*id, true);
224
225                 ctsvc_contact_update_display_name(email->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL);
226         }
227
228         ctsvc_set_contact_noti();
229         ctsvc_set_person_noti();
230
231         ret = ctsvc_end_trans(true);
232         if (ret < CONTACTS_ERROR_NONE) {
233                 /* LCOV_EXCL_START */
234                 ERR("ctsvc_end_trans() Fail(%d)", ret);
235                 return ret;
236                 /* LCOV_EXCL_STOP */
237         } else {
238                 return CONTACTS_ERROR_NONE;
239         }
240 }
241
242 static int __ctsvc_db_email_get_record(int id, contacts_record_h *out_record)
243 {
244         int ret;
245         cts_stmt stmt = NULL;
246         char query[CTS_SQL_MAX_LEN] = {0};
247
248         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
249         *out_record = NULL;
250
251         snprintf(query, sizeof(query),
252                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
253                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
254                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
255                         "WHERE id = %d AND datatype = %d ",
256                         id, CONTACTS_DATA_TYPE_EMAIL);
257
258         ret = ctsvc_query_prepare(query, &stmt);
259         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
260
261         ret = ctsvc_stmt_step(stmt);
262         if (1 /*CTS_TRUE*/ != ret) {
263                 /* LCOV_EXCL_START */
264                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
265                 ctsvc_stmt_finalize(stmt);
266                 if (CONTACTS_ERROR_NONE == ret)
267                         return CONTACTS_ERROR_NO_DATA;
268                 else
269                         return ret;
270                 /* LCOV_EXCL_STOP */
271         }
272
273         ctsvc_db_email_get_value_from_stmt(stmt, out_record, 0);
274
275         ctsvc_stmt_finalize(stmt);
276
277         return CONTACTS_ERROR_NONE;
278 }
279
280 static int __ctsvc_db_email_update_record(contacts_record_h record)
281 {
282         int ret;
283         int addressbook_id;
284         char query[CTS_SQL_MAX_LEN] = {0};
285         ctsvc_email_s *email = (ctsvc_email_s*)record;
286         RETVM_IF(NULL == email->email_addr, CONTACTS_ERROR_INVALID_PARAMETER, "email is empty");
287
288         ret = ctsvc_begin_trans();
289         if (CONTACTS_ERROR_NONE != ret) {
290                 /* LCOV_EXCL_START */
291                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
292                 return ret;
293                 /* LCOV_EXCL_STOP */
294         }
295
296         snprintf(query, sizeof(query),
297                         "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", email->contact_id);
298         ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
299         if (CONTACTS_ERROR_NONE != ret) {
300                 /* LCOV_EXCL_START */
301                 ERR("No data : contact_id (%d) is not exist", email->contact_id);
302                 ctsvc_end_trans(false);
303                 return ret;
304                 /* LCOV_EXCL_STOP */
305         }
306
307         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
308                 /* LCOV_EXCL_START */
309                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
310                 ctsvc_end_trans(false);
311                 return CONTACTS_ERROR_PERMISSION_DENIED;
312                 /* LCOV_EXCL_STOP */
313         }
314
315         ret = ctsvc_db_email_update(record, false);
316         if (CONTACTS_ERROR_NONE != ret) {
317                 /* LCOV_EXCL_START */
318                 ERR("update record Fail(%d)", ret);
319                 ctsvc_end_trans(false);
320                 return ret;
321                 /* LCOV_EXCL_STOP */
322         }
323
324         if (email->is_default) {
325                 int old_primary_default_email_id = 0;
326                 old_primary_default_email_id = __ctsvc_db_email_get_primary_default_email_id(email->contact_id);
327                 if (old_primary_default_email_id)
328                         __ctsvc_db_email_set_primary_default(email->id, true);
329         }
330         ctsvc_contact_update_display_name(email->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL);
331
332         ret = ctsvc_db_contact_update_changed_time(email->contact_id);
333         if (CONTACTS_ERROR_NONE != ret) {
334                 /* LCOV_EXCL_START */
335                 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
336                 ctsvc_end_trans(false);
337                 return ret;
338                 /* LCOV_EXCL_STOP */
339         }
340         ctsvc_set_person_noti();
341
342         ret = ctsvc_end_trans(true);
343         if (ret < CONTACTS_ERROR_NONE) {
344                 /* LCOV_EXCL_START */
345                 ERR("ctsvc_end_trans() Fail(%d)", ret);
346                 return ret;
347                 /* LCOV_EXCL_STOP */
348         } else {
349                 return CONTACTS_ERROR_NONE;
350         }
351 }
352
353 static int __ctsvc_db_email_delete_record(int id)
354 {
355         int ret;
356         int email_id;
357         int contact_id;
358         int person_id;
359         int is_default;
360         int is_primary_default;
361         char query[CTS_SQL_MAX_LEN] = {0};
362         bool has_email = false;
363         cts_stmt stmt = NULL;
364         int addressbook_id;
365
366         ret = ctsvc_begin_trans();
367         if (CONTACTS_ERROR_NONE != ret) {
368                 /* LCOV_EXCL_START */
369                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
370                 return ret;
371                 /* LCOV_EXCL_STOP */
372         }
373
374         snprintf(query, sizeof(query),
375                         "SELECT contact_id, person_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT " "
376                         "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
377
378         ret = ctsvc_query_prepare(query, &stmt);
379         if (NULL == stmt) {
380                 /* LCOV_EXCL_START */
381                 ERR("ctsvc_query_prepare() Fail(%d)", ret);
382                 ctsvc_end_trans(false);
383                 return ret;
384                 /* LCOV_EXCL_STOP */
385         }
386
387         ret = ctsvc_stmt_step(stmt);
388         if (1 != ret) {
389                 /* LCOV_EXCL_START */
390                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
391                 ctsvc_stmt_finalize(stmt);
392                 ctsvc_end_trans(false);
393                 if (CONTACTS_ERROR_NONE == ret)
394                         return CONTACTS_ERROR_NO_DATA;
395                 else
396                         return ret;
397                 /* LCOV_EXCL_STOP */
398         }
399         contact_id = ctsvc_stmt_get_int(stmt, 0);
400         person_id = ctsvc_stmt_get_int(stmt, 1);
401         addressbook_id = ctsvc_stmt_get_int(stmt, 2);
402         ctsvc_stmt_finalize(stmt);
403
404         if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
405                 /* LCOV_EXCL_START */
406                 ERR("No permission in this addresbook_id(%d)", addressbook_id);
407                 ctsvc_end_trans(false);
408                 return CONTACTS_ERROR_PERMISSION_DENIED;
409                 /* LCOV_EXCL_STOP */
410         }
411
412         snprintf(query, sizeof(query),
413                         "SELECT is_default, is_primary_default FROM "CTS_TABLE_DATA" WHERE id = %d", id);
414
415         ret = ctsvc_query_prepare(query, &stmt);
416         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
417
418         ret = ctsvc_stmt_step(stmt);
419         if (1 != ret) {
420                 /* LCOV_EXCL_START */
421                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
422                 ctsvc_stmt_finalize(stmt);
423                 ctsvc_end_trans(false);
424                 if (CONTACTS_ERROR_NONE == ret)
425                         return CONTACTS_ERROR_NO_DATA;
426                 else
427                         return ret;
428                 /* LCOV_EXCL_STOP */
429         }
430         is_default = ctsvc_stmt_get_int(stmt, 0);
431         is_primary_default = ctsvc_stmt_get_int(stmt, 1);
432         ctsvc_stmt_finalize(stmt);
433
434         ret = ctsvc_db_email_delete(id, false);
435         if (CONTACTS_ERROR_NONE != ret) {
436                 /* LCOV_EXCL_START */
437                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
438                 ctsvc_end_trans(false);
439                 return ret;
440                 /* LCOV_EXCL_STOP */
441         }
442
443         snprintf(query, sizeof(query),
444                         "SELECT id FROM "CTS_TABLE_DATA" WHERE datatype = %d AND contact_id = %d AND is_my_profile = 0 limit 1",
445                         CONTACTS_DATA_TYPE_EMAIL, contact_id);
446         ret = ctsvc_query_get_first_int_result(query, &email_id);
447         if (0 < ret)
448                 has_email = true;
449
450         snprintf(query, sizeof(query),
451                         "UPDATE "CTS_TABLE_CONTACTS" SET has_email = %d, changed_ver = %d, changed_time = %d "
452                         "WHERE contact_id = %d",
453                         has_email, ctsvc_get_next_ver(), (int)time(NULL), contact_id);
454
455         ret = ctsvc_query_exec(query);
456         if (CONTACTS_ERROR_NONE != ret) {
457                 /* LCOV_EXCL_START */
458                 ERR("ctsvc_query_exec() Fail(%d)", ret);
459                 ctsvc_end_trans(false);
460                 return ret;
461                 /* LCOV_EXCL_STOP */
462         }
463
464         if (is_default) {
465
466                 if (email_id) {
467                         __ctsvc_db_email_update_default(email_id, contact_id, is_default, is_primary_default);
468                 } else if (is_primary_default) {
469                         int default_email_id = 0;
470                         default_email_id = __ctsvc_db_email_get_person_default_email(person_id);
471                         if (default_email_id)
472                                 __ctsvc_db_email_set_primary_default(default_email_id, true);
473                         else
474                                 __ctsvc_db_email_update_person_has_email(person_id, false);
475                 }
476                 ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_EMAIL);
477         }
478
479         ctsvc_set_contact_noti();
480         ctsvc_set_person_noti();
481
482         ret = ctsvc_end_trans(true);
483         RETVM_IF(ret < CONTACTS_ERROR_NONE, ret, "ctsvc_end_trans() Fail(%d)", ret);
484         return CONTACTS_ERROR_NONE;
485 }
486
487 static int __ctsvc_db_email_get_all_records(int offset, int limit, contacts_list_h *out_list)
488 {
489         int len;
490         int ret;
491         contacts_list_h list;
492         ctsvc_email_s *email;
493         cts_stmt stmt = NULL;
494         char query[CTS_SQL_MAX_LEN] = {0};
495
496         len = snprintf(query, sizeof(query),
497                         "SELECT id, data.contact_id, is_default, data1, data2, data3 "
498                         "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
499                         "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
500                         "WHERE datatype = %d AND is_my_profile=0 ",
501                         CONTACTS_DATA_TYPE_EMAIL);
502
503         if (0 != limit) {
504                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
505                 if (0 < offset)
506                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
507         }
508
509         ret = ctsvc_query_prepare(query, &stmt);
510         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
511
512         contacts_list_create(&list);
513         while ((ret = ctsvc_stmt_step(stmt))) {
514                 if (1 /*CTS_TRUE */ != ret) {
515                         /* LCOV_EXCL_START */
516                         ERR("DB : ctsvc_stmt_step() Fail(%d)", ret);
517                         ctsvc_stmt_finalize(stmt);
518                         contacts_list_destroy(list, true);
519                         return ret;
520                         /* LCOV_EXCL_STOP */
521                 }
522                 ctsvc_db_email_get_value_from_stmt(stmt, (contacts_record_h*)&email, 0);
523                 ctsvc_list_prepend(list, (contacts_record_h)email);
524         }
525         ctsvc_stmt_finalize(stmt);
526         ctsvc_list_reverse(list);
527
528         *out_list = list;
529         return CONTACTS_ERROR_NONE;
530 }
531
532 static int __ctsvc_db_email_get_records_with_query(contacts_query_h query, int offset,
533                 int limit, contacts_list_h *out_list)
534 {
535         int ret;
536         int i;
537         int field_count;
538         ctsvc_query_s *s_query;
539         cts_stmt stmt;
540         contacts_list_h list;
541         ctsvc_email_s *email;
542
543         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
544         s_query = (ctsvc_query_s*)query;
545
546         ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
547         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
548
549         contacts_list_create(&list);
550         while ((ret = ctsvc_stmt_step(stmt))) {
551                 contacts_record_h record;
552                 if (1 /*CTS_TRUE */ != ret) {
553                         /* LCOV_EXCL_START */
554                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
555                         ctsvc_stmt_finalize(stmt);
556                         contacts_list_destroy(list, true);
557                         return ret;
558                         /* LCOV_EXCL_STOP */
559                 }
560
561                 contacts_record_create(_contacts_email._uri, &record);
562                 email = (ctsvc_email_s*)record;
563                 if (0 == s_query->projection_count) {
564                         field_count = s_query->property_count;
565                 } else {
566                         field_count = s_query->projection_count;
567                         ret = ctsvc_record_set_projection_flags(record, s_query->projection,
568                                         s_query->projection_count, s_query->property_count);
569
570                         if (CONTACTS_ERROR_NONE != ret)
571                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
572                 }
573
574                 for (i = 0; i < field_count; i++) {
575                         char *temp;
576                         int property_id;
577                         if (0 == s_query->projection_count)
578                                 property_id = s_query->properties[i].property_id;
579                         else
580                                 property_id = s_query->projection[i];
581
582                         switch (property_id) {
583                         case CTSVC_PROPERTY_EMAIL_ID:
584                                 email->id = ctsvc_stmt_get_int(stmt, i);
585                                 break;
586                         case CTSVC_PROPERTY_EMAIL_CONTACT_ID:
587                                 email->contact_id = ctsvc_stmt_get_int(stmt, i);
588                                 break;
589                         case CTSVC_PROPERTY_EMAIL_TYPE:
590                                 email->type = ctsvc_stmt_get_int(stmt, i);
591                                 break;
592                         case CTSVC_PROPERTY_EMAIL_LABEL:
593                                 temp = ctsvc_stmt_get_text(stmt, i);
594                                 free(email->label);
595                                 email->label = SAFE_STRDUP(temp);
596                                 break;
597                         case CTSVC_PROPERTY_EMAIL_EMAIL:
598                                 temp = ctsvc_stmt_get_text(stmt, i);
599                                 free(email->email_addr);
600                                 email->email_addr = SAFE_STRDUP(temp);
601                                 break;
602                         case CTSVC_PROPERTY_EMAIL_IS_DEFAULT:
603                                 email->is_default = ctsvc_stmt_get_int(stmt, i);
604                                 break;
605                         default:
606                                 break;
607                         }
608                 }
609                 ctsvc_list_prepend(list, record);
610         }
611         ctsvc_stmt_finalize(stmt);
612         ctsvc_list_reverse(list);
613
614         *out_list = list;
615         return CONTACTS_ERROR_NONE;
616 }
617
618 ctsvc_db_plugin_info_s ctsvc_db_plugin_email = {
619         .is_query_only = false,
620         .insert_record = __ctsvc_db_email_insert_record,
621         .get_record = __ctsvc_db_email_get_record,
622         .update_record = __ctsvc_db_email_update_record,
623         .delete_record = __ctsvc_db_email_delete_record,
624         .get_all_records = __ctsvc_db_email_get_all_records,
625         .get_records_with_query = __ctsvc_db_email_get_records_with_query,
626         .insert_records = NULL,
627         .update_records = NULL,
628         .delete_records = NULL,
629         .get_count = NULL,
630         .get_count_with_query = NULL,
631         .replace_record = NULL,
632         .replace_records = NULL,
633 };
634