46652eac3197c07c101c9844769572c7eef9c764
[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                         if (smack_setlabel(result, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
209                                 _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, result);
210                 } else {
211                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, result);
212                 }
213                 if (smack_setlabel(journal, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
214                         _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, journal);
215                 } else {
216                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, journal);
217                 }
218         }
219         dir = strrchr(result, '/');
220         if(!dir)
221                 return result;
222
223         int ret;
224         mkdir(dir + 1, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
225         ret = chown(dir + 1, uid, grpinfo->gr_gid);
226         if (ret == -1) {
227                 char buf[BUFSIZE];
228                 strerror_r(errno, buf, sizeof(buf));
229                 _E("FAIL : chown %s %d.%d, because %s", dir + 1, uid, grpinfo->gr_gid, buf);
230         }
231
232         return result;
233 }
234
235 char* al_get_desktop_path(uid_t uid)
236 {
237         char *result = NULL;
238         struct group *grpinfo = NULL;
239         char *dir = NULL;
240         struct passwd *userinfo = getpwuid(uid);
241
242         if (uid != GLOBAL_USER) {
243
244                 if (userinfo == NULL) {
245                         _E("getpwuid(%d) returns NULL !", uid);
246                         return NULL;
247                 }
248                 grpinfo = getgrnam("users");
249                 if (grpinfo == NULL) {
250                         _E("getgrnam(users) returns NULL !");
251                         return NULL;
252                 }
253                 // Compare git_t type and not group name
254                 if (grpinfo->gr_gid != userinfo->pw_gid) {
255                         _E("UID [%d] does not belong to 'users' group!", uid);
256                         return NULL;
257                 }
258                 asprintf(&result, "%s/.applications/desktop/", userinfo->pw_dir);
259         } else {
260                 grpinfo = getgrnam("root");
261                 if (grpinfo == NULL) {
262                         _E("getgrnam(root) returns NULL !");
263                         return NULL;
264                 }
265                 if (grpinfo->gr_gid != userinfo->pw_gid) {
266                         _E("UID [%d] does not belong to 'root' group!", uid);
267                         return NULL;
268                 }
269                 result = tzplatform_mkpath(TZ_SYS_RW_DESKTOP_APP, "/");
270                 /* chsmack */
271                 if (smack_setlabel(result, SMACK_LABEL, SMACK_LABEL_ACCESS)) {
272                         _E("failed chsmack -a \"%s\" %s", SMACK_LABEL, result);
273                 } else {
274                         _D("chsmack -a \"%s\" %s", SMACK_LABEL, result);
275                 }
276         }
277
278         int ret;
279         mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
280         ret = chown(result, uid, grpinfo->gr_gid);
281         if (ret == -1) {
282                 char buf[BUFSIZE];
283                 strerror_r(errno, buf, sizeof(buf));
284                 _E("FAIL : chown %s %d.%d, because %s", result, uid, grpinfo->gr_gid, buf);
285         }
286         return result;
287 }
288
289
290 static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt)
291 {
292         int ret;
293
294         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
295         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
296         retv_if(!db, AIL_ERROR_DB_FAILED);
297
298         ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL);
299         if (ret != SQLITE_OK) {
300                 _E("%s\n", sqlite3_errmsg(db));
301                 return AIL_ERROR_DB_FAILED;
302         } else
303                 return AIL_ERROR_OK;
304 }
305
306 ail_error_e db_open(db_open_mode mode, uid_t uid)
307 {
308         int ret;
309         int changed = 0;
310         int i;
311         const char *tbls[3] = {
312                 "CREATE TABLE app_info "
313                 "(package TEXT PRIMARY KEY, "
314                 "exec TEXT DEFAULT 'No Exec', "
315                 "name TEXT DEFAULT 'No Name', "
316                 "type TEXT DEFAULT 'Application', "
317                 "icon TEXT DEFAULT 'No Icon', "
318                 "categories TEXT, "
319                 "version TEXT, "
320                 "mimetype TEXT, "
321                 "x_slp_service TEXT, "
322                 "x_slp_packagetype TEXT, "
323                 "x_slp_packagecategories TEXT, "
324                 "x_slp_packageid TEXT, "
325                 "x_slp_uri TEXT, "
326                 "x_slp_svc TEXT, "
327                 "x_slp_exe_path TEXT, "
328                 "x_slp_appid TEXT, "
329                 "x_slp_pkgid TEXT, "
330                 "x_slp_domain TEXT, "
331                 "x_slp_submodemainid TEXT, "
332                 "x_slp_installedstorage TEXT, "
333                 "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
334                 "x_slp_installedtime INTEGER DEFAULT 0, "
335                 "nodisplay INTEGER DEFAULT 0, "
336                 "x_slp_taskmanage INTEGER DEFAULT 1, "
337                 "x_slp_multiple INTEGER DEFAULT 0, "
338                 "x_slp_removable INTEGER DEFAULT 1, "
339                 "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
340                 "x_slp_enabled INTEGER DEFAULT 1, "
341                 "x_slp_submode INTEGER DEFAULT 0, "
342                 "desktop TEXT UNIQUE NOT NULL);",
343                 "CREATE TABLE localname (package TEXT NOT NULL, "
344                 "locale TEXT NOT NULL, "
345                 "name TEXT NOT NULL, "
346                 "x_slp_pkgid TEXT NOT NULL, PRIMARY KEY (package, locale));",
347
348                 NULL
349         };
350
351         if (access(ail_get_app_DB(uid), F_OK)) {
352                 if (AIL_ERROR_OK == db_util_open_with_options(ail_get_app_DB(uid), &dbInit, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL))
353                 {
354                         for (i = 0; tbls[i] != NULL; i++) {
355                                 ret = do_db_exec(tbls[i], dbInit);
356                                 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
357                         }
358                         if(AIL_ERROR_OK != ail_db_change_perm(ail_get_app_DB(uid))) {
359                                 _E("Failed to change permission\n");
360                 }
361                 } else {
362                         dbInit = NULL;
363                         _E("Failed to create table %s\n", ail_get_app_DB(uid));
364                 }
365         }
366         if(dbInit) {
367                 ret = sqlite3_close(dbInit);
368                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
369                 dbInit = NULL;
370         }
371         if(mode & DB_OPEN_RO) {
372                 if(uid != GLOBAL_USER) {
373                         if (!db_info.dbUserro) {
374                                 db_util_open_with_options(ail_get_app_DB(uid), &db_info.dbUserro, SQLITE_OPEN_READONLY, NULL);
375                                 char query_attach[AIL_SQL_QUERY_MAX_LEN];
376                                 char query_view_app[AIL_SQL_QUERY_MAX_LEN];
377                                 char query_view_local[AIL_SQL_QUERY_MAX_LEN];
378                                 snprintf(query_attach, AIL_SQL_QUERY_MAX_LEN, QUERY_ATTACH, ail_get_app_DB(GLOBAL_USER));
379                                 _E("info : execute query_attach : %s", query_attach );
380                                 if (db_exec_usr_ro(query_attach) < 0) {
381                                         return AIL_ERROR_DB_FAILED;
382                                 }
383                                 snprintf(query_view_app, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_APP);
384                                 _E("info : execute query_attach : %s", query_view_app );
385                                 if (db_exec_usr_ro(query_view_app) < 0) {
386                                         return AIL_ERROR_DB_FAILED;
387                                 }
388
389                                 snprintf(query_view_local, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_LOCAL);
390                                 _E("info : execute query_attach : %s", query_view_local );
391                                 if (db_exec_usr_ro(query_view_local) < 0) {
392                                         return AIL_ERROR_DB_FAILED;
393                                 }
394                         }
395                 } else {
396                         if (!db_info.dbGlobalro) {
397                                 ret = db_util_open_with_options(ail_get_app_DB(GLOBAL_USER), &db_info.dbGlobalro, SQLITE_OPEN_READONLY, NULL);
398                                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
399                         }
400                 }
401  }
402         if(mode & DB_OPEN_RW) {
403                 if(uid != GLOBAL_USER) {
404                         if(!db_info.dbUserrw){
405                                 ret = db_util_open(ail_get_app_DB(uid), &db_info.dbUserrw, 0);
406                         }
407                 } else {
408                         if(!db_info.dbGlobalrw){
409                                 ret = db_util_open(ail_get_app_DB(GLOBAL_USER), &db_info.dbGlobalrw, 0);
410                         }
411                 }
412                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
413         }
414
415         return AIL_ERROR_OK;
416 }
417
418
419 ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt)
420 {
421         return db_do_prepare(db_info.dbUserro, query, stmt);
422 }
423
424 ail_error_e db_prepare_globalro(const char *query, sqlite3_stmt **stmt)
425 {
426         return db_do_prepare(db_info.dbGlobalro, query, stmt);
427 }
428
429 ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt)
430 {
431         return db_do_prepare(db_info.dbUserrw, query, stmt);
432 }
433
434
435 ail_error_e db_prepare_globalrw(const char *query, sqlite3_stmt **stmt)
436 {
437         return db_do_prepare(db_info.dbGlobalrw, query, stmt);
438 }
439
440
441 ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value)
442 {
443         int ret;
444
445         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
446
447         ret = sqlite3_bind_int(stmt, idx, (int) value);
448         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
449
450         return AIL_ERROR_OK;
451 }
452
453
454
455 ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value)
456 {
457         int ret;
458
459         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
460
461         ret = sqlite3_bind_int(stmt, idx, value);
462         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
463
464         return AIL_ERROR_OK;
465 }
466
467 ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, char* value)
468 {
469         int ret;
470
471         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
472
473         ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0);
474         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
475
476         return AIL_ERROR_OK;
477 }
478
479
480 ail_error_e db_step(sqlite3_stmt *stmt)
481 {
482         int ret;
483
484         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
485
486         ret = sqlite3_step(stmt);
487         switch (ret) {
488                 case SQLITE_DONE:
489                         return AIL_ERROR_NO_DATA;
490                 case SQLITE_ROW:
491                         return AIL_ERROR_OK;
492         }
493
494         retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED);
495 }
496
497
498
499 ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value)
500 {
501         int out_val;
502
503         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
504         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
505
506         out_val = sqlite3_column_int(stmt, index);
507         *value = (out_val == 1)? true:false;
508
509         return AIL_ERROR_OK;
510 }
511
512
513
514 ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value)
515 {
516         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
517         retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
518
519         *value = sqlite3_column_int(stmt, index);
520
521         return AIL_ERROR_OK;
522 }
523
524
525
526 ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str)
527 {
528         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
529         retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
530
531         *str = (char *)sqlite3_column_text(stmt, index);
532
533         return AIL_ERROR_OK;
534 }
535
536
537
538 ail_error_e db_reset(sqlite3_stmt *stmt)
539 {
540         int ret;
541
542         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
543
544         sqlite3_clear_bindings(stmt);
545
546         ret = sqlite3_reset(stmt);
547         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
548
549         return AIL_ERROR_OK;
550 }
551
552
553
554 ail_error_e db_finalize(sqlite3_stmt *stmt)
555 {
556         int ret;
557
558         retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
559
560         ret = sqlite3_finalize(stmt);
561         retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
562
563         return AIL_ERROR_OK;
564 }
565
566
567
568 ail_error_e do_db_exec(const char *query, sqlite3 * fileSQL)
569 {
570         int ret;
571         char *errmsg;
572
573         retv_if(!query, AIL_ERROR_INVALID_PARAMETER);
574         retv_if(!fileSQL, AIL_ERROR_DB_FAILED);
575
576         ret = sqlite3_exec(fileSQL, query, NULL, NULL, &errmsg);
577         if (ret != SQLITE_OK) {
578                 _E("Cannot execute this query - %s. because %s",
579                                 query, errmsg? errmsg:"uncatched error");
580                 sqlite3_free(errmsg);
581                 return AIL_ERROR_DB_FAILED;
582         }
583
584         return AIL_ERROR_OK;
585 }
586
587
588
589 ail_error_e db_exec_usr_rw(const char *query)
590 {
591         return do_db_exec(query, db_info.dbUserrw);
592 }
593
594
595 ail_error_e db_exec_usr_ro(const char *query)
596 {
597         return do_db_exec(query, db_info.dbUserro);
598 }
599
600 ail_error_e db_exec_glo_ro(const char *query)
601 {
602         return do_db_exec(query, db_info.dbGlobalro);
603 }
604
605 ail_error_e db_exec_glo_rw(const char *query)
606 {
607         return do_db_exec(query, db_info.dbGlobalrw);
608 }
609
610
611 ail_error_e db_close(void)
612 {
613         int ret;
614
615         if(db_info.dbUserro) {
616                 ret = sqlite3_close(db_info.dbUserro);
617                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
618
619                 db_info.dbUserro = NULL;
620         }
621         if(db_info.dbGlobalrw) {
622                 ret = sqlite3_close(db_info.dbGlobalrw);
623                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
624
625                 db_info.dbGlobalrw = NULL;
626         }
627         if(db_info.dbUserrw) {
628                 ret = sqlite3_close(db_info.dbUserrw);
629                 retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED);
630
631                 db_info.dbUserrw = NULL;
632         }
633
634         return AIL_ERROR_OK;
635 }
636
637 EXPORT_API ail_error_e ail_db_close(void)
638 {
639         return db_close();
640 }
641
642 int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data)
643 {
644         char *error_message = NULL;
645         if(db_info.dbGlobalro) {
646                 if (SQLITE_OK !=
647                         sqlite3_exec(db_info.dbGlobalro, query, callback, data, &error_message)) {
648                         _E("Don't execute query = %s error message = %s\n", query,
649                                 error_message);
650                         sqlite3_free(error_message);
651                         return -1;
652                 }
653         }
654         if(db_info.dbUserro) {
655                 if (SQLITE_OK !=
656                         sqlite3_exec(db_info.dbUserro, query, callback, data, &error_message)) {
657                         _E("Don't execute query = %s error message = %s\n", query,
658                                 error_message);
659                         sqlite3_free(error_message);
660                         return -1;
661                 }
662         }
663         sqlite3_free(error_message);
664         return 0;
665 }
666
667 // End of file.