X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fail_db.c;h=e96ef86b62a5cb760125f71ff1322ccff0847efc;hb=refs%2Ftags%2Fsubmit%2Ftizen_common%2F20151229.144031;hp=b8edd1599b613b62f9e2fd19d5b0655a93ba2f45;hpb=130c893b2773b18220cfc48794d0e86c1d822a90;p=platform%2Fcore%2Fappfw%2Fail.git diff --git a/src/ail_db.c b/src/ail_db.c index b8edd15..e96ef86 100755 --- a/src/ail_db.c +++ b/src/ail_db.c @@ -19,75 +19,607 @@ * */ - - - +#define _GNU_SOURCE +#include #include #include #include +#include #include +#include +#include +#include +#include +#include #include "ail_private.h" #include "ail_db.h" -#define retv_with_dbmsg_if(expr, val) do { \ - if (expr) { \ - _E("db_info.dbro: %s", sqlite3_errmsg(db_info.dbro)); \ - _E("db_info.dbrw: %s", sqlite3_errmsg(db_info.dbrw)); \ - return (val); \ - } \ -} while (0) - +#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) +#define BUFSIZE 4096 +#define QUERY_ATTACH "attach database '%s' as Global" +#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)" + +#define QUERY_CREATE_VIEW_LOCAL "CREATE temp VIEW localname as select distinct * from (select * from main.localname m union select * from Global.localname g)" + +#define SET_SMACK_LABEL(x, uid) \ + do { \ + if (smack_setlabel((x), (((uid) == GLOBAL_USER) ? "*" : "User"), SMACK_LABEL_ACCESS)) \ + _E("failed chsmack -a \"User/*\" %s", x); \ + else \ + _D("chsmack -a \"User/*\" %s", x); \ + } while (0) + +#define retv_with_dbmsg_if(expr, val) \ + do { \ + if (expr) { \ + _E("db_info.dbUserro: %s", sqlite3_errmsg(db_info.dbUserro)); \ + _E("db_info.dbGlobalro: %s", sqlite3_errmsg(db_info.dbGlobalro)); \ + _E("db_info.dbUserrw: %s", sqlite3_errmsg(db_info.dbUserrw)); \ + _E("db_info.dbGlobalrw: %s", sqlite3_errmsg(db_info.dbGlobalrw)); \ + _E("db_info.dbUserro errcode: %d", sqlite3_extended_errcode(db_info.dbUserro)); \ + _E("db_info.dbGlobalro errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalro)); \ + _E("db_info.dbUserrw errcode: %d", sqlite3_extended_errcode(db_info.dbUserrw)); \ + _E("db_info.dbGlobalrw errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalrw)); \ + return (val); \ + } \ + } while (0) + +#define tryvm_with_dbmsg_if(expr, val) \ + do { \ + if (expr) { \ + _E("db_info.dbUserro: %s", sqlite3_errmsg(db_info.dbUserro)); \ + _E("db_info.dbGlobalro: %s", sqlite3_errmsg(db_info.dbGlobalro)); \ + _E("db_info.dbUserrw: %s", sqlite3_errmsg(db_info.dbUserrw)); \ + _E("db_info.dbGlobalrw: %s", sqlite3_errmsg(db_info.dbGlobalrw)); \ + _E("db_info.dbUserro errcode: %d", sqlite3_extended_errcode(db_info.dbUserro)); \ + _E("db_info.dbGlobalro errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalro)); \ + _E("db_info.dbUserrw errcode: %d", sqlite3_extended_errcode(db_info.dbUserrw)); \ + _E("db_info.dbGlobalrw errcode: %d", sqlite3_extended_errcode(db_info.dbGlobalrw)); \ + goto catch; \ + } \ + } while (0) static __thread struct { - sqlite3 *dbro; - sqlite3 *dbrw; + sqlite3 *dbUserro; + sqlite3 *dbGlobalro; + sqlite3 *dbUserrw; + sqlite3 *dbGlobalrw; } db_info = { - .dbro = NULL, - .dbrw = NULL + .dbUserro = NULL, + .dbGlobalro = NULL, + .dbUserrw = NULL, + .dbGlobalrw = NULL }; -ail_error_e db_open(db_open_mode mode) +static __thread sqlite3 *dbInit = NULL; + +static int ail_db_change_perm(const char *db_file, uid_t uid) { + char journal_file[BUFSIZE]; + char *files[3]; int ret; - int changed = 0; + int i; + struct passwd pwd; + struct passwd *userinfo = NULL; + char *pwd_buf = NULL; + int pwd_bufsize; + + files[0] = (char *)db_file; + files[1] = journal_file; + files[2] = NULL; + + retv_if(!db_file, AIL_ERROR_FAIL); + if (getuid() != OWNER_ROOT) /* At this time we should be root to apply this */ + return AIL_ERROR_OK; - if(mode & DB_OPEN_RO) { - if (!db_info.dbro) { - ret = db_util_open_with_options(APP_INFO_DB, &db_info.dbro, SQLITE_OPEN_READONLY, NULL); - _E("db_open_ro ret=%d", ret); - retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); - } + pwd_bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); + if (pwd_bufsize <= 0) + pwd_bufsize = 16384; + + pwd_buf = (char *)malloc(pwd_bufsize); + if (pwd_buf == NULL) { + _E("out of memory"); + return AIL_ERROR_OUT_OF_MEMORY; } - if(mode & DB_OPEN_RW) { - if (!db_info.dbrw) { - ret = db_util_open(APP_INFO_DB, &db_info.dbrw, DB_UTIL_REGISTER_HOOK_METHOD); - _E("db_open_rw ret=%d", ret); - retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + if (getpwuid_r(uid, &pwd, pwd_buf, pwd_bufsize, &userinfo) != 0) { + _E("FAIL: user %d doesn't exist", uid); + free(pwd_buf); + return AIL_ERROR_FAIL; + } + snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal"); + + for (i = 0; files[i]; i++) { + /* Compare git_t type and not group name */ + ret = chown(files[i], uid, userinfo->pw_gid); + SET_SMACK_LABEL(files[i], uid); + if (ret == -1) { + _E("FAIL : chown %s %d.%d, because %d", db_file, uid, userinfo->pw_gid, errno); + free(pwd_buf); + return AIL_ERROR_FAIL; + } + + ret = chmod(files[i], S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (ret == -1) { + _E("FAIL : chmod %s 0664, because %d", db_file, errno); + free(pwd_buf); + return AIL_ERROR_FAIL; } } + free(pwd_buf); + return AIL_ERROR_OK; } +char *ail_get_icon_path(uid_t uid) +{ + char *result = NULL; + struct group grpbuf; + struct group *grpinfo = NULL; + struct passwd pwd; + struct passwd *userinfo = NULL; + int buflen; + char *buf = NULL; + char *pwd_buf; + + if (uid == 0) { + _E("FAIL : Root is not allowed user! please fix it replacing with DEFAULT_USER"); + return NULL; + } + + if (uid != GLOBAL_USER) { + buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (buflen <= 0) + buflen = 16384; + pwd_buf = (char *)malloc(buflen); + if (pwd_buf == NULL) { + _E("out of memory"); + return NULL; + } -ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt) + if (getpwuid_r(uid, &pwd, pwd_buf, buflen, &userinfo) != 0) { + _E("getpwuid(%d) returns NULL !", uid); + free(pwd_buf); + return NULL; + } + + buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + if (buflen <= 0) + buflen = 1024; + + buf = (char *)malloc(buflen); + if (buf == NULL) { + _E("out of memory"); + free(pwd_buf); + return NULL; + } + + if (getgrnam_r("users", &grpbuf, buf, buflen, &grpinfo) != 0) { + _E("getgrnam_r(users) returns NULL !"); + free(pwd_buf); + free(buf); + return NULL; + } + + /* Compare git_t type and not group name */ + if (grpinfo->gr_gid != userinfo->pw_gid) { + _E("UID [%d] does not belong to 'users' group!", uid); + free(pwd_buf); + free(buf); + return NULL; + } + + if (asprintf(&result, "%s/.applications/icons/", userinfo->pw_dir) == -1) + _E("out of memory: asprintf() is failed."); + + free(pwd_buf); + } else { + result = strdup(tzplatform_mkpath(TZ_SYS_RW_ICONS, "/")); + if (result == NULL) { + _E("out of memory"); + return NULL; + } + } + + int ret = mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH); + if (ret == -1 && errno != EEXIST) { + _E("FAIL : to create directory %s %d", result, errno); + } else if (getuid() == OWNER_ROOT) { + ret = chown(result, uid, grpinfo ? grpinfo->gr_gid : 0); + SET_SMACK_LABEL(result, uid); + if (ret == -1) { + _E("FAIL : chown %s %d.%d, because %d", result, uid, + grpinfo ? grpinfo->gr_gid : 0, errno); + } + } + + free(buf); + + return result; +} + +char *ail_get_app_DB_journal(uid_t uid) +{ + char *app_path = ail_get_app_DB(uid); + char *result = NULL; + + if (asprintf(&result, "%s-journal", app_path) == -1) + _E("out of memory: asprintf() is failed."); + + free(app_path); + + return result; +} + +char *ail_get_app_DB(uid_t uid) +{ + char *result = NULL; + struct group grpbuf; + struct group *grpinfo = NULL; + char *dir = NULL; + char *temp = NULL; + struct passwd pwd; + struct passwd *userinfo; + int buflen; + char *buf = NULL; + char *pwd_buf; + + if (uid == 0) { + _E("FAIL : Root is not allowed! switch to DEFAULT_USER"); + return NULL; + } + + if (uid != GLOBAL_USER) { + buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (buflen <= 0) + buflen = 16384; + + pwd_buf = (char *)malloc(buflen); + if (pwd_buf == NULL) { + _E("out of memory"); + return NULL; + } + + if (getpwuid_r(uid, &pwd, pwd_buf, buflen, &userinfo) != 0) { + _E("getpwuid(%d) returns NULL !", uid); + free(pwd_buf); + return NULL; + } + + buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + if (buflen <= 0) + buflen = 1024; + + buf = (char *)malloc(buflen); + if (buf == NULL) { + _E("out of memory"); + free(pwd_buf); + return NULL; + } + + if (getgrnam_r("users", &grpbuf, buf, buflen, &grpinfo) != 0) { + _E("getgrnam(users) returns NULL !"); + free(pwd_buf); + free(buf); + return NULL; + } + + /* Compare git_t type and not group name */ + if (grpinfo->gr_gid != userinfo->pw_gid) { + _E("UID [%d] does not belong to 'users' group!", uid); + free(pwd_buf); + free(buf); + return NULL; + } + + if (asprintf(&result, "%s/.applications/dbspace/.app_info.db", userinfo->pw_dir) == -1) + _E("out of memory: asprintf() is failed."); + + free(pwd_buf); + } else { + result = strdup(APP_INFO_DB_FILE); + if (result == NULL) { + _E("ouf of memory"); + return NULL; + } + } + + temp = strdup(result); + if (temp == NULL) { + free(buf); + return result; + } + + dir = strrchr(temp, '/'); + if (!dir) { + free(temp); + free(buf); + return result; + } + *dir = 0; + + int ret = mkdir(temp, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH); + if (ret == -1 && errno != EEXIST) { + _E("FAIL : to create directory %s %d", temp, errno); + } else if (getuid() == OWNER_ROOT) { + ret = chown(temp, uid, grpinfo ? grpinfo->gr_gid : 0); + SET_SMACK_LABEL(temp, uid); + if (ret == -1) { + _E("FAIL : chown %s %d.%d, because %d", temp, uid, + grpinfo ? grpinfo->gr_gid : 0, errno); + } + } + + free(temp); + free(buf); + + return result; +} + +char *ail_get_desktop_path(uid_t uid) +{ + char *result = NULL; + struct group grpbuf; + struct group *grpinfo = NULL; + struct passwd pwd; + struct passwd *userinfo = NULL; + int buflen; + char *buf = NULL; + char *pwd_buf; + + if (uid == 0) { + _E("FAIL : Root is not allowed user! please fix it replacing with DEFAULT_USER"); + return NULL; + } + + if (uid != GLOBAL_USER) { + buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (buflen <= 0) + buflen = 16384; + + pwd_buf = (char *)malloc(buflen); + if (pwd_buf == NULL) { + _E("out of memory"); + return NULL; + } + + if (getpwuid_r(uid, &pwd, pwd_buf, buflen, &userinfo) != 0) { + _E("getpwuid(%d) returns NULL !", uid); + free(pwd_buf); + return NULL; + } + + buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + if (buflen <= 0) + buflen = 1024; + + buf = (char *)malloc(buflen); + if (buf == NULL) { + _E("out of memory"); + free(pwd_buf); + return NULL; + } + + if (getgrnam_r("users", &grpbuf, buf, buflen, &grpinfo) != 0) { + _E("getgrnam(users) returns NULL !"); + free(pwd_buf); + free(buf); + return NULL; + } + + /* Compare git_t type and not group name */ + if (grpinfo->gr_gid != userinfo->pw_gid) { + _E("UID [%d] does not belong to 'users' group!", uid); + free(pwd_buf); + free(buf); + return NULL; + } + + if (asprintf(&result, "%s/.applications/desktop/", userinfo->pw_dir) == -1) + _E("out of memory: asprintf() is failed."); + + free(pwd_buf); + } else { + result = strdup(tzplatform_mkpath(TZ_SYS_RW_DESKTOP_APP, "/")); + if (result == NULL) { + _E("out of memory"); + return NULL; + } + } + + int ret = mkdir(result, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH); + if (ret == -1 && errno != EEXIST) { + _E("FAIL : to create directory %s %d", result, errno); + } else if (getuid() == OWNER_ROOT) { + ret = chown(result, uid, grpinfo ? grpinfo->gr_gid : 0); + SET_SMACK_LABEL(result, uid); + if (ret == -1) { + _E("FAIL : chown %s %d.%d, because %d", result, uid, + grpinfo ? grpinfo->gr_gid : 0, errno); + } + } + + free(buf); + + return result; +} + + +static ail_error_e db_do_prepare(sqlite3 *db, const char *query, sqlite3_stmt **stmt) { int ret; retv_if(!query, AIL_ERROR_INVALID_PARAMETER); retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER); - retv_if(!db_info.dbro, AIL_ERROR_DB_FAILED); + retv_if(!db, AIL_ERROR_DB_FAILED); - ret = sqlite3_prepare_v2(db_info.dbro, query, strlen(query), stmt, NULL); + ret = sqlite3_prepare_v2(db, query, strlen(query), stmt, NULL); if (ret != SQLITE_OK) { - _E("%s\n", sqlite3_errmsg(db_info.dbro)); + _E("%s\n", sqlite3_errmsg(db)); return AIL_ERROR_DB_FAILED; - } else + } else return AIL_ERROR_OK; } +ail_error_e db_open(db_open_mode mode, uid_t uid) +{ + int ret; + int i; + char *db; + char *global_db; + const char *tbls[3] = { + "CREATE TABLE app_info " + "(package TEXT PRIMARY KEY, " + "exec TEXT DEFAULT 'No Exec', " + "name TEXT DEFAULT 'No Name', " + "type TEXT DEFAULT 'Application', " + "icon TEXT DEFAULT 'No Icon', " + "categories TEXT, " + "version TEXT, " + "mimetype TEXT, " + "x_slp_service TEXT, " + "x_slp_packagetype TEXT, " + "x_slp_packagecategories TEXT, " + "x_slp_packageid TEXT, " + "x_slp_uri TEXT, " + "x_slp_svc TEXT, " + "x_slp_exe_path TEXT, " + "x_slp_appid TEXT, " + "x_slp_pkgid TEXT, " + "x_slp_domain TEXT, " + "x_slp_submodemainid TEXT, " + "x_slp_installedstorage TEXT, " + "x_slp_baselayoutwidth INTEGER DEFAULT 0, " + "x_slp_installedtime INTEGER DEFAULT 0, " + "nodisplay INTEGER DEFAULT 0, " + "x_slp_taskmanage INTEGER DEFAULT 1, " + "x_slp_multiple INTEGER DEFAULT 0, " + "x_slp_removable INTEGER DEFAULT 1, " + "x_slp_ishorizontalscale INTEGER DEFAULT 0, " + "x_slp_enabled INTEGER DEFAULT 1, " + "x_slp_submode INTEGER DEFAULT 0, " + "desktop TEXT UNIQUE NOT NULL);", + "CREATE TABLE localname (package TEXT NOT NULL, " + "locale TEXT NOT NULL, " + "name TEXT NOT NULL, " + "x_slp_pkgid TEXT NOT NULL, PRIMARY KEY (package, locale));", + + NULL + }; + + db = ail_get_app_DB(uid); + if (db == NULL) { + _E("Failed to get app DB"); + return AIL_ERROR_DB_FAILED; + } + + global_db = ail_get_app_DB(GLOBAL_USER); + if (global_db == NULL) { + _E("Failed to get global app DB"); + free(db); + return AIL_ERROR_DB_FAILED; + } + + if (access(db, F_OK)) { + if (AIL_ERROR_OK == db_util_open_with_options(db, + &dbInit, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) { + for (i = 0; tbls[i] != NULL; i++) { + ret = do_db_exec(tbls[i], dbInit); + if (ret != AIL_ERROR_OK) + goto catch; + } + if (getuid() == OWNER_ROOT && AIL_ERROR_OK != ail_db_change_perm(db, uid)) + _E("Failed to change permission\n"); + } else { + dbInit = NULL; + _E("Failed to create table %s\n", db); + } + } + + if (dbInit) { + ret = sqlite3_close(dbInit); + tryvm_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + dbInit = NULL; + } + if (mode & DB_OPEN_RO) { + if (uid != GLOBAL_USER) { + if (!db_info.dbUserro) { + db_util_open_with_options(db, &db_info.dbUserro, SQLITE_OPEN_READONLY, NULL); + char query_attach[AIL_SQL_QUERY_MAX_LEN]; + char query_view_app[AIL_SQL_QUERY_MAX_LEN]; + char query_view_local[AIL_SQL_QUERY_MAX_LEN]; + snprintf(query_attach, AIL_SQL_QUERY_MAX_LEN, QUERY_ATTACH, global_db); + if (db_exec_usr_ro(query_attach) < 0) { + _D("executing query_attach : %s", query_attach); + goto catch; + } + snprintf(query_view_app, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_APP); + if (db_exec_usr_ro(query_view_app) < 0) { + _D("executing query_attach : %s", query_view_app); + goto catch; + } + + snprintf(query_view_local, AIL_SQL_QUERY_MAX_LEN, QUERY_CREATE_VIEW_LOCAL); + if (db_exec_usr_ro(query_view_local) < 0) { + _D("executing query_attach : %s", query_view_local); + goto catch; + } + } + } else { + if (!db_info.dbGlobalro) { + ret = db_util_open_with_options(global_db, &db_info.dbGlobalro, SQLITE_OPEN_READONLY, NULL); + tryvm_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + } + } + } + + if (mode & DB_OPEN_RW) { + if (uid != GLOBAL_USER) { + if (!db_info.dbUserrw) { + ret = db_util_open(db, &db_info.dbUserrw, 0); + tryvm_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + } + } else { + if (!db_info.dbGlobalrw) { + ret = db_util_open(global_db, &db_info.dbGlobalrw, 0); + tryvm_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + } + } + } + + free(global_db); + free(db); + + return AIL_ERROR_OK; + +catch: + free(global_db); + free(db); + + return AIL_ERROR_DB_FAILED; +} + +ail_error_e db_prepare(const char *query, sqlite3_stmt **stmt) +{ + return db_do_prepare(db_info.dbUserro, query, stmt); +} + +ail_error_e db_prepare_globalro(const char *query, sqlite3_stmt **stmt) +{ + return db_do_prepare(db_info.dbGlobalro, query, stmt); +} + +ail_error_e db_prepare_rw(const char *query, sqlite3_stmt **stmt) +{ + return db_do_prepare(db_info.dbUserrw, query, stmt); +} + +ail_error_e db_prepare_globalrw(const char *query, sqlite3_stmt **stmt) +{ + return db_do_prepare(db_info.dbGlobalrw, query, stmt); +} ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value) { @@ -101,8 +633,6 @@ ail_error_e db_bind_bool(sqlite3_stmt *stmt, int idx, bool value) return AIL_ERROR_OK; } - - ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value) { int ret; @@ -115,7 +645,17 @@ ail_error_e db_bind_int(sqlite3_stmt *stmt, int idx, int value) return AIL_ERROR_OK; } +ail_error_e db_bind_text(sqlite3_stmt *stmt, int idx, const char* value) +{ + int ret; + retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER); + + ret = sqlite3_bind_text(stmt, idx, value, strlen(value), 0); + retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + + return AIL_ERROR_OK; +} ail_error_e db_step(sqlite3_stmt *stmt) { @@ -125,17 +665,15 @@ ail_error_e db_step(sqlite3_stmt *stmt) ret = sqlite3_step(stmt); switch (ret) { - case SQLITE_DONE: - return AIL_ERROR_NO_DATA; - case SQLITE_ROW: - return AIL_ERROR_OK; + case SQLITE_DONE: + return AIL_ERROR_NO_DATA; + case SQLITE_ROW: + return AIL_ERROR_OK; } retv_with_dbmsg_if(1, AIL_ERROR_DB_FAILED); } - - ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value) { int out_val; @@ -144,13 +682,11 @@ ail_error_e db_column_bool(sqlite3_stmt *stmt, int index, bool *value) retv_if(!value, AIL_ERROR_INVALID_PARAMETER); out_val = sqlite3_column_int(stmt, index); - *value = (out_val == 1)? true:false; + *value = (out_val == 1) ? true : false; return AIL_ERROR_OK; } - - ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value) { retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER); @@ -161,8 +697,6 @@ ail_error_e db_column_int(sqlite3_stmt *stmt, int index, int *value) return AIL_ERROR_OK; } - - ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str) { retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER); @@ -173,8 +707,6 @@ ail_error_e db_column_str(sqlite3_stmt *stmt, int index, char **str) return AIL_ERROR_OK; } - - ail_error_e db_reset(sqlite3_stmt *stmt) { int ret; @@ -189,8 +721,6 @@ ail_error_e db_reset(sqlite3_stmt *stmt) return AIL_ERROR_OK; } - - ail_error_e db_finalize(sqlite3_stmt *stmt) { int ret; @@ -203,44 +733,66 @@ ail_error_e db_finalize(sqlite3_stmt *stmt) return AIL_ERROR_OK; } - - -ail_error_e db_exec(const char *query) +ail_error_e do_db_exec(const char *query, sqlite3 * fileSQL) { int ret; - char *errmsg; + char *errmsg = NULL; retv_if(!query, AIL_ERROR_INVALID_PARAMETER); - retv_if(!db_info.dbrw, AIL_ERROR_DB_FAILED); + retv_if(!fileSQL, AIL_ERROR_DB_FAILED); - ret = sqlite3_exec(db_info.dbrw, query, NULL, NULL, &errmsg); + ret = sqlite3_exec(fileSQL, query, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { _E("Cannot execute this query - %s. because %s", - query, errmsg? errmsg:"uncatched error"); - sqlite3_free(errmsg); + query, errmsg ? errmsg : "uncatched error"); + if (errmsg) + sqlite3_free(errmsg); return AIL_ERROR_DB_FAILED; } return AIL_ERROR_OK; } +ail_error_e db_exec_usr_rw(const char *query) +{ + return do_db_exec(query, db_info.dbUserrw); +} +ail_error_e db_exec_usr_ro(const char *query) +{ + return do_db_exec(query, db_info.dbUserro); +} + +ail_error_e db_exec_glo_ro(const char *query) +{ + return do_db_exec(query, db_info.dbGlobalro); +} + +ail_error_e db_exec_glo_rw(const char *query) +{ + return do_db_exec(query, db_info.dbGlobalrw); +} ail_error_e db_close(void) { int ret; - if(db_info.dbro) { - ret = sqlite3_close(db_info.dbro); + if (db_info.dbUserro) { + ret = sqlite3_close(db_info.dbUserro); retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); - - db_info.dbro = NULL; + db_info.dbUserro = NULL; } - if(db_info.dbrw) { - ret = sqlite3_close(db_info.dbrw); + + if (db_info.dbGlobalrw) { + ret = sqlite3_close(db_info.dbGlobalrw); retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + db_info.dbGlobalrw = NULL; + } - db_info.dbrw = NULL; + if (db_info.dbUserrw) { + ret = sqlite3_close(db_info.dbUserrw); + retv_with_dbmsg_if(ret != SQLITE_OK, AIL_ERROR_DB_FAILED); + db_info.dbUserrw = NULL; } return AIL_ERROR_OK; @@ -254,15 +806,24 @@ EXPORT_API ail_error_e ail_db_close(void) int db_exec_sqlite_query(char *query, sqlite_query_callback callback, void *data) { char *error_message = NULL; - if (SQLITE_OK != - sqlite3_exec(db_info.dbro, query, callback, data, &error_message)) { - _E("Don't execute query = %s error message = %s\n", query, - error_message); - sqlite3_free(error_message); - return -1; + if (db_info.dbGlobalro) { + if (SQLITE_OK != + sqlite3_exec(db_info.dbGlobalro, query, callback, data, &error_message)) { + _E("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } + } + if (db_info.dbUserro) { + if (SQLITE_OK != + sqlite3_exec(db_info.dbUserro, query, callback, data, &error_message)) { + _E("Don't execute query = %s error message = %s\n", query, + error_message); + sqlite3_free(error_message); + return -1; + } } sqlite3_free(error_message); return 0; } - -// End of file.