4 * Copyright (c) 2010 - 2012 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.
23 #include "ctsvc_internal.h"
24 #include "ctsvc_schema.h"
25 #include "ctsvc_sqlite.h"
26 #include "ctsvc_utils.h"
27 #include "ctsvc_db_init.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"
35 static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id );
36 static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record );
37 static int __ctsvc_db_company_update_record( contacts_record_h record );
38 static int __ctsvc_db_company_delete_record( int id );
39 static int __ctsvc_db_company_get_all_records( int offset, int limit, contacts_list_h* out_list );
40 static int __ctsvc_db_company_get_records_with_query( contacts_query_h query, int offset, int limit, contacts_list_h* out_list );
41 //static int __ctsvc_db_company_insert_records(const contacts_list_h in_list, int **ds);
42 //static int __ctsvc_db_company_update_records(const contacts_list_h in_list);
43 //static int __ctsvc_db_company_delete_records( int ids[], int count);
45 ctsvc_db_plugin_info_s ctsvc_db_plugin_company = {
46 .is_query_only = false,
47 .insert_record = __ctsvc_db_company_insert_record,
48 .get_record = __ctsvc_db_company_get_record,
49 .update_record = __ctsvc_db_company_update_record,
50 .delete_record = __ctsvc_db_company_delete_record,
51 .get_all_records = __ctsvc_db_company_get_all_records,
52 .get_records_with_query = __ctsvc_db_company_get_records_with_query,
53 .insert_records = NULL,//__ctsvc_db_company_insert_records,
54 .update_records = NULL,//__ctsvc_db_company_update_records,
55 .delete_records = NULL,//__ctsvc_db_company_delete_records
57 .get_count_with_query = NULL,
58 .replace_record = NULL,
59 .replace_records = NULL,
62 static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record )
67 char query[CTS_SQL_MAX_LEN] = {0};
69 RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
72 len = snprintf(query, sizeof(query),
73 "SELECT id, data.contact_id, is_default, data1, data2, "
74 "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 "
75 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
76 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
77 "WHERE id = %d AND datatype = %d ",
78 id, CTSVC_DATA_COMPANY);
80 stmt = cts_query_prepare(query);
81 RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
83 ret = cts_stmt_step(stmt);
84 if (1 /*CTS_TRUE*/ != ret) {
85 CTS_ERR("cts_stmt_step() Failed(%d)", ret);
86 cts_stmt_finalize(stmt);
87 return CONTACTS_ERROR_NO_DATA;
90 ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
91 cts_stmt_finalize(stmt);
93 return CONTACTS_ERROR_NONE;
96 static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id )
100 char query[CTS_SQL_MAX_LEN] = {0};
101 ctsvc_company_s *company = (ctsvc_company_s *)record;
103 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title
104 && NULL == company->role && NULL == company->assistant_name && NULL == company->logo
105 && NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
106 CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : company is NULL");
108 ret = ctsvc_begin_trans();
109 if (CONTACTS_ERROR_NONE != ret) {
110 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
114 snprintf(query, sizeof(query),
115 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
116 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
117 if (CONTACTS_ERROR_NONE != ret) {
118 ctsvc_end_trans(false);
119 if (CONTACTS_ERROR_NO_DATA) {
120 CTS_ERR("No data : contact_id (%d) is not exist", company->contact_id);
121 return CONTACTS_ERROR_INVALID_PARAMETER;
124 CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
129 ret = ctsvc_db_company_insert(record, company->contact_id, false, id);
130 if (CONTACTS_ERROR_NONE != ret) {
131 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
132 ctsvc_end_trans(false);
136 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
138 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
139 if (CONTACTS_ERROR_NONE != ret) {
140 CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
141 ctsvc_end_trans(false);
144 ctsvc_set_person_noti();
146 ret = ctsvc_end_trans(true);
147 if (ret < CONTACTS_ERROR_NONE)
149 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
153 return CONTACTS_ERROR_NONE;
156 static int __ctsvc_db_company_update_record( contacts_record_h record )
160 char query[CTS_SQL_MAX_LEN] = {0};
161 ctsvc_company_s *company = (ctsvc_company_s *)record;
163 RETVM_IF(NULL == company->name && NULL == company->department && NULL == company->job_title &&
164 NULL == company->role && NULL == company->assistant_name && NULL == company->logo &&
165 NULL == company->location && NULL == company->description && NULL == company->phonetic_name,
166 CONTACTS_ERROR_INVALID_PARAMETER, "company is empty");
168 ret = ctsvc_begin_trans();
169 if (CONTACTS_ERROR_NONE != ret) {
170 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
174 snprintf(query, sizeof(query),
175 "SELECT addressbook_id FROM "CTSVC_DB_VIEW_CONTACT" WHERE contact_id = %d", company->contact_id);
176 ret = ctsvc_query_get_first_int_result(query, &addressbook_id);
177 if (CONTACTS_ERROR_NONE != ret) {
178 CTS_ERR("No data : contact_id (%d) is not exist", company->contact_id);
179 ctsvc_end_trans(false);
183 ret = ctsvc_db_company_update(record, company->contact_id, false);
184 if (CONTACTS_ERROR_NONE != ret) {
185 CTS_ERR("Update record Failed(%d)", ret);
186 ctsvc_end_trans(false);
190 ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
192 ret = ctsvc_db_contact_update_changed_time(company->contact_id);
193 if (CONTACTS_ERROR_NONE != ret) {
194 CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
195 ctsvc_end_trans(false);
198 ctsvc_set_person_noti();
200 ret = ctsvc_end_trans(true);
201 if (ret < CONTACTS_ERROR_NONE)
203 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
207 return CONTACTS_ERROR_NONE;
211 static int __ctsvc_db_company_delete_record( int id )
215 char query[CTS_SQL_MAX_LEN] = {0};
217 ret = ctsvc_begin_trans();
218 if (CONTACTS_ERROR_NONE != ret) {
219 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
223 snprintf(query, sizeof(query),
224 "SELECT contact_id FROM "CTSVC_DB_VIEW_CONTACT" "
225 "WHERE contact_id = (SELECT contact_id FROM "CTS_TABLE_DATA" WHERE id = %d)", id);
226 ret = ctsvc_query_get_first_int_result(query, &contact_id);
227 if( ret != CONTACTS_ERROR_NONE ) {
228 CTS_ERR("The id(%d) is Invalid(%d)", id, ret);
229 ctsvc_end_trans(false);
233 ret = ctsvc_db_company_delete(id, false);
234 if (CONTACTS_ERROR_NONE != ret) {
235 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
236 ctsvc_end_trans(false);
240 ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
242 ret = ctsvc_db_contact_update_changed_time(contact_id);
243 if (CONTACTS_ERROR_NONE != ret) {
244 CTS_ERR("DB error : ctsvc_db_contact_update_changed_time() Failed(%d)", ret);
245 ctsvc_end_trans(false);
248 ctsvc_set_person_noti();
250 ret = ctsvc_end_trans(true);
251 if (ret < CONTACTS_ERROR_NONE)
253 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
257 return CONTACTS_ERROR_NONE;
260 static int __ctsvc_db_company_get_all_records( int offset, int limit, contacts_list_h* out_list )
264 contacts_list_h list;
265 ctsvc_company_s *company;
266 cts_stmt stmt = NULL;
267 char query[CTS_SQL_MAX_LEN] = {0};
269 len = snprintf(query, sizeof(query),
270 "SELECT id, data.contact_id, is_default, data1, data2, "
271 "data3, data4, data5, data6, data7, data8, data9, data10, data11, data12 "
272 "FROM "CTS_TABLE_DATA", "CTSVC_DB_VIEW_CONTACT" "
273 "ON "CTS_TABLE_DATA".contact_id = "CTSVC_DB_VIEW_CONTACT".contact_id "
274 "WHERE datatype=%d AND is_my_profile=0 ",
277 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
279 len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
282 stmt = cts_query_prepare(query);
283 RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
285 contacts_list_create(&list);
286 while ((ret = cts_stmt_step(stmt))) {
287 if (1 /*CTS_TRUE */ != ret) {
288 CTS_ERR("DB : cts_stmt_step fail(%d)", ret);
289 cts_stmt_finalize(stmt);
290 contacts_list_destroy(list, true);
293 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
294 ctsvc_list_prepend(list, (contacts_record_h)company);
296 cts_stmt_finalize(stmt);
297 ctsvc_list_reverse(list);
300 return CONTACTS_ERROR_NONE;
303 static int __ctsvc_db_company_get_records_with_query( contacts_query_h query, int offset,
304 int limit, contacts_list_h* out_list )
309 ctsvc_query_s *s_query;
311 contacts_list_h list;
312 ctsvc_company_s *company;
314 RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
315 s_query = (ctsvc_query_s *)query;
317 ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
318 RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
320 contacts_list_create(&list);
321 while ((ret = cts_stmt_step(stmt))) {
322 contacts_record_h record;
323 if (1 /*CTS_TRUE */ != ret) {
324 CTS_ERR("DB error : cts_stmt_step() Failed(%d)", ret);
325 cts_stmt_finalize(stmt);
326 contacts_list_destroy(list, true);
330 contacts_record_create(_contacts_company._uri, &record);
331 company = (ctsvc_company_s*)record;
332 if (0 == s_query->projection_count)
333 field_count = s_query->property_count;
335 field_count = s_query->projection_count;
336 ret = ctsvc_record_set_projection_flags(record, s_query->projection,
337 s_query->projection_count, s_query->property_count);
339 if(CONTACTS_ERROR_NONE != ret)
340 ASSERT_NOT_REACHED("To set projection is failed.\n");
343 for(i=0;i<field_count;i++) {
346 if (0 == s_query->projection_count)
347 property_id = s_query->properties[i].property_id;
349 property_id = s_query->projection[i];
351 switch(property_id) {
352 case CTSVC_PROPERTY_COMPANY_ID:
353 company->id = ctsvc_stmt_get_int(stmt, i);
355 case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
356 company->contact_id = ctsvc_stmt_get_int(stmt, i);
358 case CTSVC_PROPERTY_COMPANY_TYPE:
359 company->type = ctsvc_stmt_get_int(stmt, i);
361 case CTSVC_PROPERTY_COMPANY_LABEL:
362 temp = ctsvc_stmt_get_text(stmt, i);
363 company->label = SAFE_STRDUP(temp);
365 case CTSVC_PROPERTY_COMPANY_NAME:
366 temp = ctsvc_stmt_get_text(stmt, i);
367 company->name = SAFE_STRDUP(temp);
369 case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
370 temp = ctsvc_stmt_get_text(stmt, i);
371 company->department = SAFE_STRDUP(temp);
373 case CTSVC_PROPERTY_COMPANY_JOB_TITLE:
374 temp = ctsvc_stmt_get_text(stmt, i);
375 company->job_title = SAFE_STRDUP(temp);
377 case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME:
378 temp = ctsvc_stmt_get_text(stmt, i);
379 company->assistant_name = SAFE_STRDUP(temp);
381 case CTSVC_PROPERTY_COMPANY_ROLE:
382 temp = ctsvc_stmt_get_text(stmt, i);
383 company->role = SAFE_STRDUP(temp);
385 case CTSVC_PROPERTY_COMPANY_LOGO:
386 temp = ctsvc_stmt_get_text(stmt, i);
387 company->logo = SAFE_STRDUP(temp);
389 case CTSVC_PROPERTY_COMPANY_LOCATION:
390 temp = ctsvc_stmt_get_text(stmt, i);
391 company->location = SAFE_STRDUP(temp);
393 case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
394 temp = ctsvc_stmt_get_text(stmt, i);
395 company->description = SAFE_STRDUP(temp);
397 case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME:
398 temp = ctsvc_stmt_get_text(stmt, i);
399 company->phonetic_name = SAFE_STRDUP(temp);
405 ctsvc_list_prepend(list, record);
407 cts_stmt_finalize(stmt);
408 ctsvc_list_reverse(list);
411 return CONTACTS_ERROR_NONE;
414 //static int __ctsvc_db_company_insert_records(const contacts_list_h in_list, int **ids) { return CONTACTS_ERROR_NONE; }
415 //static int __ctsvc_db_company_update_records(const contacts_list_h in_list) { return CONTACTS_ERROR_NONE; }
416 //static int __ctsvc_db_company_delete_records( int ids[], int count) { return CONTACTS_ERROR_NONE; }