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