[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_simple_contact.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 <sys/types.h>
20 #include <fcntl.h>
21
22 #include "contacts.h"
23 #include "ctsvc_internal.h"
24 #include "ctsvc_db_sqlite.h"
25 #include "ctsvc_db_schema.h"
26 #include "ctsvc_db_init.h"
27 #include "ctsvc_db_utils.h"
28 #include "ctsvc_list.h"
29 #include "ctsvc_db_plugin_person_helper.h"
30 #include "ctsvc_db_plugin_contact_helper.h"
31 #include "ctsvc_record.h"
32 #include "ctsvc_db_query.h"
33 #include "ctsvc_notification.h"
34 #include "ctsvc_db_access_control.h"
35 #include "ctsvc_notify.h"
36
37
38 static int __ctsvc_db_simple_contact_value_set(cts_stmt stmt, contacts_record_h *record)
39 {
40         int i;
41         int ret;
42         char *temp;
43         ctsvc_simple_contact_s *contact;
44         char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
45
46         ret = contacts_record_create(_contacts_simple_contact._uri, record);
47         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
48         contact = (ctsvc_simple_contact_s*)*record;
49
50         i = 0;
51         contact->contact_id = ctsvc_stmt_get_int(stmt, i++);
52         contact->addressbook_id = ctsvc_stmt_get_int(stmt, i++);
53         contact->person_id = ctsvc_stmt_get_int(stmt, i++);
54         contact->changed_time = ctsvc_stmt_get_int(stmt, i++);
55         temp = ctsvc_stmt_get_text(stmt, i++);
56         contact->display_name = SAFE_STRDUP(temp);
57         contact->display_source_type = ctsvc_stmt_get_int(stmt, i++);
58
59         temp = ctsvc_stmt_get_text(stmt, i++);
60         if (temp) {
61                 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
62                 contact->image_thumbnail_path = strdup(full_path);
63         }
64
65         temp = ctsvc_stmt_get_text(stmt, i++);
66         contact->ringtone_path = SAFE_STRDUP(temp);
67         temp = ctsvc_stmt_get_text(stmt, i++);
68         contact->vibration = SAFE_STRDUP(temp);
69         temp = ctsvc_stmt_get_text(stmt, i++);
70         contact->message_alert = SAFE_STRDUP(temp);
71         temp = ctsvc_stmt_get_text(stmt, i++);
72         contact->uid = SAFE_STRDUP(temp);
73         contact->is_favorite = ctsvc_stmt_get_int(stmt, i++);
74         contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i++);
75         contact->has_email = ctsvc_stmt_get_int(stmt, i++);
76
77         return CONTACTS_ERROR_NONE;
78 }
79
80 static int __ctsvc_db_simple_contact_get_record(int id, contacts_record_h *out_record)
81 {
82         int ret;
83         cts_stmt stmt = NULL;
84         char query[CTS_SQL_MAX_LEN] = {0};
85         contacts_record_h record;
86
87         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
88         *out_record = NULL;
89
90         snprintf(query, sizeof(query),
91                         "SELECT contact_id, addressbook_id, person_id, changed_time, %s, "
92                         "display_name_source, image_thumbnail_path, "
93                         "ringtone_path, vibration, message_alert, uid, is_favorite, has_phonenumber, has_email "
94                         "FROM "CTS_TABLE_CONTACTS" WHERE contact_id = %d AND deleted = 0",
95                         ctsvc_get_display_column(), id);
96
97         ret = ctsvc_query_prepare(query, &stmt);
98         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
99
100         ret = ctsvc_stmt_step(stmt);
101         if (1 /*CTS_TRUE*/ != ret) {
102                 /* LCOV_EXCL_START */
103                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
104                 ctsvc_stmt_finalize(stmt);
105                 if (CONTACTS_ERROR_NONE == ret)
106                         return CONTACTS_ERROR_NO_DATA;
107                 else
108                         return ret;
109                 /* LCOV_EXCL_STOP */
110         }
111
112         ret = __ctsvc_db_simple_contact_value_set(stmt, &record);
113
114         ctsvc_stmt_finalize(stmt);
115         if (CONTACTS_ERROR_NONE != ret) {
116                 /* LCOV_EXCL_START */
117                 ERR("__ctsvc_db_simple_contact_value_set(ALL) Fail(%d)", ret);
118                 return ret;
119                 /* LCOV_EXCL_STOP */
120         }
121
122         *out_record = record;
123
124         return CONTACTS_ERROR_NONE;
125 }
126
127 static int __ctsvc_db_simple_contact_get_all_records(int offset, int limit,
128                 contacts_list_h *out_list)
129 {
130         int ret;
131         int len;
132         cts_stmt stmt;
133         char query[CTS_SQL_MAX_LEN] = {0};
134         contacts_list_h list;
135
136         len = snprintf(query, sizeof(query),
137                         "SELECT contact_id, addressbook_id, person_id, changed_time, "
138                         "%s, display_name_source, image_thumbnail_path, "
139                         "ringtone_path, vibration, message_alert, uid, is_favorite, has_phonenumber, has_email "
140                         "FROM "CTS_TABLE_CONTACTS" WHERE deleted = 0", ctsvc_get_display_column());
141
142         if (0 != limit) {
143                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
144                 if (0 < offset)
145                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
146         }
147
148         ret = ctsvc_query_prepare(query, &stmt);
149         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
150
151         contacts_list_create(&list);
152         while ((ret = ctsvc_stmt_step(stmt))) {
153                 contacts_record_h record;
154                 if (1 != ret) {
155                         /* LCOV_EXCL_START */
156                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
157                         ctsvc_stmt_finalize(stmt);
158                         contacts_list_destroy(list, true);
159                         return ret;
160                         /* LCOV_EXCL_STOP */
161                 }
162                 __ctsvc_db_simple_contact_value_set(stmt, &record);
163
164                 ctsvc_list_prepend(list, record);
165         }
166         ctsvc_stmt_finalize(stmt);
167         ctsvc_list_reverse(list);
168
169         *out_list = (contacts_list_h)list;
170         return CONTACTS_ERROR_NONE;
171 }
172
173 static int __ctsvc_db_simple_contact_get_records_with_query(contacts_query_h query,
174                 int offset, int limit, contacts_list_h *out_list)
175 {
176         int ret;
177         int i;
178         int field_count;
179         ctsvc_query_s *s_query;
180         cts_stmt stmt;
181         contacts_list_h list;
182         ctsvc_simple_contact_s *contact;
183         char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
184
185         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
186         s_query = (ctsvc_query_s*)query;
187
188         ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
189         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
190
191         contacts_list_create(&list);
192         while ((ret = ctsvc_stmt_step(stmt))) {
193                 contacts_record_h record;
194                 if (1 != ret) {
195                         /* LCOV_EXCL_START */
196                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
197                         ctsvc_stmt_finalize(stmt);
198                         contacts_list_destroy(list, true);
199                         return ret;
200                         /* LCOV_EXCL_STOP */
201                 }
202
203                 contacts_record_create(_contacts_simple_contact._uri, &record);
204                 contact = (ctsvc_simple_contact_s*)record;
205                 if (0 == s_query->projection_count) {
206                         field_count = s_query->property_count;
207                 } else {
208                         field_count = s_query->projection_count;
209
210                         int err = ctsvc_record_set_projection_flags(record, s_query->projection,
211                                         s_query->projection_count, s_query->property_count);
212                         if (CONTACTS_ERROR_NONE != err)
213                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
214                 }
215
216                 for (i = 0; i < field_count; i++) {
217                         char *temp;
218                         int property_id;
219                         if (0 == s_query->projection_count)
220                                 property_id = s_query->properties[i].property_id;
221                         else
222                                 property_id = s_query->projection[i];
223
224                         switch (property_id) {
225                         case CTSVC_PROPERTY_CONTACT_ID:
226                                 contact->contact_id = ctsvc_stmt_get_int(stmt, i);
227                                 break;
228                         case CTSVC_PROPERTY_CONTACT_DISPLAY_NAME:
229                                 temp = ctsvc_stmt_get_text(stmt, i);
230                                 free(contact->display_name);
231                                 contact->display_name = SAFE_STRDUP(temp);
232                                 break;
233                         case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID:
234                                 contact->display_source_type = ctsvc_stmt_get_int(stmt, i);
235                                 break;
236                         case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID:
237                                 contact->addressbook_id = ctsvc_stmt_get_int(stmt, i);
238                                 break;
239                         case CTSVC_PROPERTY_CONTACT_RINGTONE:
240                                 temp = ctsvc_stmt_get_text(stmt, i);
241                                 free(contact->ringtone_path);
242                                 contact->ringtone_path = SAFE_STRDUP(temp);
243                                 break;
244                         case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL:
245                                 temp = ctsvc_stmt_get_text(stmt, i);
246                                 if (temp && *temp) {
247                                         snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
248                                         free(contact->image_thumbnail_path);
249                                         contact->image_thumbnail_path = strdup(full_path);
250                                 }
251                                 break;
252                         case CTSVC_PROPERTY_CONTACT_IS_FAVORITE:
253                                 contact->is_favorite = ctsvc_stmt_get_int(stmt, i);
254                                 break;
255                         case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER:
256                                 contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i);
257                                 break;
258                         case CTSVC_PROPERTY_CONTACT_HAS_EMAIL:
259                                 contact->has_email = ctsvc_stmt_get_int(stmt, i);
260                                 break;
261                         case CTSVC_PROPERTY_CONTACT_PERSON_ID:
262                                 contact->person_id = ctsvc_stmt_get_int(stmt, i);
263                                 break;
264                         case CTSVC_PROPERTY_CONTACT_UID:
265                                 temp = ctsvc_stmt_get_text(stmt, i);
266                                 free(contact->uid);
267                                 contact->uid = SAFE_STRDUP(temp);
268                                 break;
269                         case CTSVC_PROPERTY_CONTACT_VIBRATION:
270                                 temp = ctsvc_stmt_get_text(stmt, i);
271                                 free(contact->vibration);
272                                 contact->vibration = SAFE_STRDUP(temp);
273                                 break;
274                         case CTSVC_PROPERTY_CONTACT_MESSAGE_ALERT:
275                                 temp = ctsvc_stmt_get_text(stmt, i);
276                                 free(contact->message_alert);
277                                 contact->message_alert = SAFE_STRDUP(temp);
278                                 break;
279                         case CTSVC_PROPERTY_CONTACT_CHANGED_TIME:
280                                 contact->changed_time = ctsvc_stmt_get_int(stmt, i);
281                                 break;
282                         default:
283                                 break;
284                         }
285                 }
286                 ctsvc_list_prepend(list, record);
287         }
288         ctsvc_stmt_finalize(stmt);
289         ctsvc_list_reverse(list);
290
291         *out_list = (contacts_list_h)list;
292
293         return CONTACTS_ERROR_NONE;
294 }
295
296 ctsvc_db_plugin_info_s ctsvc_db_plugin_simple_contact = {
297         .is_query_only = false,
298         .insert_record = NULL,
299         .get_record = __ctsvc_db_simple_contact_get_record,
300         .update_record = NULL,
301         .delete_record = NULL,
302         .get_all_records = __ctsvc_db_simple_contact_get_all_records,
303         .get_records_with_query = __ctsvc_db_simple_contact_get_records_with_query,
304         .insert_records = NULL,
305         .update_records = NULL,
306         .delete_records = NULL,
307         .get_count = NULL,
308         .get_count_with_query = NULL,
309         .replace_record = NULL,
310         .replace_records = NULL,
311 };
312