Implement pkgmgr plugin execution info
[platform/core/appfw/pkgmgr-info.git] / parser / src / pkgmgr_parser_db.c
index a7a1004..b6db523 100644 (file)
@@ -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