Add new feature to change app's icon
[platform/core/appfw/pkgmgr-info.git] / parser / src / pkgmgr_parser_db.c
index 1b94e74..7b9d10e 100644 (file)
@@ -191,11 +191,8 @@ static int __set_db_version(sqlite3 *db)
        static const char query_raw[] = "PRAGMA user_version=";
        char query[BUFSIZE];
        int ret;
-       int version;
 
-       version = atoi(TIZEN_MAJOR_VER) * 10000 + atoi(TIZEN_MINOR_VER) * 100 +
-               atoi(TIZEN_PATCH_VER);
-       snprintf(query, sizeof(query), "%s%d", query_raw, version);
+       snprintf(query, sizeof(query), "%s%d", query_raw, PKG_DB_VERSION);
 
        ret = sqlite3_exec(db, query, NULL, NULL, NULL);
        if (ret != SQLITE_OK) {
@@ -301,17 +298,16 @@ static const char *parser_init_queries[] = {
        QUERY_CREATE_TABLE_PACKAGE_INFO,
        QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
        QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
+       QUERY_CREATE_TABLE_PACKAGE_APPDEFINED_PRIVILEGE_INFO,
+       QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
        QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
        QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
-       QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO, /* ? */
-       QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO, /* ? */
        QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
+       QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
        QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
        QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
-       QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION, /* ? */
-       QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, /* ? */
-       QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, /* ? */
        QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
+       QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
        QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
        QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
        QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
@@ -473,6 +469,14 @@ static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
        if (ret != SQLITE_OK)
                return ret;
 
+       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 (flags & SQLITE_OPEN_CREATE) {
                ret = __initialize_db(*db, path, uid);
                if (ret) {
@@ -490,14 +494,6 @@ static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags)
                return ret;
        }
 
-       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;
-       }
-
        return ret;
 }
 
@@ -556,6 +552,60 @@ static const char *__find_effective_appid(GList *metadata_list)
        return NULL;
 }
 
+static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
+               appcontrol_x *ac)
+{
+       static const char query[] =
+               "INSERT INTO package_app_app_control_privilege (app_id,"
+               "  app_control, privilege) VALUES (?, ?, ?)";
+       int ret;
+       sqlite3_stmt *stmt;
+       int idx;
+       char app_control[BUFSIZE];
+       GList *tmp;
+       char *privilege;
+
+       if (ac == NULL)
+               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 = ac->privileges; tmp; tmp = tmp->next) {
+               privilege = (char *)tmp->data;
+               if (privilege == NULL || !strlen(privilege))
+                       continue;
+
+               idx = 1;
+               snprintf(app_control, sizeof(app_control), "%s|%s|%s",
+                               ac->operation ? (strlen(ac->operation) > 0 ?
+                                       ac->operation : "NULL") : "NULL",
+                               ac->uri ? (strlen(ac->uri) > 0 ?
+                                       ac->uri : "NULL") : "NULL",
+                               ac->mime ? (strlen(ac->mime) > 0 ?
+                                       ac->mime : "NULL") : "NULL");
+               __BIND_TEXT(db, stmt, idx++, appid);
+               __BIND_TEXT(db, stmt, idx++, app_control);
+               __BIND_TEXT(db, stmt, idx++, privilege);
+
+               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 __insert_appcontrol_info(sqlite3 *db, application_x *app)
 {
        static const char query[] =
@@ -599,6 +649,11 @@ static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
                        return -1;
                }
 
+               if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
+                       sqlite3_finalize(stmt);
+                       return -1;
+               }
+
                sqlite3_reset(stmt);
        }
 
@@ -694,6 +749,53 @@ static int __insert_metadata_info(sqlite3 *db, application_x *app)
        return 0;
 }
 
