adab6351b5ae84bd138852cdd002c51a18509ba1
[platform/core/pim/contacts-service.git] / native / ctsvc_db_plugin_company.c
1 /*
2  * Contacts Service
3  *
4  * Copyright (c) 2010 - 2012 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
20 #include <unistd.h>
21
22 #include "contacts.h"
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"
34
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);
44
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
56         .get_count = NULL,
57         .get_count_with_query = NULL,
58         .replace_record = NULL,
59         .replace_records = NULL,
60 };
61
62 static int __ctsvc_db_company_get_record( int id, contacts_record_h* out_record )
63 {
64         int ret;
65         int len;
66         cts_stmt stmt = NULL;
67         char query[CTS_SQL_MAX_LEN] = {0};
68
69         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
70         *out_record = NULL;
71
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);
79
80         stmt = cts_query_prepare(query);
81         RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
82
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;
88         }
89
90         ctsvc_db_company_get_value_from_stmt(stmt, out_record, 0);
91         cts_stmt_finalize(stmt);
92
93         return CONTACTS_ERROR_NONE;
94 }
95
96 static int __ctsvc_db_company_insert_record( contacts_record_h record, int *id )
97 {
98         int ret;
99         int addressbook_id;
100         char query[CTS_SQL_MAX_LEN] = {0};
101         ctsvc_company_s *company = (ctsvc_company_s *)record;
102
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");
107
108         ret = ctsvc_begin_trans();
109         if (CONTACTS_ERROR_NONE != ret) {
110                 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
111                 return ret;
112         }
113
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;
122                 }
123                 else {
124                         CTS_ERR("ctsvc_query_get_first_int_result Fail(%d)", ret);
125                         return ret;
126                 }
127         }
128
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);
133                 return ret;
134         }
135
136         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
137
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);
142                 return ret;
143         }
144         ctsvc_set_person_noti();
145
146         ret = ctsvc_end_trans(true);
147         if (ret < CONTACTS_ERROR_NONE)
148         {
149                 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
150                 return ret;
151         }
152         else
153                 return CONTACTS_ERROR_NONE;
154 }
155
156 static int __ctsvc_db_company_update_record( contacts_record_h record )
157 {
158         int ret;
159         int addressbook_id;
160         char query[CTS_SQL_MAX_LEN] = {0};
161         ctsvc_company_s *company = (ctsvc_company_s *)record;
162
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");
167
168         ret = ctsvc_begin_trans();
169         if (CONTACTS_ERROR_NONE != ret) {
170                 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
171                 return ret;
172         }
173
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);
180                 return ret;
181         }
182
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);
187                 return ret;
188         }
189
190         ctsvc_contact_update_display_name(company->contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
191
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);
196                 return ret;
197         }
198         ctsvc_set_person_noti();
199
200         ret = ctsvc_end_trans(true);
201         if (ret < CONTACTS_ERROR_NONE)
202         {
203                 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
204                 return ret;
205         }
206         else
207                 return CONTACTS_ERROR_NONE;
208 }
209
210
211 static int __ctsvc_db_company_delete_record( int id )
212 {
213         int ret;
214         int contact_id;
215         char query[CTS_SQL_MAX_LEN] = {0};
216
217         ret = ctsvc_begin_trans();
218         if (CONTACTS_ERROR_NONE != ret) {
219                 CTS_ERR("DB error : ctsvc_begin_trans() Failed(%d)", ret);
220                 return ret;
221         }
222
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);
230                 return ret;
231         }
232
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);
237                 return ret;
238         }
239
240         ctsvc_contact_update_display_name(contact_id, CONTACTS_DISPLAY_NAME_SOURCE_TYPE_COMPANY);
241
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);
246                 return ret;
247         }
248         ctsvc_set_person_noti();
249
250         ret = ctsvc_end_trans(true);
251         if (ret < CONTACTS_ERROR_NONE)
252         {
253                 CTS_ERR("DB error : ctsvc_end_trans() Failed(%d)", ret);
254                 return ret;
255         }
256         else
257                 return CONTACTS_ERROR_NONE;
258 }
259
260 static int __ctsvc_db_company_get_all_records( int offset, int limit, contacts_list_h* out_list )
261 {
262         int len;
263         int ret;
264         contacts_list_h list;
265         ctsvc_company_s *company;
266         cts_stmt stmt = NULL;
267         char query[CTS_SQL_MAX_LEN] = {0};
268
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 ",
275                                 CTSVC_DATA_COMPANY);
276         if (0 != limit) {
277                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
278                 if (0 < offset)
279                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
280         }
281
282         stmt = cts_query_prepare(query);
283         RETVM_IF(NULL == stmt, CONTACTS_ERROR_DB, "DB error : cts_query_prepare() Failed");
284
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);
291                         return ret;
292                 }
293                 ctsvc_db_company_get_value_from_stmt(stmt, (contacts_record_h*)&company, 0);
294                 ctsvc_list_prepend(list, (contacts_record_h)company);
295         }
296         cts_stmt_finalize(stmt);
297         ctsvc_list_reverse(list);
298
299         *out_list = list;
300         return CONTACTS_ERROR_NONE;
301 }
302
303 static int __ctsvc_db_company_get_records_with_query( contacts_query_h query, int offset,
304                 int limit, contacts_list_h* out_list )
305 {
306         int ret;
307         int i;
308         int field_count;
309         ctsvc_query_s *s_query;
310         cts_stmt stmt;
311         contacts_list_h list;
312         ctsvc_company_s *company;
313
314         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
315         s_query = (ctsvc_query_s *)query;
316
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);
319
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);
327                         return ret;
328                 }
329
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;
334                 else {
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);
338
339                         if(CONTACTS_ERROR_NONE != ret)
340                                 ASSERT_NOT_REACHED("To set projection is failed.\n");
341                 }
342
343                 for(i=0;i<field_count;i++) {
344                         char *temp;
345                         int property_id;
346                         if (0 == s_query->projection_count)
347                                 property_id = s_query->properties[i].property_id;
348                         else
349                                 property_id = s_query->projection[i];
350
351                         switch(property_id) {
352                         case CTSVC_PROPERTY_COMPANY_ID:
353                                 company->id = ctsvc_stmt_get_int(stmt, i);
354                                 break;
355                         case CTSVC_PROPERTY_COMPANY_CONTACT_ID:
356                                 company->contact_id = ctsvc_stmt_get_int(stmt, i);
357                                 break;
358                         case CTSVC_PROPERTY_COMPANY_TYPE:
359                                 company->type = ctsvc_stmt_get_int(stmt, i);
360                                 break;
361                         case CTSVC_PROPERTY_COMPANY_LABEL:
362                                 temp = ctsvc_stmt_get_text(stmt, i);
363                                 company->label = SAFE_STRDUP(temp);
364                                 break;
365                         case CTSVC_PROPERTY_COMPANY_NAME:
366                                 temp = ctsvc_stmt_get_text(stmt, i);
367                                 company->name = SAFE_STRDUP(temp);
368                                 break;
369                         case CTSVC_PROPERTY_COMPANY_DEPARTMENT:
370                                 temp = ctsvc_stmt_get_text(stmt, i);
371                                 company->department = SAFE_STRDUP(temp);
372                                 break;
373                         case CTSVC_PROPERTY_COMPANY_JOB_TITLE:
374                                 temp = ctsvc_stmt_get_text(stmt, i);
375                                 company->job_title = SAFE_STRDUP(temp);
376                                 break;
377                         case CTSVC_PROPERTY_COMPANY_ASSISTANT_NAME:
378                                 temp = ctsvc_stmt_get_text(stmt, i);
379                                 company->assistant_name = SAFE_STRDUP(temp);
380                                 break;
381                         case CTSVC_PROPERTY_COMPANY_ROLE:
382                                 temp = ctsvc_stmt_get_text(stmt, i);
383                                 company->role = SAFE_STRDUP(temp);
384                                 break;
385                         case CTSVC_PROPERTY_COMPANY_LOGO:
386                                 temp = ctsvc_stmt_get_text(stmt, i);
387                                 company->logo = SAFE_STRDUP(temp);
388                                 break;
389                         case CTSVC_PROPERTY_COMPANY_LOCATION:
390                                 temp = ctsvc_stmt_get_text(stmt, i);
391                                 company->location = SAFE_STRDUP(temp);
392                                 break;
393                         case CTSVC_PROPERTY_COMPANY_DESCRIPTION:
394                                 temp = ctsvc_stmt_get_text(stmt, i);
395                                 company->description = SAFE_STRDUP(temp);
396                                 break;
397                         case CTSVC_PROPERTY_COMPANY_PHONETIC_NAME:
398                                 temp = ctsvc_stmt_get_text(stmt, i);
399                                 company->phonetic_name = SAFE_STRDUP(temp);
400                                 break;
401                         default:
402                                 break;
403                         }
404                 }
405                 ctsvc_list_prepend(list, record);
406         }
407         cts_stmt_finalize(stmt);
408         ctsvc_list_reverse(list);
409
410         *out_list = list;
411         return CONTACTS_ERROR_NONE;
412 }
413
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; }