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.
22 #include "ctsvc_internal.h"
23 #include "ctsvc_db_schema.h"
24 #include "ctsvc_db_sqlite.h"
25 #include "ctsvc_db_utils.h"
26 #include "ctsvc_db_init.h"
27 #include "ctsvc_db_access_control.h"
28 #include "ctsvc_db_plugin_contact_helper.h"
29 #include "ctsvc_db_plugin_company_helper.h"
30 #include "ctsvc_record.h"
31 #include "ctsvc_notification.h"
32 #include "ctsvc_db_query.h"
33 #include "ctsvc_list.h"
36 static int __ctsvc_db_company_get_record(int id, contacts_record_h *out_record)
40 char query[CTS_SQL_MAX_LEN] = {0};
42 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
45 snprintf(query, sizeof(query),
46 "SELECT id, data.contact_id, is_default, data1, data2, "
47 "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 "
48 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
49 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
50 "WHERE id = %d AND datatype = %d ",
51 id, CTSVC_DATA_COMPANY);
53 ret = ctsvc_query_prepare(query, &stmt);
54 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
56 ret = ctsvc_stmt_step(stmt);
57 if (1 /*CTS_TRUE*/ != ret) {
58 ERR("ctsvc_stmt_step() Fail(%d)", ret);
59 ctsvc_stmt_finalize(stmt);
60 if (CONTACTS_ERROR_NONE == ret)
61 return CONTACTS_ERROR_NO_DATA;
66 ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
67 ctsvc_stmt_finalize(stmt);
69 return CONTACTS_ERROR_NONE;
72 static int __ctsvc_db_company_insert_record(contacts_record_h record, int *id)
76 char query[CTS_SQL_MAX_LEN] = {0};
77 ctsvc_company_s *company = (ctsvc_company_s*)record;
79 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title
80 && NULL == company->role && NULL == company->assistant_name && NULL == company->logo
81 && NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
82 CONTACTS_ERROR_INVALID_PARAMETER, "company is NULL");
84 ret = ctsvc_begin_trans();
85 if (CONTACTS_ERROR_NONE != ret) {
86 ERR("ctsvc_begin_trans() Fail(%d)", ret);
90 snprintf(query, sizeof(query),
91 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
92 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
93 if (CONTACTS_ERROR_NONE != ret) {
94 ctsvc_end_trans(false);
95 if (CONTACTS_ERROR_NO_DATA == ret) {
96 ERR("No data : contact_id (%d) is not exist", company->contact_id);
97 return CONTACTS_ERROR_INVALID_PARAMETER;
99 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
104 if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
105 ERR("Does not have permission to update this company record : addresbook_id(%d)", addressbook_id);
106 ctsvc_end_trans(false);
107 return CONTACTS_ERROR_PERMISSION_DENIED;
110 ret = ctsvc_db_company_insert(record, company->contact_id, false, id);
111 if (CONTACTS_ERROR_NONE != ret) {
112 ERR("ctsvc_begin_trans() Fail(%d)", ret);
113 ctsvc_end_trans(false);
117 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
119 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
120 if (CONTACTS_ERROR_NONE != ret) {
121 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
122 ctsvc_end_trans(false);
125 ctsvc_set_person_noti();
127 ret = ctsvc_end_trans(true);
128 if (ret < CONTACTS_ERROR_NONE) {
129 ERR("ctsvc_end_trans() Fail(%d)", ret);
132 return CONTACTS_ERROR_NONE;
136 static int __ctsvc_db_company_update_record(contacts_record_h record)
140 char query[CTS_SQL_MAX_LEN] = {0};
141 ctsvc_company_s *company = (ctsvc_company_s*)record;
143 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title &&
144 NULL == company->role && NULL == company->assistant_name && NULL == company->logo &&
145 NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
146 CONTACTS_ERROR_INVALID_PARAMETER, "company is empty");
148 ret = ctsvc_begin_trans();
149 if (CONTACTS_ERROR_NONE != ret) {
150 ERR("ctsvc_begin_trans() Fail(%d)", ret);
154 snprintf(query, sizeof(query),
155 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
156 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
157 if (CONTACTS_ERROR_NONE != ret) {
158 ERR("No data : contact_id (%d) is not exist", company->contact_id);
159 ctsvc_end_trans(false);
163 if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
164 ERR("Does not have permission to update this company record : addresbook_id(%d)", addressbook_id);
165 ctsvc_end_trans(false);
166 return CONTACTS_ERROR_PERMISSION_DENIED;
169 ret = ctsvc_db_company_update(record, company->contact_id, false);
170 if (CONTACTS_ERROR_NONE != ret) {
171 ERR("Update record Fail(%d)", ret);
172 ctsvc_end_trans(false);
176 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
178 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
179 if (CONTACTS_ERROR_NONE != ret) {
180 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
181 ctsvc_end_trans(false);
184 ctsvc_set_person_noti();
186 ret = ctsvc_end_trans(true);
187 if (ret < CONTACTS_ERROR_NONE) {
188 ERR("ctsvc_end_trans() Fail(%d)", ret);
191 return CONTACTS_ERROR_NONE;
196 static int __ctsvc_db_company_delete_record(int id)
200 char query[CTS_SQL_MAX_LEN] = {0};
204 ret = ctsvc_begin_trans();
205 if (CONTACTS_ERROR_NONE != ret) {
206 ERR("ctsvc_begin_trans() Fail(%d)", ret);
210 snprintf(query, sizeof(query),
211 "SELECT contact_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" "
212 "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
213 ret = ctsvc_query_prepare(query, &stmt);
215 ERR("ctsvc_query_prepare Fail(%d)", ret);
216 ctsvc_end_trans(false);
219 ret = ctsvc_stmt_step(stmt);
221 ERR("The id(%d) is Invalid(%d)", id, ret);
222 ctsvc_stmt_finalize(stmt);
223 ctsvc_end_trans(false);
224 if (CONTACTS_ERROR_NONE == ret)
225 return CONTACTS_ERROR_NO_DATA;
230 contact_id = ctsvc_stmt_get_int(stmt, 0);
231 addressbook_id = ctsvc_stmt_get_int(stmt, 1);
232 ctsvc_stmt_finalize(stmt);
234 if (false == ctsvc_have_ab_write_permission(addressbook_id)) {
235 ERR("Does not have permission to delete this company record : addresbook_id(%d)", addressbook_id);
236 ctsvc_end_trans(false);
237 return CONTACTS_ERROR_PERMISSION_DENIED;
240 ret = ctsvc_db_company_delete(id, false);
241 if (CONTACTS_ERROR_NONE != ret) {
242 ERR("ctsvc_begin_trans() Fail(%d)", ret);
243 ctsvc_end_trans(false);
247 ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
249 ret = ctsvc_db_contact_update_changed_time(contact_id);
250 if (CONTACTS_ERROR_NONE != ret) {
251 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
252 ctsvc_end_trans(false);
255 ctsvc_set_person_noti();
257 ret = ctsvc_end_trans(true);
258 if (ret < CONTACTS_ERROR_NONE) {
259 ERR("ctsvc_end_trans() Fail(%d)", ret);
262 return CONTACTS_ERROR_NONE;
266 static int __ctsvc_db_company_get_all_records(int offset, int limit, contacts_list_h *out_list)
270 contacts_list_h list;
271 ctsvc_company_s *company;
272 cts_stmt stmt = NULL;
273 char query[CTS_SQL_MAX_LEN] = {0};
275 len = snprintf(query, sizeof(query),
276 "SELECT id, data.contact_id, is_default, data1, data2, "
277 "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 "
278 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
279 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
280 "WHERE datatype=%d AND is_my_profile=0 ",
284 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
286 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
289 ret = ctsvc_query_prepare(query, &stmt);
290 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
292 contacts_list_create(&list);
293 while ((ret = ctsvc_stmt_step(stmt))) {
294 if (1 /*CTS_TRUE */ != ret) {
295 ERR("DB : ctsvc_stmt_step() Fail(%d)", ret);
296 ctsvc_stmt_finalize(stmt);
297 contacts_list_destroy(list, true);
300 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
301 ctsvc_list_prepend(list, (contacts_record_h)company);
303 ctsvc_stmt_finalize(stmt);
304 ctsvc_list_reverse(list);
307 return CONTACTS_ERROR_NONE;
310 static int __ctsvc_db_company_get_records_with_query(contacts_query_h query, int offset,
311 int limit, contacts_list_h *out_list)
316 ctsvc_query_s *s_query;
318 contacts_list_h list;
319 ctsvc_company_s *company;
321 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
322 s_query = (ctsvc_query_s*)query;
324 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
325 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
327 contacts_list_create(&list);
328 while ((ret = ctsvc_stmt_step(stmt))) {
329 contacts_record_h record;
330 if (1 /*CTS_TRUE */ != ret) {
331 ERR("ctsvc_stmt_step() Fail(%d)", ret);
332 ctsvc_stmt_finalize(stmt);
333 contacts_list_destroy(list, true);
337 contacts_record_create(_contacts_company._uri, &record);
338 company = (ctsvc_company_s*)record;
339 if (0 == s_query->projection_count) {
340 field_count = s_query->property_count;
342 field_count = s_query->projection_count;
343 ret = ctsvc_record_set_projection_flags(record, s_query->projection,
344 s_query->projection_count, s_query->property_count);
346 if (CONTACTS_ERROR_NONE != ret)
347 ASSERT_NOT_REACHED("To set projection is Fail.\n");
350 for (i = 0; i < field_count; i++) {
353 if (0 == s_query->projection_count)
354 property_id = s_query->properties[i].property_id;
356 property_id = s_query->projection[i];
358 switch (property_id) {
359 case CTSVC_PROPERTY_COMPANY_ID:
360 company->id = ctsvc_stmt_get_int(stmt, i);
362 case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
363 company->contact_id = ctsvc_stmt_get_int(stmt, i);
365 case CTSVC_PROPERTY_COMPANY_TYPE:
366 company->type = ctsvc_stmt_get_int(stmt, i);
368 case CTSVC_PROPERTY_COMPANY_LABEL:
369 temp = ctsvc_stmt_get_text(stmt, i);
370 free(company->label);
371 company->label = SAFE_STRDUP(temp);
373 case CTSVC_PROPERTY_COMPANY_NAME:
374 temp = ctsvc_stmt_get_text(stmt, i);
376 company->name = SAFE_STRDUP(temp);
378 case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
379 temp = ctsvc_stmt_get_text(stmt, i);
380 free(company->department);
381 company->department = SAFE_STRDUP(temp);
383 case CTSVC_PROPERTY_COMPANY_JOB_TITLE:
384 temp = ctsvc_stmt_get_text(stmt, i);
385 free(company->job_title);
386 company->job_title = SAFE_STRDUP(temp);
388 case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME:
389 temp = ctsvc_stmt_get_text(stmt, i);
390 free(company->assistant_name);
391 company->assistant_name = SAFE_STRDUP(temp);
393 case CTSVC_PROPERTY_COMPANY_ROLE:
394 temp = ctsvc_stmt_get_text(stmt, i);
396 company->role = SAFE_STRDUP(temp);
398 case CTSVC_PROPERTY_COMPANY_LOGO:
399 temp = ctsvc_stmt_get_text(stmt, i);
401 company->logo = SAFE_STRDUP(temp);
403 case CTSVC_PROPERTY_COMPANY_LOCATION:
404 temp = ctsvc_stmt_get_text(stmt, i);
405 free(company->location);
406 company->location = SAFE_STRDUP(temp);
408 case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
409 temp = ctsvc_stmt_get_text(stmt, i);
410 free(company->description);
411 company->description = SAFE_STRDUP(temp);
413 case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME:
414 temp = ctsvc_stmt_get_text(stmt, i);
415 free(company->phonetic_name);
416 company->phonetic_name = SAFE_STRDUP(temp);
422 ctsvc_list_prepend(list, record);
424 ctsvc_stmt_finalize(stmt);
425 ctsvc_list_reverse(list);
428 return CONTACTS_ERROR_NONE;
431 ctsvc_db_plugin_info_s ctsvc_db_plugin_company = {
432 .is_query_only = false,
433 .insert_record = __ctsvc_db_company_insert_record,
434 .get_record = __ctsvc_db_company_get_record,
435 .update_record = __ctsvc_db_company_update_record,
436 .delete_record = __ctsvc_db_company_delete_record,
437 .get_all_records = __ctsvc_db_company_get_all_records,
438 .get_records_with_query = __ctsvc_db_company_get_records_with_query,
439 .insert_records = NULL,
440 .update_records = NULL,
441 .delete_records = NULL,
443 .get_count_with_query = NULL,
444 .replace_record = NULL,
445 .replace_records = NULL,