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