Clean Code
[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 <errno.h>
29 #include <glib.h>
30 #include <grp.h>
31 #include <pwd.h>
32 #include <sys/smack.h>
33 #include <sys/stat.h>
34 #include "ail_private.h"
35 #include "ail_db.h"
36
37 #define GLOBAL_USER     0 //#define     tzplatform_getenv(TZ_GLOBAL) //TODO
38 #define BUFSIZE 4096
39 #define QUERY_ATTACH "attach database '%s' as Global"
40 #define QUERY_CREATE_VIEW_APP "CREATE temp VIEW app_info as select distinct * from (select  * from main.app_info m union select * from Global.app_info g)"
41
42 #define QUERY_CREATE_VIEW_LOCAL "CREATE temp VIEW localname as select distinct * from (select  * from main.localname m union select * from Global.localname g)"
43
44 #define SMACK_LABEL "_"
45
46 #define retv_with_dbmsg_if(expr, val) do { \
47         if (expr) { \
48                 _E("db_info.dbUserro: %s", sqlite3_errmsg(db_info.dbUserro)); \
49                 _E("db_info.dbGlobalro: %s", sqlite3_errmsg(db_info.dbGlobalro)); \
50                 _E("db_info.dbUserrw: %s", sqlite3_errmsg(db_info.dbUserrw)); \
51                 _E("db_info.dbGlobalrw: %s", sqlite3_errmsg(db_info.dbGlobalrw)); \
52                 _E("db_info.dbUserro errcode: %d", sqlite3_extended_errcode(db_info.dbUserro)); \
53                 _E("db_info.dbGlobalro errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalro)); \
54                 _E("db_info.dbUserrw errcode: %d", sqlite3_extended_errcode(db_info.dbUserrw)); \
55                 _E("db_info.dbGlobalrw errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalrw)); \
56                 return (val); \
57         } \
58 } while (0)
59
60 static __thread struct {
61         sqlite3         *dbUserro;
62         sqlite3         *dbGlobalro;
63         sqlite3         *dbUserrw;
64         sqlite3         *dbGlobalrw;
65 } db_info = {
66         .dbUserro = NULL,
67         .dbGlobalro = NULL,
68         .dbUserrw = NULL,
69         .dbGlobalrw = NULL
70 };
71   static __thread      sqlite3         *dbInit = NULL;
72
73 static int ail_db_change_perm(const char *db_file)
74 {
75         char buf[BUFSIZE];
76         char journal_file[BUFSIZE];
77         char *files[3];
78         int ret, i;
79         struct group *grpinfo = NULL;
80         const char *name = "users";
81
82         files[0] = (char *)db_file;
83         files[1] = journal_file;
84         files[2] = NULL;
85
86         retv_if(!db_file, AIL_ERROR_FAIL);
87         if(getuid()) //At this time we should be root to apply this
88                         return AIL_ERROR_OK;
89
90         snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal");
91
92         for (i = 0; files[i]; i++) {
93                 grpinfo = getgrnam(name);
94                 if(grpinfo == NULL)
95                         _E("getgrnam(users) returns NULL !");
96
97                 // Compare git_t type and not group name
98                 ret = chown(files[i], OWNER_ROOT, grpinfo->gr_gid);
99                 if (ret == -1) {
100                         strerror_r(errno, buf, sizeof(buf));
101                         _E("FAIL : chown %s %d.%d, because %s", db_file, OWNER_ROOT, grpinfo->gr_gid, buf);
102                         return AIL_ERROR_FAIL;
103                 }
104
105                 ret = chmod(files[i], S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
106                 if (ret == -1) {
107                         strerror_r(errno, buf, sizeof(buf));
108                         _E("FAIL : chmod %s 0664, because %s", db_file, buf);
109                         return AIL_ERROR_FAIL;
110                 }
111         }
112
113         return AIL_ERROR_OK;
114 }
115
116 char* ail_get_icon_path(uid_t uid)
117 {
118         char *result = NULL;
119         struct group *grpinfo = NULL;
120         char *dir = NULL;
121         struct passwd *userinfo = getpwuid(uid);
122
123         if (uid != GLOBAL_USER) {
124
125                 if (userinfo == NULL) {
126                         _E("getpwuid(%d) returns NULL !", uid);
127                         return NULL;
128                 }
129                 grpinfo = getgrnam("users");
130                 if (grpinfo == NULL) {
131                         _E("getgrnam(users) returns NULL !");
132                         return NULL;
133                 }
134                 // Compare git_t type and not group name
135                 if (grpinfo->gr_gid != userinfo->pw_gid) {
136                         _E("UID [%d] does not belong to 'users' group!", uid);
137                         return NULL;
138                 }
139                 asprintf(&result, "%s/.applications/icons/", userinfo->pw_dir);
140         } else {
141                 result = tzplatform_mkpath(TZ_SYS_RW_ICONS, "/");
142                 grpinfo = getgrnam("root");
143                 if (grpinfo == NULL) {
144                         _E("getgrnam(root) returns NULL !");
145                         return NULL;
146                         }
147                         if (grpinfo->gr_gid != userinfo->pw_gid) {
148                                 _E("UID [%d] does not belong to 'root' group!", uid);
149                                 return NULL;
150                         }
151                         /* chsmack */
152                         if (smack_setlabel(result, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
153                                 _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, result);
154                         } else {
155                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, result);
156                         }
157         }
158         int ret;
159         mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
160         ret = chown(result, uid, grpinfo->gr_gid);
161         if (ret == -1) {
162                 char buf[BUFSIZE];
163                 strerror_r(errno, buf, sizeof(buf));
164                 _E("FAIL : chown %s %d.%d, because %s", result, uid, grpinfo->gr_gid, buf);
165         }
166         return result;
167 }
168
169 static char* ail_get_app_DB(uid_t uid)
170 {
171         char *result = NULL;
172         char *journal = NULL;
173         struct group *grpinfo = NULL;
174         char *dir = NULL;
175         struct passwd *userinfo = getpwuid(uid);
176
177         if (uid != GLOBAL_USER) {
178
179                 if (userinfo == NULL) {
180                         _E("getpwuid(%d) returns NULL !", uid);
181                         return NULL;
182                 }
183                 grpinfo = getgrnam("users");
184                 if (grpinfo == NULL) {
185                         _E("getgrnam(users) returns NULL !");
186                         return NULL;
187                 }
188                 // Compare git_t type and not group name
189                 if (grpinfo->gr_gid != userinfo->pw_gid) {
190                         _E("UID [%d] does not belong to 'users' group!", uid);
191                         return NULL;
192                 }
193                 asprintf(&result, "%s/.applications/dbspace/.app_info.db", userinfo->pw_dir);
194                 asprintf(&journal, "%s/.applications/dbspace/.app_info.db-journal", userinfo->pw_dir);
195         } else {
196                 grpinfo = getgrnam("root");
197                 if (grpinfo == NULL) {
198                         _E("getgrnam(root) returns NULL !");
199                         return NULL;
200                         }
201                         if (grpinfo->gr_gid != userinfo->pw_gid) {
202                                 _E("UID [%d] does not belong to 'root' group!", uid);
203                                 return NULL;
204                         }
205                         result = strdup(APP_INFO_DB_FILE);
206                         journal = strdup(APP_INFO_DB_FILE_JOURNAL);
207                         /* chsmack */
208                         /*Check if we have permission to do it*/
209                         if (geteuid() == 0) {
210                                 if (smack_setlabel(result, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
211                                         _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, result);
212                                 } else {
213                                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, result);
214                                 }
215                                 if (smack_setlabel(journal, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
216                                         _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, journal);
217                                 } else {
218                                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, journal);
219                                 }
220                         }
221         }
222         dir = strrchr(result, '/');
223         if(!dir)
224                 return result;
225         if ((uid != GLOBAL_USER)||((uid == GLOBAL_USER)&& (geteuid() == 0 ))) {
226                 int ret;
227                 mkdir(dir + 1, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
228                 ret = chown(dir + 1, uid, grpinfo->gr_gid);
229                 if (ret == -1) {
230                         char buf[BUFSIZE];
231                         strerror_r(errno, buf, sizeof(buf));
232                         _E("FAIL : chown %s %d.%d, because %s", dir + 1, uid, grpinfo->gr_gid, buf);
233                 }
234         }
235         return result;
236 }
237
238 char* al_get_desktop_path(uid_t uid)
239 {
240         char *result = NULL;
241         struct group *grpinfo = NULL;
242         char *dir = NULL;
243         struct passwd *userinfo = getpwuid(uid);
244
245         if (uid != GLOBAL_USER) {
246
247                 if (userinfo == NULL) {
248                         _E("getpwuid(%d) returns NULL !", uid);
249                         return NULL;
250                 }
251                 grpinfo = getgrnam("users");
252                 if (grpinfo == NULL) {
253                         _E("getgrnam(users) returns NULL !");
254                         return NULL;
255                 }
256                 // Compare git_t type and not group name
257                 if (grpinfo->gr_gid != userinfo->pw_gid) {
258                         _E("UID [%d] does not belong to 'users' group!", uid);
259                         return NULL;
260                 }
261                 asprintf(&result, "%s/.applications/desktop/", userinfo->pw_dir);
262         } else {
263                 grpinfo = getgrnam("root");
264                 if (grpinfo == NULL) {
265                         _E("getgrnam(root) returns NULL !");
266                         return NULL;
267                 }
268                 if (grpinfo->gr_gid != userinfo->pw_gid) {
269                         _E("UID [%d] does not belong to 'root' group!", uid);
270                         return NULL;
271                 }
272                 result = tzplatform_mkpath(TZ_SYS_RW_DESKTOP_APP, "/");
273                 /* chsmack */
274                 if (smack_setlabel(result, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
275                         _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, result);
276                 } else {
277                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, result);
278                 }
279         }
280         if ((uid != GLOBAL_USER)||((uid == GLOBAL_USER)&& (geteuid() == 0 ))) {
281                 int ret;
282                 mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
283                 ret = chown(result, uid, grpinfo->gr_gid);
284                 if (ret == -1) {
285                         char buf[BUFSIZE];
286                         strerror_r(errno, buf, sizeof(buf));
287                         _E("FAIL : chown %s %d.%d, because %s", result, uid, grpinfo->gr_gid, buf);
288                 }
289         }
290         return result;
291 }
292
293
294 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
295 {
296         int ret;
297
298         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
299         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
300         retv_if(!db, AIL_ERROR_DB_FAILED);
301
302         ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL);
303         if (ret != SQLITE_OK) {
304                 _E("%s\n", sqlite3_errmsg(db));
305                 return AIL_ERROR_DB_FAILED;
306         } else
307                 return AIL_ERROR_OK;
308 }
309
310 ail_error_e db_open(db_open_mode mode, uid_t uid)
311 {
312         int ret;
313         int changed = 0;
314         int i;
315         const char *tbls[3] = {
316                 "CREATE TABLE app_info "
317                 "(package TEXT PRIMARY KEY, "
318                 "exec TEXT DEFAULT 'No Exec', "
319                 "name TEXT DEFAULT 'No Name', "
320                 "type TEXT DEFAULT 'Application', "
321                 "icon TEXT DEFAULT 'No Icon', "
322                 "categories TEXT, "
323                 "version TEXT, "
324                 "mimetype TEXT, "
325                 "x_slp_service TEXT, "
326                 "x_slp_packagetype TEXT, "
327                 "x_slp_packagecategories TEXT, "
328                 "x_slp_packageid TEXT, "
329                 "x_slp_uri TEXT, "
330                 "x_slp_svc TEXT, "
331                 "x_slp_exe_path TEXT, "
332                 "x_slp_appid TEXT, "
333                 "x_slp_pkgid TEXT, "
334                 "x_slp_domain TEXT, "
335                 "x_slp_submodemainid TEXT, "
336                 "x_slp_installedstorage TEXT, "
337                 "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
338                 "x_slp_installedtime INTEGER DEFAULT 0, "
339                 "nodisplay INTEGER DEFAULT 0, "
340                 "x_slp_taskmanage INTEGER DEFAULT 1, "
341                 "x_slp_multiple INTEGER DEFAULT 0, "
342                 "x_slp_removable INTEGER DEFAULT 1, "
343                 "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
344                 "x_slp_enabled INTEGER DEFAULT 1, "
345                 "x_slp_submode INTEGER DEFAULT 0, "
346                 "desktop TEXT UNIQUE NOT NULL);",
347                 "CREATE TABLE localname (package TEXT NOT NULL, "
348                 "locale TEXT NOT NULL, "
349                 "name TEXT NOT NULL, "
350                 "x_slp_pkgid TEXT NOT NULL, PRIMARY KEY (package, locale));",
351
352                 NULL
353         };
354
355         if (access(ail_get_app_DB(uid), F_OK)) {
356                 if (AIL_ERROR_OK == db_util_open_with_options(ail_get_app_DB(uid), &dbInit, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL))
357                 {
358                         for (i = 0; tbls[i] != NULL; i++) {
359                                 ret = do_db_exec(tbls[i], dbInit);
360                                 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
361                         }
362                         if(AIL_ERROR_OK != ail_db_change_perm(ail_get_app_DB(uid))) {
363                                 _E("Failed to change permission\n");
364                 }
365                 } else {
366                         dbInit = NULL;
367                         _E("Failed to create table %s\n", ail_get_app_DB(uid));
368                 }
369         }
370         if(dbInit) {
371                 ret = sqlite3_close(dbInit);
372                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
373                 dbInit = NULL;
374         }
375         if(mode & DB_OPEN_RO) {
376                 if(uid != GLOBAL_USER) {
377                         if (!db_info.dbUserro) {
378                                 db_util_open_with_options(ail_get_app_DB(uid), &db_info.dbUserro, SQLITE_OPEN_READONLY, NULL);
379                                 char query_attach[AIL_SQL_QUERY_MAX_LEN];
380                                 char query_view_app[AIL_SQL_QUERY_MAX_LEN];
381                                 char query_view_local[AIL_SQL_QUERY_MAX_LEN];
382                                 snprintf(query_attach, AIL_SQL_QUERY_MAX_LEN, QUERY_ATTACH, ail_get_app_DB(GLOBAL_USER));
383                                 _D("info : execute query_attach : %s", query_attach );
384                                 if (db_exec_usr_ro(query_attach) < 0) {
385                                         return AIL_ERROR_DB_FAILED;
386                                 }
387                                 snprintf(query_view_app, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_APP);
388                                 _D("info : execute query_attach : %s", query_view_app );
389                                 if (db_exec_usr_ro(query_view_app) < 0) {
390                                         return AIL_ERROR_DB_FAILED;
391                                 }
392
393                                 snprintf(query_view_local, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_LOCAL);
394                                 _D("info : execute query_attach : %s", query_view_local );
395                                 if (db_exec_usr_ro(query_view_local) < 0) {
396                                         return AIL_ERROR_DB_FAILED;
397                                 }
398                         }
399                 } else {
400                         if (!db_info.dbGlobalro) {
401                                 ret = db_util_open_with_options(ail_get_app_DB(GLOBAL_USER), &db_info.dbGlobalro, SQLITE_OPEN_READONLY, NULL);
402                                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
403                         }
404                 }
405  }
406         if(mode & DB_OPEN_RW) {
407                 if(uid != GLOBAL_USER) {
408                         if(!db_info.dbUserrw){
409                                 ret = db_util_open(ail_get_app_DB(uid), &db_info.dbUserrw, 0);
410                         }
411                 } else {
412                         if(!db_info.dbGlobalrw){
413                                 ret = db_util_open(ail_get_app_DB(GLOBAL_USER), &db_info.dbGlobalrw, 0);
414                         }
415                 }
416                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
417         }
418
419         return AIL_ERROR_OK;
420 }
421
422
423 ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
424 {
425         return db_do_prepare(db_info.dbUserro, query, stmt);
426 }
427
428 ail_error_e db_prepare_globalro(const char *query, sqlite3_stmt **stmt)
429 {
430         return db_do_prepare(db_info.dbGlobalro, query, stmt);
431 }
432
433 ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt)
434 {
435         return db_do_prepare(db_info.dbUserrw, query, stmt);
436 }
437
438
439 ail_error_e db_prepare_globalrw(const char *query, sqlite3_stmt **stmt)
440 {
441         return db_do_prepare(db_info.dbGlobalrw, query, stmt);
442 }
443
444
445 ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
446 {
447         int ret;
448
449         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
450
451         ret = sqlite3_bind_int(stmt, idx, (int) value);
452         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
453
454         return AIL_ERROR_OK;
455 }
456
457
458
459 ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
460 {
461         int ret;
462
463         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
464
465         ret = sqlite3_bind_int(stmt, idx, value);
466         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
467
468         return AIL_ERROR_OK;
469 }
470
471 ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, char* value)
472 {
473         int ret;
474
475         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
476
477         ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0);
478         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
479
480         return AIL_ERROR_OK;
481 }
482
483
484 ail_error_e db_step(sqlite3_stmt *stmt)
485 {
486         int ret;
487
488         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
489
490         ret = sqlite3_step(stmt);
491         switch (ret) {
492                 case SQLITE_DONE:
493                         return AIL_ERROR_NO_DATA;
494                 case SQLITE_ROW:
495                         return AIL_ERROR_OK;
496         }
497
498         retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
499 }
500
501
502
503 ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
504 {
505         int out_val;
506
507         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
508         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
509
510         out_val = sqlite3_column_int(stmt, index);
511         *value = (out_val == 1)? true:false;
512
513         return AIL_ERROR_OK;
514 }
515
516
517
518 ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
519 {
520         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
521         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
522
523         *value = sqlite3_column_int(stmt, index);
524
525         return AIL_ERROR_OK;
526 }
527
528
529
530 ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
531 {
532         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
533         retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
534
535         *str = (char *)sqlite3_column_text(stmt, index);
536
537         return AIL_ERROR_OK;
538 }
539
540
541
542 ail_error_e db_reset(sqlite3_stmt *stmt)
543 {
544         int ret;
545
546         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
547
548         sqlite3_clear_bindings(stmt);
549
550         ret = sqlite3_reset(stmt);
551         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
552
553         return AIL_ERROR_OK;
554 }
555
556
557
558 ail_error_e db_finalize(sqlite3_stmt *stmt)
559 {
560         int ret;
561
562         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
563
564         ret = sqlite3_finalize(stmt);
565         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
566
567         return AIL_ERROR_OK;
568 }
569
570
571
572 ail_error_e do_db_exec(const char *query, sqlite3 * fileSQL)
573 {
574         int ret;
575         char *errmsg;
576
577         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
578         retv_if(!fileSQL, AIL_ERROR_DB_FAILED);
579
580         ret = sqlite3_exec(fileSQL, query, NULL, NULL, &errmsg);
581         if (ret != SQLITE_OK) {
582                 _E("Cannot execute this query - %s. because %s",
583                                 query, errmsg? errmsg:"uncatched error");
584                 sqlite3_free(errmsg);
585                 return AIL_ERROR_DB_FAILED;
586         }
587
588         return AIL_ERROR_OK;
589 }
590
591
592
593 ail_error_e db_exec_usr_rw(const char *query)
594 {
595         return do_db_exec(query, db_info.dbUserrw);
596 }
597
598
599 ail_error_e db_exec_usr_ro(const char *query)
600 {
601         return do_db_exec(query, db_info.dbUserro);
602 }
603
604 ail_error_e db_exec_glo_ro(const char *query)
605 {
606         return do_db_exec(query, db_info.dbGlobalro);
607 }
608
609 ail_error_e db_exec_glo_rw(const char *query)
610 {
611         return do_db_exec(query, db_info.dbGlobalrw);
612 }
613
614
615 ail_error_e db_close(void)
616 {
617         int ret;
618
619         if(db_info.dbUserro) {
620                 ret = sqlite3_close(db_info.dbUserro);
621                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
622
623                 db_info.dbUserro = NULL;
624         }
625         if(db_info.dbGlobalrw) {
626                 ret = sqlite3_close(db_info.dbGlobalrw);
627                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
628
629                 db_info.dbGlobalrw = NULL;
630         }
631         if(db_info.dbUserrw) {
632                 ret = sqlite3_close(db_info.dbUserrw);
633                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
634
635                 db_info.dbUserrw = NULL;
636         }
637
638         return AIL_ERROR_OK;
639 }
640
641 EXPORT_API ail_error_e ail_db_close(void)
642 {
643         return db_close();
644 }
645
646 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
647 {
648         char *error_message = NULL;
649         if(db_info.dbGlobalro) {
650                 if (SQLITE_OK !=
651                         sqlite3_exec(db_info.dbGlobalro, query, callback, data, &error_message)) {
652                         _E("Don't execute query = %s error message = %s\n", query,
653                                 error_message);
654                         sqlite3_free(error_message);
655                         return -1;
656                 }
657         }
658         if(db_info.dbUserro) {
659                 if (SQLITE_OK !=
660                         sqlite3_exec(db_info.dbUserro, query, callback, data, &error_message)) {
661                         _E("Don't execute query = %s error message = %s\n", query,
662                                 error_message);
663                         sqlite3_free(error_message);
664                         return -1;
665                 }
666         }
667         sqlite3_free(error_message);
668         return 0;
669 }
670
671 // End of file.