+static int __insert_app_data_control_privilege_info(sqlite3 *db,
+               datacontrol_x *datacontrol)
+{
+       static const char query[] =
+               "INSERT INTO package_app_data_control_privilege (providerid,"
+               "  privilege, type) VALUES (?, ?, ?)";
+
+       int ret;
+       sqlite3_stmt *stmt;
+       int idx;
+       GList *privileges;
+       char *priv;
+
+       if (datacontrol == NULL)
+               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 (privileges = datacontrol->privileges; privileges;
+                       privileges = privileges->next) {
+               priv = (char *)privileges->data;
+               if (priv == NULL)
+                       continue;
+
+               idx = 1;
+               __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
+               __BIND_TEXT(db, stmt, idx++, priv);
+               __BIND_TEXT(db, stmt, idx++, datacontrol->type);
+
+               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 __insert_datacontrol_info(sqlite3 *db, application_x *app)
 {
        static const char query[] =
@@ -732,6 +834,12 @@ static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
                        return -1;
                }
 
+               if (dc->privileges &&
+                               __insert_app_data_control_privilege_info(db, dc)) {
+                       sqlite3_finalize(stmt);
+                       return -1;
+               }
+
                sqlite3_reset(stmt);
        }
 
@@ -1399,7 +1507,7 @@ static int __insert_app_localized_info(sqlite3 *db, application_x *app)
 
                sqlite3_reset(stmt);
 
-               if (strcasecmp(app->mainapp, "true")) {
+               if (strcasecmp(app->mainapp, "true") == 0) {
                        if (__insert_mainapp_localized_info(db, app, locale,
                                                label, icon))
                                _LOGE("insert mainapp localized info failed");
@@ -1453,6 +1561,50 @@ static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
        return 0;
 }
 
+static int __insert_package_appdefined_privilege_info(sqlite3 *db,
+               manifest_x *mfx)
+{
+       static const char query[] =
+               "INSERT INTO package_appdefined_privilege_info "
+               "(package, privilege, license, type) "
+               "VALUES (?, ?, ?, ?)";
+       int ret;
+       sqlite3_stmt *stmt;
+       int idx;
+       GList *tmp;
+       appdefined_privilege_x *priv;
+
+       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->appdefined_privileges; tmp; tmp = tmp->next) {
+               priv = (appdefined_privilege_x *)tmp->data;
+               if (priv == NULL)
+                       continue;
+
+               idx = 1;
+               __BIND_TEXT(db, stmt, idx++, mfx->package);
+               __BIND_TEXT(db, stmt, idx++, priv->value);
+               __BIND_TEXT(db, stmt, idx++, priv->license);
+               __BIND_TEXT(db, stmt, idx++, priv->type);
+
+               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
@@ -1560,7 +1712,7 @@ static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
                __BIND_TEXT(db, stmt, idx++, mfx->api_version);
                __BIND_TEXT(db, stmt, idx++, effective_appid);
                __BIND_TEXT(db, stmt, idx++,
-                               __get_bool(app->splash_screen_display, false));
+                               __get_bool(app->splash_screen_display, true));
                __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
                __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
                __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
@@ -1608,6 +1760,35 @@ static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
        return 0;
 }
 
+static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
+{
+       static const char query[] =
+               "INSERT INTO package_update_info (package, update_version) "
+               "VALUES (?, ?)";
+       int ret;
+       int idx;
+       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;
+       }
+
+       idx = 1;
+       __BIND_TEXT(db, stmt, idx++, mfx->package);
+       __BIND_TEXT(db, stmt, idx, mfx->version);
+       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_localized_info(sqlite3 *db, manifest_x *mfx)
 {
        static const char query[] =
@@ -1752,12 +1933,16 @@ static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
 
        sqlite3_finalize(stmt);
 
+       if (__insert_package_update_info(db, mfx))
+               return -1;
        if (__insert_package_localized_info(db, mfx))
                return -1;
        if (__insert_application_info(db, mfx))
                return -1;
        if (__insert_package_privilege_info(db, mfx))
                return -1;
+       if (__insert_package_appdefined_privilege_info(db, mfx))
+               return -1;
 
        return 0;
 }
@@ -1938,9 +2123,9 @@ API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
                return PM_PARSER_R_EINVAL;
        }
 
-       dbpath = __get_parser_db_path(uid);
+       dbpath = __get_parser_db_path(GLOBAL_USER);
 
-       ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
+       ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
        if (ret != SQLITE_OK) {
                _LOGE("open db failed: %d", ret);
                return PM_PARSER_R_ERROR;
@@ -2137,9 +2322,9 @@ API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
                return PM_PARSER_R_EINVAL;
        }
 
-       dbpath = __get_parser_db_path(uid);
+       dbpath = __get_parser_db_path(GLOBAL_USER);
 
-       ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
+       ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
        if (ret != SQLITE_OK) {
                _LOGE("open db failed: %d", ret);
                return PM_PARSER_R_ERROR;
@@ -2288,6 +2473,72 @@ API int pkgmgr_parser_update_app_label_info_in_db(const char *appid,
                        label);
 }
 
+static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
+{
+       static const char query[] =
+               "UPDATE package_app_localized_info SET app_icon=? "
+               "WHERE app_id=? AND app_icon IS NOT NULL";
+       int ret;
+       sqlite3_stmt *stmt;
+       int idx = 1;
+
+       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, idx++, icon_path);
+       __BIND_TEXT(db, stmt, idx++, appid);
+
+       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;
+}
+
+API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
+               uid_t uid, const char *icon_path)
+{
+       int ret;
+       const char *dbpath;
+       sqlite3 *db;
+
+       if (appid == NULL) {
+               _LOGE("invalid parameter");
+               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, __set_app_icon(db, appid, icon_path));
+       __END_TRANSACTION(db);
+
+       sqlite3_close_v2(db);
+
+       return PM_PARSER_R_OK;
+}
+
+API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
+               const char *icon_path)
+{
+       return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
+                       icon_path);
+}
+
 static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
 {
        static const char query[] =