[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_company.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 <unistd.h>
20
21 #include "contacts.h"
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"
34
35
36 static int __ctsvc_db_company_get_record(int id, contacts_record_h *out_record)
37 {
38         int ret;
39         cts_stmt stmt = NULL;
40         char query[CTS_SQL_MAX_LEN] = {0};
41
42         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
43         *out_record = NULL;
44
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);
52
53         ret = ctsvc_query_prepare(query, &stmt);
54         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
55
56         ret = ctsvc_stmt_step(stmt);
57         if (1 /*CTS_TRUE*/ != ret) {
58                 /* LCOV_EXCL_START */
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;
63                 else
64                         return ret;
65                 /* LCOV_EXCL_STOP */
66         }
67
68         ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
69         ctsvc_stmt_finalize(stmt);
70
71         return CONTACTS_ERROR_NONE;
72 }
73
74 static int __ctsvc_db_company_insert_record(contacts_record_h record, int *id)
75 {
76         int ret;
77         int addressbook_id;
78         char query[CTS_SQL_MAX_LEN] = {0};
79         ctsvc_company_s *company = (ctsvc_company_s*)record;
80
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");
85
86         ret = ctsvc_begin_trans();
87         if (CONTACTS_ERROR_NONE != ret) {
88                 /* LCOV_EXCL_START */
89                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
90                 return ret;
91                 /* LCOV_EXCL_STOP */
92         }
93
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;
103                         /* LCOV_EXCL_STOP */
104                 } else {
105                         /* LCOV_EXCL_START */
106                         ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
107                         return ret;
108                         /* LCOV_EXCL_STOP */
109                 }
110         }
111
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;
117                 /* LCOV_EXCL_STOP */
118         }
119
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);
125                 return ret;
126                 /* LCOV_EXCL_STOP */
127         }
128
129         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
130
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);
136                 return ret;
137                 /* LCOV_EXCL_STOP */
138         }
139         ctsvc_set_person_noti();
140
141         ret = ctsvc_end_trans(true);
142         if (ret < CONTACTS_ERROR_NONE) {
143                 /* LCOV_EXCL_START */
144                 ERR("ctsvc_end_trans() Fail(%d)", ret);
145                 return ret;
146                 /* LCOV_EXCL_STOP */
147         } else {
148                 return CONTACTS_ERROR_NONE;
149         }
150 }
151
152 static int __ctsvc_db_company_update_record(contacts_record_h record)
153 {
154         int ret;
155         int addressbook_id;
156         char query[CTS_SQL_MAX_LEN] = {0};
157         ctsvc_company_s *company = (ctsvc_company_s*)record;
158
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");
163
164         ret = ctsvc_begin_trans();
165         if (CONTACTS_ERROR_NONE != ret) {
166                 /* LCOV_EXCL_START */
167                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
168                 return ret;
169                 /* LCOV_EXCL_STOP */
170         }
171
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);
179                 return ret;
180                 /* LCOV_EXCL_STOP */
181         }
182
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;
188                 /* LCOV_EXCL_STOP */
189         }
190
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);
196                 return ret;
197                 /* LCOV_EXCL_STOP */
198         }
199
200         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
201
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);
207                 return ret;
208                 /* LCOV_EXCL_STOP */
209         }
210         ctsvc_set_person_noti();
211
212         ret = ctsvc_end_trans(true);
213         if (ret < CONTACTS_ERROR_NONE) {
214                 /* LCOV_EXCL_START */
215                 ERR("ctsvc_end_trans() Fail(%d)", ret);
216                 return ret;
217                 /* LCOV_EXCL_STOP */
218         } else {
219                 return CONTACTS_ERROR_NONE;
220         }
221 }
222
223
224 static int __ctsvc_db_company_delete_record(int id)
225 {
226         int ret;
227         int contact_id;
228         char query[CTS_SQL_MAX_LEN] = {0};
229         cts_stmt stmt;
230         int addressbook_id;
231
232         ret = ctsvc_begin_trans();
233         if (CONTACTS_ERROR_NONE != ret) {
234                 /* LCOV_EXCL_START */
235                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
236                 return ret;
237                 /* LCOV_EXCL_STOP */
238         }
239
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);
244         if (NULL == stmt) {
245                 /* LCOV_EXCL_START */
246                 ERR("ctsvc_query_prepare Fail(%d)", ret);
247                 ctsvc_end_trans(false);
248                 return ret;
249                 /* LCOV_EXCL_STOP */
250         }
251         ret = ctsvc_stmt_step(stmt);
252         if (1 != ret) {
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;
259                 else
260                         return ret;
261                 /* LCOV_EXCL_STOP */
262         }
263
264         contact_id = ctsvc_stmt_get_int(stmt, 0);
265         addressbook_id = ctsvc_stmt_get_int(stmt, 1);
266         ctsvc_stmt_finalize(stmt);
267
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;
273                 /* LCOV_EXCL_STOP */
274         }
275
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);
281                 return ret;
282                 /* LCOV_EXCL_STOP */
283         }
284
285         ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
286
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);
292                 return ret;
293                 /* LCOV_EXCL_STOP */
294         }
295         ctsvc_set_person_noti();
296
297         ret = ctsvc_end_trans(true);
298         if (ret < CONTACTS_ERROR_NONE) {
299                 /* LCOV_EXCL_START */
300                 ERR("ctsvc_end_trans() Fail(%d)", ret);
301                 return ret;
302                 /* LCOV_EXCL_STOP */
303         } else {
304                 return CONTACTS_ERROR_NONE;
305         }
306 }
307
308 static int __ctsvc_db_company_get_all_records(int offset, int limit, contacts_list_h *out_list)
309 {
310         int len;
311         int ret;
312         contacts_list_h list;
313         ctsvc_company_s *company;
314         cts_stmt stmt = NULL;
315         char query[CTS_SQL_MAX_LEN] = {0};
316
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);
324
325         if (0 != limit) {
326                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
327                 if (0 < offset)
328                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
329         }
330
331         ret = ctsvc_query_prepare(query, &stmt);
332         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
333
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);
341                         return ret;
342                         /* LCOV_EXCL_STOP */
343                 }
344                 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
345                 ctsvc_list_prepend(list, (contacts_record_h)company);
346         }
347         ctsvc_stmt_finalize(stmt);
348         ctsvc_list_reverse(list);
349
350         *out_list = list;
351         return CONTACTS_ERROR_NONE;
352 }
353
354 static int __ctsvc_db_company_get_records_with_query(contacts_query_h query, int offset,
355                 int limit, contacts_list_h *out_list)
356 {
357         int ret;
358         int i;
359         int field_count;
360         ctsvc_query_s *s_query;
361         cts_stmt stmt;
362         contacts_list_h list;
363         ctsvc_company_s *company;
364
365         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
366         s_query = (ctsvc_query_s*)query;
367
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);
370
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);
379                         return ret;
380                         /* LCOV_EXCL_STOP */
381                 }
382
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;
387                 } else {
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);
391
392                         if (CONTACTS_ERROR_NONE != ret)
393                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
394                 }
395
396                 for (i = 0; i < field_count; i++) {
397                         char *temp;
398                         int property_id;
399                         if (0 == s_query->projection_count)
400                                 property_id = s_query->properties[i].property_id;
401                         else
402                                 property_id = s_query->projection[i];
403
404                         switch (property_id) {
405                         case CTSVC_PROPERTY_COMPANY_ID:
406                                 company->id = ctsvc_stmt_get_int(stmt, i);
407                                 break;
408                         case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
409                                 company->contact_id = ctsvc_stmt_get_int(stmt, i);
410                                 break;
411                         case CTSVC_PROPERTY_COMPANY_TYPE:
412                                 company->type = ctsvc_stmt_get_int(stmt, i);
413                                 break;
414                         case CTSVC_PROPERTY_COMPANY_LABEL:
415                                 temp = ctsvc_stmt_get_text(stmt, i);
416                                 free(company->label);
417                                 company->label = SAFE_STRDUP(temp);
418                                 break;
419                         case CTSVC_PROPERTY_COMPANY_NAME:
420                                 temp = ctsvc_stmt_get_text(stmt, i);
421                                 free(company->name);
422                                 company->name = SAFE_STRDUP(temp);
423                                 break;
424                         case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
425                                 temp = ctsvc_stmt_get_text(stmt, i);
426                                 free(company->department);
427                                 company->department = SAFE_STRDUP(temp);
428                                 break;
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);
433                                 break;
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);
438                                 break;
439                         case CTSVC_PROPERTY_COMPANY_ROLE:
440                                 temp = ctsvc_stmt_get_text(stmt, i);
441                                 free(company->role);
442                                 company->role = SAFE_STRDUP(temp);
443                                 break;
444                         case CTSVC_PROPERTY_COMPANY_LOGO:
445                                 temp = ctsvc_stmt_get_text(stmt, i);
446                                 free(company->logo);
447                                 company->logo = SAFE_STRDUP(temp);
448                                 break;
449                         case CTSVC_PROPERTY_COMPANY_LOCATION:
450                                 temp = ctsvc_stmt_get_text(stmt, i);
451                                 free(company->location);
452                                 company->location = SAFE_STRDUP(temp);
453                                 break;
454                         case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
455                                 temp = ctsvc_stmt_get_text(stmt, i);
456                                 free(company->description);
457                                 company->description = SAFE_STRDUP(temp);
458                                 break;
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);
463                                 break;
464                         default:
465                                 break;
466                         }
467                 }
468                 ctsvc_list_prepend(list, record);
469         }
470         ctsvc_stmt_finalize(stmt);
471         ctsvc_list_reverse(list);
472
473         *out_list = list;
474         return CONTACTS_ERROR_NONE;
475 }
476
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,
488         .get_count = NULL,
489         .get_count_with_query = NULL,
490         .replace_record = NULL,
491         .replace_records = NULL,
492 };
493