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, CONTACTS_DATA_TYPE_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) {
59 ERR("ctsvc_stmt_step() Fail(%d)", ret);
60 ctsvc_stmt_finalize(stmt);
61 if (CONTACTS_ERROR_NONE == ret)
62 return CONTACTS_ERROR_NO_DATA;
68 ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
69 ctsvc_stmt_finalize(stmt);
71 return CONTACTS_ERROR_NONE;
74 static int __ctsvc_db_company_insert_record(contacts_record_h record, int *id)
78 char query[CTS_SQL_MAX_LEN] = {0};
79 ctsvc_company_s *company = (ctsvc_company_s*)record;
81 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title
82 && NULL == company->role && NULL == company->assistant_name && NULL == company->logo
83 && NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
84 CONTACTS_ERROR_INVALID_PARAMETER, "company is NULL");
86 ret = ctsvc_begin_trans();
87 if (CONTACTS_ERROR_NONE != ret) {
89 ERR("ctsvc_begin_trans() Fail(%d)", ret);
94 snprintf(query, sizeof(query),
95 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
96 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
97 if (CONTACTS_ERROR_NONE != ret) {
98 ctsvc_end_trans(false);
99 if (CONTACTS_ERROR_NO_DATA == ret) {
100 /* LCOV_EXCL_START */
101 ERR("No data : contact_id (%d) is not exist", company->contact_id);
102 return CONTACTS_ERROR_INVALID_PARAMETER;
105 /* LCOV_EXCL_START */
106 ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
112 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
113 /* LCOV_EXCL_START */
114 ERR("No permission in this addresbook_id(%d)", addressbook_id);
115 ctsvc_end_trans(false);
116 return CONTACTS_ERROR_PERMISSION_DENIED;
120 ret = ctsvc_db_company_insert(record, company->contact_id, false, id);
121 if (CONTACTS_ERROR_NONE != ret) {
122 /* LCOV_EXCL_START */
123 ERR("ctsvc_begin_trans() Fail(%d)", ret);
124 ctsvc_end_trans(false);
129 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
131 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
132 if (CONTACTS_ERROR_NONE != ret) {
133 /* LCOV_EXCL_START */
134 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
135 ctsvc_end_trans(false);
139 ctsvc_set_person_noti();
141 ret = ctsvc_end_trans(true);
142 if (ret < CONTACTS_ERROR_NONE) {
143 /* LCOV_EXCL_START */
144 ERR("ctsvc_end_trans() Fail(%d)", ret);
148 return CONTACTS_ERROR_NONE;
152 static int __ctsvc_db_company_update_record(contacts_record_h record)
156 char query[CTS_SQL_MAX_LEN] = {0};
157 ctsvc_company_s *company = (ctsvc_company_s*)record;
159 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title &&
160 NULL == company->role && NULL == company->assistant_name && NULL == company->logo &&
161 NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
162 CONTACTS_ERROR_INVALID_PARAMETER, "company is empty");
164 ret = ctsvc_begin_trans();
165 if (CONTACTS_ERROR_NONE != ret) {
166 /* LCOV_EXCL_START */
167 ERR("ctsvc_begin_trans() Fail(%d)", ret);
172 snprintf(query, sizeof(query),
173 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
174 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
175 if (CONTACTS_ERROR_NONE != ret) {
176 /* LCOV_EXCL_START */
177 ERR("No data : contact_id (%d) is not exist", company->contact_id);
178 ctsvc_end_trans(false);
183 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
184 /* LCOV_EXCL_START */
185 ERR("No permission in this addresbook_id(%d)", addressbook_id);
186 ctsvc_end_trans(false);
187 return CONTACTS_ERROR_PERMISSION_DENIED;
191 ret = ctsvc_db_company_update(record, company->contact_id, false);
192 if (CONTACTS_ERROR_NONE != ret) {
193 /* LCOV_EXCL_START */
194 ERR("Update record Fail(%d)", ret);
195 ctsvc_end_trans(false);
200 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
202 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
203 if (CONTACTS_ERROR_NONE != ret) {
204 /* LCOV_EXCL_START */
205 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
206 ctsvc_end_trans(false);
210 ctsvc_set_person_noti();
212 ret = ctsvc_end_trans(true);
213 if (ret < CONTACTS_ERROR_NONE) {
214 /* LCOV_EXCL_START */
215 ERR("ctsvc_end_trans() Fail(%d)", ret);
219 return CONTACTS_ERROR_NONE;
224 static int __ctsvc_db_company_delete_record(int id)
228 char query[CTS_SQL_MAX_LEN] = {0};
232 ret = ctsvc_begin_trans();
233 if (CONTACTS_ERROR_NONE != ret) {
234 /* LCOV_EXCL_START */
235 ERR("ctsvc_begin_trans() Fail(%d)", ret);
240 snprintf(query, sizeof(query),
241 "SELECT contact_id, addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" "
242 "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
243 ret = ctsvc_query_prepare(query, &stmt);
245 /* LCOV_EXCL_START */
246 ERR("ctsvc_query_prepare Fail(%d)", ret);
247 ctsvc_end_trans(false);
251 ret = ctsvc_stmt_step(stmt);
253 /* LCOV_EXCL_START */
254 ERR("The id(%d) is Invalid(%d)", id, ret);
255 ctsvc_stmt_finalize(stmt);
256 ctsvc_end_trans(false);
257 if (CONTACTS_ERROR_NONE == ret)
258 return CONTACTS_ERROR_NO_DATA;
264 contact_id = ctsvc_stmt_get_int(stmt, 0);
265 addressbook_id = ctsvc_stmt_get_int(stmt, 1);
266 ctsvc_stmt_finalize(stmt);
268 if (false == ctsvc_have_ab_write_permission(addressbook_id, false)) {
269 /* LCOV_EXCL_START */
270 ERR("No permission in this addresbook_id(%d)", addressbook_id);
271 ctsvc_end_trans(false);
272 return CONTACTS_ERROR_PERMISSION_DENIED;
276 ret = ctsvc_db_company_delete(id, false);
277 if (CONTACTS_ERROR_NONE != ret) {
278 /* LCOV_EXCL_START */
279 ERR("ctsvc_begin_trans() Fail(%d)", ret);
280 ctsvc_end_trans(false);
285 ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
287 ret = ctsvc_db_contact_update_changed_time(contact_id);
288 if (CONTACTS_ERROR_NONE != ret) {
289 /* LCOV_EXCL_START */
290 ERR("ctsvc_db_contact_update_changed_time() Fail(%d)", ret);
291 ctsvc_end_trans(false);
295 ctsvc_set_person_noti();
297 ret = ctsvc_end_trans(true);
298 if (ret < CONTACTS_ERROR_NONE) {
299 /* LCOV_EXCL_START */
300 ERR("ctsvc_end_trans() Fail(%d)", ret);
304 return CONTACTS_ERROR_NONE;
308 static int __ctsvc_db_company_get_all_records(int offset, int limit, contacts_list_h *out_list)
312 contacts_list_h list;
313 ctsvc_company_s *company;
314 cts_stmt stmt = NULL;
315 char query[CTS_SQL_MAX_LEN] = {0};
317 len = snprintf(query, sizeof(query),
318 "SELECT id, data.contact_id, is_default, data1, data2, "
319 "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 "
320 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
321 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
322 "WHERE datatype=%d AND is_my_profile=0 ",
323 CONTACTS_DATA_TYPE_COMPANY);
326 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
328 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
331 ret = ctsvc_query_prepare(query, &stmt);
332 RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
334 contacts_list_create(&list);
335 while ((ret = ctsvc_stmt_step(stmt))) {
336 if (1 /*CTS_TRUE */ != ret) {
337 /* LCOV_EXCL_START */
338 ERR("DB : ctsvc_stmt_step() Fail(%d)", ret);
339 ctsvc_stmt_finalize(stmt);
340 contacts_list_destroy(list, true);
344 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
345 ctsvc_list_prepend(list, (contacts_record_h)company);
347 ctsvc_stmt_finalize(stmt);
348 ctsvc_list_reverse(list);
351 return CONTACTS_ERROR_NONE;
354 static int __ctsvc_db_company_get_records_with_query(contacts_query_h query, int offset,
355 int limit, contacts_list_h *out_list)
360 ctsvc_query_s *s_query;
362 contacts_list_h list;
363 ctsvc_company_s *company;
365 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
366 s_query = (ctsvc_query_s*)query;
368 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
369 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
371 contacts_list_create(&list);
372 while ((ret = ctsvc_stmt_step(stmt))) {
373 contacts_record_h record;
374 if (1 /*CTS_TRUE */ != ret) {
375 /* LCOV_EXCL_START */
376 ERR("ctsvc_stmt_step() Fail(%d)", ret);
377 ctsvc_stmt_finalize(stmt);
378 contacts_list_destroy(list, true);
383 contacts_record_create(_contacts_company._uri, &record);
384 company = (ctsvc_company_s*)record;
385 if (0 == s_query->projection_count) {
386 field_count = s_query->property_count;
388 field_count = s_query->projection_count;
389 ret = ctsvc_record_set_projection_flags(record, s_query->projection,
390 s_query->projection_count, s_query->property_count);
392 if (CONTACTS_ERROR_NONE != ret)
393 ASSERT_NOT_REACHED("To set projection is Fail.\n");
396 for (i = 0; i < field_count; i++) {
399 if (0 == s_query->projection_count)
400 property_id = s_query->properties[i].property_id;
402 property_id = s_query->projection[i];
404 switch (property_id) {
405 case CTSVC_PROPERTY_COMPANY_ID:
406 company->id = ctsvc_stmt_get_int(stmt, i);
408 case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
409 company->contact_id = ctsvc_stmt_get_int(stmt, i);
411 case CTSVC_PROPERTY_COMPANY_TYPE:
412 company->type = ctsvc_stmt_get_int(stmt, i);
414 case CTSVC_PROPERTY_COMPANY_LABEL:
415 temp = ctsvc_stmt_get_text(stmt, i);
416 free(company->label);
417 company->label = SAFE_STRDUP(temp);
419 case CTSVC_PROPERTY_COMPANY_NAME:
420 temp = ctsvc_stmt_get_text(stmt, i);
422 company->name = SAFE_STRDUP(temp);
424 case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
425 temp = ctsvc_stmt_get_text(stmt, i);
426 free(company->department);
427 company->department = SAFE_STRDUP(temp);
429 case CTSVC_PROPERTY_COMPANY_JOB_TITLE:
430 temp = ctsvc_stmt_get_text(stmt, i);
431 free(company->job_title);
432 company->job_title = SAFE_STRDUP(temp);
434 case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME:
435 temp = ctsvc_stmt_get_text(stmt, i);
436 free(company->assistant_name);
437 company->assistant_name = SAFE_STRDUP(temp);
439 case CTSVC_PROPERTY_COMPANY_ROLE:
440 temp = ctsvc_stmt_get_text(stmt, i);
442 company->role = SAFE_STRDUP(temp);
444 case CTSVC_PROPERTY_COMPANY_LOGO:
445 temp = ctsvc_stmt_get_text(stmt, i);
447 company->logo = SAFE_STRDUP(temp);
449 case CTSVC_PROPERTY_COMPANY_LOCATION:
450 temp = ctsvc_stmt_get_text(stmt, i);
451 free(company->location);
452 company->location = SAFE_STRDUP(temp);
454 case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
455 temp = ctsvc_stmt_get_text(stmt, i);
456 free(company->description);
457 company->description = SAFE_STRDUP(temp);
459 case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME:
460 temp = ctsvc_stmt_get_text(stmt, i);
461 free(company->phonetic_name);
462 company->phonetic_name = SAFE_STRDUP(temp);
468 ctsvc_list_prepend(list, record);
470 ctsvc_stmt_finalize(stmt);
471 ctsvc_list_reverse(list);
474 return CONTACTS_ERROR_NONE;
477 ctsvc_db_plugin_info_s ctsvc_db_plugin_company = {
478 .is_query_only = false,
479 .insert_record = __ctsvc_db_company_insert_record,
480 .get_record = __ctsvc_db_company_get_record,
481 .update_record = __ctsvc_db_company_update_record,
482 .delete_record = __ctsvc_db_company_delete_record,
483 .get_all_records = __ctsvc_db_company_get_all_records,
484 .get_records_with_query = __ctsvc_db_company_get_records_with_query,
485 .insert_records = NULL,
486 .update_records = NULL,
487 .delete_records = NULL,
489 .get_count_with_query = NULL,
490 .replace_record = NULL,
491 .replace_records = NULL,