8f2468961fff6ab926ceab3dd548c301378da677
[platform/core/appfw/ail.git] / src / ail_db.c
1 /*
2  * ail
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22
23
24
25 #include <stdlib.h>
26 #include <string.h>
27 #include <db-util.h>
28 #include <glib.h>
29 #include "ail_private.h"
30 #include "ail_db.h"
31
32 #define retv_with_dbmsg_if(expr, val) do { \
33         if (expr) { \
34                 _E("db_info.dbro: %s", sqlite3_errmsg(db_info.dbro)); \
35                 _E("db_info.dbrw: %s", sqlite3_errmsg(db_info.dbrw)); \
36                 _E("db_info.dbro errcode: %d", sqlite3_extended_errcode(db_info.dbro)); \
37                 _E("db_info.dbrw errcode: %d", sqlite3_extended_errcode(db_info.dbrw)); \
38                 return (val); \
39         } \
40 } while (0)
41
42
43 static __thread struct {
44         sqlite3         *dbro;
45         sqlite3         *dbrw;
46 } db_info = {
47         .dbro = NULL,
48         .dbrw = NULL
49 };
50
51
52 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
53 {
54         int ret;
55
56         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
57         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
58         retv_if(!db, AIL_ERROR_DB_FAILED);
59
60         ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL);
61         if (ret != SQLITE_OK) {
62                 _E("%s\n", sqlite3_errmsg(db));
63                 return AIL_ERROR_DB_FAILED;
64         } else
65                 return AIL_ERROR_OK;
66 }
67
68 ail_error_e db_open(db_open_mode mode)
69 {
70         int ret;
71         int changed = 0;
72
73         if(mode & DB_OPEN_RO) {
74                 if (!db_info.dbro) {
75                         //ret = db_util_open_with_options(APP_INFO_DB, &db_info.dbro, SQLITE_OPEN_READONLY, NULL);
76                         ret = db_util_open(APP_INFO_DB, &db_info.dbro, 0);
77                         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
78                 }
79         }
80
81         if(mode & DB_OPEN_RW) {
82                 if (!db_info.dbrw) {
83                         ret = db_util_open(APP_INFO_DB, &db_info.dbrw, 0);
84                         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
85                 }
86         }
87
88         return AIL_ERROR_OK;
89 }
90
91 ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
92 {
93         return db_do_prepare(db_info.dbro, query, stmt);
94 }
95
96 ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt)
97 {
98         return db_do_prepare(db_info.dbrw, query, stmt);
99 }
100
101
102 ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
103 {
104         int ret;
105
106         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
107
108         ret = sqlite3_bind_int(stmt, idx, (int) value);
109         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
110
111         return AIL_ERROR_OK;
112 }
113
114
115
116 ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
117 {
118         int ret;
119
120         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
121
122         ret = sqlite3_bind_int(stmt, idx, value);
123         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
124
125         return AIL_ERROR_OK;
126 }
127
128 ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, char* value)
129 {
130         int ret;
131
132         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
133
134         ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0);
135         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
136
137         return AIL_ERROR_OK;
138 }
139
140
141 ail_error_e db_step(sqlite3_stmt *stmt)
142 {
143         int ret;
144
145         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
146
147         ret = sqlite3_step(stmt);
148         switch (ret) {
149                 case SQLITE_DONE:
150                         return AIL_ERROR_NO_DATA;
151                 case SQLITE_ROW:
152                         return AIL_ERROR_OK;
153         }
154
155         retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
156 }
157
158
159
160 ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
161 {
162         int out_val;
163
164         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
165         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
166
167         out_val = sqlite3_column_int(stmt, index);
168         *value = (out_val == 1)? true:false;
169
170         return AIL_ERROR_OK;
171 }
172
173
174
175 ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
176 {
177         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
178         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
179
180         *value = sqlite3_column_int(stmt, index);
181
182         return AIL_ERROR_OK;
183 }
184
185
186
187 ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
188 {
189         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
190         retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
191
192         *str = (char *)sqlite3_column_text(stmt, index);
193
194         return AIL_ERROR_OK;
195 }
196
197
198
199 ail_error_e db_reset(sqlite3_stmt *stmt)
200 {
201         int ret;
202
203         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
204
205         sqlite3_clear_bindings(stmt);
206
207         ret = sqlite3_reset(stmt);
208         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
209
210         return AIL_ERROR_OK;
211 }
212
213
214
215 ail_error_e db_finalize(sqlite3_stmt *stmt)
216 {
217         int ret;
218
219         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
220
221         ret = sqlite3_finalize(stmt);
222         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
223
224         return AIL_ERROR_OK;
225 }
226
227
228
229 ail_error_e db_exec(const char *query)
230 {
231         int ret;
232         char *errmsg;
233
234         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
235         retv_if(!db_info.dbrw, AIL_ERROR_DB_FAILED);
236
237         ret = sqlite3_exec(db_info.dbrw, query, NULL, NULL, &errmsg);
238         if (ret != SQLITE_OK) {
239                 _E("Cannot execute this query - %s. because %s",
240                                 query, errmsg? errmsg:"uncatched error");
241                 sqlite3_free(errmsg);
242                 return AIL_ERROR_DB_FAILED;
243         }
244
245         return AIL_ERROR_OK;
246 }
247
248
249
250 ail_error_e db_close(void)
251 {
252         int ret;
253
254         if(db_info.dbro) {
255                 ret = sqlite3_close(db_info.dbro);
256                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
257
258                 db_info.dbro = NULL;
259         }
260         if(db_info.dbrw) {
261                 ret = sqlite3_close(db_info.dbrw);
262                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
263
264                 db_info.dbrw = NULL;
265         }
266
267         return AIL_ERROR_OK;
268 }
269
270 EXPORT_API ail_error_e ail_db_close(void)
271 {
272         return db_close();
273 }
274
275 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
276 {
277         char *error_message = NULL;
278         if (SQLITE_OK !=
279             sqlite3_exec(db_info.dbro, query, callback, data, &error_message)) {
280                 _E("Don't execute query = %s error message = %s\n", query,
281                        error_message);
282                 sqlite3_free(error_message);
283                 return -1;
284         }
285         sqlite3_free(error_message);
286         return 0;
287 }
288
289 // End of file.