apply coding style
[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, CTSVC_DATA_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                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
59                 ctsvc_stmt_finalize(stmt);
60                 if (CONTACTS_ERROR_NONE == ret)
61                         return CONTACTS_ERROR_NO_DATA;
62                 else
63                         return ret;
64         }
65
66         ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
67         ctsvc_stmt_finalize(stmt);
68
69         return CONTACTS_ERROR_NONE;
70 }
71
72 static int __ctsvc_db_company_insert_record(contacts_record_h record, int *id)
73 {
74         int ret;
75         int addressbook_id;
76         char query[CTS_SQL_MAX_LEN] = {0};
77         ctsvc_company_s *company = (ctsvc_company_s*)record;
78
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");
83
84         ret = ctsvc_begin_trans();
85         if (CONTACTS_ERROR_NONE != ret) {
86                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
87                 return ret;
88         }
89
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;
98                 } else {
99                         ERR("ctsvc_query_get_first_int_result() Fail(%d)", ret);
100                         return ret;
101                 }
102         }
103
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;
108         }
109
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);
114                 return ret;
115         }
116
117         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
118
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);
123                 return ret;
124         }
125         ctsvc_set_person_noti();
126
127         ret = ctsvc_end_trans(true);
128         if (ret < CONTACTS_ERROR_NONE) {
129                 ERR("ctsvc_end_trans() Fail(%d)", ret);
130                 return ret;
131         } else {
132                 return CONTACTS_ERROR_NONE;
133         }
134 }
135
136 static int __ctsvc_db_company_update_record(contacts_record_h record)
137 {
138         int ret;
139         int addressbook_id;
140         char query[CTS_SQL_MAX_LEN] = {0};
141         ctsvc_company_s *company = (ctsvc_company_s*)record;
142
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");
147
148         ret = ctsvc_begin_trans();
149         if (CONTACTS_ERROR_NONE != ret) {
150                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
151                 return ret;
152         }
153
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);
160                 return ret;
161         }
162
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;
167         }
168
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);
173                 return ret;
174         }
175
176         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
177
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);
182                 return ret;
183         }
184         ctsvc_set_person_noti();
185
186         ret = ctsvc_end_trans(true);
187         if (ret < CONTACTS_ERROR_NONE) {
188                 ERR("ctsvc_end_trans() Fail(%d)", ret);
189                 return ret;
190         } else {
191                 return CONTACTS_ERROR_NONE;
192         }
193 }
194
195
196 static int __ctsvc_db_company_delete_record(int id)
197 {
198         int ret;
199         int contact_id;
200         char query[CTS_SQL_MAX_LEN] = {0};
201         cts_stmt stmt;
202         int addressbook_id;
203
204         ret = ctsvc_begin_trans();
205         if (CONTACTS_ERROR_NONE != ret) {
206                 ERR("ctsvc_begin_trans() Fail(%d)", ret);
207                 return ret;
208         }
209
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);
214         if (NULL == stmt) {
215                 ERR("ctsvc_query_prepare Fail(%d)", ret);
216                 ctsvc_end_trans(false);
217                 return ret;
218         }
219         ret = ctsvc_stmt_step(stmt);
220         if (1 != ret) {
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;
226                 else
227                         return ret;
228         }
229
230         contact_id = ctsvc_stmt_get_int(stmt, 0);
231         addressbook_id = ctsvc_stmt_get_int(stmt, 1);
232         ctsvc_stmt_finalize(stmt);
233
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;
238         }
239
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);
244                 return ret;
245         }
246
247         ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
248
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);
253                 return ret;
254         }
255         ctsvc_set_person_noti();
256
257         ret = ctsvc_end_trans(true);
258         if (ret < CONTACTS_ERROR_NONE) {
259                 ERR("ctsvc_end_trans() Fail(%d)", ret);
260                 return ret;
261         } else {
262                 return CONTACTS_ERROR_NONE;
263         }
264 }
265
266 static int __ctsvc_db_company_get_all_records(int offset, int limit, contacts_list_h *out_list)
267 {
268         int len;
269         int ret;
270         contacts_list_h list;
271         ctsvc_company_s *company;
272         cts_stmt stmt = NULL;
273         char query[CTS_SQL_MAX_LEN] = {0};
274
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 ",
281                         CTSVC_DATA_COMPANY);
282
283         if (0 != limit) {
284                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
285                 if (0 < offset)
286                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
287         }
288
289         ret = ctsvc_query_prepare(query, &stmt);
290         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
291
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);
298                         return ret;
299                 }
300                 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
301                 ctsvc_list_prepend(list, (contacts_record_h)company);
302         }
303         ctsvc_stmt_finalize(stmt);
304         ctsvc_list_reverse(list);
305
306         *out_list = list;
307         return CONTACTS_ERROR_NONE;
308 }
309
310 static int __ctsvc_db_company_get_records_with_query(contacts_query_h query, int offset,
311                 int limit, contacts_list_h *out_list)
312 {
313         int ret;
314         int i;
315         int field_count;
316         ctsvc_query_s *s_query;
317         cts_stmt stmt;
318         contacts_list_h list;
319         ctsvc_company_s *company;
320
321         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
322         s_query = (ctsvc_query_s*)query;
323
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);
326
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);
334                         return ret;
335                 }
336
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;
341                 } else {
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);
345
346                         if (CONTACTS_ERROR_NONE != ret)
347                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
348                 }
349
350                 for (i = 0; i < field_count; i++) {
351                         char *temp;
352                         int property_id;
353                         if (0 == s_query->projection_count)
354                                 property_id = s_query->properties[i].property_id;
355                         else
356                                 property_id = s_query->projection[i];
357
358                         switch (property_id) {
359                         case CTSVC_PROPERTY_COMPANY_ID:
360                                 company->id = ctsvc_stmt_get_int(stmt, i);
361                                 break;
362                         case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
363                                 company->contact_id = ctsvc_stmt_get_int(stmt, i);
364                                 break;
365                         case CTSVC_PROPERTY_COMPANY_TYPE:
366                                 company->type = ctsvc_stmt_get_int(stmt, i);
367                                 break;
368                         case CTSVC_PROPERTY_COMPANY_LABEL:
369                                 temp = ctsvc_stmt_get_text(stmt, i);
370                                 free(company->label);
371                                 company->label = SAFE_STRDUP(temp);
372                                 break;
373                         case CTSVC_PROPERTY_COMPANY_NAME:
374                                 temp = ctsvc_stmt_get_text(stmt, i);
375                                 free(company->name);
376                                 company->name = SAFE_STRDUP(temp);
377                                 break;
378                         case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
379                                 temp = ctsvc_stmt_get_text(stmt, i);
380                                 free(company->department);
381                                 company->department = SAFE_STRDUP(temp);
382                                 break;
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);
387                                 break;
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);
392                                 break;
393                         case CTSVC_PROPERTY_COMPANY_ROLE:
394                                 temp = ctsvc_stmt_get_text(stmt, i);
395                                 free(company->role);
396                                 company->role = SAFE_STRDUP(temp);
397                                 break;
398                         case CTSVC_PROPERTY_COMPANY_LOGO:
399                                 temp = ctsvc_stmt_get_text(stmt, i);
400                                 free(company->logo);
401                                 company->logo = SAFE_STRDUP(temp);
402                                 break;
403                         case CTSVC_PROPERTY_COMPANY_LOCATION:
404                                 temp = ctsvc_stmt_get_text(stmt, i);
405                                 free(company->location);
406                                 company->location = SAFE_STRDUP(temp);
407                                 break;
408                         case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
409                                 temp = ctsvc_stmt_get_text(stmt, i);
410                                 free(company->description);
411                                 company->description = SAFE_STRDUP(temp);
412                                 break;
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);
417                                 break;
418                         default:
419                                 break;
420                         }
421                 }
422                 ctsvc_list_prepend(list, record);
423         }
424         ctsvc_stmt_finalize(stmt);
425         ctsvc_list_reverse(list);
426
427         *out_list = list;
428         return CONTACTS_ERROR_NONE;
429 }
430
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,
442         .get_count = NULL,
443         .get_count_with_query = NULL,
444         .replace_record = NULL,
445         .replace_records = NULL,
446 };
447