X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=parser%2Fsrc%2Fpkgmgr_parser_db.c;h=b6db5238f24d2d3db4ada0e8e187dffe4fe62760;hb=aa88d97f98ae9093f07947ec8397e15e07e1dac3;hp=a7a10041a7795bf6a94bd2e9b2d975a88dc5b0ec;hpb=87b8daea23c8d671f4284933cd71dfa9d349ea0a;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index a7a1004..b6db523 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -329,6 +329,8 @@ static const char *parser_init_queries[] = { QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID, QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID, QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN, + QUERY_CREATE_TABLE_PACKAGE_DEPENDENCY_INFO, + QUERY_CREATE_TABLE_PACKAGE_PLUGIN_INFO, NULL, }; @@ -342,11 +344,23 @@ static const char *cert_init_queries[] = { NULL }; -static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) +static int __create_tables(sqlite3 *db, const char **queries) { int ret; - const char **queries; int i; + for (i = 0; queries[i] != NULL; i++) { + ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("exec failed: %s", sqlite3_errmsg(db)); + return -1; + } + } + return 0; +} + +static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) +{ + const char **queries; if (__set_db_version(db)) return -1; @@ -360,13 +374,9 @@ static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) return -1; } - for (i = 0; queries[i] != NULL; i++) { - ret = sqlite3_exec(db, queries[i], NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGE("exec failed: %s", sqlite3_errmsg(db)); - return -1; - } - } + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __create_tables(db, queries)); + __END_TRANSACTION(db); if (__set_db_permission(dbpath, uid)) _LOGE("failed to set db permission"); @@ -374,93 +384,6 @@ static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) return 0; } -API int pkgmgr_parser_initialize_parser_db(uid_t uid) -{ - int ret; - const char *dbpath; - sqlite3 *db; - - dbpath = __get_parser_db_path(uid); - if (access(dbpath, F_OK) != -1) { - _LOGE("Manifest db for user %d is already exists", uid); - return PM_PARSER_R_ERROR; - } - - ret = sqlite3_open_v2(dbpath, &db, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); - if (ret != SQLITE_OK) { - _LOGE("open db failed: %d", ret); - return PM_PARSER_R_ERROR; - } - - if (__initialize_db(db, dbpath, uid)) { - sqlite3_close_v2(db); - return PM_PARSER_R_ERROR; - } - sqlite3_close_v2(db); - - return PM_PARSER_R_OK; -} - -API int pkgmgr_parser_initialize_cert_db(void) -{ - int ret; - const char *dbpath; - sqlite3 *db; - - dbpath = __get_cert_db_path(); - if (access(dbpath, F_OK) != -1) { - _LOGE("Cert db is already exists"); - return PM_PARSER_R_ERROR; - } - - ret = sqlite3_open_v2(dbpath, &db, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); - if (ret != SQLITE_OK) { - _LOGE("open db failed: %d", ret); - return PM_PARSER_R_ERROR; - } - - if (__initialize_db(db, dbpath, GLOBAL_USER)) { - sqlite3_close_v2(db); - return PM_PARSER_R_ERROR; - } - sqlite3_close_v2(db); - - return PM_PARSER_R_OK; -} - -API int pkgmgr_parser_create_and_initialize_db(uid_t uid) -{ - int ret; - struct passwd pwd; - struct passwd *result; - char buf[BUFSIZE]; - - ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); - if (result == NULL) { - if (ret == 0) - _LOGE("no such user: %s", APPFW_USER); - else - _LOGE("getpwnam_r failed: %d", errno); - return PM_PARSER_R_ERROR; - } - - if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) { - _LOGE("Only root or app_fw user is allowed"); - return PM_PARSER_R_EINVAL; - } - - if (pkgmgr_parser_initialize_parser_db(uid)) - return PM_PARSER_R_ERROR; - - if (uid == OWNER_ROOT || uid == GLOBAL_USER) - if (pkgmgr_parser_initialize_cert_db()) - return PM_PARSER_R_ERROR; - - return PM_PARSER_R_OK; -} - #define RESOURCED_BUS_NAME "org.tizen.resourced" #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process" #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process" @@ -577,6 +500,109 @@ static int __db_busy_handler(void *data, int count) } } +API int pkgmgr_parser_initialize_parser_db(uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + dbpath = __get_parser_db_path(uid); + if (access(dbpath, F_OK) != -1) { + _LOGE("Manifest db for user %d is already exists", uid); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_open_v2(dbpath, &db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_busy_handler(db, __db_busy_handler, NULL); + if (ret != SQLITE_OK) { + _LOGE("failed to register busy handler: %s", + sqlite3_errmsg(db)); + sqlite3_close_v2(db); + return ret; + } + + if (__initialize_db(db, dbpath, uid)) { + sqlite3_close_v2(db); + return PM_PARSER_R_ERROR; + } + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_initialize_cert_db(void) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + dbpath = __get_cert_db_path(); + if (access(dbpath, F_OK) != -1) { + _LOGE("Cert db is already exists"); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_open_v2(dbpath, &db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_busy_handler(db, __db_busy_handler, NULL); + if (ret != SQLITE_OK) { + _LOGE("failed to register busy handler: %s", + sqlite3_errmsg(db)); + sqlite3_close_v2(db); + return ret; + } + + if (__initialize_db(db, dbpath, GLOBAL_USER)) { + sqlite3_close_v2(db); + return PM_PARSER_R_ERROR; + } + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_create_and_initialize_db(uid_t uid) +{ + int ret; + struct passwd pwd; + struct passwd *result; + char buf[BUFSIZE]; + + ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %s", APPFW_USER); + else + _LOGE("getpwnam_r failed: %d", errno); + return PM_PARSER_R_ERROR; + } + + if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) { + _LOGE("Only root or app_fw user is allowed"); + return PM_PARSER_R_EINVAL; + } + + if (pkgmgr_parser_initialize_parser_db(uid)) + return PM_PARSER_R_ERROR; + + if (uid == OWNER_ROOT || uid == GLOBAL_USER) + if (pkgmgr_parser_initialize_cert_db()) + return PM_PARSER_R_ERROR; + + return PM_PARSER_R_OK; +} + static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags) { int ret; @@ -732,8 +758,8 @@ static int __insert_appcontrol_info(sqlite3 *db, application_x *app) { static const char query[] = "INSERT INTO package_app_app_control (app_id, app_control," - " visibility) " - "VALUES (?, ?, ?)"; + " visibility, app_control_id) " + "VALUES (?, ?, ?, ?)"; int ret; sqlite3_stmt *stmt; int idx; @@ -765,6 +791,7 @@ static int __insert_appcontrol_info(sqlite3 *db, application_x *app) __BIND_TEXT(db, stmt, idx++, app->appid); __BIND_TEXT(db, stmt, idx++, app_control); __BIND_TEXT(db, stmt, idx++, ac->visibility); + __BIND_TEXT(db, stmt, idx++, ac->id); ret = sqlite3_step(stmt); if (ret != SQLITE_DONE) { @@ -1687,6 +1714,81 @@ static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx) return 0; } +static int __insert_package_plugin_execution_info(sqlite3 *db, + manifest_x *mfx) +{ + static const char query[] = + "INSERT INTO package_plugin_info " + "(pkgid, appid, plugin_type, plugin_name) " + "VALUES (?, ?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + plugin_x *plugin; + + if (!mfx->plugin) + return 0; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } + + for (tmp = mfx->plugin; tmp; tmp = tmp->next) { + plugin = (plugin_x *)tmp->data; + if (plugin == NULL) + continue; + + idx = 1; + __BIND_TEXT(db, stmt, idx++, plugin->pkgid); + __BIND_TEXT(db, stmt, idx++, plugin->appid); + __BIND_TEXT(db, stmt, idx++, plugin->plugin_type); + __BIND_TEXT(db, stmt, idx++, plugin->plugin_name); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; + } + sqlite3_reset(stmt); + } + + sqlite3_finalize(stmt); + + return 0; +} + +static int __delete_package_plugin_execution_info(sqlite3 *db, + const char *pkgid) +{ + static const char query[] = + "DELETE FROM package_plugin_info WHERE pkgid=?"; + int ret; + sqlite3_stmt *stmt; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } + + __BIND_TEXT(db, stmt, 1, pkgid); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; + } + + sqlite3_finalize(stmt); + + return 0; +} + static int __insert_package_appdefined_privilege_info(sqlite3 *db, manifest_x *mfx) { @@ -1731,6 +1833,49 @@ static int __insert_package_appdefined_privilege_info(sqlite3 *db, return 0; } +static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx) +{ + static const char query[] = + "INSERT INTO package_dependency_info" + " (package, depends_on, type, required_version) " + "VALUES (?, ?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + dependency_x *dep; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } + + for (tmp = mfx->dependencies; tmp; tmp = tmp->next) { + dep = (dependency_x *)tmp->data; + if (dep == NULL) + continue; + + idx = 1; + __BIND_TEXT(db, stmt, idx++, mfx->package); + __BIND_TEXT(db, stmt, idx++, dep->depends_on); + __BIND_TEXT(db, stmt, idx++, dep->type); + __BIND_TEXT(db, stmt, idx++, dep->required_version); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; + } + sqlite3_reset(stmt); + } + + sqlite3_finalize(stmt); + + return 0; +} + /* _PRODUCT_LAUNCHING_ENHANCED_ * app->indicatordisplay, app->portraitimg, app->landscapeimg, * app->guestmode_appstatus @@ -2074,6 +2219,8 @@ static int __insert_package_info(sqlite3 *db, manifest_x *mfx) return -1; if (__insert_package_appdefined_privilege_info(db, mfx)) return -1; + if (__insert_package_dependency_info(db, mfx)) + return -1; return 0; } @@ -2996,3 +3143,92 @@ API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void) return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db( __getuid()); } + +API int pkgmgr_parser_register_pkg_plugin_info_in_usr_db( + manifest_x *mfx, uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + if (!mfx) + return PM_PARSER_R_EINVAL; + dbpath = __get_parser_db_path(uid); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_register_pkg_plugin_info_in_db(manifest_x *mfx) +{ + return pkgmgr_parser_register_pkg_plugin_info_in_usr_db(mfx, __getuid()); +} + +API int pkgmgr_parser_update_pkg_plugin_info_in_usr_db( + manifest_x *mfx, uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + if (!mfx) + return PM_PARSER_R_EINVAL; + dbpath = __get_parser_db_path(uid); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, mfx->package)); + __DO_TRANSACTION(db, __insert_package_plugin_execution_info(db, mfx)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_update_pkg_plugin_info_in_db(manifest_x *mfx) +{ + return pkgmgr_parser_update_pkg_plugin_info_in_usr_db(mfx, __getuid()); +} + +API int pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db( + const char *pkgid, uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + dbpath = __get_parser_db_path(uid); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __delete_package_plugin_execution_info(db, pkgid)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_unregister_pkg_plugin_info_in_db(const char *pkgid) +{ + return pkgmgr_parser_unregister_pkg_plugin_info_in_usr_db(pkgid, __getuid()); +} \ No newline at end of file