Merge branch 'tizen_2.2' into tizen
[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                 return (val); \
37         } \
38 } while (0)
39
40
41 static __thread struct {
42         sqlite3         *dbro;
43         sqlite3         *dbrw;
44 } db_info = {
45         .dbro = NULL,
46         .dbrw = NULL
47 };
48
49
50 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
51 {
52         int ret;
53
54         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
55         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
56         retv_if(!db, AIL_ERROR_DB_FAILED);
57
58         ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL);
59         if (ret != SQLITE_OK) {
60                 _E("%s\n", sqlite3_errmsg(db));
61                 return AIL_ERROR_DB_FAILED;
62         } else
63                 return AIL_ERROR_OK;
64 }
65
66 ail_error_e db_open(db_open_mode mode)
67 {
68         int ret;
69         int changed = 0;
70
71         if(mode & DB_OPEN_RO) {
72                 if (!db_info.dbro) {
73                         ret = db_util_open_with_options(APP_INFO_DB, &db_info.dbro, SQLITE_OPEN_READONLY, NULL);
74                         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
75                 }
76         }
77
78         if(mode & DB_OPEN_RW) {
79                 if (!db_info.dbrw) {
80                         ret = db_util_open(APP_INFO_DB, &db_info.dbrw, DB_UTIL_REGISTER_HOOK_METHOD);
81                         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
82                 }
83         }
84
85         return AIL_ERROR_OK;
86 }
87
88 ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
89 {
90         return db_do_prepare(db_info.dbro, query, stmt);
91 }
92
93 ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt)
94 {
95         return db_do_prepare(db_info.dbrw, query, stmt);
96 }
97
98
99 ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
100 {
101         int ret;
102
103         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
104
105         ret = sqlite3_bind_int(stmt, idx, (int) value);
106         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
107
108         return AIL_ERROR_OK;
109 }
110
111
112
113 ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
114 {
115         int ret;
116
117         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
118
119         ret = sqlite3_bind_int(stmt, idx, value);
120         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
121
122         return AIL_ERROR_OK;
123 }
124
125 ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, char* value)
126 {
127         int ret;
128
129         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
130
131         ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0);
132         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
133
134         return AIL_ERROR_OK;
135 }
136
137
138 ail_error_e db_step(sqlite3_stmt *stmt)
139 {
140         int ret;
141
142         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
143
144         ret = sqlite3_step(stmt);
145         switch (ret) {
146                 case SQLITE_DONE:
147                         return AIL_ERROR_NO_DATA;
148                 case SQLITE_ROW:
149                         return AIL_ERROR_OK;
150         }
151
152         retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
153 }
154
155
156
157 ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
158 {
159         int out_val;
160
161         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
162         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
163
164         out_val = sqlite3_column_int(stmt, index);
165         *value = (out_val == 1)? true:false;
166
167         return AIL_ERROR_OK;
168 }
169
170
171
172 ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
173 {
174         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
175         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
176
177         *value = sqlite3_column_int(stmt, index);
178
179         return AIL_ERROR_OK;
180 }
181
182
183
184 ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
185 {
186         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
187         retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
188
189         *str = (char *)sqlite3_column_text(stmt, index);
190
191         return AIL_ERROR_OK;
192 }
193
194
195
196 ail_error_e db_reset(sqlite3_stmt *stmt)
197 {
198         int ret;
199
200         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
201
202         sqlite3_clear_bindings(stmt);
203
204         ret = sqlite3_reset(stmt);
205         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
206
207         return AIL_ERROR_OK;
208 }
209
210
211
212 ail_error_e db_finalize(sqlite3_stmt *stmt)
213 {
214         int ret;
215
216         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
217
218         ret = sqlite3_finalize(stmt);
219         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
220
221         return AIL_ERROR_OK;
222 }
223
224
225
226 ail_error_e db_exec(const char *query)
227 {
228         int ret;
229         char *errmsg;
230
231         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
232         retv_if(!db_info.dbrw, AIL_ERROR_DB_FAILED);
233
234         ret = sqlite3_exec(db_info.dbrw, query, NULL, NULL, &errmsg);
235         if (ret != SQLITE_OK) {
236                 _E("Cannot execute this query - %s. because %s",
237                                 query, errmsg? errmsg:"uncatched error");
238                 sqlite3_free(errmsg);
239                 return AIL_ERROR_DB_FAILED;
240         }
241
242         return AIL_ERROR_OK;
243 }
244
245
246
247 ail_error_e db_close(void)
248 {
249         int ret;
250
251         if(db_info.dbro) {
252                 ret = sqlite3_close(db_info.dbro);
253                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
254
255                 db_info.dbro = NULL;
256         }
257         if(db_info.dbrw) {
258                 ret = sqlite3_close(db_info.dbrw);
259                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
260
261                 db_info.dbrw = NULL;
262         }
263
264         return AIL_ERROR_OK;
265 }
266
267 EXPORT_API ail_error_e ail_db_close(void)
268 {
269         return db_close();
270 }
271
272 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
273 {
274         char *error_message = NULL;
275         if (SQLITE_OK !=
276             sqlite3_exec(db_info.dbro, query, callback, data, &error_message)) {
277                 _E("Don't execute query = %s error message = %s\n", query,
278                        error_message);
279                 sqlite3_free(error_message);
280                 return -1;
281         }
282         sqlite3_free(error_message);
283         return 0;
284 }
285
286 // End of file.