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