4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include <sys/types.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"
38 static int __ctsvc_db_simple_contact_value_set(cts_stmt stmt, contacts_record_h *record)
43 ctsvc_simple_contact_s *contact;
44 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
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;
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++);
59 temp = ctsvc_stmt_get_text(stmt, i++);
61 snprintf(full_path, sizeof(full_path), "%s/%s", CTSVC_CONTACT_IMG_FULL_LOCATION, temp);
62 contact->image_thumbnail_path = strdup(full_path);
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++);
77 return CONTACTS_ERROR_NONE;
80 static int __ctsvc_db_simple_contact_get_record(int id, contacts_record_h *out_record)
84 char query[CTS_SQL_MAX_LEN] = {0};
85 contacts_record_h record;
87 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
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);
97 ret = ctsvc_query_prepare(query, &stmt);
98 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
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;
112 ret = __ctsvc_db_simple_contact_value_set(stmt, &record);
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);
122 *out_record = record;
124 return CONTACTS_ERROR_NONE;
127 static int __ctsvc_db_simple_contact_get_all_records(int offset, int limit,
128 contacts_list_h *out_list)
133 char query[CTS_SQL_MAX_LEN] = {0};
134 contacts_list_h list;
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());
143 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
145 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
148 ret = ctsvc_query_prepare(query, &stmt);
149 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
151 contacts_list_create(&list);
152 while ((ret = ctsvc_stmt_step(stmt))) {
153 contacts_record_h record;
155 /* LCOV_EXCL_START */
156 ERR("ctsvc_stmt_step() Fail(%d)", ret);
157 ctsvc_stmt_finalize(stmt);
158 contacts_list_destroy(list, true);
162 __ctsvc_db_simple_contact_value_set(stmt, &record);
164 ctsvc_list_prepend(list, record);
166 ctsvc_stmt_finalize(stmt);
167 ctsvc_list_reverse(list);
169 *out_list = (contacts_list_h)list;
170 return CONTACTS_ERROR_NONE;
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)
179 ctsvc_query_s *s_query;
181 contacts_list_h list;
182 ctsvc_simple_contact_s *contact;
183 char full_path[CTSVC_IMG_FULL_PATH_SIZE_MAX] = {0};
185 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
186 s_query = (ctsvc_query_s*)query;
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);
191 contacts_list_create(&list);
192 while ((ret = ctsvc_stmt_step(stmt))) {
193 contacts_record_h record;
195 /* LCOV_EXCL_START */
196 ERR("ctsvc_stmt_step() Fail(%d)", ret);
197 ctsvc_stmt_finalize(stmt);
198 contacts_list_destroy(list, true);
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;
208 field_count = s_query->projection_count;
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");
216 for (i = 0; i < field_count; i++) {
219 if (0 == s_query->projection_count)
220 property_id = s_query->properties[i].property_id;
222 property_id = s_query->projection[i];
224 switch (property_id) {
225 case CTSVC_PROPERTY_CONTACT_ID:
226 contact->contact_id = ctsvc_stmt_get_int(stmt, i);
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);
233 case CTSVC_PROPERTY_CONTACT_DISPLAY_SOURCE_DATA_ID:
234 contact->display_source_type = ctsvc_stmt_get_int(stmt, i);
236 case CTSVC_PROPERTY_CONTACT_ADDRESSBOOK_ID:
237 contact->addressbook_id = ctsvc_stmt_get_int(stmt, i);
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);
244 case CTSVC_PROPERTY_CONTACT_IMAGE_THUMBNAIL:
245 temp = ctsvc_stmt_get_text(stmt, i);
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);
252 case CTSVC_PROPERTY_CONTACT_IS_FAVORITE:
253 contact->is_favorite = ctsvc_stmt_get_int(stmt, i);
255 case CTSVC_PROPERTY_CONTACT_HAS_PHONENUMBER:
256 contact->has_phonenumber = ctsvc_stmt_get_int(stmt, i);
258 case CTSVC_PROPERTY_CONTACT_HAS_EMAIL:
259 contact->has_email = ctsvc_stmt_get_int(stmt, i);
261 case CTSVC_PROPERTY_CONTACT_PERSON_ID:
262 contact->person_id = ctsvc_stmt_get_int(stmt, i);
264 case CTSVC_PROPERTY_CONTACT_UID:
265 temp = ctsvc_stmt_get_text(stmt, i);
267 contact->uid = SAFE_STRDUP(temp);
269 case CTSVC_PROPERTY_CONTACT_VIBRATION:
270 temp = ctsvc_stmt_get_text(stmt, i);
271 free(contact->vibration);
272 contact->vibration = SAFE_STRDUP(temp);
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);
279 case CTSVC_PROPERTY_CONTACT_CHANGED_TIME:
280 contact->changed_time = ctsvc_stmt_get_int(stmt, i);
286 ctsvc_list_prepend(list, record);
288 ctsvc_stmt_finalize(stmt);
289 ctsvc_list_reverse(list);
291 *out_list = (contacts_list_h)list;
293 return CONTACTS_ERROR_NONE;
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,
308 .get_count_with_query = NULL,
309 .replace_record = NULL,
310 .replace_records = NULL,