[SVACE Issue Fixes]
[platform/core/pim/contacts-service.git] / server / db / ctsvc_db_plugin_sdn.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 "contacts.h"
20 #include "ctsvc_internal.h"
21 #include "ctsvc_db_schema.h"
22 #include "ctsvc_db_sqlite.h"
23 #include "ctsvc_db_utils.h"
24 #include "ctsvc_list.h"
25 #include "ctsvc_db_plugin_sdn.h"
26 #include "ctsvc_db_init.h"
27 #include "ctsvc_db_query.h"
28 #include "ctsvc_record.h"
29 #include "ctsvc_notification.h"
30 #include "ctsvc_server_utils.h"
31
32
33 static int __ctsvc_db_sdn_value_set(cts_stmt stmt, contacts_record_h *record)
34 {
35         int i;
36         int ret;
37         char *temp;
38         ctsvc_sdn_s *sdn;
39
40         ret = contacts_record_create(_contacts_sdn._uri, record);
41         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "contacts_record_create Fail(%d)", ret);
42         sdn = (ctsvc_sdn_s*)*record;
43
44         i = 0;
45         sdn->id = ctsvc_stmt_get_int(stmt, i++);
46         temp = ctsvc_stmt_get_text(stmt, i++);
47         sdn->name = SAFE_STRDUP(temp);
48         temp = ctsvc_stmt_get_text(stmt, i++);
49         sdn->number = SAFE_STRDUP(temp);
50         sdn->sim_slot_no = ctsvc_stmt_get_int(stmt, i++);
51
52         return CONTACTS_ERROR_NONE;
53 }
54
55 static int __ctsvc_db_sdn_get_record(int id, contacts_record_h *out_record)
56 {
57         RETVM_IF(false == ctsvc_server_have_telephony_feature(), CONTACTS_ERROR_NOT_SUPPORTED, "Telephony feature disabled");
58
59         int ret;
60         cts_stmt stmt = NULL;
61         char query[CTS_SQL_MAX_LEN] = {0};
62         contacts_record_h record;
63
64         RETV_IF(NULL == out_record, CONTACTS_ERROR_INVALID_PARAMETER);
65         *out_record = NULL;
66
67         snprintf(query, sizeof(query),
68                         "SELECT id, name, number, sim_slot_no FROM "CTS_TABLE_SDN" WHERE id = %d", id);
69
70         ret = ctsvc_query_prepare(query, &stmt);
71         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
72
73         ret = ctsvc_stmt_step(stmt);
74         if (1 /*CTS_TRUE*/ != ret) {
75                 /* LCOV_EXCL_START */
76                 ERR("ctsvc_stmt_step() Fail(%d)", ret);
77                 ctsvc_stmt_finalize(stmt);
78                 if (CONTACTS_ERROR_NONE == ret)
79                         return CONTACTS_ERROR_NO_DATA;
80                 else
81                         return ret;
82                 /* LCOV_EXCL_STOP */
83         }
84
85         ret = __ctsvc_db_sdn_value_set(stmt, &record);
86
87         ctsvc_stmt_finalize(stmt);
88         if (CONTACTS_ERROR_NONE != ret) {
89                 /* LCOV_EXCL_START */
90                 ERR("__ctsvc_db_sdn_value_set(ALL) Fail(%d)", ret);
91                 return ret;
92                 /* LCOV_EXCL_STOP */
93         }
94
95         *out_record = record;
96
97         return CONTACTS_ERROR_NONE;
98 }
99
100 static int __ctsvc_db_sdn_get_all_records(int offset, int limit,
101                 contacts_list_h *out_list)
102 {
103         RETVM_IF(false == ctsvc_server_have_telephony_feature(), CONTACTS_ERROR_NOT_SUPPORTED, "Telephony feature disabled");
104
105         int ret;
106         int len;
107         cts_stmt stmt;
108         char query[CTS_SQL_MAX_LEN] = {0};
109         contacts_list_h list;
110
111         len = snprintf(query, sizeof(query),
112                         "SELECT id, name, number, sim_slot_no FROM "CTS_TABLE_SDN);
113
114         if (0 != limit) {
115                 len += snprintf(query+len, sizeof(query)-len, " LIMIT %d", limit);
116                 if (0 < offset)
117                         len += snprintf(query+len, sizeof(query)-len, " OFFSET %d", offset);
118         }
119
120         ret = ctsvc_query_prepare(query, &stmt);
121         RETVM_IF(NULL == stmt, ret, "ctsvc_query_prepare() Fail(%d)", ret);
122
123         contacts_list_create(&list);
124         while ((ret = ctsvc_stmt_step(stmt))) {
125                 contacts_record_h record;
126                 if (1 != ret) {
127                         /* LCOV_EXCL_START */
128                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
129                         ctsvc_stmt_finalize(stmt);
130                         contacts_list_destroy(list, true);
131                         return ret;
132                         /* LCOV_EXCL_STOP */
133                 }
134                 __ctsvc_db_sdn_value_set(stmt, &record);
135
136                 ctsvc_list_prepend(list, record);
137         }
138         ctsvc_stmt_finalize(stmt);
139         ctsvc_list_reverse(list);
140
141         *out_list = (contacts_list_h)list;
142         return CONTACTS_ERROR_NONE;
143 }
144
145 static int __ctsvc_db_sdn_get_records_with_query(contacts_query_h query, int offset, int limit, contacts_list_h *out_list)
146 {
147         RETVM_IF(false == ctsvc_server_have_telephony_feature(), CONTACTS_ERROR_NOT_SUPPORTED, "Telephony feature disabled");
148
149         int ret;
150         int i;
151         int field_count;
152         ctsvc_query_s *s_query;
153         cts_stmt stmt;
154         contacts_list_h list;
155         ctsvc_sdn_s *sdn;
156
157         RETV_IF(NULL == query, CONTACTS_ERROR_INVALID_PARAMETER);
158         s_query = (ctsvc_query_s*)query;
159
160         ret = ctsvc_db_make_get_records_query_stmt(s_query, offset, limit, &stmt);
161         RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_db_make_get_records_query_stmt fail(%d)", ret);
162
163         contacts_list_create(&list);
164         while ((ret = ctsvc_stmt_step(stmt))) {
165                 contacts_record_h record;
166                 if (1 != ret) {
167                         /* LCOV_EXCL_START */
168                         ERR("ctsvc_stmt_step() Fail(%d)", ret);
169                         ctsvc_stmt_finalize(stmt);
170                         contacts_list_destroy(list, true);
171                         return ret;
172                         /* LCOV_EXCL_STOP */
173                 }
174
175                 contacts_record_create(_contacts_sdn._uri, &record);
176                 sdn = (ctsvc_sdn_s*)record;
177                 if (0 == s_query->projection_count) {
178                         field_count = s_query->property_count;
179                 } else {
180                         field_count = s_query->projection_count;
181
182                         int err = ctsvc_record_set_projection_flags(record, s_query->projection,
183                                         s_query->projection_count, s_query->property_count);
184                         if (CONTACTS_ERROR_NONE != err)
185                                 ASSERT_NOT_REACHED("To set projection is Fail.\n");
186                 }
187
188                 for (i = 0; i < field_count; i++) {
189                         char *temp;
190                         int property_id;
191                         if (0 == s_query->projection_count)
192                                 property_id = s_query->properties[i].property_id;
193                         else
194                                 property_id = s_query->projection[i];
195
196                         switch (property_id) {
197                         case CTSVC_PROPERTY_SDN_ID:
198                                 sdn->id = ctsvc_stmt_get_int(stmt, i);
199                                 break;
200                         case CTSVC_PROPERTY_SDN_NAME:
201                                 temp = ctsvc_stmt_get_text(stmt, i);
202                                 free(sdn->name);
203                                 sdn->name = SAFE_STRDUP(temp);
204                                 break;
205                         case CTSVC_PROPERTY_SDN_NUMBER:
206                                 temp = ctsvc_stmt_get_text(stmt, i);
207                                 free(sdn->number);
208                                 sdn->number = SAFE_STRDUP(temp);
209                                 break;
210                         case CTSVC_PROPERTY_SDN_SIM_SLOT_NO:
211                                 sdn->sim_slot_no = ctsvc_stmt_get_int(stmt, i);
212                                 break;
213                         default:
214                                 break;
215                         }
216                 }
217                 ctsvc_list_prepend(list, record);
218         }
219         ctsvc_stmt_finalize(stmt);
220         ctsvc_list_reverse(list);
221
222         *out_list = (contacts_list_h)list;
223
224         return CONTACTS_ERROR_NONE;
225 }
226
227 ctsvc_db_plugin_info_s ctsvc_db_plugin_sdn = {
228         .is_query_only = false,
229         .insert_record = NULL,
230         .get_record = __ctsvc_db_sdn_get_record,
231         .update_record = NULL,
232         .delete_record = NULL,
233         .get_all_records = __ctsvc_db_sdn_get_all_records,
234         .get_records_with_query = __ctsvc_db_sdn_get_records_with_query,
235         .insert_records = NULL,
236         .update_records = NULL,
237         .delete_records = NULL,
238         .get_count = NULL,
239         .get_count_with_query = NULL,
240         .replace_record = NULL,
241         .replace_records = NULL,
242 };
243