From fe6aacb1830e31f38b7c95b64a8055cfc486a0ac Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 9 Feb 2017 15:40:57 +0900 Subject: [PATCH] Rework db insertion code - Use prepared statement instead of using sqlite3_exec - Use local db handle - Turn on foreign key feature always - Fix code style - Remove unused code Inserting app icon section, app image, app permission, app share allowed, app share request are removed. Change-Id: I4eedca163fca140c3f03d1a93356790a28ebe941 Signed-off-by: Sangyoon Jang --- parser/include/pkgmgr_parser_db.h | 9 +- parser/src/pkgmgr_parser_db.c | 4596 ++++++++++++++------------------- parser/src/pkgmgr_parser_db_queries.h | 333 +++ src/pkgmgrinfo_certinfo.c | 4 +- src/pkgmgrinfo_db.c | 107 +- src/pkgmgrinfo_private.h | 2 +- 6 files changed, 2256 insertions(+), 2795 deletions(-) create mode 100644 parser/src/pkgmgr_parser_db_queries.h diff --git a/parser/include/pkgmgr_parser_db.h b/parser/include/pkgmgr_parser_db.h index b43931e..298bd79 100644 --- a/parser/include/pkgmgr_parser_db.h +++ b/parser/include/pkgmgr_parser_db.h @@ -331,8 +331,6 @@ int pkgmgr_parser_update_app_label_info_in_db(const char *appid, const char *lab */ int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid, uid_t uid, const char *label); -int pkgmgr_parser_create_and_initialize_db(uid_t uid); - /** * @fn int pkgmgr_parser_register_pkg_update_info_in_usr_db(pkgmgrinfo_updateinfo_h handle, uid_t uid) * @brief This API registers update informations of given packages for user specified by uid @@ -456,7 +454,7 @@ static int unregister_all_pkg_update_info(uid_t uid) int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid); /** - * @fn int pkgmgr_parser_unregister_all_pkg_update_info_in_db() + * @fn int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void) * @brief This API unregisters update information of all packages * * @par This API is only for internal usage @@ -476,8 +474,11 @@ static int unregister_all_pkg_update_info(void) } * @endcode */ -int pkgmgr_parser_unregister_all_pkg_update_info_in_db(); +int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void); +int pkgmgr_parser_create_and_initialize_db(uid_t uid); +int pkgmgr_parser_initialize_parser_db(uid_t uid); +int pkgmgr_parser_initialize_cert_db(void); /** @} */ #ifdef __cplusplus diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index 944651d..6620f28 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -1,10 +1,5 @@ /* - * pkgmgr-info - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Jayoun Lee , Sewook Park , - * Jaeho Lee , Shobhit Srivastava + * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,38 +15,41 @@ * */ -#define _GNU_SOURCE +#include #include -#include +#include #include #include -#include #include -#include +#include +#include #include -#include #include -#include #include -#include +#include -/* For multi-user support */ #include +#include #include "pkgmgr-info.h" #include "pkgmgrinfo_basic.h" -#include "pkgmgr_parser_internal.h" -#include "pkgmgr_parser_db.h" +#include "pkgmgr_parser.h" +#include "pkgmgr_parser_db_queries.h" #include "pkgmgr_parser_debug.h" +#include "pkgmgr_parser_internal.h" -#define PKGMGR_PARSER_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db") -#define PKGMGR_CERT_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db") -#define MAX_QUERY_LEN 4096 -#define BUFSIZE 4096 +#ifndef OWNER_ROOT #define OWNER_ROOT 0 +#endif +#ifndef GLOBAL_USER +#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) +#endif +#ifndef APPFW_USER #define APPFW_USER "app_fw" -#define MAX_INTEGER_LENGTH 10 +#endif + +#define BUFSIZE 4096 #define LDPI "ldpi" #define MDPI "mdpi" @@ -70,354 +68,29 @@ #define XXHDPI_MIN 481 #define XXHDPI_MAX 600 -#define DB_LABEL "User::Home" -#define SET_SMACK_LABEL(x) \ -do { \ - if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \ - _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \ - else \ - _LOGD("chsmack -a %s %s", DB_LABEL, x); \ -} while (0) - -sqlite3 *pkgmgr_parser_db; -sqlite3 *pkgmgr_cert_db; - - -#define QUERY_CREATE_TABLE_PACKAGE_INFO "CREATE TABLE IF NOT EXISTS package_info " \ - "(package TEXT PRIMARY KEY NOT NULL, " \ - "package_type TEXT DEFAULT 'tpk', " \ - "package_version TEXT, " \ - "package_api_version TEXT, " \ - "package_tep_name TEXT, " \ - "package_zip_mount_file TEXT, " \ - "install_location TEXT NOT NULL , " \ - "package_size TEXT, " \ - "package_removable TEXT NOT NULL DEFAULT 'true', " \ - "package_preload TEXT NOT NULL DEFAULT 'false', " \ - "package_readonly TEXT NOT NULL DEFAULT 'false', " \ - "package_update TEXT NOT NULL DEFAULT 'false', " \ - "package_appsetting TEXT NOT NULL DEFAULT 'false', " \ - "package_nodisplay TEXT NOT NULL DEFAULT 'false', " \ - "package_system TEXT NOT NULL DEFAULT 'false', " \ - "author_name TEXT, " \ - "author_email TEXT, " \ - "author_href TEXT," \ - "installed_time TEXT, " \ - "installed_storage TEXT, " \ - "storeclient_id TEXT, " \ - "mainapp_id TEXT, " \ - "package_url TEXT, " \ - "root_path TEXT, " \ - "external_path TEXT, " \ - "csc_path TEXT, " \ - "package_support_mode TEXT, " \ - "package_support_disable TEXT NOT NULL DEFAULT 'false', " \ - "package_disable TEXT NOT NULL DEFAULT 'false')" - -#define QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO "CREATE TABLE IF NOT EXISTS package_localized_info " \ - "(package TEXT NOT NULL, " \ - "package_locale TEXT NOT NULL DEFAULT 'No Locale', " \ - "package_label TEXT, " \ - "package_icon TEXT, " \ - "package_description TEXT, " \ - "package_license TEXT, " \ - "package_author TEXT, " \ - "PRIMARY KEY(package, package_locale), " \ - "FOREIGN KEY(package) " \ - "REFERENCES package_info(package) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO "CREATE TABLE IF NOT EXISTS package_privilege_info " \ - "(package TEXT NOT NULL, " \ - "privilege TEXT NOT NULL, " \ - "type TEXT NOT NULL, " \ - "PRIMARY KEY(package, privilege, type) " \ - "FOREIGN KEY(package) " \ - "REFERENCES package_info(package) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO "CREATE TABLE IF NOT EXISTS package_update_info " \ - "(package TEXT PRIMARY KEY, " \ - "update_version TEXT NOT NULL, " \ - "update_type TEXT NOT NULL DEFAULT 'none', " \ - "FOREIGN KEY(package) " \ - "REFERENCES package_info(package) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO "CREATE TABLE IF NOT EXISTS package_app_info " \ - "(app_id TEXT PRIMARY KEY NOT NULL, " \ - "app_component TEXT NOT NULL, " \ - "app_exec TEXT, " \ - "app_nodisplay TEXT NOT NULL DEFAULT 'false', " \ - "app_type TEXT, " \ - "app_onboot TEXT NOT NULL DEFAULT 'false', " \ - "app_multiple TEXT NOT NULL DEFAULT 'false', " \ - "app_autorestart TEXT NOT NULL DEFAULT 'false', " \ - "app_taskmanage TEXT NOT NULL DEFAULT 'false', " \ - "app_hwacceleration TEXT NOT NULL DEFAULT 'use-system-setting', " \ - "app_screenreader TEXT NOT NULL DEFAULT 'use-system-setting', " \ - "app_mainapp TEXT NOT NULL, " \ - "app_recentimage TEXT NOT NULL DEFAULT 'false', " \ - "app_launchcondition TEXT, " \ - "app_indicatordisplay TEXT NOT NULL DEFAULT 'true', " \ - "app_portraitimg TEXT, " \ - "app_landscapeimg TEXT, " \ - "app_guestmodevisibility TEXT NOT NULL DEFAULT 'true', " \ - "app_permissiontype TEXT NOT NULL DEFAULT 'normal', " \ - "app_preload TEXT NOT NULL DEFAULT 'false', " \ - "app_submode TEXT NOT NULL DEFAULT 'false', " \ - "app_submode_mainid TEXT, " \ - "app_installed_storage TEXT NOT NULL, " \ - "app_process_pool TEXT NOT NULL DEFAULT 'false', " \ - "app_launch_mode TEXT NOT NULL DEFAULT 'caller', " \ - "app_ui_gadget TEXT NOT NULL DEFAULT 'false', " \ - "app_support_mode TEXT, " \ - "app_support_disable TEXT NOT NULL DEFAULT 'false', " \ - "app_disable TEXT NOT NULL DEFAULT 'false', " \ - "app_package_type TEXT DEFAULT 'tpk', " \ - "app_package_system TEXT NOT NULL, " \ - "app_removable TEXT NOT NULL DEFAULT 'false', " \ - "app_package_installed_time TEXT, " \ - "app_support_ambient TEXT NOT NULL DEFAULT 'false', " \ - "component_type TEXT, " \ - "package TEXT NOT NULL, " \ - "app_tep_name TEXT, " \ - "app_zip_mount_file TEXT, " \ - "app_background_category INTEGER DEFAULT 0, " \ - "app_root_path TEXT, " \ - "app_api_version TEXT, " \ - "app_effective_appid TEXT, " \ - "app_splash_screen_display TEXT NOT NULL DEFAULT 'true', " \ - "app_external_path TEXT, " \ - "app_setup_appid TEXT, " \ - "FOREIGN KEY(package) " \ - "REFERENCES package_info(package) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO "CREATE TABLE IF NOT EXISTS package_app_localized_info " \ - "(app_id TEXT NOT NULL, " \ - "app_locale TEXT NOT NULL DEFAULT 'No Locale', " \ - "app_label TEXT, " \ - "app_icon TEXT, " \ - "PRIMARY KEY(app_id,app_locale) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO "CREATE TABLE IF NOT EXISTS package_app_icon_section_info " \ - "(app_id TEXT NOT NULL, " \ - "app_icon TEXT, " \ - "app_icon_section TEXT NOT NULL, " \ - "app_icon_resolution TEXT NOT NULL, " \ - "PRIMARY KEY(app_id,app_icon_section,app_icon_resolution) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO "CREATE TABLE IF NOT EXISTS package_app_image_info " \ - "(app_id TEXT NOT NULL, " \ - "app_locale TEXT DEFAULT 'No Locale', " \ - "app_image_section TEXT NOT NULL, " \ - "app_image TEXT, " \ - "PRIMARY KEY(app_id,app_image_section) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL "CREATE TABLE IF NOT EXISTS package_app_app_control " \ - "(app_id TEXT NOT NULL, " \ - "app_control TEXT NOT NULL, " \ - "PRIMARY KEY(app_id,app_control) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY "CREATE TABLE IF NOT EXISTS package_app_app_category " \ - "(app_id TEXT NOT NULL, " \ - "category TEXT NOT NULL, " \ - "PRIMARY KEY(app_id,category) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA "CREATE TABLE IF NOT EXISTS package_app_app_metadata " \ - "(app_id TEXT NOT NULL, " \ - "md_key TEXT NOT NULL, " \ - "md_value TEXT, " \ - "PRIMARY KEY(app_id, md_key, md_value) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION "CREATE TABLE IF NOT EXISTS package_app_app_permission " \ - "(app_id TEXT NOT NULL, " \ - "pm_type TEXT NOT NULL, " \ - "pm_value TEXT NOT NULL, " \ - "PRIMARY KEY(app_id, pm_type, pm_value) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED "CREATE TABLE IF NOT EXISTS package_app_share_allowed " \ - "(app_id TEXT NOT NULL, " \ - "data_share_path TEXT NOT NULL, " \ - "data_share_allowed TEXT NOT NULL, " \ - "PRIMARY KEY(app_id,data_share_path,data_share_allowed) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST "CREATE TABLE IF NOT EXISTS package_app_share_request " \ - "(app_id TEXT NOT NULL, " \ - "data_share_request TEXT NOT NULL, " \ - "PRIMARY KEY(app_id,data_share_request) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL "CREATE TABLE IF NOT EXISTS package_app_data_control " \ - "(app_id TEXT NOT NULL, " \ - "providerid TEXT NOT NULL, " \ - "access TEXT NOT NULL, " \ - "type TEXT NOT NULL, " \ - "trusted TEXT NOT NULL, " \ - "PRIMARY KEY(providerid, type) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID "CREATE TABLE IF NOT EXISTS package_app_info_for_uid " \ - "(app_id TEXT NOT NULL, " \ - "uid INTEGER NOT NULL, " \ - "is_disabled TEXT NOT NULL DEFAULT 'false', " \ - "is_splash_screen_enabled TEXT NOT NULL, " \ - "PRIMARY KEY(app_id, uid))" - -#define QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID \ - "CREATE TRIGGER IF NOT EXISTS update_package_appinfo_for_uid "\ - "AFTER UPDATE ON package_app_info_for_uid " \ - "BEGIN" \ - " DELETE FROM package_app_info_for_uid WHERE " \ - " is_splash_screen_enabled=" \ - " (SELECT package_app_info.app_splash_screen_display FROM " \ - " package_app_info, package_app_info_for_uid WHERE " \ - " package_app_info.app_id=OLD.app_id) AND is_disabled='false';" \ - "END;" - -#define QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN \ - "CREATE TABLE IF NOT EXISTS package_app_splash_screen " \ - "(app_id TEXT NOT NULL, " \ - "src TEXT NOT NULL, " \ - "type TEXT NOT NULL, " \ - "orientation TEXT NOT NULL, " \ - "indicatordisplay TEXT, " \ - "operation TEXT NOT NULL, " \ - "color_depth TEXT NOT NULL DEFAULT '24', " \ - "PRIMARY KEY(app_id, orientation, operation) " \ - "FOREIGN KEY(app_id) " \ - "REFERENCES package_app_info(app_id) " \ - "ON DELETE CASCADE)" - - -/* FIXME: duplicated at pkgmgrinfo_db.c */ -#define QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO \ - "CREATE TABLE IF NOT EXISTS package_cert_index_info( " \ - " cert_info TEXT UNIQUE, " \ - " cert_id INTEGER PRIMARY KEY, " \ - " cert_ref_count INTEGER NOT NULL)" - -#define QUERY_CREATE_TABLE_PACKAGE_CERT_INFO \ - "CREATE TABLE IF NOT EXISTS package_cert_info( " \ - " package TEXT PRIMARY KEY, " \ - " package_count INTEGER, " \ - " author_root_cert INTEGER, " \ - " author_im_cert INTEGER, " \ - " author_signer_cert INTEGER, " \ - " dist_root_cert INTEGER, " \ - " dist_im_cert INTEGER, " \ - " dist_signer_cert INTEGER, " \ - " dist2_root_cert INTEGER, " \ - " dist2_im_cert INTEGER, " \ - " dist2_signer_cert INTEGER)" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO \ - "CREATE TRIGGER IF NOT EXISTS update_cert_info " \ - "AFTER UPDATE ON package_cert_info " \ - "WHEN (NEW.package_count = 0) " \ - "BEGIN" \ - " DELETE FROM package_cert_info WHERE package=OLD.package;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2 \ - "CREATE TRIGGER IF NOT EXISTS update_cert_info2 " \ - "AFTER UPDATE ON package_cert_info " \ - "WHEN (NEW.package_count = OLD.package_count + 1) " \ - "BEGIN" \ - " UPDATE package_cert_index_info SET" \ - " cert_ref_count = cert_ref_count - 1" \ - " WHERE cert_id = OLD.author_root_cert" \ - " OR cert_id = OLD.author_im_cert" \ - " OR cert_id = OLD.author_signer_cert" \ - " OR cert_id = OLD.dist_root_cert" \ - " OR cert_id = OLD.dist_im_cert" \ - " OR cert_id = OLD.dist_signer_cert" \ - " OR cert_id = OLD.dist2_root_cert" \ - " OR cert_id = OLD.dist2_im_cert" \ - " OR cert_id = OLD.dist2_signer_cert;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_DELETE_CERT_INFO \ - "CREATE TRIGGER IF NOT EXISTS delete_cert_info " \ - "AFTER DELETE ON package_cert_info " \ - "BEGIN" \ - " UPDATE package_cert_index_info SET" \ - " cert_ref_count = cert_ref_count - 1" \ - " WHERE cert_id = OLD.author_root_cert" \ - " OR cert_id = OLD.author_im_cert" \ - " OR cert_id = OLD.author_signer_cert" \ - " OR cert_id = OLD.dist_root_cert" \ - " OR cert_id = OLD.dist_im_cert" \ - " OR cert_id = OLD.dist_signer_cert" \ - " OR cert_id = OLD.dist2_root_cert" \ - " OR cert_id = OLD.dist2_im_cert" \ - " OR cert_id = OLD.dist2_signer_cert;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO \ - "CREATE TRIGGER IF NOT EXISTS update_cert_index_info " \ - "AFTER UPDATE ON package_cert_index_info " \ - "WHEN ((SELECT cert_ref_count FROM package_cert_index_info " \ - " WHERE cert_id = OLD.cert_id) = 0) "\ - "BEGIN" \ - " DELETE FROM package_cert_index_info WHERE cert_id = OLD.cert_id;" \ - "END;" - -static int __insert_application_info(manifest_x *mfx); -static int __insert_application_appcategory_info(manifest_x *mfx); -static int __insert_application_appcontrol_info(manifest_x *mfx); -static int __insert_application_appmetadata_info(manifest_x *mfx); -static int __insert_application_share_allowed_info(manifest_x *mfx); -static int __insert_application_share_request_info(manifest_x *mfx); -static int __insert_application_datacontrol_info(manifest_x *mfx); -static void __insert_application_locale_info(gpointer data, gpointer userdata); -static void __insert_pkglocale_info(gpointer data, gpointer userdata); -static int __insert_manifest_info_in_db(manifest_x *mfx, uid_t uid); -static int __delete_manifest_info_from_db(manifest_x *mfx, uid_t uid); -static int __delete_subpkg_info_from_db(char *appid); -static int __delete_appinfo_from_db(char *db_table, const char *appid); -static int __initialize_db(sqlite3 *db_handle, const char *db_query); -static int __exec_query(char *query); -static void __extract_data(gpointer data, GList *lbl, GList *lcn, GList *icn, GList *dcn, GList *ath, - char **label, char **license, char **icon, char **description, char **author); -static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata); -static GList *__create_locale_list(GList *locale, GList *lbl, GList *lcn, GList *icn, GList *dcn, GList *ath); -static void __preserve_guestmode_visibility_value(manifest_x *mfx); -static int __guestmode_visibility_cb(void *data, int ncols, char **coltxt, char **colname); -static int __pkgmgr_parser_create_db(sqlite3 **db_handle, const char *db_path); -static int __parserdb_change_perm(const char *db_file, uid_t uid); +/* app background category value */ +#define APP_BG_CATEGORY_USER_DISABLE_FALSE_VAL 0x00000 +#define APP_BG_CATEGORY_USER_DISABLE_TRUE_VAL 0x00001 +#define APP_BG_CATEGORY_MEDIA_VAL 0x00002 +#define APP_BG_CATEGORY_DOWNLOAD_VAL 0x00004 +#define APP_BG_CATEGORY_BGNETWORK_VAL 0x00008 +#define APP_BG_CATEGORY_LOCATION_VAL 0x00010 +#define APP_BG_CATEGORY_SENSOR_VAL 0x00020 +#define APP_BG_CATEGORY_IOTCOMM_VAL 0x00040 +#define APP_BG_CATEGORY_SYSTEM_VAL 0x00080 + +#define APP_BG_CATEGORY_USER_DISABLE_FALSE_STR "enable" +#define APP_BG_CATEGORY_USER_DISABLE_TRUE_STR "disable" +#define APP_BG_CATEGORY_MEDIA_STR "media" +#define APP_BG_CATEGORY_DOWNLOAD_STR "download" +#define APP_BG_CATEGORY_BGNETWORK_STR "background-network" +#define APP_BG_CATEGORY_LOCATION_STR "location" +#define APP_BG_CATEGORY_SENSOR_STR "sensor" +#define APP_BG_CATEGORY_IOTCOMM_STR "iot-communication" +#define APP_BG_CATEGORY_SYSTEM "system" #define REGULAR_USER 5000 -static inline uid_t _getuid(void) +static inline uid_t __getuid(void) { uid_t uid = getuid(); @@ -427,258 +100,647 @@ static inline uid_t _getuid(void) return uid; } -static int __delete_subpkg_list_cb(void *data, int ncols, char **coltxt, char **colname) +static const char *__get_bool(char *value, bool is_true) { - if (coltxt[0]) - __delete_subpkg_info_from_db(coltxt[0]); + if (value != NULL) { + if (!strcmp(value, "")) + return (is_true) ? "true" : "false"; + return value; + } - return 0; + return (is_true) ? "true" : "false"; } -static int __pkgmgr_parser_create_db(sqlite3 **db_handle, const char *db_path) +#define __BEGIN_TRANSACTION(db) \ +do { \ + if (sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, NULL) != \ + SQLITE_OK) { \ + _LOGE("begin transaction failed: %s", sqlite3_errmsg(db)); \ + sqlite3_close_v2(db); \ + return PM_PARSER_R_ERROR; \ + } \ +} while (0) \ + +#define __DO_TRANSACTION(db, func) \ +do { \ + if (func) { \ + _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \ + if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \ + SQLITE_OK) \ + _LOGE("roll back transaction failed: %s", \ + sqlite3_errmsg(db)); \ + sqlite3_close_v2(db); \ + return PM_PARSER_R_ERROR; \ + } \ +} while (0) \ + +#define __END_TRANSACTION(db) \ +do { \ + if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != \ + SQLITE_OK) { \ + _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db)); \ + if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) != \ + SQLITE_OK) \ + _LOGE("roll back transaction failed: %s", \ + sqlite3_errmsg(db)); \ + sqlite3_close_v2(db); \ + return PM_PARSER_R_ERROR; \ + } \ +} while (0) \ + +#define __BIND_TEXT(db, stmt, i, text) \ +do { \ + if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\ + _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \ + sqlite3_finalize(stmt); \ + return -1; \ + } \ +} while (0) + +#define __BIND_INT(db, stmt, i, int) \ +do { \ + if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) { \ + _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db)); \ + sqlite3_finalize(stmt); \ + return -1; \ + } \ +} while (0) + +static const char *__get_parser_db_path(uid_t uid) { - int ret = -1; - sqlite3 *handle; - char *query = NULL; - char *error_message = NULL; + char buf[PATH_MAX]; + const char *path; - ret = db_util_open(db_path, &handle, DB_UTIL_REGISTER_HOOK_METHOD); - if (ret != SQLITE_OK) { - _LOGD("connect db [%s] failed!\n", db_path); - return -1; + if (uid == GLOBAL_USER || uid == OWNER_ROOT) { + path = tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_parser.db"); + } else { + snprintf(buf, sizeof(buf), "user/%d/.pkgmgr_parser.db", uid); + path = tzplatform_mkpath(TZ_SYS_DB, buf); } - *db_handle = handle; - /* add user_version for db upgrade*/ - query = sqlite3_mprintf("PRAGMA user_version=%d", (atoi(TIZEN_MAJOR_VER) * 10000 + atoi(TIZEN_MINOR_VER) * 100 + atoi(TIZEN_PATCH_VER))); - if (SQLITE_OK != - sqlite3_exec(handle, query, NULL, NULL, &error_message)) { - _LOGE("Don't execute query = %s error message = %s\n", query, - error_message); + return path; +} + +static const char *__get_cert_db_path(void) +{ + return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db"); +} + +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); + + ret = sqlite3_exec(db, query, NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("exec failed: %s", sqlite3_errmsg(db)); + return -1; } - sqlite3_free(error_message); - sqlite3_free(query); return 0; } -static int __guestmode_visibility_cb(void *data, int ncols, char **coltxt, char **colname) +/* TODO: Do not labeling directly */ +#define DB_LABEL "User::Home" +#define SET_SMACK_LABEL(x) \ +do { \ + if (smack_setlabel((x), DB_LABEL, SMACK_LABEL_ACCESS)) \ + _LOGE("failed chsmack -a %s %s", DB_LABEL, x); \ + else \ + _LOGD("chsmack -a %s %s", DB_LABEL, x); \ +} while (0) + +static int __set_db_permission(const char *path, uid_t uid) { - manifest_x *mfx = (manifest_x *)data; - int i = 0; - char *appid = NULL; - char *status = NULL; - application_x *app; - GList *tmp; - if (mfx->application == NULL) - return -1; - app = (application_x *)mfx->application->data; - for (i = 0; i < ncols; i++) { - if (strcmp(colname[i], "app_id") == 0) { - if (coltxt[i]) - appid = strdup(coltxt[i]); - } else if (strcmp(colname[i], "app_guestmodevisibility") == 0) { - if (coltxt[i]) - status = strdup(coltxt[i]); + int fd; + const char *files[2]; + char journal_file[BUFSIZE]; + struct stat sb; + mode_t mode; + struct passwd pwd; + struct passwd *result; + char buf[BUFSIZE]; + int ret; + int i; + + if (getuid() != OWNER_ROOT) + return 0; + + if (uid == OWNER_ROOT || uid == GLOBAL_USER) { + ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %d", uid); + else + _LOGE("getpwuid_r failed: %d", errno); + return -1; } + uid = pwd.pw_uid; } - if (appid == NULL) { - if (status != NULL) - free(status); - _LOGD("app id is NULL\n"); + + snprintf(journal_file, sizeof(journal_file), "%s-journal", path); + files[0] = path; + files[1] = journal_file; + + ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %d", uid); + else + _LOGE("getpwuid_r failed: %d", errno); return -1; } - /*update guest mode visibility*/ - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - if (strcmp(app->appid, appid) == 0) { - free((void *)app->guestmode_visibility); - app->guestmode_visibility = strdup(status); - break; + + for (i = 0; i < 2; i++) { + fd = open(files[i], O_RDONLY); + if (fd == -1) { + _LOGE("open %s failed: %d", files[i], errno); + return -1; + } + ret = fstat(fd, &sb); + if (ret == -1) { + _LOGE("stat %s failed: %d", files[i], errno); + close(fd); + return -1; + } + if (S_ISLNK(sb.st_mode)) { + _LOGE("%s is symlink!", files[i]); + close(fd); + return -1; + } + ret = fchown(fd, uid, pwd.pw_gid); + if (ret == -1) { + _LOGE("fchown %s failed: %d", files[i], errno); + close(fd); + return -1; + } + + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; + if (!strcmp(path, __get_cert_db_path())) + mode |= S_IWOTH; + ret = fchmod(fd, mode); + if (ret == -1) { + _LOGD("fchmod %s failed: %d", files[i], errno); + close(fd); + return -1; } + close(fd); + SET_SMACK_LABEL(files[i]); } - if (appid) { - free(appid); - appid = NULL; + + return 0; +} + +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_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_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_INFO_FOR_UID, + QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID, + QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN, + NULL, +}; + +static const char *cert_init_queries[] = { + QUERY_CREATE_TABLE_PACKAGE_CERT_INFO, + QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO, + QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO, + QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2, + QUERY_CREATE_TRIGGER_DELETE_CERT_INFO, + QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO, + NULL +}; + +static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) +{ + int ret; + const char **queries; + int i; + + if (__set_db_version(db)) + return -1; + + if (strstr(dbpath, ".pkgmgr_parser.db")) { + queries = parser_init_queries; + } else if (strstr(dbpath, ".pkgmgr_cert.db")) { + queries = cert_init_queries; + } else { + _LOGE("unexpected dbpath: %s", dbpath); + return -1; } - if (status) { - free(status); - status = NULL; + + 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; + } } + if (__set_db_permission(dbpath, uid)) + _LOGE("failed to set db permission"); + return 0; } -static void __preserve_guestmode_visibility_value(manifest_x *mfx) +API int pkgmgr_parser_initialize_parser_db(uid_t uid) { - char *error_message = NULL; - char query[MAX_QUERY_LEN] = {'\0'}; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "SELECT app_id, app_guestmodevisibility FROM package_app_info " \ - "WHERE package=%Q", mfx->package); - if (SQLITE_OK != - sqlite3_exec(pkgmgr_parser_db, query, - __guestmode_visibility_cb, (void *)mfx, &error_message)) { - _LOGD("Don't execute query = %s error message = %s\n", - query, error_message); - sqlite3_free(error_message); + 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; } - return; + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; } -static int __initialize_db(sqlite3 *db_handle, const char *db_query) +API int pkgmgr_parser_initialize_cert_db(void) { - char *error_message = NULL; - if (SQLITE_OK != - sqlite3_exec(db_handle, db_query, - NULL, NULL, &error_message)) { - _LOGD("Don't execute query = %s error message = %s\n", - db_query, error_message); - sqlite3_free(error_message); - return -1; + 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; } - sqlite3_free(error_message); - return 0; + + 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; } -static int __exec_query(char *query) +API int pkgmgr_parser_create_and_initialize_db(uid_t uid) { - char *error_message = NULL; - if (SQLITE_OK != - sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message)) { - _LOGE("Don't execute query = %s error message = %s\n", query, - error_message); - sqlite3_free(error_message); - return -1; + 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; } - sqlite3_free(error_message); - if (strncmp(query, "DELETE", 6) && sqlite3_changes(pkgmgr_parser_db) == 0) { - _LOGE("No such record matches with given query : %s\n", query); - return -1; + if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) { + _LOGE("Only root or app_fw user is allowed"); + return PM_PARSER_R_EINVAL; } - return 0; + + if (pkgmgr_parser_initialize_parser_db(uid)) + return PM_PARSER_R_ERROR; + + if (pkgmgr_parser_initialize_cert_db()) + return PM_PARSER_R_ERROR; + + return PM_PARSER_R_OK; } -static GList *__create_locale_list(GList *locale, GList *lbls, GList *lcns, GList *icns, GList *dcns, GList *aths) +#define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */ +#define BUSY_WAITING_MAX 20 /* wait for max 1 sec */ +static int __db_busy_handler(void *data, int count) { - GList *tmp; - label_x *lbl; - license_x *lcn; - icon_x *icn; - description_x *dcn; - author_x *ath; - for (tmp = lbls; tmp; tmp = tmp->next) { - lbl = (label_x *)tmp->data; - if (lbl == NULL) - continue; - if (lbl->lang) - locale = g_list_insert_sorted_with_data(locale, (gpointer)lbl->lang, __comparefunc, NULL); - } - for (tmp = lcns; tmp; tmp = tmp->next) { - lcn = (license_x *)tmp->data; - if (lcn == NULL) - continue; - if (lcn->lang) - locale = g_list_insert_sorted_with_data(locale, (gpointer)lcn->lang, __comparefunc, NULL); + if (count < BUSY_WAITING_MAX) { + usleep(BUSY_WAITING_USEC); + return 1; + } else { + /* sqlite3_prepare_v2 will return SQLITE_BUSY */ + return 0; } - for (tmp = icns; tmp; tmp = tmp->next) { - icn = (icon_x *)tmp->data; - if (icn == NULL) - continue; - if (icn->lang) - locale = g_list_insert_sorted_with_data(locale, (gpointer)icn->lang, __comparefunc, NULL); +} + +static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags) +{ + int ret; + + /* FIXME: always open with OPEN_CREATE flag for keeping previous + * implementation + */ + if (flags & SQLITE_OPEN_READWRITE) + flags = flags | SQLITE_OPEN_CREATE; + + ret = sqlite3_open_v2(path, db, flags, NULL); + if (ret != SQLITE_OK) + return ret; + + if (flags & SQLITE_OPEN_CREATE) { + ret = __initialize_db(*db, path, uid); + if (ret) { + _LOGE("failed to initialize db: %s\n"); + sqlite3_close_v2(*db); + return -1; + } } - for (tmp = dcns; tmp; tmp = tmp->next) { - dcn = (description_x *)tmp->data; - if (dcn == NULL) - continue; - if (dcn->lang) - locale = g_list_insert_sorted_with_data(locale, (gpointer)dcn->lang, __comparefunc, NULL); + + ret = sqlite3_exec(*db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL); + if (ret != SQLITE_OK) { + _LOGE("failed to enable foreign key support: %s", + sqlite3_errmsg(*db)); + sqlite3_close_v2(*db); + return ret; } - for (tmp = aths; tmp; tmp = tmp->next) { - ath = (author_x *)tmp->data; - if (ath == NULL) - continue; - if (ath->lang) - locale = g_list_insert_sorted_with_data(locale, (gpointer)ath->lang, __comparefunc, NULL); + + 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 locale; + return ret; } -static GList *__create_icon_list(GList *appicon, GList *icns) + +static int __convert_background_category(GList *category_list) { + int ret = 0; GList *tmp; - icon_x *icn; + char *category_data; - for (tmp = icns; tmp; tmp = tmp->next) { - icn = (icon_x *)tmp->data; - if (icn == NULL) + if (category_list == NULL) + return 0; + + for (tmp = category_list; tmp; tmp = tmp->next) { + category_data = (char *)tmp->data; + if (category_data == NULL) continue; - if (icn->section) - appicon = g_list_insert_sorted_with_data(appicon, (gpointer)icn->section, __comparefunc, NULL); + if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR)) + ret |= APP_BG_CATEGORY_MEDIA_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR)) + ret |= APP_BG_CATEGORY_DOWNLOAD_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR)) + ret |= APP_BG_CATEGORY_BGNETWORK_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR)) + ret |= APP_BG_CATEGORY_LOCATION_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR)) + ret |= APP_BG_CATEGORY_SENSOR_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR)) + ret |= APP_BG_CATEGORY_IOTCOMM_VAL; + else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM)) + ret |= APP_BG_CATEGORY_SYSTEM_VAL; + else + _LOGE("Unidentified category [%s]", category_data); } - return appicon; + + return ret; } -static GList *__create_image_list(GList *appimage, GList *imgs) +#define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid" +static const char *__find_effective_appid(GList *metadata_list) { GList *tmp; - image_x *img; + metadata_x *md; - for (tmp = imgs; tmp; tmp = tmp->next) { - img = (image_x *)tmp->data; - if (img == NULL) + for (tmp = metadata_list; tmp; tmp = tmp->next) { + md = (metadata_x *)tmp->data; + if (md == NULL || md->key == NULL) continue; - if (img->section) - appimage = g_list_insert_sorted_with_data(appimage, (gpointer)img->section, __comparefunc, NULL); + + if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) { + if (md->value) + return md->value; + } } - return appimage; + + return NULL; } -static void __trimfunc(GList *trim_list) +static int __insert_appcontrol_info(sqlite3 *db, application_x *app) { - char *trim_data = NULL; - char *prev = NULL; + static const char query[] = + "INSERT INTO package_app_app_control (app_id, app_control) " + "VALUES (?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + char app_control[BUFSIZE]; + GList *tmp; + appcontrol_x *ac; - GList *list = NULL; - list = g_list_first(trim_list); + if (app->appcontrol == NULL) + return 0; - while (list) { - trim_data = (char *)list->data; - if (trim_data) { - if (prev) { - if (strcmp(trim_data, prev) == 0) { - trim_list = g_list_remove(trim_list, trim_data); - list = g_list_first(trim_list); - prev = NULL; - continue; - } else - prev = trim_data; - } else { - prev = trim_data; - } + 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 = app->appcontrol; tmp; tmp = tmp->next) { + ac = (appcontrol_x *)tmp->data; + if (ac == NULL) + 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++, app->appid); + __BIND_TEXT(db, stmt, idx++, app_control); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; } - list = g_list_next(list); + + sqlite3_reset(stmt); } + + sqlite3_finalize(stmt); + + return 0; } -static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata) +static int __insert_category_info(sqlite3 *db, application_x *app) { - if (a == NULL || b == NULL) + static const char query[] = + "INSERT INTO package_app_app_category (app_id, category) " + "VALUES (?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + const char *category; + + if (app->category == NULL) return 0; - if (strcmp((char *)a, (char *)b) == 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 = app->category; tmp; tmp = tmp->next) { + category = (const char *)tmp->data; + if (category == NULL) + continue; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, category); + + 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_metadata_info(sqlite3 *db, application_x *app) +{ + static const char query[] = + "INSERT INTO package_app_app_metadata (app_id," + " md_key, md_value) VALUES (?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + metadata_x *md; + + if (app->metadata == NULL) return 0; - if (strcmp((char *)a, (char *)b) < 0) + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); return -1; - if (strcmp((char *)a, (char *)b) > 0) - return 1; + } + + for (tmp = app->metadata; tmp; tmp = tmp->next) { + md = (metadata_x *)tmp->data; + if (md == NULL) + continue; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, md->key); + __BIND_TEXT(db, stmt, idx++, md->value); + + 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[] = + "INSERT INTO package_app_data_control (app_id, providerid," + " access, type, trusted) VALUES (?, ?, ?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + datacontrol_x *dc; + + if (app->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 (tmp = app->datacontrol; tmp; tmp = tmp->next) { + dc = (datacontrol_x *)tmp->data; + if (dc == NULL) + continue; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, dc->providerid); + __BIND_TEXT(db, stmt, idx++, dc->access); + __BIND_TEXT(db, stmt, idx++, dc->type); + __BIND_TEXT(db, stmt, idx++, dc->trusted); + + 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; } +/* TODO: move to installer */ static int __check_dpi(const char *dpi_char, int dpi_int) { if (dpi_char == NULL) @@ -713,2196 +775,1589 @@ static int __check_dpi(const char *dpi_char, int dpi_int) return -1; } -static gint __check_icon_folder(const char *orig_icon_path, char **new_icon_path) +static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a, + gconstpointer b) { - char *dpi_path[2]; - char *icon_filename = NULL; - char modified_iconpath[BUFSIZE] = { '\0' }; - char icon_path[BUFSIZE] = { '\0' }; - int i; + splashscreen_x *ss = (splashscreen_x *)a; + const char *orientation = (const char *)b; int dpi = -1; + int ret; - if (orig_icon_path == NULL) + if (ss->operation || ss->dpi == NULL) return -1; - system_info_get_platform_int("http://tizen.org/feature/screen.dpi", &dpi); - if (!dpi) + ret = system_info_get_platform_int( + "http://tizen.org/feature/screen.dpi", &dpi); + if (ret != SYSTEM_INFO_ERROR_NONE) return -1; - if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) { - dpi_path[0] = "LDPI"; - dpi_path[1] = "ldpi"; - } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) { - dpi_path[0] = "MDPI"; - dpi_path[1] = "mdpi"; - } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) { - dpi_path[0] = "HDPI"; - dpi_path[1] = "hdpi"; - } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) { - dpi_path[0] = "XHDPI"; - dpi_path[1] = "xhdpi"; - } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) { - dpi_path[0] = "XXHDPI"; - dpi_path[1] = "xxhdpi"; - } else { - _LOGE("Unidentified dpi[%d]", dpi); - return -1; - } + if (strcasecmp(ss->orientation, orientation) == 0 && + __check_dpi(ss->dpi, dpi) == 0) + return 0; - icon_filename = strrchr(orig_icon_path, '/'); - if (icon_filename == NULL) + return -1; +} + +static gint __compare_splashscreen_with_orientation(gconstpointer a, + gconstpointer b) +{ + splashscreen_x *ss = (splashscreen_x *)a; + const char *orientation = (const char *)b; + + if (ss->operation || ss->dpi) return -1; - snprintf(icon_path, strlen(orig_icon_path) - (strlen(icon_filename) - 1), "%s", orig_icon_path); - for (i = 0; i < 2; i++) { - snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s", icon_path, dpi_path[i], icon_filename); - if (access(modified_iconpath, F_OK) != -1) { - /* if exists, return modified icon path */ - *new_icon_path = strdup(modified_iconpath); - return 0; - } - } + if (strcasecmp(ss->orientation, orientation) == 0) + return 0; return -1; } -static gint __compare_icon(gconstpointer a, gconstpointer b) +static splashscreen_x *__find_default_splashscreen(GList *splashscreens, + const char *orientation) { - icon_x *icon = (icon_x *)a; - - char *icon_folder_path = NULL; - - if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0) - return -1; + GList *tmp; - if (icon->dpi != NULL) - return -1; + tmp = g_list_find_custom(splashscreens, orientation, + (GCompareFunc) + __compare_splashscreen_with_orientation_dpi); + if (tmp) + return (splashscreen_x *)tmp->data; - if (__check_icon_folder(icon->text, &icon_folder_path) == 0) { - free(icon->text); - icon->text = icon_folder_path; - } + tmp = g_list_find_custom(splashscreens, orientation, + (GCompareFunc)__compare_splashscreen_with_orientation); + if (tmp) + return (splashscreen_x *)tmp->data; - return 0; + return NULL; } -static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b) +static void __find_appcontrol_splashscreen_with_dpi(gpointer data, + gpointer user_data) { - icon_x *icon = (icon_x *)a; - int dpi = GPOINTER_TO_INT(b); + splashscreen_x *ss = (splashscreen_x *)data; + GList **list = (GList **)user_data; + int dpi = -1; + int ret; - if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0) - return -1; + if (ss->operation == NULL || ss->dpi == NULL) + return; - if (icon->dpi == NULL) - return -1; + ret = system_info_get_platform_int( + "http://tizen.org/feature/screen.dpi", &dpi); + if (ret != SYSTEM_INFO_ERROR_NONE) + return; - if (__check_dpi(icon->dpi, dpi) == 0) - return 0; + if (__check_dpi(ss->dpi, dpi) != 0) + return; - return -1; + *list = g_list_append(*list, ss); } -static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b) +static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data) { - icon_x *icon = (icon_x *)a; - char *lang = (char *)b; - char *icon_folder_path = NULL; + splashscreen_x *ss = (splashscreen_x *)data; + GList **list = (GList **)user_data; + splashscreen_x *ss_tmp; + GList *tmp; - if (icon->dpi != NULL) - return -1; + if (ss->operation == NULL || ss->dpi) + return; - if (strcasecmp(icon->lang, lang) == 0) { - if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) { - /* icon for no locale. check existance of folder-hierachied default icons */ - if (__check_icon_folder(icon->text, &icon_folder_path) == 0) { - free(icon->text); - icon->text = icon_folder_path; - } - } - return 0; + for (tmp = *list; tmp; tmp = tmp->next) { + ss_tmp = (splashscreen_x *)tmp->data; + if (ss_tmp->operation + && strcmp(ss_tmp->operation, ss->operation) == 0 + && strcmp(ss_tmp->orientation, ss->orientation) == 0) + return; } - return -1; + *list = g_list_append(*list, ss); } -static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b) +static GList *__find_splashscreens(GList *splashscreens) { - icon_x *icon = (icon_x *)a; - char *lang = (char *)b; - int dpi = -1; + GList *list = NULL; + splashscreen_x *ss; - system_info_get_platform_int("http://tizen.org/feature/screen.dpi", &dpi); - if (!dpi) - return -1; + g_list_foreach(splashscreens, + __find_appcontrol_splashscreen_with_dpi, &list); + g_list_foreach(splashscreens, + __find_appcontrol_splashscreen, &list); - if (strcasecmp(icon->lang, lang) == 0 && __check_dpi(icon->dpi, dpi) == 0) - return 0; + ss = __find_default_splashscreen(splashscreens, "portrait"); + if (ss) + list = g_list_append(list, ss); + ss = __find_default_splashscreen(splashscreens, "landscape"); + if (ss) + list = g_list_append(list, ss); - return -1; + return list; } -static char *__find_icon(GList *icons, const char *lang) +static int __insert_splashscreen_info(sqlite3 *db, application_x *app) { - GList *tmp; - icon_x *icon = NULL; - int dpi = 0; + static const char query[] = + "INSERT INTO package_app_splash_screen (app_id, src, type," + " orientation, indicatordisplay, operation, color_depth) " + "VALUES (?, ?, ?, ?, ?, ?, ?)"; int ret; + sqlite3_stmt *stmt; + int idx; + GList *tmp; + splashscreen_x *ss; + GList *ss_list; - /* first, find icon whose locale and dpi with given lang and system's dpi has matched */ - tmp = g_list_find_custom(icons, lang, (GCompareFunc)__compare_icon_with_lang_dpi); - if (tmp != NULL) { - icon = (icon_x *)tmp->data; - return (char *)icon->text; - } + if (app->splashscreens == NULL) + return 0; - /* if first has failed, find icon whose locale has matched */ - tmp = g_list_find_custom(icons, lang, (GCompareFunc)__compare_icon_with_lang); - if (tmp != NULL) { - icon = (icon_x *)tmp->data; - return (char *)icon->text; + ss_list = __find_splashscreens(app->splashscreens); + if (ss_list == 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; } - /* if second has failed, find icon whose dpi has matched with system's dpi */ - ret = system_info_get_platform_int("http://tizen.org/feature/screen.dpi", &dpi); - if (ret == SYSTEM_INFO_ERROR_NONE) { - tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi), (GCompareFunc)__compare_icon_with_dpi); - if (tmp != NULL) { - icon = (icon_x *)tmp->data; - return (char *)icon->text; + for (tmp = ss_list; tmp; tmp = tmp->next) { + ss = (splashscreen_x *)tmp->data; + if (ss == NULL) + continue; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, ss->src); + __BIND_TEXT(db, stmt, idx++, ss->type); + __BIND_TEXT(db, stmt, idx++, ss->orientation); + __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay); + __BIND_TEXT(db, stmt, idx++, ss->operation); + __BIND_TEXT(db, stmt, idx++, ss->color_depth); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; } - } - /* last, find default icon marked as "No Locale" */ - tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon); - if (tmp != NULL) { - icon = (icon_x *)tmp->data; - return (char *)icon->text; + sqlite3_reset(stmt); } - return NULL; + sqlite3_finalize(stmt); + + return 0; } -static void __extract_data(gpointer data, GList *lbls, GList *lcns, GList *icns, GList *dcns, GList *aths, - char **label, char **license, char **icon, char **description, char **author) +static void __trimfunc(GList *trim_list) { - GList *tmp; - label_x *lbl; - license_x *lcn; - description_x *dcn; - author_x *ath; - for (tmp = lbls; tmp; tmp = tmp->next) { - lbl = (label_x *)tmp->data; - if (lbl == NULL) - continue; - if (lbl->lang) { - if (strcmp(lbl->lang, (char *)data) == 0) { - *label = (char *)lbl->text; - break; - } - } - } - for (tmp = lcns; tmp; tmp = tmp->next) { - lcn = (license_x *)tmp->data; - if (lcn == NULL) - continue; - if (lcn->lang) { - if (strcmp(lcn->lang, (char *)data) == 0) { - *license = (char *)lcn->text; - break; - } - } - } - - *icon = __find_icon(icns, (char *)data); + char *trim_data; + char *prev = NULL; + GList *list = g_list_first(trim_list); - for (tmp = dcns; tmp; tmp = tmp->next) { - dcn = (description_x *)tmp->data; - if (dcn == NULL) - continue; - if (dcn->lang) { - if (strcmp(dcn->lang, (char *)data) == 0) { - *description = (char *)dcn->text; - break; - } - } - } - for (tmp = aths; tmp; tmp = tmp->next) { - ath = (author_x *)tmp->data; - if (ath == NULL) - continue; - if (ath->lang) { - if (strcmp(ath->lang, (char *)data) == 0) { - *author = (char *)ath->text; - break; + while (list) { + trim_data = (char *)list->data; + if (trim_data) { + if (prev) { + if (strcmp(trim_data, prev) == 0) { + trim_list = g_list_remove(trim_list, + trim_data); + list = g_list_first(trim_list); + prev = NULL; + continue; + } else + prev = trim_data; + } else { + prev = trim_data; } } + list = g_list_next(list); } +} +static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata) +{ + if (a == NULL || b == NULL) + return 0; + if (strcmp((char *)a, (char *)b) == 0) + return 0; + if (strcmp((char *)a, (char *)b) < 0) + return -1; + if (strcmp((char *)a, (char *)b) > 0) + return 1; + return 0; } -static void __extract_icon_data(gpointer data, GList *icns, char **icon, char **resolution) +/* TODO: refactor inserting localized info */ +static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns, + GList *dcns, GList *aths) { + GList *locale = NULL; GList *tmp; + label_x *lbl; + license_x *lcn; icon_x *icn; + description_x *dcn; + author_x *ath; + + for (tmp = lbls; tmp; tmp = tmp->next) { + lbl = (label_x *)tmp->data; + if (lbl == NULL) + continue; + if (lbl->lang) + locale = g_list_insert_sorted_with_data( + locale, (gpointer)lbl->lang, + __comparefunc, NULL); + } + for (tmp = lcns; tmp; tmp = tmp->next) { + lcn = (license_x *)tmp->data; + if (lcn == NULL) + continue; + if (lcn->lang) + locale = g_list_insert_sorted_with_data( + locale, (gpointer)lcn->lang, + __comparefunc, NULL); + } for (tmp = icns; tmp; tmp = tmp->next) { icn = (icon_x *)tmp->data; if (icn == NULL) continue; - if (icn->section) { - if (strcmp(icn->section, (char *)data) == 0) { - *icon = (char *)icn->text; - *resolution = (char *)icn->resolution; - break; - } - } + if (icn->lang) + locale = g_list_insert_sorted_with_data( + locale, (gpointer)icn->lang, + __comparefunc, NULL); } -} - -static void __extract_image_data(gpointer data, GList *imgs, char **lang, char **image) -{ - GList *tmp; - image_x *img; - for (tmp = imgs; tmp; tmp = tmp->next) { - img = (image_x *)tmp->data; - if (img == NULL) + for (tmp = dcns; tmp; tmp = tmp->next) { + dcn = (description_x *)tmp->data; + if (dcn == NULL) continue; - if (img->section) { - if (strcmp(img->section, (char *)data) == 0) { - *lang = (char *)img->lang; - *image = (char *)img->text; - break; - } - } + if (dcn->lang) + locale = g_list_insert_sorted_with_data( + locale, (gpointer)dcn->lang, + __comparefunc, NULL); } + for (tmp = aths; tmp; tmp = tmp->next) { + ath = (author_x *)tmp->data; + if (ath == NULL) + continue; + if (ath->lang) + locale = g_list_insert_sorted_with_data( + locale, (gpointer)ath->lang, + __comparefunc, NULL); + } + __trimfunc(locale); + return locale; } -static void __insert_pkglocale_info(gpointer data, gpointer userdata) +static gint __check_icon_resolution(const char *orig_icon_path, + char **new_icon_path) { - int ret = -1; - char *label = NULL; - char *icon = NULL; - char *description = NULL; - char *license = NULL; - char *author = NULL; - char *query = NULL; - - manifest_x *mfx = (manifest_x *)userdata; - GList *lbl = mfx->label; - GList *lcn = mfx->license; - GList *icn = mfx->icon; - GList *dcn = mfx->description; - GList *ath = mfx->author; - - __extract_data(data, lbl, lcn, icn, dcn, ath, &label, &license, &icon, &description, &author); - if (!label && !description && !icon && !license && !author) - return; - - query = sqlite3_mprintf("INSERT INTO package_localized_info(package, package_locale, " \ - "package_label, package_icon, package_description, package_license, package_author) VALUES" \ - "(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", - mfx->package, - (char *)data, - label, - icon, - description, - license, - author); - - ret = __exec_query(query); - if (ret == -1) - _LOGD("Package Localized Info DB Insert failed\n"); - - sqlite3_free(query); -} + int ret; + char *dpi_path[2]; + char *icon_filename; + char modified_iconpath[BUFSIZE]; + char icon_path[BUFSIZE]; + int i; + int dpi = -1; -static void __insert_application_locale_info(gpointer data, gpointer userdata) -{ - int ret = -1; - char *label = NULL; - char *icon = NULL; - char *query = NULL; - char *locale = (char *)data; + if (orig_icon_path == NULL) + return -1; - application_x *app = (application_x *)userdata; - GList *lbl = app->label; - GList *icn = app->icon; + ret = system_info_get_platform_int( + "http://tizen.org/feature/screen.dpi", &dpi); + if (ret != SYSTEM_INFO_ERROR_NONE) + return -1; - __extract_data(data, lbl, NULL, icn, NULL, NULL, &label, NULL, &icon, NULL, NULL); - if (!label && !icon) - return; + if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) { + dpi_path[0] = "LDPI"; + dpi_path[1] = "ldpi"; + } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) { + dpi_path[0] = "MDPI"; + dpi_path[1] = "mdpi"; + } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) { + dpi_path[0] = "HDPI"; + dpi_path[1] = "hdpi"; + } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) { + dpi_path[0] = "XHDPI"; + dpi_path[1] = "xhdpi"; + } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) { + dpi_path[0] = "XXHDPI"; + dpi_path[1] = "xxhdpi"; + } else { + _LOGE("Unidentified dpi[%d]", dpi); + return -1; + } - query = sqlite3_mprintf("INSERT INTO package_app_localized_info(app_id, app_locale, " \ - "app_label, app_icon) VALUES" \ - "(%Q, %Q, %Q, %Q)", app->appid, (char *)data, - label, icon); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Package UiApp Localized Info DB Insert failed\n"); - - sqlite3_free(query); - - /*insert ui app locale info to pkg locale to get mainapp data */ - if (strcasecmp(app->mainapp, "true") == 0) { - query = sqlite3_mprintf("INSERT OR REPLACE INTO package_localized_info(package, package_locale, " - "package_label, package_icon, package_description, package_license, package_author) VALUES" - "(%Q, %Q, " - "COALESCE((SELECT package_label FROM package_localized_info WHERE package=%Q AND package_locale=%Q), %Q), " - "COALESCE((SELECT package_icon FROM package_localized_info WHERE package=%Q AND package_locale=%Q), %Q), " - "(SELECT package_description FROM package_localized_info WHERE package=%Q AND package_locale=%Q), " - "(SELECT package_license FROM package_localized_info WHERE package=%Q AND package_locale=%Q), " - "(SELECT package_author FROM package_localized_info WHERE package=%Q AND package_locale=%Q))", - app->package, locale, - app->package, locale, label, - app->package, locale, icon, - app->package, locale, - app->package, locale, - app->package, locale); - - ret = __exec_query(query); - if (ret == -1) - _LOGE("Package Localized Info DB Insert failed"); - sqlite3_free(query); - } -} - -static void __insert_application_icon_section_info(gpointer data, gpointer userdata) -{ - int ret = -1; - char *icon = NULL; - char *resolution = NULL; - char query[MAX_QUERY_LEN] = {'\0'}; - - application_x *app = (application_x *)userdata; - GList *icn = app->icon; - - __extract_icon_data(data, icn, &icon, &resolution); - if (!icon && !resolution) - return; - sqlite3_snprintf(MAX_QUERY_LEN, query, "INSERT INTO package_app_icon_section_info(app_id, " \ - "app_icon, app_icon_section, app_icon_resolution) VALUES " \ - "(%Q, %Q, %Q, %Q)", app->appid, - icon, (char *)data, resolution); + icon_filename = strrchr(orig_icon_path, '/'); + if (icon_filename == NULL) + return -1; - ret = __exec_query(query); - if (ret == -1) - _LOGD("Package UiApp Localized Info DB Insert failed\n"); + snprintf(icon_path, + strlen(orig_icon_path) - (strlen(icon_filename) - 1), + "%s", orig_icon_path); + for (i = 0; i < 2; i++) { + snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s", + icon_path, dpi_path[i], icon_filename); + if (access(modified_iconpath, F_OK) != -1) { + /* if exists, return modified icon path */ + *new_icon_path = strdup(modified_iconpath); + return 0; + } + } + return -1; } -static void __insert_application_image_info(gpointer data, gpointer userdata) +static gint __compare_icon(gconstpointer a, gconstpointer b) { - int ret = -1; - char *lang = NULL; - char *img = NULL; - char query[MAX_QUERY_LEN] = {'\0'}; + icon_x *icon = (icon_x *)a; + char *icon_path; - application_x *app = (application_x *)userdata; - GList *image = app->image; + if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0) + return -1; - __extract_image_data(data, image, &lang, &img); - if (!lang && !img) - return; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_image_info(app_id, app_locale, " \ - "app_image_section, app_image) VALUES" \ - "(%Q, %Q, %Q, %Q)", app->appid, lang, (char *)data, img); + if (icon->dpi != NULL) + return -1; - ret = __exec_query(query); - if (ret == -1) - _LOGD("Package UiApp image Info DB Insert failed\n"); + if (__check_icon_resolution(icon->text, &icon_path) == 0) { + free(icon->text); + icon->text = icon_path; + } + return 0; } - -static int __insert_mainapp_info(manifest_x *mfx) +static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b) { - GList *tmp; - application_x *app; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - if (strcasecmp(app->mainapp, "True") == 0) - mfx->mainapp_id = strdup(app->appid); - } - - if (mfx->mainapp_id == NULL) { - if (mfx->application == NULL) - return -1; - app = (application_x *)mfx->application->data; - if (app == NULL) - return -1; - free((void *)app->mainapp); - app->mainapp = strdup("true"); - mfx->mainapp_id = strdup(app->appid); - } + icon_x *icon = (icon_x *)a; + int dpi = GPOINTER_TO_INT(b); - memset(query, '\0', MAX_QUERY_LEN); - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_info SET mainapp_id=%Q WHERE package=%Q", mfx->mainapp_id, mfx->package); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Info DB update Failed\n"); + if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0) return -1; - } - - return 0; -} -static int __convert_background_category(GList *category_list) -{ - int ret = 0; - GList *tmp_list = category_list; - char *category_data = NULL; + if (icon->dpi == NULL) + return -1; - if (category_list == NULL) + if (__check_dpi(icon->dpi, dpi) == 0) return 0; - while (tmp_list != NULL) { - category_data = (char *)tmp_list->data; - if (strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR) == 0) - ret = ret | APP_BG_CATEGORY_MEDIA_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR) == 0) - ret = ret | APP_BG_CATEGORY_DOWNLOAD_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR) == 0) - ret = ret | APP_BG_CATEGORY_BGNETWORK_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR) == 0) - ret = ret | APP_BG_CATEGORY_LOCATION_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR) == 0) - ret = ret | APP_BG_CATEGORY_SENSOR_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR) == 0) - ret = ret | APP_BG_CATEGORY_IOTCOMM_VAL; - else if (strcmp(category_data, APP_BG_CATEGORY_SYSTEM) == 0) - ret = ret | APP_BG_CATEGORY_SYSTEM_VAL; - else - _LOGE("Unidentified category [%s]", category_data); - tmp_list = g_list_next(tmp_list); - } - - return ret; + return -1; } -static const char *__find_effective_appid(GList *metadata_list) +static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b) { - GList *tmp_list; - metadata_x *md; + icon_x *icon = (icon_x *)a; + char *lang = (char *)b; + char *icon_path; - for (tmp_list = metadata_list; tmp_list; tmp_list = tmp_list->next) { - md = (metadata_x *)tmp_list->data; - if (md == NULL || md->key == NULL) - continue; + if (icon->dpi != NULL) + return -1; - if (strcmp(md->key, "http://tizen.org/metadata/effective-appid") == 0) { - if (md->value) - return md->value; + if (strcasecmp(icon->lang, lang) == 0) { + if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) { + /* icon for no locale. check existance of + * folder-hierachied default icons + */ + if (__check_icon_resolution(icon->text, + &icon_path) == 0) { + free(icon->text); + icon->text = icon_path; + } } + return 0; } - return NULL; -} - -static char *__get_bool(char *value, bool is_true) -{ - if (value != NULL) { - if (!strcmp(value, "")) - return (is_true) ? "true" : "false"; - return value; - } - - return (is_true) ? "true" : "false"; + return -1; } -static int __insert_pkg_updateinfo_in_db(manifest_x *mfx, uid_t uid) +static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b) { - char query[MAX_QUERY_LEN] = {'\0'}; int ret; + icon_x *icon = (icon_x *)a; + char *lang = (char *)b; + int dpi = -1; - if (mfx == NULL) + ret = system_info_get_platform_int( + "http://tizen.org/feature/screen.dpi", &dpi); + if (ret != SYSTEM_INFO_ERROR_NONE) return -1; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_update_info(" \ - "package, update_version) VALUES(%Q, %Q)", - mfx->package, mfx->version); - ret = __exec_query(query); + if (strcasecmp(icon->lang, lang) == 0 && + __check_dpi(icon->dpi, dpi) == 0) + return 0; - return ret; + return -1; } -/* _PRODUCT_LAUNCHING_ENHANCED_ -* app->indicatordisplay, app->portraitimg, app->landscapeimg, app->guestmode_appstatus -*/ -static int __insert_application_info(manifest_x *mfx) +static char *__find_icon(GList *icons, const char *lang) { GList *tmp; - application_x *app; - int ret = -1; - int background_value = 0; - char query[MAX_QUERY_LEN] = {'\0'}; - char *type = NULL; - const char *effective_appid; - - if (mfx->type) - type = strdup(mfx->type); - else - type = strdup("tpk"); - - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - - background_value = __convert_background_category(app->background_category); - if (background_value < 0) { - _LOGE("Failed to retrieve background value[%d]", background_value); - background_value = 0; - } - - effective_appid = __find_effective_appid(app->metadata); + icon_x *icon; + int dpi = 0; + int ret; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_info(" \ - "app_id, app_component, app_exec, app_nodisplay, app_type, " \ - "app_onboot, app_multiple, app_autorestart, app_taskmanage, " \ - "app_hwacceleration, app_screenreader, app_mainapp, app_recentimage, app_launchcondition, " \ - "app_indicatordisplay, app_portraitimg, app_landscapeimg, app_guestmodevisibility, app_permissiontype, " \ - "app_preload, app_submode, app_submode_mainid, app_installed_storage, app_process_pool, " \ - "app_launch_mode, app_ui_gadget, app_support_mode, app_support_disable, component_type, package, " \ - "app_tep_name, app_zip_mount_file, app_background_category, app_package_type, app_root_path, " \ - "app_api_version, app_effective_appid, app_splash_screen_display, app_package_system, app_removable, " \ - "app_package_installed_time, app_support_ambient, app_setup_appid) " \ - "VALUES(" \ - "%Q, %Q, %Q, LOWER(%Q), %Q, " \ - "LOWER(%Q), LOWER(%Q), LOWER(%Q), LOWER(%Q), " \ - "%Q, %Q, %Q, %Q, %Q, " \ - "LOWER(%Q), %Q, %Q, LOWER(%Q), %Q, " \ - "LOWER(%Q), LOWER(%Q), %Q, %Q, LOWER(%Q), " \ - "COALESCE(%Q, 'caller'), LOWER(%Q), %Q, LOWER(%Q), %Q, %Q, " \ - "%Q, %Q, %d, %Q, %Q, " \ - "%Q, %Q, LOWER(%Q), LOWER(%Q), LOWER(%Q), " \ - "%Q, LOWER(%Q), %Q)", \ - app->appid, app->component_type, app->exec, __get_bool(app->nodisplay, false), app->type, - __get_bool(app->onboot, false), __get_bool(app->multiple, false), __get_bool(app->autorestart, false), __get_bool(app->taskmanage, false), - app->hwacceleration, app->screenreader, app->mainapp, app->recentimage, app->launchcondition, - __get_bool(app->indicatordisplay, true), app->portraitimg, app->landscapeimg, - __get_bool(app->guestmode_visibility, true), app->permission_type, - __get_bool(mfx->preload, false), __get_bool(app->submode, false), app->submode_mainid, mfx->installed_storage, __get_bool(app->process_pool, false), - app->launch_mode, __get_bool(app->ui_gadget, false), mfx->support_mode, __get_bool(mfx->support_disable, false), app->component_type, mfx->package, - mfx->tep_name, mfx->zip_mount_file, background_value, type, mfx->root_path, mfx->api_version, - effective_appid, __get_bool(app->splash_screen_display, false), __get_bool(mfx->system, false), __get_bool(mfx->removable, true), - mfx->installed_time, __get_bool(app->support_ambient, false), app->setup_appid); - - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Info DB Insert Failed\n"); - if (type) - free(type); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); + /* first, find icon whose locale and dpi with given lang and + * system's dpi has matched + */ + tmp = g_list_find_custom(icons, lang, + (GCompareFunc)__compare_icon_with_lang_dpi); + if (tmp != NULL) { + icon = (icon_x *)tmp->data; + return (char *)icon->text; } - if (type) - free(type); - - return 0; -} - -static int __insert_application_appcategory_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *ct_tmp; - const char *ct; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) - continue; - for (ct_tmp = app->category; ct_tmp; ct_tmp = ct_tmp->next) { - ct = (const char *)ct_tmp->data; - if (ct == NULL) - continue; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_app_category(app_id, category) " \ - "VALUES(%Q, %Q)",\ - app->appid, ct); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Category Info DB Insert Failed\n"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); - } + /* if first has failed, find icon whose locale has matched */ + tmp = g_list_find_custom(icons, lang, + (GCompareFunc)__compare_icon_with_lang); + if (tmp != NULL) { + icon = (icon_x *)tmp->data; + return (char *)icon->text; } - return 0; -} -static int __insert_application_appmetadata_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *md_tmp; - metadata_x *md; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) - continue; - for (md_tmp = app->metadata; md_tmp; md_tmp = md_tmp->next) { - md = (metadata_x *)md_tmp->data; - if (md == NULL) - continue; - if (md->key) { - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_app_metadata(app_id, md_key, md_value) " \ - "VALUES(%Q, %Q, %Q)",\ - app->appid, md->key, md->value ? md->value : NULL); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Metadata Info DB Insert Failed\n"); - return -1; - } - } - memset(query, '\0', MAX_QUERY_LEN); + /* if second has failed, find icon whose dpi has matched with + * system's dpi + */ + ret = system_info_get_platform_int( + "http://tizen.org/feature/screen.dpi", &dpi); + if (ret == SYSTEM_INFO_ERROR_NONE) { + tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi), + (GCompareFunc)__compare_icon_with_dpi); + if (tmp != NULL) { + icon = (icon_x *)tmp->data; + return (char *)icon->text; } } - return 0; -} -static int __insert_application_apppermission_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *pm_tmp; - permission_x *pm; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) - continue; - for (pm_tmp = app->permission; pm_tmp; pm_tmp = pm_tmp->next) { - pm = (permission_x *)pm_tmp->data; - if (pm == NULL) - continue; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_app_permission(app_id, pm_type, pm_value) " \ - "VALUES(%Q, %Q, %Q)",\ - app->appid, pm->type, pm->value); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp permission Info DB Insert Failed\n"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); - } + /* last, find default icon marked as "No Locale" */ + tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon); + if (tmp != NULL) { + icon = (icon_x *)tmp->data; + return (char *)icon->text; } - return 0; + + return NULL; } -static int __insert_application_appcontrol_info(manifest_x *mfx) +static void __extract_data(const char *locale, GList *lbls, GList *lcns, + GList *icns, GList *dcns, GList *aths, char **label, + char **license, char **icon, char **description, char **author) { - GList *app_tmp; - application_x *app; - GList *acontrol_tmp; - appcontrol_x *acontrol; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - char buf[BUFSIZE] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) + GList *tmp; + label_x *lbl; + license_x *lcn; + description_x *dcn; + author_x *ath; + + for (tmp = lbls; tmp; tmp = tmp->next) { + lbl = (label_x *)tmp->data; + if (lbl == NULL) continue; - for (acontrol_tmp = app->appcontrol; acontrol_tmp; acontrol_tmp = acontrol_tmp->next) { - acontrol = (appcontrol_x *)acontrol_tmp->data; - if (acontrol == NULL) - continue; - snprintf(buf, BUFSIZE, "%s|%s|%s",\ - acontrol->operation ? (strlen(acontrol->operation) > 0 ? acontrol->operation : "NULL") : "NULL", - acontrol->uri ? (strlen(acontrol->uri) > 0 ? acontrol->uri : "NULL") : "NULL", - acontrol->mime ? (strlen(acontrol->mime) > 0 ? acontrol->mime : "NULL") : "NULL"); - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_app_control(app_id, app_control) " \ - "VALUES(%Q, %Q)",\ - app->appid, buf); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp AppSvc DB Insert Failed\n"); - return -1; + if (lbl->lang) { + if (strcmp(lbl->lang, locale) == 0) { + *label = (char *)lbl->text; + break; } - memset(query, '\0', MAX_QUERY_LEN); } } - return 0; -} - -static int __insert_application_datacontrol_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *dc_tmp; - datacontrol_x *dc; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) + for (tmp = lcns; tmp; tmp = tmp->next) { + lcn = (license_x *)tmp->data; + if (lcn == NULL) continue; - for (dc_tmp = app->datacontrol; dc_tmp; dc_tmp = dc_tmp->next) { - dc = (datacontrol_x *)dc_tmp->data; - if (dc == NULL) - continue; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_data_control(app_id, providerid, access, type, trusted) " \ - "VALUES(%Q, %Q, %Q, %Q, %Q)",\ - app->appid, - dc->providerid, - dc->access, - dc->type, - __get_bool(dc->trusted, false)); - - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Data Control DB Insert Failed\n"); - return -1; + if (lcn->lang) { + if (strcmp(lcn->lang, locale) == 0) { + *license = (char *)lcn->text; + break; } - memset(query, '\0', MAX_QUERY_LEN); } } - return 0; -} -static int __insert_application_share_request_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *ds_tmp; - datashare_x *ds; - GList *rq_tmp; - const char *rq; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) + *icon = __find_icon(icns, locale); + + for (tmp = dcns; tmp; tmp = tmp->next) { + dcn = (description_x *)tmp->data; + if (dcn == NULL) continue; - for (ds_tmp = app->datashare; ds_tmp; ds_tmp = ds_tmp->next) { - ds = (datashare_x *)ds_tmp->data; - if (ds == NULL) - continue; - for (rq_tmp = ds->request; rq_tmp; rq_tmp = rq_tmp->next) { - rq = (const char *)rq_tmp->data; - if (rq == NULL) - continue; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_share_request(app_id, data_share_request) " \ - "VALUEES(%Q, %Q)",\ - app->appid, rq); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Share Request DB Insert Failed\n"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); + if (dcn->lang) { + if (strcmp(dcn->lang, locale) == 0) { + *description = (char *)dcn->text; + break; } } } - return 0; -} - -static int __insert_application_share_allowed_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *ds_tmp; - datashare_x *ds; - GList *df_tmp; - define_x *df; - GList *al_tmp; - const char *al; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL) + for (tmp = aths; tmp; tmp = tmp->next) { + ath = (author_x *)tmp->data; + if (ath == NULL) continue; - for (ds_tmp = app->datashare; ds_tmp; ds_tmp = ds_tmp->next) { - ds = (datashare_x *)ds_tmp->data; - if (ds == NULL) - continue; - for (df_tmp = ds->define; df_tmp; df_tmp = df_tmp->next) { - df = (define_x *)df_tmp->data; - if (df == NULL) - continue; - for (al_tmp = df->allowed; al_tmp; al_tmp = al_tmp->next) { - al = (const char *)al_tmp->data; - if (al == NULL) - continue; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_share_allowed(app_id, data_share_path, data_share_allowed) " \ - "VALUES(%Q, %Q, %Q)",\ - app->appid, df->path, al); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Share Allowed DB Insert Failed\n"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); - } + if (ath->lang) { + if (strcmp(ath->lang, locale) == 0) { + *author = (char *)ath->text; + break; } } } - return 0; -} - -static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a, gconstpointer b) -{ - splashscreen_x *ss = (splashscreen_x *)a; - const char *orientation = (const char *)b; - int dpi = -1; - - if (ss->operation || ss->dpi == NULL) - return -1; - - system_info_get_platform_int("http://tizen.org/feature/screen.dpi", &dpi); - if (!dpi) - return -1; - - if (strcasecmp(ss->orientation, orientation) == 0 && __check_dpi(ss->dpi, dpi) == 0) - return 0; - - return -1; } -static gint __compare_splashscreen_with_orientation(gconstpointer a, gconstpointer b) -{ - splashscreen_x *ss = (splashscreen_x *)a; - const char *orientation = (const char *)b; +static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app, + const char *locale, const char *label, const char *icon) +{ + static const char query[] = + "INSERT OR REPLACE INTO package_localized_info (" + " package, package_locale, package_label, package_icon," + " package_description, package_license, package_author) " + "VALUES (?, ?," + " COALESCE((SELECT package_label FROM package_localized_info" + " WHERE package=? AND package_locale=?), ?)," + " COALESCE((SELECT package_icon FROM package_localized_info" + " WHERE package=? AND package_icon=?), ?)," + " (SELECT package_description FROM package_localized_info" + " WHERE package=? AND package_locale=?)," + " (SELECT package_description FROM package_localized_info" + " WHERE package=? AND package_locale=?)," + " (SELECT package_description FROM package_localized_info" + " WHERE package=? AND package_locale=?))"; + int ret; + sqlite3_stmt *stmt; + int idx = 1; - if (ss->operation || ss->dpi) + 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++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, label); + __BIND_TEXT(db, stmt, idx++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, icon); + __BIND_TEXT(db, stmt, idx++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, app->package); + __BIND_TEXT(db, stmt, idx++, locale); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; + } - if (strcasecmp(ss->orientation, orientation) == 0) - return 0; + sqlite3_finalize(stmt); - return -1; + return 0; } -static splashscreen_x *__find_default_splashscreen(GList *splashscreens, - const char *orientation) +static int __insert_app_localized_info(sqlite3 *db, application_x *app) { + static const char query[] = + "INSERT INTO package_app_localized_info (app_id, app_locale," + " app_label, app_icon) " + "VALUES (?, ?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; GList *tmp; + GList *locales; + const char *locale; + char *label; + char *icon; - tmp = g_list_find_custom(splashscreens, orientation, - (GCompareFunc)__compare_splashscreen_with_orientation_dpi); - if (tmp) - return (splashscreen_x *)tmp->data; - - tmp = g_list_find_custom(splashscreens, orientation, - (GCompareFunc)__compare_splashscreen_with_orientation); - if (tmp) - return (splashscreen_x *)tmp->data; + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } - return NULL; -} + locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL); + for (tmp = locales; tmp; tmp = tmp->next) { + locale = (const char *)tmp->data; + label = NULL; + icon = NULL; + __extract_data(locale, app->label, NULL, app->icon, NULL, NULL, + &label, NULL, &icon, NULL, NULL); + if (!label && !icon) + continue; -static void __find_appcontrol_splashscreen_with_dpi(gpointer data, gpointer user_data) -{ - splashscreen_x *ss = (splashscreen_x *)data; - GList **list = (GList **)user_data; - int dpi = -1; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, label); + __BIND_TEXT(db, stmt, idx++, icon); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + g_list_free(locales); + sqlite3_finalize(stmt); + return -1; + } - if (ss->operation == NULL || ss->dpi == NULL) - return; + sqlite3_reset(stmt); - system_info_get_platform_int("http://tizen.org/feature/screen.dpi", &dpi); - if (!dpi) - return; + if (strcasecmp(app->mainapp, "true")) { + if (__insert_mainapp_localized_info(db, app, locale, + label, icon)) + _LOGE("insert mainapp localized info failed"); + } + } - if (__check_dpi(ss->dpi, dpi) != 0) - return; + g_list_free(locales); + sqlite3_finalize(stmt); - *list = g_list_append(*list, ss); + return 0; } -static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data) -{ - splashscreen_x *ss = (splashscreen_x *)data; - GList **list = (GList **)user_data; - splashscreen_x *ss_tmp; +/* _PRODUCT_LAUNCHING_ENHANCED_ + * app->indicatordisplay, app->portraitimg, app->landscapeimg, + * app->guestmode_appstatus + */ +static int __insert_application_info(sqlite3 *db, manifest_x *mfx) +{ + static const char query[] = + "INSERT INTO package_app_info (app_id, app_component," + " app_exec, app_nodisplay, app_type, app_onboot, app_multiple," + " app_autorestart, app_taskmanage, app_hwacceleration," + " app_screenreader, app_mainapp, app_recentimage," + " app_launchcondition, app_indicatordisplay, app_portraitimg," + " app_landscapeimg, app_guestmodevisibility," + " app_permissiontype, app_preload, app_submode," + " app_submode_mainid, app_installed_storage, app_process_pool," + " app_launch_mode, app_ui_gadget, app_support_mode," + " app_support_disable, component_type, package, app_tep_name," + " app_zip_mount_file, app_background_category," + " app_package_type, app_root_path, app_api_version," + " app_effective_appid, app_splash_screen_display," + " app_package_system, app_removable," + " app_package_installed_time, app_support_ambient," + " app_setup_appid) " + "VALUES (?, ?, " + " ?, LOWER(?), ?, LOWER(?), LOWER(?)," + " LOWER(?), LOWER(?), ?," + " ?, LOWER(?), ?," + " ?, LOWER(?), ?," + " ?, LOWER(?)," + " ?, LOWER(?), LOWER(?)," + " ?, ?, LOWER(?)," + " ?, LOWER(?), ?," + " LOWER(?), ?, ?, ?," + " ?, ?," + " ?, ?, ?," + " ?, LOWER(?)," + " LOWER(?), LOWER(?)," + " ?, LOWER(?)," + " ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; GList *tmp; + application_x *app; + int bg_category; + const char *effective_appid; - if (ss->operation == NULL || ss->dpi) - return; - - for (tmp = *list; tmp; tmp = tmp->next) { - ss_tmp = (splashscreen_x *)tmp->data; - if (ss_tmp->operation - && strcmp(ss_tmp->operation, ss->operation) == 0 - && strcmp(ss_tmp->orientation, ss->orientation) == 0) - return; + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; } - *list = g_list_append(*list, ss); -} - -static GList *__find_splashscreens(GList *splashscreens) -{ - GList *list = NULL; - splashscreen_x *ss; - - g_list_foreach(splashscreens, - __find_appcontrol_splashscreen_with_dpi, &list); - g_list_foreach(splashscreens, - __find_appcontrol_splashscreen, &list); - - ss = __find_default_splashscreen(splashscreens, "portrait"); - if (ss) - list = g_list_append(list, ss); - ss = __find_default_splashscreen(splashscreens, "landscape"); - if (ss) - list = g_list_append(list, ss); - - return list; -} + for (tmp = mfx->application; tmp; tmp = tmp->next) { + app = (application_x *)tmp->data; + if (app == NULL) + continue; -static int __insert_application_splashscreen_info(manifest_x *mfx) -{ - GList *app_tmp; - application_x *app; - GList *ss_tmp; - splashscreen_x *ss; - GList *tmp; - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; + bg_category = __convert_background_category( + app->background_category); + effective_appid = __find_effective_appid(app->metadata); - for (app_tmp = mfx->application; app_tmp; app_tmp = app_tmp->next) { - app = (application_x *)app_tmp->data; - if (app == NULL || app->splashscreens == NULL) - continue; + idx = 1; + __BIND_TEXT(db, stmt, idx++, app->appid); + __BIND_TEXT(db, stmt, idx++, app->component_type); + __BIND_TEXT(db, stmt, idx++, app->exec); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false)); + __BIND_TEXT(db, stmt, idx++, app->type); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false)); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->autorestart, false)); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->taskmanage, false)); + __BIND_TEXT(db, stmt, idx++, app->hwacceleration); + __BIND_TEXT(db, stmt, idx++, app->screenreader); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false)); + __BIND_TEXT(db, stmt, idx++, app->recentimage); + __BIND_TEXT(db, stmt, idx++, app->launchcondition); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->indicatordisplay, true)); + __BIND_TEXT(db, stmt, idx++, app->portraitimg); + __BIND_TEXT(db, stmt, idx++, app->landscapeimg); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->guestmode_visibility, true)); + __BIND_TEXT(db, stmt, idx++, app->permission_type); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false)); + __BIND_TEXT(db, stmt, idx++, app->submode_mainid); + __BIND_TEXT(db, stmt, idx++, mfx->installed_storage); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->process_pool, false)); + __BIND_TEXT(db, stmt, idx++, app->launch_mode); + __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false)); + __BIND_TEXT(db, stmt, idx++, app->support_mode); + __BIND_TEXT(db, stmt, idx++, + __get_bool(mfx->support_disable, false)); + __BIND_TEXT(db, stmt, idx++, app->component_type); + __BIND_TEXT(db, stmt, idx++, mfx->package); + __BIND_TEXT(db, stmt, idx++, mfx->tep_name); + __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file); + __BIND_INT(db, stmt, idx++, bg_category); + __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk"); + __BIND_TEXT(db, stmt, idx++, mfx->root_path); + __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)); + __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); + __BIND_TEXT(db, stmt, idx++, + __get_bool(app->support_ambient, false)); + __BIND_TEXT(db, stmt, idx++, app->setup_appid); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; + } - ss_tmp = __find_splashscreens(app->splashscreens); - if (ss_tmp == NULL) - continue; + sqlite3_reset(stmt); - for (tmp = ss_tmp; tmp; tmp = tmp->next) { - ss = (splashscreen_x *)tmp->data; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_app_splash_screen" \ - "(app_id, src, type, orientation, indicatordisplay, " \ - "operation, color_depth) " \ - "VALUES(%Q, %Q, %Q, %Q, %Q, %Q, %Q)", - app->appid, ss->src, ss->type, ss->orientation, - ss->indicatordisplay, ss->operation, - ss->color_depth); - - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package UiApp Splash Screen DB Insert Failed"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); + if (__insert_appcontrol_info(db, app)) { + sqlite3_finalize(stmt); + return -1; + } + if (__insert_category_info(db, app)) { + sqlite3_finalize(stmt); + return -1; + } + if (__insert_metadata_info(db, app)) { + sqlite3_finalize(stmt); + return -1; + } + if (__insert_datacontrol_info(db, app)) { + sqlite3_finalize(stmt); + return -1; + } + if (__insert_splashscreen_info(db, app)) { + sqlite3_finalize(stmt); + return -1; + } + if (__insert_app_localized_info(db, app)) { + sqlite3_finalize(stmt); + return -1; } - g_list_free(ss_tmp); } + + sqlite3_finalize(stmt); + return 0; } -static int __insert_manifest_info_in_db(manifest_x *mfx, uid_t uid) +static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx) { + static const char query[] = + "INSERT INTO package_localized_info (package, package_locale," + " package_label, package_icon, package_description," + " package_license, package_author) " + "VALUES (?, ?, ?, ?, ?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx; GList *tmp; - application_x *app; - privilege_x *pv = NULL; - char query[MAX_QUERY_LEN] = { '\0' }; - int ret = -1; - author_x *author; - const char *auth_name = NULL; - const char *auth_email = NULL; - const char *auth_href = NULL; - - GList *pkglocale = NULL; - GList *applocale = NULL; - GList *appicon = NULL; - GList *appimage = NULL; - - int temp_pkg_mode = 0; - int temp_app_mode = 0; - char pkg_mode[MAX_INTEGER_LENGTH] = {'\0'}; - application_x *up_support_mode = NULL; - GList *list_up = NULL; - - if (mfx->author && mfx->author->data) { - author = (author_x *)mfx->author->data; - if (author->text) - auth_name = author->text; - if (author->email) - auth_email = author->email; - if (author->href) - auth_href = author->href; - } - - if (mfx->support_mode) - temp_pkg_mode = atoi(mfx->support_mode); - - /* FIXME : OR-ing should be fixed to not to store whole support mode */ - list_up = mfx->application; - while (list_up != NULL) { - up_support_mode = (application_x *)list_up->data; - if (up_support_mode->support_mode) { - temp_app_mode = atoi(up_support_mode->support_mode); - temp_pkg_mode |= temp_app_mode; - } - list_up = list_up->next; - } - snprintf(pkg_mode, MAX_INTEGER_LENGTH, "%d", temp_pkg_mode); - - if (mfx->support_mode) - free((void *)mfx->support_mode); - mfx->support_mode = strdup(pkg_mode); - - /*Insert in the package_info DB*/ - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_info(" \ - "package, package_type, package_version, package_api_version, package_tep_name, package_zip_mount_file, " \ - "install_location, package_size, package_removable, package_preload, package_readonly, " \ - "package_update, package_appsetting, package_nodisplay, package_system, author_name, " \ - "author_email, author_href, installed_time, installed_storage, storeclient_id, " \ - "mainapp_id, package_url, root_path, csc_path, package_support_mode, package_support_disable) " \ - "VALUES(" \ - "%Q, %Q, %Q, %Q, %Q, %Q, " \ - "%Q, %Q, LOWER(%Q), LOWER(%Q), LOWER(%Q), " \ - "LOWER(%Q), LOWER(%Q), LOWER(%Q), LOWER(%Q), %Q, " \ - "%Q, %Q, %Q, %Q, %Q, " \ - "%Q, %Q, %Q, %Q, %Q, LOWER(%Q))", - mfx->package, mfx->type, mfx->version, mfx->api_version, mfx->tep_name, mfx->zip_mount_file, - mfx->installlocation, mfx->package_size, __get_bool(mfx->removable, true), __get_bool(mfx->preload, false), __get_bool(mfx->readonly, false), - __get_bool(mfx->update, false), __get_bool(mfx->appsetting, false), __get_bool(mfx->nodisplay_setting, false), __get_bool(mfx->system, false), auth_name, - auth_email, auth_href, mfx->installed_time, mfx->installed_storage, - mfx->storeclient_id, - mfx->mainapp_id, mfx->package_url, mfx->root_path, mfx->csc_path, mfx->support_mode, __get_bool(mfx->support_disable, false)); - - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Info DB Insert Failed\n"); - return -1; - } - - ret = __insert_pkg_updateinfo_in_db(mfx, uid); - if (ret == -1) { - _LOGE("Package Update Info DB Insert Failed\n"); - return -1; - } - - /*Insert in the package_privilege_info DB*/ - for (tmp = mfx->privileges; tmp; tmp = tmp->next) { - pv = (privilege_x *)tmp->data; - if (pv == NULL) + GList *locales; + const char *locale; + char *label; + char *icon; + char *description; + char *license; + char *author; + + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; + } + + locales = __create_locale_list(mfx->label, mfx->license, mfx->icon, + mfx->description, mfx->author); + for (tmp = locales; tmp; tmp = tmp->next) { + locale = (const char *)tmp->data; + label = NULL; + icon = NULL; + description = NULL; + license = NULL; + author = NULL; + __extract_data(locale, mfx->label, mfx->license, mfx->icon, + mfx->description, mfx->author, + &label, &license, &icon, &description, &author); + if (!label && !license && !icon && !description && !author) continue; - memset(query, '\0', MAX_QUERY_LEN); - sqlite3_snprintf(MAX_QUERY_LEN, query, - "INSERT INTO package_privilege_info(package, privilege, type) " \ - "VALUES(%Q, %Q, %Q)",\ - mfx->package, pv->value, pv->type); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Privilege Info DB Insert Failed\n"); + + idx = 1; + __BIND_TEXT(db, stmt, idx++, mfx->package); + __BIND_TEXT(db, stmt, idx++, locale); + __BIND_TEXT(db, stmt, idx++, label); + __BIND_TEXT(db, stmt, idx++, icon); + __BIND_TEXT(db, stmt, idx++, description); + __BIND_TEXT(db, stmt, idx++, license); + __BIND_TEXT(db, stmt, idx++, author); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + g_list_free(locales); + sqlite3_finalize(stmt); return -1; } - } - if (mfx->application != NULL) { - ret = __insert_mainapp_info(mfx); - if (ret == -1) - return -1; + sqlite3_reset(stmt); } - /*Insert the package locale*/ - pkglocale = __create_locale_list(pkglocale, mfx->label, mfx->license, mfx->icon, mfx->description, mfx->author); - /*remove duplicated data in pkglocale*/ - __trimfunc(pkglocale); - - /*Insert the app locale, icon, image info */ - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - applocale = __create_locale_list(applocale, app->label, NULL, app->icon, NULL, NULL); - appicon = __create_icon_list(appicon, app->icon); - appimage = __create_image_list(appimage, app->image); - } - /*remove duplicated data in applocale*/ - __trimfunc(applocale); - __trimfunc(appicon); - __trimfunc(appimage); - - g_list_foreach(pkglocale, __insert_pkglocale_info, (gpointer)mfx); - - /*native app locale info*/ - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - g_list_foreach(applocale, __insert_application_locale_info, (gpointer)app); - g_list_foreach(appicon, __insert_application_icon_section_info, (gpointer)app); - g_list_foreach(appimage, __insert_application_image_info, (gpointer)app); - } - - g_list_free(pkglocale); - pkglocale = NULL; - g_list_free(applocale); - applocale = NULL; - g_list_free(appicon); - appicon = NULL; - g_list_free(appimage); - appimage = NULL; - - /*Insert in the package_app_info DB*/ - ret = __insert_application_info(mfx); - if (ret == -1) - return -1; - /*Insert in the package_app_app_control DB*/ - ret = __insert_application_appcontrol_info(mfx); - if (ret == -1) - return -1; + g_list_free(locales); + sqlite3_finalize(stmt); - /*Insert in the package_app_app_category DB*/ - ret = __insert_application_appcategory_info(mfx); - if (ret == -1) - return -1; + return 0; +} - /*Insert in the package_app_app_metadata DB*/ - ret = __insert_application_appmetadata_info(mfx); - if (ret == -1) - return -1; +static int __insert_package_info(sqlite3 *db, manifest_x *mfx) +{ + static const char query[] = + "INSERT INTO package_info (package, package_type," + " package_version, package_api_version, package_tep_name," + " package_zip_mount_file, install_location, package_size," + " package_removable, package_preload, package_readonly," + " package_update, package_appsetting, package_nodisplay," + " package_system, author_name, author_email, author_href," + " installed_time, installed_storage, storeclient_id," + " mainapp_id, package_url, root_path, external_path," + " csc_path, package_support_mode, package_support_disable) " + "VALUES (?, ?," + " ?, ?, ?," + " ?, ?, ?," + " LOWER(?), LOWER(?), LOWER(?)," + " LOWER(?), LOWER(?), LOWER(?)," + " LOWER(?), ?, ?, ?," + " ?, ?, ?," + " ?, ?, ?, ?," + " ?, ?, LOWER(?))"; + int ret; + sqlite3_stmt *stmt; + int idx = 1; + const char *author_name = NULL; + const char *author_email = NULL; + const char *author_href = NULL; - /*Insert in the package_app_app_permission DB*/ - ret = __insert_application_apppermission_info(mfx); - if (ret == -1) + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); return -1; + } - /*Insert in the package_app_share_allowed DB*/ - ret = __insert_application_share_allowed_info(mfx); - if (ret == -1) + if (mfx->author && mfx->author->data) { + author_name = ((author_x *)mfx->author->data)->text; + author_email = ((author_x *)mfx->author->data)->email; + author_href = ((author_x *)mfx->author->data)->href; + } + + __BIND_TEXT(db, stmt, idx++, mfx->package); + __BIND_TEXT(db, stmt, idx++, mfx->type); + __BIND_TEXT(db, stmt, idx++, mfx->version); + __BIND_TEXT(db, stmt, idx++, mfx->api_version); + __BIND_TEXT(db, stmt, idx++, mfx->tep_name); + __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file); + __BIND_TEXT(db, stmt, idx++, mfx->installlocation); + __BIND_TEXT(db, stmt, idx++, mfx->package_size); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false)); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false)); + __BIND_TEXT(db, stmt, idx++, author_name); + __BIND_TEXT(db, stmt, idx++, author_email); + __BIND_TEXT(db, stmt, idx++, author_href); + __BIND_TEXT(db, stmt, idx++, mfx->installed_time); + __BIND_TEXT(db, stmt, idx++, mfx->installed_storage); + __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id); + __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id); + __BIND_TEXT(db, stmt, idx++, mfx->package_url); + __BIND_TEXT(db, stmt, idx++, mfx->root_path); + __BIND_TEXT(db, stmt, idx++, mfx->external_path); + __BIND_TEXT(db, stmt, idx++, mfx->csc_path); + __BIND_TEXT(db, stmt, idx++, mfx->support_mode); + __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false)); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; + } - /*Insert in the package_app_share_request DB*/ - ret = __insert_application_share_request_info(mfx); - if (ret == -1) - return -1; + sqlite3_finalize(stmt); - /*Insert in the package_app_data_control DB*/ - ret = __insert_application_datacontrol_info(mfx); - if (ret == -1) + if (__insert_package_localized_info(db, mfx)) return -1; - - /*Insert in the package_app_splash_screen DB*/ - ret = __insert_application_splashscreen_info(mfx); - if (ret == -1) + if (__insert_application_info(db, mfx)) return -1; return 0; - } -static int __delete_appinfo_from_db(char *db_table, const char *appid) +API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid) { - char query[MAX_QUERY_LEN] = { '\0' }; - int ret = -1; + int ret; + const char *dbpath; + sqlite3 *db; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "DELETE FROM %q where app_id=%Q", db_table, appid); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("DB Deletion from table (%s) Failed\n", db_table); - return -1; + if (mfx == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - return 0; -} -static int __delete_subpkg_info_from_db(char *appid) -{ - int ret = -1; + dbpath = __get_parser_db_path(uid); - ret = __delete_appinfo_from_db("package_app_info", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_localized_info", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_icon_section_info", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_image_info", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_control", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_category", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_metadata", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_permission", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_share_allowed", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_share_request", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_data_control", appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_splash_screen", appid); - if (ret < 0) - return ret; + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } - return 0; + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __insert_package_info(db, mfx)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx) +{ + return pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, __getuid()); } -static int __delete_subpkg_from_db(manifest_x *mfx) +static int __delete_package_info(sqlite3 *db, const char *pkgid) { - char query[MAX_QUERY_LEN] = { '\0' }; - char *error_message = NULL; + static const char query[] = + "DELETE FROM package_info WHERE package=?"; + 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); - sqlite3_snprintf(MAX_QUERY_LEN, query, "SELECT app_id FROM package_app_info WHERE package=%Q", mfx->package); - if (SQLITE_OK != - sqlite3_exec(pkgmgr_parser_db, query, __delete_subpkg_list_cb, NULL, &error_message)) { - _LOGE("Don't execute query = %s error message = %s\n", query, - error_message); - sqlite3_free(error_message); + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; } - sqlite3_free(error_message); return 0; } -static int __delete_manifest_info_from_db(manifest_x *mfx, uid_t uid) +API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx, + uid_t uid) { - char query[MAX_QUERY_LEN] = { '\0' }; - int ret = -1; - GList *tmp; - application_x *app; + int ret; + const char *dbpath; + sqlite3 *db; - /*Delete from Package Info DB*/ - sqlite3_snprintf(MAX_QUERY_LEN, query, - "DELETE FROM package_info WHERE package=%Q", mfx->package); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Info DB Delete Failed\n"); - return -1; + if (mfx == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - memset(query, '\0', MAX_QUERY_LEN); - /*Delete from Package Update Info DB*/ - sqlite3_snprintf(MAX_QUERY_LEN, query, - "DELETE FROM package_update_info WHERE package=%Q", mfx->package); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Update Info DB Delete Failed\n"); - return -1; - } - memset(query, '\0', MAX_QUERY_LEN); + dbpath = __get_parser_db_path(uid); - /*Delete from Package Localized Info*/ - sqlite3_snprintf(MAX_QUERY_LEN, query, - "DELETE FROM package_localized_info WHERE package=%Q", mfx->package); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Localized Info DB Delete Failed\n"); - return -1; + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - /*Delete from Package Privilege Info*/ - sqlite3_snprintf(MAX_QUERY_LEN, query, - "DELETE FROM package_privilege_info WHERE package=%Q", mfx->package); - ret = __exec_query(query); - if (ret == -1) { - _LOGD("Package Privilege Info DB Delete Failed\n"); - return -1; - } + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __delete_package_info(db, mfx->package)); + __END_TRANSACTION(db); - for (tmp = mfx->application; tmp; tmp = tmp->next) { - app = (application_x *)tmp->data; - if (app == NULL) - continue; - ret = __delete_appinfo_from_db("package_app_info", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_localized_info", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_icon_section_info", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_image_info", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_control", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_category", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_metadata", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_app_permission", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_share_allowed", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_share_request", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_data_control", app->appid); - if (ret < 0) - return ret; - ret = __delete_appinfo_from_db("package_app_splash_screen", app->appid); - if (ret < 0) - return ret; - } - - /* if main package has sub pkg, delete sub pkg data*/ - __delete_subpkg_from_db(mfx); + sqlite3_close_v2(db); - return 0; + return PM_PARSER_R_OK; } -static int __disable_app(const char *appid) +API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx) { - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info SET app_disable='true' WHERE app_id=%Q", - appid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Insert global app disable failed\n"); - - return ret; + return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, __getuid()); } -static int __enable_app(const char *appid) +API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid) { - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info SET app_disable='false' WHERE app_id=%Q", - appid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Insert global app disable failed\n"); + int ret; + const char *dbpath; + sqlite3 *db; - return ret; -} + if (mfx == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; + } -static int __disable_pkg(const char *pkgid) -{ - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_info SET package_disable='true' WHERE package=%Q", - pkgid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Update pkg disable info has failed\n"); + dbpath = __get_parser_db_path(uid); - return ret; + 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_info(db, mfx->package)); + __DO_TRANSACTION(db, __insert_package_info(db, mfx)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; } -static int __enable_pkg(const char *pkgid) +API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx) { - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_info SET package_disable='false' WHERE package=%Q", - pkgid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Update pkg disable info has failed\n"); - - return ret; + return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, __getuid()); } -static int __check_appinfo_for_uid_table(const char *appid, uid_t uid) +static int __set_global_app_disable_for_uid(sqlite3 *db, const char *appid, + uid_t uid, bool is_disable) { - int ret = -1; - char query[MAX_QUERY_LEN] = { '\0', }; + static const char query[] = + "INSERT OR REPLACE INTO package_app_info_for_uid (" + " app_id, uid, is_disabled, is_splash_screen_enabled) " + "VALUES (?, ?, ?," + " (SELECT app_splash_screen_display FROM package_app_info" + " WHERE app_id=?))"; + int ret; sqlite3_stmt *stmt; - const char *val = NULL; - - if (appid == NULL) - return -1; - - sqlite3_snprintf(MAX_QUERY_LEN, query, - "SELECT COUNT(*) FROM " - "package_app_info_for_uid WHERE app_id=%Q " - "AND uid=%d", appid, (int)uid); + int idx = 1; - ret = sqlite3_prepare_v2(pkgmgr_parser_db, query, strlen(query), &stmt, NULL); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); if (ret != SQLITE_OK) { - LOGE("prepare failed: %s", sqlite3_errmsg(pkgmgr_parser_db)); - return PMINFO_R_ERROR; + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; } - if (sqlite3_step(stmt) != SQLITE_ROW) { - LOGE("failed to step"); + __BIND_TEXT(db, stmt, idx++, appid); + __BIND_INT(db, stmt, idx++, uid); + __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false"); + __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 PMINFO_R_ERROR; + return -1; } - val = (const char *)sqlite3_column_text(stmt, 0); - ret = atoi(val); sqlite3_finalize(stmt); - return ret; + return 0; } -static int __disable_global_app_for_user(const char *appid, uid_t uid) +API int pkgmgr_parser_update_global_app_disable_for_uid_info_in_db( + const char *appid, uid_t uid, int is_disable) { - int ret = -1; - char query[MAX_QUERY_LEN] = { '\0', }; + int ret; + const char *dbpath; + sqlite3 *db; - ret = __check_appinfo_for_uid_table(appid, uid); - if (ret < 0) { - _LOGE("Failed to check package_app_info_for_uid with appid[%s], uid[%d]", - appid, (int)uid); - return -1; - } else if (ret == 0) { - sqlite3_snprintf(MAX_QUERY_LEN, query, "INSERT INTO " - "package_app_info_for_uid(app_id, uid, is_disabled, is_splash_screen_enabled) " - "VALUES(%Q, %d, 'true', " - "(SELECT app_splash_screen_display FROM package_app_info WHERE app_id=%Q))", - appid, (int)uid, appid); - } else { - sqlite3_snprintf(MAX_QUERY_LEN, query, "UPDATE " - "package_app_info_for_uid SET is_disabled='true' " - "WHERE app_id=%Q AND uid=%d", appid, (int)uid); + if (appid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - ret = __exec_query(query); - if (ret == -1) - _LOGD("Add global app disable info failed\n"); + dbpath = __get_parser_db_path(uid); - return ret; + 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_global_app_disable_for_uid(db, appid, + uid, (bool)is_disable)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; } -static int __enable_global_app_for_user(const char *appid, uid_t uid) +static int __set_app_disable(sqlite3 *db, const char *appid, uid_t uid, + bool is_disable) { - int ret = -1; - char query[MAX_QUERY_LEN] = {'\0'}; + static const char query[] = + "UPDATE package_app_info SET app_disable=? " + "WHERE app_id=?"; + int ret; + sqlite3_stmt *stmt; + int idx = 1; - ret = __check_appinfo_for_uid_table(appid, uid); - if (ret < 0) { - _LOGE("Failed to check package_app_info_for_uid with appid[%s], uid[%d]", - appid, (int)uid); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); return -1; - } else if (ret > 0) { - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info_for_uid SET " - "is_disabled='false' WHERE app_id=%Q AND " - "uid=%d", appid, (int)uid); } - ret = __exec_query(query); - if (ret == -1) - _LOGD("Remove global app disable info failed\n"); - - return ret; -} - -static int __update_global_app_splash_screen_for_user(const char *appid, - uid_t uid, int flag) -{ - int ret = -1; - char query[MAX_QUERY_LEN] = { '\0', }; + __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false"); + __BIND_TEXT(db, stmt, idx++, appid); - ret = __check_appinfo_for_uid_table(appid, uid); - if (ret < 0) { - _LOGE("Failed to check package_app_info_for_uid with appid[%s], uid[%d]", - appid, (int)uid); + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; - } else if (ret == 0) { - sqlite3_snprintf(MAX_QUERY_LEN, query, "INSERT INTO " - "package_app_info_for_uid(app_id, uid, is_splash_screen_enabled) " - "VALUES(%Q, %d, %Q)", appid, (int)uid, - flag ? "true" : "false"); - } else { - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info_for_uid SET " - "is_splash_screen_enabled=%Q WHERE app_id=%Q AND " - "uid=%d", flag ? "true" : "false", appid, (int)uid); } - ret = __exec_query(query); - if (ret == -1) - _LOGD("update global app splash screen info failed\n"); + sqlite3_finalize(stmt); - return ret; + return 0; } -static int __disable_app_splash_screen(const char *appid) +API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid, + uid_t uid, int is_disable) { int ret; - char query[MAX_QUERY_LEN] = {'\0'}; + const char *dbpath; + sqlite3 *db; + + if (appid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; + } - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info SET app_splash_screen_display='false' WHERE app_id=%Q", - appid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Failed to update app_palsh_screen_display"); + dbpath = __get_parser_db_path(uid); - return ret; -} + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } -static int __enable_app_splash_screen(const char *appid) -{ - int ret; - char query[MAX_QUERY_LEN] = {'\0'}; + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __set_app_disable(db, appid, uid, + (bool)is_disable)); + __END_TRANSACTION(db); - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_info SET app_splash_screen_display='true' WHERE app_id=%Q", - appid); - ret = __exec_query(query); - if (ret == -1) - _LOGD("Failed to update app_splash_screen_display"); + sqlite3_close_v2(db); - return ret; + return PM_PARSER_R_OK; } -API int pkgmgr_parser_initialize_db(uid_t uid) +API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid, + int is_disable) { - int ret = -1; - char *db_path; + return pkgmgr_parser_update_app_disable_info_in_usr_db(appid, + __getuid(), is_disable); +} - /*Manifest DB*/ - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_INFO); - if (ret == -1) { - _LOGD("package info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO); - if (ret == -1) { - _LOGD("package localized info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO); - if (ret == -1) { - _LOGD("package app app privilege DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO); - if (ret == -1) { - _LOGD("package update info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_INFO); - if (ret == -1) { - _LOGD("package app info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO); - if (ret == -1) { - _LOGD("package app localized info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO); - if (ret == -1) { - _LOGD("package app icon localized info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO); - if (ret == -1) { - _LOGD("package app image info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL); - if (ret == -1) { - _LOGD("package app app control DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY); - if (ret == -1) { - _LOGD("package app app category DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA); - if (ret == -1) { - _LOGD("package app app category DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION); - if (ret == -1) { - _LOGD("package app app permission DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED); - if (ret == -1) { - _LOGD("package app share allowed DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST); - if (ret == -1) { - _LOGD("package app share request DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL); - if (ret == -1) { - _LOGD("package app data control DB initialization failed\n"); - return ret; - } +static int __set_pkg_disable(sqlite3 *db, const char *pkgid, uid_t uid, + bool is_disable) +{ + static const char query[] = + "UPDATE package_info SET package_disable=? " + "WHERE package=?"; + int ret; + sqlite3_stmt *stmt; + int idx = 1; - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID); - if (ret == -1) { - _LOGD("package_app_info_for_uid for user DB initialization failed\n"); - return ret; + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; } - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN); - if (ret == -1) { - _LOGD("package app splash screen DB initialization failed\n"); - return ret; - } + __BIND_TEXT(db, stmt, idx++, is_disable ? "true" : "false"); + __BIND_TEXT(db, stmt, idx++, pkgid); - /* Trigger package_app_info_for_uid */ - ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID); - if (ret == -1) { - _LOGD("package app info for uid DB initialization failed\n"); - return ret; + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; } - /*Cert DB*/ - /* TODO: refactor this code */ - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INFO); - if (ret == -1) { - _LOGD("package cert info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO); - if (ret == -1) { - _LOGD("package cert index info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO); - if (ret == -1) { - _LOGD("package cert info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2); - if (ret == -1) { - _LOGD("package cert info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TRIGGER_DELETE_CERT_INFO); - if (ret == -1) { - _LOGD("package cert info DB initialization failed\n"); - return ret; - } - ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO); - if (ret == -1) { - _LOGD("package cert index info DB initialization failed\n"); - return ret; - } + sqlite3_finalize(stmt); - db_path = getUserPkgCertDBPathUID(GLOBAL_USER); - if (db_path == NULL) { - _LOGD("Failed to get user cert db path - GLOBAL_USER"); - } else { - ret = __parserdb_change_perm(db_path, GLOBAL_USER); - if (ret != 0) - _LOGD("Failed to change cert db permission"); - free(db_path); + return 0; +} + +API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid, + uid_t uid, int is_disable) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + if (pkgid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - db_path = getUserPkgParserDBPathUID(uid); - if (db_path == NULL) { - _LOGD("Failed to get user pkg parser db path - %d", uid); - } else { - ret = __parserdb_change_perm(db_path, uid); - if (ret != 0) - _LOGD("Failed to change parser db permission\n"); - free(db_path); + 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; } - return 0; + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __set_pkg_disable(db, pkgid, uid, + (bool)is_disable)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; } -static int __parserdb_change_perm(const char *db_file, uid_t uid) +API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid, + int is_disable) { - char buf[BUFSIZE]; - char pwuid_buf[1024]; - char journal_file[BUFSIZE]; - int fd; - struct stat sb; - char *files[3]; - int ret, i; - struct passwd userinfo, *result = NULL; - files[0] = (char *)db_file; - files[1] = journal_file; - files[2] = NULL; - mode_t mode; + return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid, + __getuid(), is_disable); +} - if (db_file == NULL) - return -1; +static int __set_global_app_splash_screen_for_uid(sqlite3 *db, + const char *appid, uid_t uid, bool is_enabled) +{ + static const char query[] = + "INSERT OR REPLACE INTO package_app_info_for_uid(" + " appid, uid, is_splash_screen_enabled) " + "VALUES (?, ?, ?)"; + int ret; + sqlite3_stmt *stmt; + int idx = 1; - if (getuid() != OWNER_ROOT) /* At this time we should be root to apply this */ - return 0; - snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal"); - if (uid == OWNER_ROOT || uid == GLOBAL_USER) { - ret = getpwnam_r(APPFW_USER, &userinfo, buf, sizeof(buf), &result); - if (ret != 0 || result == NULL) - return -1; - uid = userinfo.pw_uid; + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; } - ret = getpwuid_r(uid, &userinfo, pwuid_buf, sizeof(pwuid_buf), &result); - if (ret != 0 || result == NULL) { - _LOGE("FAIL: user %d doesn't exist", uid); + __BIND_TEXT(db, stmt, idx++, appid); + __BIND_INT(db, stmt, idx++, uid); + __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false"); + + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; } - snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal"); - for (i = 0; files[i]; i++) { - fd = open(files[i], O_RDONLY); - if (fd == -1) { - if (strerror_r(errno, buf, sizeof(buf))) - strncpy(buf, "", BUFSIZE - 1); - _LOGD("FAIL : open %s : %s", files[i], buf); - return -1; - } - ret = fstat(fd, &sb); - if (ret == -1) { - if (strerror_r(errno, buf, sizeof(buf))) - strncpy(buf, "", BUFSIZE - 1); - _LOGD("FAIL : fstat %s : %s", files[i], buf); - close(fd); - return -1; - } - if (S_ISLNK(sb.st_mode)) { - _LOGE("FAIL : %s is symlink!", files[i]); - close(fd); - return -1; - } - ret = fchown(fd, uid, userinfo.pw_gid); - if (ret == -1) { - if (strerror_r(errno, buf, sizeof(buf))) - strncpy(buf, "", BUFSIZE - 1); - _LOGD("FAIL : fchown %s %d.%d : %s", files[i], uid, - userinfo.pw_gid, buf); - close(fd); - return -1; - } + sqlite3_finalize(stmt); - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; - if (!strcmp(db_file, getUserPkgCertDBPathUID(GLOBAL_USER))) - mode |= S_IWOTH; - ret = fchmod(fd, mode); - if (ret == -1) { - if (strerror_r(errno, buf, sizeof(buf))) - strncpy(buf, "", BUFSIZE - 1); - _LOGD("FAIL : fchmod %s 0664 : %s", files[i], buf); - close(fd); - return -1; - } - close(fd); - SET_SMACK_LABEL(files[i]); - } return 0; } -API int pkgmgr_parser_create_and_initialize_db(uid_t uid) +API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db( + const char *appid, uid_t uid, int flag) +{ + 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_global_app_splash_screen_for_uid(db, + appid, uid, (bool)flag)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +static int __set_app_splash_screen(sqlite3 *db, const char *appid, + bool is_enabled) { + static const char query[] = + "UPDATE package_app_info SET app_splash_screen_display=? " + "WHERE app_id=?"; int ret; - char *db_path; - - if (getuid() != OWNER_ROOT) { - _LOGE("Only root user is allowed"); - return -1; - } - - db_path = getUserPkgParserDBPathUID(uid); - if (db_path == NULL) { - _LOGE("Failed to get pkg parser db path - %d", uid); - return -1; - } + sqlite3_stmt *stmt; + int idx = 1; - if (access(db_path, F_OK) != -1) { - _LOGE("Manifest db for user %d is already exists", uid); - free(db_path); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); return -1; } - free(db_path); - db_path = getUserPkgCertDBPathUID(uid); - if (db_path == NULL) { - _LOGE("Failed to get pkg cert db path - %d", uid); - return -1; - } + __BIND_TEXT(db, stmt, idx++, is_enabled ? "true" : "false"); + __BIND_TEXT(db, stmt, idx++, appid); - if (access(db_path, F_OK) != -1) { - _LOGE("Cert db for user %d is already exists", uid); - free(db_path); + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; } - free(db_path); - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret < 0) - return -1; - ret = pkgmgr_parser_initialize_db(uid); - if (ret < 0) { - pkgmgr_parser_close_db(); - return -1; - } - pkgmgr_parser_close_db(); + sqlite3_finalize(stmt); return 0; } -API int pkgmgr_parser_check_and_create_db(uid_t uid) +API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db( + const char *appid, uid_t uid, int flag) { - int ret = -1; - char *db_path; + int ret; + const char *dbpath; + sqlite3 *db; - db_path = getUserPkgParserDBPathUID(uid); - if (db_path == NULL) { - _LOGD("Failed to get pkg parser db path - %d", uid); - return -1; + if (appid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - /*Manifest DB*/ - ret = __pkgmgr_parser_create_db(&pkgmgr_parser_db, db_path); - if (ret) { - _LOGD("Manifest DB creation Failed\n"); - free(db_path); - return -1; - } - free(db_path); + dbpath = __get_parser_db_path(uid); - db_path = getUserPkgCertDBPathUID(GLOBAL_USER); - if (db_path == NULL) { - _LOGE("Failed to get pkg cert db path - GLOBAL_USER"); - return -1; + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - /*Cert DB*/ - ret = __pkgmgr_parser_create_db(&pkgmgr_cert_db, db_path); - if (ret) { - _LOGD("Cert DB creation Failed\n"); - free(db_path); - return -1; - } + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __set_app_splash_screen(db, appid, (bool)flag)); + __END_TRANSACTION(db); - free(db_path); + sqlite3_close_v2(db); - return 0; + return PM_PARSER_R_OK; } -void pkgmgr_parser_close_db(void) +API int pkgmgr_parser_update_app_splash_screen_display_info_in_db( + const char *appid, int flag) { - sqlite3_close(pkgmgr_parser_db); - sqlite3_close(pkgmgr_cert_db); + return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db( + appid, __getuid(), flag); } - -API int pkgmgr_parser_insert_manifest_info_in_db(manifest_x *mfx) +static int __set_app_label(sqlite3 *db, const char *appid, const char *label) { - _LOGD("pkgmgr_parser_insert_manifest_info_in_db\n"); - if (mfx == NULL) { - _LOGD("manifest pointer is NULL\n"); + static const char query[] = + "UPDATE package_app_localized_info SET app_label=? " + "WHERE app_id=? AND app_label 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; } - int ret = 0; - ret = pkgmgr_parser_check_and_create_db(GLOBAL_USER); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; + + __BIND_TEXT(db, stmt, idx++, label); + __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; } - ret = pkgmgr_parser_initialize_db(GLOBAL_USER); - if (ret == -1) - goto err; - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); - ret = __insert_manifest_info_in_db(mfx, GLOBAL_USER); - if (ret == -1) { - _LOGD("Insert into DB failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; + + sqlite3_finalize(stmt); + + return 0; } -API int pkgmgr_parser_insert_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid) +API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid, + uid_t uid, const char *label) { - _LOGD("pkgmgr_parser_insert_manifest_info_in_usr_db\n"); - if (mfx == NULL) { - _LOGD("manifest pointer is NULL\n"); - return -1; - } - int ret = 0; - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; + int ret; + const char *dbpath; + sqlite3 *db; + + if (appid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - ret = pkgmgr_parser_initialize_db(uid); - if (ret == -1) - goto err; - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); - ret = __insert_manifest_info_in_db(mfx, uid); - if (ret == -1) { - _LOGD("Insert into DB failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); + + dbpath = __get_parser_db_path(uid); + + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __set_app_label(db, appid, label)); + __END_TRANSACTION(db); + + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; } -API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid, const char *tep_path) +API int pkgmgr_parser_update_app_label_info_in_db(const char *appid, + const char *label) { - return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path, _getuid()); + return pkgmgr_parser_update_app_label_info_in_usr_db(appid, __getuid(), + label); } -API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid, const char *tep_path, uid_t uid) +static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path) { - if (pkgid == NULL || tep_path == NULL) { - _LOGE("invalid parameter"); + static const char query[] = + "UPDATE package_info SET package_tep_name=? " + "WHERE package=?"; + 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; } - int ret = -1; - char *query = NULL; + __BIND_TEXT(db, stmt, idx++, tep_path); + __BIND_TEXT(db, stmt, idx++, pkgid); - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; } - ret = pkgmgr_parser_initialize_db(uid); - if (ret == -1) - goto err; - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); + sqlite3_finalize(stmt); + return 0; +} - /* Updating TEP info in "package_info" table */ - query = sqlite3_mprintf("UPDATE package_info "\ - "SET package_tep_name = %Q "\ - "WHERE package = %Q", tep_path, pkgid); +API int pkgmgr_parser_update_tep_info_in_usr_db(const char *pkgid, + const char *tep_path, uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; - ret = __exec_query(query); - sqlite3_free(query); - if (ret != SQLITE_OK) { - ret = PM_PARSER_R_ERROR; - _LOGE("sqlite exec failed to insert entries into package_info!!"); - goto err; + if (pkgid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - /* Updating TEP info in "package_app_info" table */ - query = sqlite3_mprintf("UPDATE package_app_info "\ - "SET app_tep_name = %Q "\ - "WHERE package = %Q", tep_path, pkgid); + dbpath = __get_parser_db_path(uid); - ret = __exec_query(query); - sqlite3_free(query); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); if (ret != SQLITE_OK) { - ret = PM_PARSER_R_ERROR; - _LOGE("sqlite exec failed to insert entries into package_app_info!!"); - goto err; + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGE("Failed to commit transaction, Rollback now\n"); - ret = sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - if (ret != SQLITE_OK) - _LOGE("Failed to Rollback\n"); + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __set_tep_path(db, pkgid, tep_path)); + __END_TRANSACTION(db); - ret = PM_PARSER_R_ERROR; - goto err; - } - _LOGD("Transaction Commit and End\n"); - ret = PM_PARSER_R_OK; + sqlite3_close_v2(db); -err: - pkgmgr_parser_close_db(); - return ret; + return PM_PARSER_R_OK; } - -API int pkgmgr_parser_update_manifest_info_in_usr_db(manifest_x *mfx, uid_t uid) +API int pkgmgr_parser_update_tep_info_in_db(const char *pkgid, + const char *tep_path) { - if (mfx == NULL) { - _LOGD("manifest pointer is NULL\n"); - return -1; - } - int ret = 0; - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } - ret = pkgmgr_parser_initialize_db(uid); - if (ret == -1) - goto err; - /*Preserve guest mode visibility*/ - __preserve_guestmode_visibility_value(mfx); - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); - ret = __delete_manifest_info_from_db(mfx, uid); - if (ret == -1) { - _LOGD("Delete from DB failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - ret = __insert_manifest_info_in_db(mfx, uid); - if (ret == -1) { - _LOGD("Insert into DB failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; + return pkgmgr_parser_update_tep_info_in_usr_db(pkgid, tep_path, + __getuid()); } -API int pkgmgr_parser_update_manifest_info_in_db(manifest_x *mfx) +static int __convert_update_type(pkgmgrinfo_updateinfo_update_type type, + const char **update_type) { - return pkgmgr_parser_update_manifest_info_in_usr_db(mfx, _getuid()); + if (type == PMINFO_UPDATEINFO_NONE) + *update_type = PMINFO_UPDATEINFO_TYPE_NONE; + else if (type == PMINFO_UPDATEINFO_FORCE) + *update_type = PMINFO_UPDATEINFO_TYPE_FORCE; + else if (type == PMINFO_UPDATEINFO_OPTIONAL) + *update_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL; + else + return -1; + return 0; } -API int pkgmgr_parser_delete_manifest_info_from_usr_db(manifest_x *mfx, uid_t uid) +static int __register_pkg_update_info(sqlite3 *db, updateinfo_x *info, + const char *update_type) { - if (mfx == NULL) { - _LOGD("manifest pointer is NULL\n"); + static const char query[] = + "UPDATE package_update_info " + "SET update_version=?, update_type=? " + "WHERE package=?"; + 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; } - int ret = 0; - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); - ret = __delete_manifest_info_from_db(mfx, uid); - if (ret == -1) { - _LOGD("Delete from DB failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; -} -API int pkgmgr_parser_delete_manifest_info_from_db(manifest_x *mfx) -{ - return pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, _getuid()); -} + __BIND_TEXT(db, stmt, idx++, info->version); + __BIND_TEXT(db, stmt, idx++, update_type); + __BIND_TEXT(db, stmt, idx++, info->pkgid); -static int _convert_update_type(pkgmgrinfo_updateinfo_update_type type, char **convert_type) -{ - if (type == PMINFO_UPDATEINFO_NONE) - *convert_type = PMINFO_UPDATEINFO_TYPE_NONE; - else if (type == PMINFO_UPDATEINFO_FORCE) - *convert_type = PMINFO_UPDATEINFO_TYPE_FORCE; - else if (type == PMINFO_UPDATEINFO_OPTIONAL) - *convert_type = PMINFO_UPDATEINFO_TYPE_OPTIONAL; - else + 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_register_pkg_update_info_in_usr_db(pkgmgrinfo_updateinfo_h handle, uid_t uid) +API int pkgmgr_parser_register_pkg_update_info_in_usr_db( + pkgmgrinfo_updateinfo_h handle, uid_t uid) { int ret; updateinfo_x *update_info; @@ -2911,433 +2366,206 @@ API int pkgmgr_parser_register_pkg_update_info_in_usr_db(pkgmgrinfo_updateinfo_h pkgmgrinfo_pkginfo_h pkginfo; pkgmgrinfo_version_compare_type compare_result; bool is_global_pkg; - char query[MAX_QUERY_LEN] = {'\0'}; - char *convert_type; + const char *update_type; + const char *dbpath; + sqlite3 *db; - if (handle == NULL) - return PMINFO_R_EINVAL; + if (handle == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; + } update_info = (updateinfo_x *)handle; if (update_info->pkgid == NULL || update_info->version == NULL) - return PMINFO_R_EINVAL; - if (_convert_update_type(update_info->type, &convert_type) != 0) - return PMINFO_R_EINVAL; + return PM_PARSER_R_EINVAL; + if (__convert_update_type(update_info->type, &update_type) != 0) + return PM_PARSER_R_EINVAL; ret = pkgmgrinfo_updateinfo_get_usr_updateinfo(update_info->pkgid, &prev_update_handle, uid); if (ret != PMINFO_R_OK) - return PMINFO_R_ERROR; + return PM_PARSER_R_ERROR; prev_update_info = (updateinfo_x *)prev_update_handle; ret = pkgmgrinfo_compare_package_version(update_info->version, prev_update_info->version, &compare_result); if (ret != PMINFO_R_OK) { pkgmgrinfo_updateinfo_destroy(prev_update_handle); - return PMINFO_R_ERROR; + return PM_PARSER_R_ERROR; } if (compare_result == PMINFO_VERSION_SAME && prev_update_info->type == PMINFO_UPDATEINFO_NONE) { - _LOGI("Given update info version[%s] of pkgid[%s] will be ignored", + _LOGI("Given update info version[%s] of pkgid[%s] " + "will be ignored", update_info->version, update_info->pkgid); pkgmgrinfo_updateinfo_destroy(prev_update_handle); - return PMINFO_R_OK; + return PM_PARSER_R_OK; } pkgmgrinfo_updateinfo_destroy(prev_update_handle); ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(update_info->pkgid, uid, &pkginfo); if (ret != PMINFO_R_OK) - return PMINFO_R_ERROR; + return PM_PARSER_R_ERROR; ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg); if (ret != PMINFO_R_OK) { pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); - return PMINFO_R_ERROR; + return PM_PARSER_R_ERROR; } pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); - ret = pkgmgr_parser_check_and_create_db( - (is_global_pkg) ? GLOBAL_USER : uid); - if (ret != PMINFO_R_OK) - return PMINFO_R_ERROR; - - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_update_info SET update_version=%Q, " \ - "update_type=%Q WHERE package=%Q", - update_info->version, - convert_type, - update_info->pkgid); - - ret = __exec_query(query); - pkgmgr_parser_close_db(); - - return ret; -} - -API int pkgmgr_parser_register_pkg_update_info_in_db(pkgmgrinfo_updateinfo_h handle) -{ - return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle, _getuid()); -} - -API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid, uid_t uid) -{ - pkgmgrinfo_pkginfo_h pkginfo = NULL; - int ret; - bool is_global_pkg; - char query[MAX_QUERY_LEN] = {'\0'}; - - if (pkgid == NULL) - return PMINFO_R_EINVAL; - - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo); - if (ret != PMINFO_R_OK) - return -1; + dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid); - ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg); - if (ret != PMINFO_R_OK) { - pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); - return PMINFO_R_ERROR; + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); - ret = pkgmgr_parser_check_and_create_db((is_global_pkg) ? GLOBAL_USER : uid); - if (ret != PMINFO_R_OK) - return ret; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_update_info SET update_type='none' " \ - "WHERE package=%Q", pkgid); + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __register_pkg_update_info(db, update_info, + update_type)); + __END_TRANSACTION(db); - ret = __exec_query(query); - pkgmgr_parser_close_db(); + sqlite3_close_v2(db); - return ret; + return PM_PARSER_R_OK; } -API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid) +API int pkgmgr_parser_register_pkg_update_info_in_db( + pkgmgrinfo_updateinfo_h handle) { - return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid, _getuid()); + return pkgmgr_parser_register_pkg_update_info_in_usr_db(handle, + __getuid()); } -API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid) +static int __unregister_pkg_update_info(sqlite3 *db, const char *pkgid) { + static const char query[] = + "UPDATE package_update_info SET update_type='none' " + "WHERE package=?"; int ret; - char query[MAX_QUERY_LEN] = {'\0'}; - char *error_message = NULL; - - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret != 0) - return PMINFO_R_ERROR; + sqlite3_stmt *stmt; + int idx = 1; - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_update_info SET update_type='none'"); - ret = sqlite3_exec(pkgmgr_parser_db, query, NULL, NULL, &error_message); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); if (ret != SQLITE_OK) { - _LOGE("Don't execute query = %s error message = %s\n", query, - error_message); - sqlite3_free(error_message); - pkgmgr_parser_close_db(); - return PMINFO_R_ERROR; + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); + return -1; } - sqlite3_free(error_message); - error_message = NULL; - pkgmgr_parser_close_db(); - - return PMINFO_R_OK; -} - -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_update_global_app_disable_for_uid_info_in_db(const char *appid, uid_t uid, int is_disable) -{ - int ret = -1; - ret = pkgmgr_parser_check_and_create_db(GLOBAL_USER); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } + __BIND_TEXT(db, stmt, idx++, pkgid); - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + return -1; } - _LOGD("Transaction Begin\n"); - if (is_disable) - ret = __disable_global_app_for_user(appid, uid); - else - ret = __enable_global_app_for_user(appid, uid); - if (ret == -1) { - _LOGD("__update_global_app_disable_condition_in_db failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; -} + sqlite3_finalize(stmt); -API int pkgmgr_parser_update_app_disable_info_in_db(const char *appid, int is_disable) -{ - return pkgmgr_parser_update_app_disable_info_in_usr_db(appid, _getuid(), is_disable); + return 0; } -API int pkgmgr_parser_update_pkg_disable_info_in_usr_db(const char *pkgid, uid_t uid, int is_disable) +API int pkgmgr_parser_unregister_pkg_update_info_in_usr_db(const char *pkgid, + uid_t uid) { - int ret = -1; - - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } - - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - - _LOGD("Transaction Begin\n"); - if (is_disable) - ret = __disable_pkg(pkgid); - else - ret = __enable_pkg(pkgid); - - if (ret == -1) { - _LOGD("__update_pkg_disable_condition_in_db failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } + int ret; + const char *dbpath; + sqlite3 *db; + pkgmgrinfo_pkginfo_h pkginfo; + bool is_global_pkg; - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; + if (pkgid == NULL) { + _LOGE("invalid parameter"); + return PM_PARSER_R_EINVAL; } - _LOGD("Transaction Commit and End\n"); - -err: - pkgmgr_parser_close_db(); - return ret; -} -API int pkgmgr_parser_update_pkg_disable_info_in_db(const char *pkgid, int is_disable) -{ - return pkgmgr_parser_update_pkg_disable_info_in_usr_db(pkgid, _getuid(), is_disable); -} + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo); + if (ret != PMINFO_R_OK) + return PM_PARSER_R_EINVAL; -API int pkgmgr_parser_update_app_disable_info_in_usr_db(const char *appid, uid_t uid, int is_disable) -{ - int ret = -1; + ret = pkgmgrinfo_pkginfo_is_global(pkginfo, &is_global_pkg); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); + if (ret != PMINFO_R_OK) + return PM_PARSER_R_ERROR; - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } + dbpath = __get_parser_db_path(is_global_pkg ? GLOBAL_USER : uid); - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); - if (is_disable) - ret = __disable_app(appid); - else - ret = __enable_app(appid); - if (ret == -1) { - _LOGD("__update_app_disable_condition_in_db failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /*Commit transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; - -} - -API int pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(const char *appid, uid_t uid, int flag) -{ - int ret = -1; - - if (appid == NULL) { - _LOGD("Invalid parameter"); - return -1; + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - ret = pkgmgr_parser_check_and_create_db(GLOBAL_USER); - if (ret == -1) { - _LOGD("Failed to open DB\n"); - return ret; - } + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __unregister_pkg_update_info(db, pkgid)); + __END_TRANSACTION(db); - /* Begin transaction */ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin\n"); + sqlite3_close_v2(db); - ret = __update_global_app_splash_screen_for_user(appid, uid, flag); - if (ret == -1) { - _LOGD("__update_splash_screen_disable_condition_in_db failed. Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /* Commit transaction */ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now\n"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End\n"); -err: - pkgmgr_parser_close_db(); - return ret; + return PM_PARSER_R_OK; } -API int pkgmgr_parser_update_app_splash_screen_display_info_in_db(const char *appid, int flag) +API int pkgmgr_parser_unregister_pkg_update_info_in_db(const char *pkgid) { - return pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(appid, _getuid(), flag); + return pkgmgr_parser_unregister_pkg_update_info_in_usr_db(pkgid, + __getuid()); } -API int pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(const char *appid, uid_t uid, int flag) +static int __unregister_all_pkg_update_info(sqlite3 *db) { + static const char query[] = + "UPDATE package_update_info SET update_type='none'"; int ret; + sqlite3_stmt *stmt; - if (appid == NULL) { - _LOGD("Invalid parameter"); + ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL); + if (ret != SQLITE_OK) { + _LOGE("prepare failed: %s", sqlite3_errmsg(db)); return -1; } - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB"); + ret = sqlite3_step(stmt); + if (ret != SQLITE_DONE) { + _LOGE("step failed: %s", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); return -1; } - /* Begin transaction */ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction"); - ret = -1; - goto err; - } - _LOGD("Transaction Begin"); - - if (flag) - ret = __enable_app_splash_screen(appid); - else - ret = __disable_app_splash_screen(appid); - if (ret == -1) { - _LOGD("__update_app_splash_screen_condition_in_db. Rollback now"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } - /* Commit transaction */ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End"); + sqlite3_finalize(stmt); -err: - pkgmgr_parser_close_db(); - return ret; + return 0; } -API int pkgmgr_parser_update_app_label_info_in_usr_db(const char *appid, uid_t uid, const char *label) +API int pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(uid_t uid) { int ret; - char query[MAX_QUERY_LEN] = {'\0'}; - - if (appid == NULL || label == NULL) { - _LOGE("Invalid parameter"); - return -1; - } + const char *dbpath; + sqlite3 *db; - ret = pkgmgr_parser_check_and_create_db(uid); - if (ret == -1) { - _LOGD("Failed to open DB"); - return -1; - } + dbpath = __get_parser_db_path(uid); - /*Begin transaction*/ - ret = sqlite3_exec(pkgmgr_parser_db, "BEGIN EXCLUSIVE", NULL, NULL, NULL); + ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE); if (ret != SQLITE_OK) { - _LOGD("Failed to begin transaction\n"); - ret = -1; - goto err; + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; } - sqlite3_snprintf(MAX_QUERY_LEN, query, - "UPDATE package_app_localized_info SET app_label=%Q WHERE " \ - "app_id=%Q AND app_label IS NOT NULL", - label, appid); - ret = __exec_query(query); - if (ret == -1) { - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - goto err; - } + __BEGIN_TRANSACTION(db); + __DO_TRANSACTION(db, __unregister_all_pkg_update_info(db)); + __END_TRANSACTION(db); - /* Commit transaction */ - ret = sqlite3_exec(pkgmgr_parser_db, "COMMIT", NULL, NULL, NULL); - if (ret != SQLITE_OK) { - _LOGD("Failed to commit transaction, Rollback now"); - sqlite3_exec(pkgmgr_parser_db, "ROLLBACK", NULL, NULL, NULL); - ret = -1; - goto err; - } - _LOGD("Transaction Commit and End"); + sqlite3_close_v2(db); -err: - pkgmgr_parser_close_db(); - return ret; + return PM_PARSER_R_OK; } -API int pkgmgr_parser_update_app_label_info_in_db(const char *appid, const char *label) +API int pkgmgr_parser_unregister_all_pkg_update_info_in_db(void) { - return pkgmgr_parser_update_app_label_info_in_usr_db(appid, _getuid(), label); + return pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db( + __getuid()); } - diff --git a/parser/src/pkgmgr_parser_db_queries.h b/parser/src/pkgmgr_parser_db_queries.h new file mode 100644 index 0000000..53666f6 --- /dev/null +++ b/parser/src/pkgmgr_parser_db_queries.h @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __PKGMGR_PARSER_DB_QUERIES_H__ +#define __PKGMGR_PARSER_DB_QUERIES_H__ + +#define QUERY_CREATE_TABLE_PACKAGE_INFO \ + "CREATE TABLE IF NOT EXISTS package_info (\n" \ + " package TEXT PRIMARY KEY NOT NULL,\n" \ + " package_type TEXT DEFAULT 'tpk',\n" \ + " package_version TEXT,\n" \ + " package_api_version TEXT,\n" \ + " package_tep_name TEXT,\n" \ + " package_zip_mount_file TEXT,\n" \ + " install_location TEXT NOT NULL,\n" \ + " package_size TEXT,\n" \ + " package_removable TEXT NOT NULL DEFAULT 'true',\n" \ + " package_preload TEXT NOT NULL DEFAULT 'false',\n" \ + " package_readonly TEXT NOT NULL DEFAULT 'false',\n" \ + " package_update TEXT NOT NULL DEFAULT 'false',\n" \ + " package_appsetting TEXT NOT NULL DEFAULT 'false',\n" \ + " package_nodisplay TEXT NOT NULL DEFAULT 'false',\n" \ + " package_system TEXT NOT NULL DEFAULT 'false',\n" \ + " author_name TEXT,\n" \ + " author_email TEXT,\n" \ + " author_href TEXT,\n" \ + " installed_time TEXT,\n" \ + " installed_storage TEXT,\n" \ + " storeclient_id TEXT,\n" \ + " mainapp_id TEXT,\n" \ + " package_url TEXT,\n" \ + " root_path TEXT,\n" \ + " external_path TEXT,\n" \ + " csc_path TEXT,\n" \ + " package_support_mode TEXT,\n" \ + " package_support_disable TEXT NOT NULL DEFAULT 'false',\n" \ + " package_disable TEXT NOT NULL DEFAULT 'false')" + +#define QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO \ + "CREATE TABLE IF NOT EXISTS package_localized_info (\n" \ + " package TEXT NOT NULL,\n" \ + " package_locale TEXT NOT NULL DEFAULT 'No Locale',\n" \ + " package_label TEXT,\n" \ + " package_icon TEXT,\n" \ + " package_description TEXT,\n" \ + " package_license TEXT,\n" \ + " package_author TEXT,\n" \ + " PRIMARY KEY(package, package_locale),\n" \ + " FOREIGN KEY(package)\n" \ + " REFERENCES package_info(package) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO \ + "CREATE TABLE IF NOT EXISTS package_privilege_info (\n" \ + " package TEXT NOT NULL,\n" \ + " privilege TEXT NOT NULL,\n" \ + " type TEXT NOT NULL,\n" \ + " PRIMARY KEY(package, privilege, type)\n" \ + " FOREIGN KEY(package)\n" \ + " REFERENCES package_info(package) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO \ + "CREATE TABLE IF NOT EXISTS package_update_info (\n" \ + " package TEXT NOT NULL,\n" \ + " update_version TEXT NOT NULL,\n" \ + " update_type TEXT NOT NULL DEFAULT 'none',\n" \ + " PRIMARY KEY(package)\n" \ + " FOREIGN KEY(package)\n" \ + " REFERENCES package_info(package) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO \ + "CREATE TABLE IF NOT EXISTS package_app_info (\n" \ + " app_id TEXT PRIMARY KEY NOT NULL,\n" \ + " app_component TEXT NOT NULL,\n" \ + " app_exec TEXT,\n" \ + " app_nodisplay TEXT NOT NULL DEFAULT 'false',\n" \ + " app_type TEXT,\n" \ + " app_onboot TEXT NOT NULL DEFAULT 'false',\n" \ + " app_multiple TEXT NOT NULL DEFAULT 'false',\n" \ + " app_autorestart TEXT NOT NULL DEFAULT 'false',\n" \ + " app_taskmanage TEXT NOT NULL DEFAULT 'false',\n" \ + " app_hwacceleration TEXT NOT NULL DEFAULT 'use-system-setting',\n" \ + " app_screenreader TEXT NOT NULL DEFAULT 'use-system-setting',\n" \ + " app_mainapp TEXT NOT NULL,\n" \ + " app_recentimage TEXT NOT NULL DEFAULT 'false',\n" \ + " app_launchcondition TEXT,\n" \ + " app_indicatordisplay TEXT NOT NULL DEFAULT 'true',\n" \ + " app_portraitimg TEXT,\n" \ + " app_landscapeimg TEXT,\n" \ + " app_guestmodevisibility TEXT NOT NULL DEFAULT 'true',\n" \ + " app_permissiontype TEXT NOT NULL DEFAULT 'normal',\n" \ + " app_preload TEXT NOT NULL DEFAULT 'false',\n" \ + " app_submode TEXT NOT NULL DEFAULT 'false',\n" \ + " app_submode_mainid TEXT,\n" \ + " app_installed_storage TEXT NOT NULL,\n" \ + " app_process_pool TEXT NOT NULL DEFAULT 'false',\n" \ + " app_launch_mode TEXT NOT NULL DEFAULT 'caller',\n" \ + " app_ui_gadget TEXT NOT NULL DEFAULT 'false',\n" \ + " app_support_mode TEXT,\n" \ + " app_support_disable TEXT NOT NULL DEFAULT 'false',\n" \ + " app_disable TEXT NOT NULL DEFAULT 'false',\n" \ + " app_package_type TEXT DEFAULT 'tpk',\n" \ + " app_package_system TEXT NOT NULL,\n" \ + " app_removable TEXT NOT NULL DEFAULT 'false',\n" \ + " app_package_installed_time TEXT,\n" \ + " app_support_ambient TEXT NOT NULL DEFAULT 'false',\n" \ + " component_type TEXT,\n" \ + " package TEXT NOT NULL,\n" \ + " app_tep_name TEXT,\n" \ + " app_zip_mount_file TEXT,\n" \ + " app_background_category INTEGER DEFAULT 0,\n" \ + " app_root_path TEXT,\n" \ + " app_api_version TEXT,\n" \ + " app_effective_appid TEXT,\n" \ + " app_splash_screen_display TEXT NOT NULL DEFAULT 'true',\n" \ + " app_external_path TEXT,\n" \ + " app_setup_appid TEXT,\n" \ + " FOREIGN KEY(package)\n" \ + " REFERENCES package_info(package) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO \ + "CREATE TABLE IF NOT EXISTS package_app_localized_info (\n" \ + " app_id TEXT NOT NULL,\n" \ + " app_locale TEXT NOT NULL DEFAULT 'No Locale',\n" \ + " app_label TEXT,\n" \ + " app_icon TEXT,\n" \ + " PRIMARY KEY(app_id,app_locale)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO \ + "CREATE TABLE IF NOT EXISTS package_app_icon_section_info (\n" \ + " app_id TEXT NOT NULL,\n" \ + " app_icon TEXT,\n" \ + " app_icon_section TEXT NOT NULL,\n" \ + " app_icon_resolution TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id,app_icon_section,app_icon_resolution)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO \ + "CREATE TABLE IF NOT EXISTS package_app_image_info (\n" \ + " app_id TEXT NOT NULL,\n" \ + " app_locale TEXT DEFAULT 'No Locale',\n" \ + " app_image_section TEXT NOT NULL,\n" \ + " app_image TEXT,\n" \ + " PRIMARY KEY(app_id,app_image_section)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL \ + "CREATE TABLE IF NOT EXISTS package_app_app_control (\n" \ + " app_id TEXT NOT NULL,\n" \ + " app_control TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id,app_control)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY \ + "CREATE TABLE IF NOT EXISTS package_app_app_category (\n" \ + " app_id TEXT NOT NULL,\n" \ + " category TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id,category)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA \ + "CREATE TABLE IF NOT EXISTS package_app_app_metadata (\n" \ + " app_id TEXT NOT NULL,\n" \ + " md_key TEXT NOT NULL,\n" \ + " md_value TEXT,\n" \ + " PRIMARY KEY(app_id, md_key, md_value)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION \ + "CREATE TABLE IF NOT EXISTS package_app_app_permission (\n" \ + " app_id TEXT NOT NULL,\n" \ + " pm_type TEXT NOT NULL,\n" \ + " pm_value TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id, pm_type, pm_value)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED \ + "CREATE TABLE IF NOT EXISTS package_app_share_allowed (\n" \ + " app_id TEXT NOT NULL,\n" \ + " data_share_path TEXT NOT NULL,\n" \ + " data_share_allowed TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id,data_share_path,data_share_allowed)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST \ + "CREATE TABLE IF NOT EXISTS package_app_share_request (\n" \ + " app_id TEXT NOT NULL,\n" \ + " data_share_request TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id,data_share_request)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL \ + "CREATE TABLE IF NOT EXISTS package_app_data_control (\n" \ + " app_id TEXT NOT NULL,\n" \ + " providerid TEXT NOT NULL,\n" \ + " access TEXT NOT NULL,\n" \ + " type TEXT NOT NULL,\n" \ + " trusted TEXT NOT NULL,\n" \ + " PRIMARY KEY(providerid, type)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID \ + "CREATE TABLE IF NOT EXISTS package_app_info_for_uid (\n" \ + " app_id TEXT NOT NULL,\n" \ + " uid INTEGER NOT NULL,\n" \ + " is_disabled TEXT NOT NULL DEFAULT 'false',\n" \ + " is_splash_screen_enabled TEXT NOT NULL,\n" \ + " PRIMARY KEY(app_id, uid)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +#define QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID \ + "CREATE TRIGGER IF NOT EXISTS update_package_appinfo_for_uid\n"\ + "AFTER UPDATE ON package_app_info_for_uid\n" \ + "BEGIN\n" \ + " DELETE FROM package_app_info_for_uid\n"\ + " WHERE is_splash_screen_enabled=\n" \ + " (SELECT package_app_info.app_splash_screen_display FROM\n" \ + " package_app_info, package_app_info_for_uid\n" \ + " WHERE package_app_info.app_id=OLD.app_id) AND is_disabled='false';\n" \ + "END;" + +#define QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN \ + "CREATE TABLE IF NOT EXISTS package_app_splash_screen (\n" \ + " app_id TEXT NOT NULL,\n" \ + " src TEXT NOT NULL,\n" \ + " type TEXT NOT NULL,\n" \ + " orientation TEXT NOT NULL,\n" \ + " indicatordisplay TEXT,\n" \ + " operation TEXT NOT NULL,\n" \ + " color_depth TEXT NOT NULL DEFAULT '24',\n" \ + " PRIMARY KEY(app_id, orientation, operation)\n" \ + " FOREIGN KEY(app_id)\n" \ + " REFERENCES package_app_info(app_id) ON DELETE CASCADE)" + +/* FIXME: duplicated at pkgmgrinfo_db.c */ +#define QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO \ + "CREATE TABLE IF NOT EXISTS package_cert_index_info (\n" \ + " cert_info TEXT UNIQUE,\n" \ + " cert_id INTEGER PRIMARY KEY,\n" \ + " cert_ref_count INTEGER NOT NULL)" + +#define QUERY_CREATE_TABLE_PACKAGE_CERT_INFO \ + "CREATE TABLE IF NOT EXISTS package_cert_info (\n" \ + " package TEXT PRIMARY KEY,\n" \ + " package_count INTEGER,\n" \ + " author_root_cert INTEGER,\n" \ + " author_im_cert INTEGER,\n" \ + " author_signer_cert INTEGER,\n" \ + " dist_root_cert INTEGER,\n" \ + " dist_im_cert INTEGER,\n" \ + " dist_signer_cert INTEGER,\n" \ + " dist2_root_cert INTEGER,\n" \ + " dist2_im_cert INTEGER,\n" \ + " dist2_signer_cert INTEGER)" + +#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO \ + "CREATE TRIGGER IF NOT EXISTS update_cert_info\n" \ + "AFTER UPDATE ON package_cert_info\n" \ + "WHEN (NEW.package_count = 0)\n" \ + "BEGIN\n" \ + " DELETE FROM package_cert_info WHERE package=OLD.package;\n" \ + "END;" + +#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2 \ + "CREATE TRIGGER IF NOT EXISTS update_cert_info2\n" \ + "AFTER UPDATE ON package_cert_info\n" \ + "WHEN (NEW.package_count = OLD.package_count + 1)\n" \ + "BEGIN\n" \ + " UPDATE package_cert_index_info SET\n" \ + " cert_ref_count = cert_ref_count - 1\n" \ + " WHERE cert_id = OLD.author_root_cert\n" \ + " OR cert_id = OLD.author_im_cert\n" \ + " OR cert_id = OLD.author_signer_cert\n" \ + " OR cert_id = OLD.dist_root_cert\n" \ + " OR cert_id = OLD.dist_im_cert\n" \ + " OR cert_id = OLD.dist_signer_cert\n" \ + " OR cert_id = OLD.dist2_root_cert\n" \ + " OR cert_id = OLD.dist2_im_cert\n" \ + " OR cert_id = OLD.dist2_signer_cert;\n" \ + "END;" + +#define QUERY_CREATE_TRIGGER_DELETE_CERT_INFO \ + "CREATE TRIGGER IF NOT EXISTS delete_cert_info\n" \ + "AFTER DELETE ON package_cert_info\n" \ + "BEGIN\n" \ + " UPDATE package_cert_index_info SET\n" \ + " cert_ref_count = cert_ref_count - 1\n" \ + " WHERE cert_id = OLD.author_root_cert\n" \ + " OR cert_id = OLD.author_im_cert\n" \ + " OR cert_id = OLD.author_signer_cert\n" \ + " OR cert_id = OLD.dist_root_cert\n" \ + " OR cert_id = OLD.dist_im_cert\n" \ + " OR cert_id = OLD.dist_signer_cert\n" \ + " OR cert_id = OLD.dist2_root_cert\n" \ + " OR cert_id = OLD.dist2_im_cert\n" \ + " OR cert_id = OLD.dist2_signer_cert;\n" \ + "END;" + +#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO \ + "CREATE TRIGGER IF NOT EXISTS update_cert_index_info\n" \ + "AFTER UPDATE ON package_cert_index_info\n" \ + "WHEN ((SELECT cert_ref_count FROM package_cert_index_info\n" \ + " WHERE cert_id = OLD.cert_id) = 0)\n"\ + "BEGIN\n" \ + " DELETE FROM package_cert_index_info WHERE cert_id = OLD.cert_id;\n" \ + "END;" + +#endif /* __PKGMGR_PARSER_DB_QUERIES_H__ */ diff --git a/src/pkgmgrinfo_certinfo.c b/src/pkgmgrinfo_certinfo.c index 7535c93..c626b51 100644 --- a/src/pkgmgrinfo_certinfo.c +++ b/src/pkgmgrinfo_certinfo.c @@ -603,6 +603,8 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha return PMINFO_R_EINVAL; } + _check_create_cert_db(); + /* open unified global cert db */ dbpath = getUserPkgCertDBPathUID(GLOBAL_USER); if (dbpath == NULL) @@ -623,8 +625,6 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha return PMINFO_R_ERROR; } - _check_create_cert_db(db); - if (_pkginfo_save_cert_index_info(db, info->cert_info)) { _LOGE("failed to save cert index info, rollback now"); sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL); diff --git a/src/pkgmgrinfo_db.c b/src/pkgmgrinfo_db.c index 7af6e71..27ea246 100644 --- a/src/pkgmgrinfo_db.c +++ b/src/pkgmgrinfo_db.c @@ -19,78 +19,7 @@ #include "pkgmgrinfo_debug.h" #include "pkgmgrinfo_private.h" #include "pkgmgr_parser.h" - -#define QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO \ - "CREATE TABLE IF NOT EXISTS package_cert_index_info( " \ - " cert_info TEXT UNIQUE, " \ - " cert_id INTEGER PRIMARY KEY, " \ - " cert_ref_count INTEGER NOT NULL)" - -#define QUERY_CREATE_TABLE_PACKAGE_CERT_INFO \ - "CREATE TABLE IF NOT EXISTS package_cert_info( " \ - " package TEXT PRIMARY KEY, " \ - " package_count INTEGER, " \ - " author_root_cert INTEGER, " \ - " author_im_cert INTEGER, " \ - " author_signer_cert INTEGER, " \ - " dist_root_cert INTEGER, " \ - " dist_im_cert INTEGER, " \ - " dist_signer_cert INTEGER, " \ - " dist2_root_cert INTEGER, " \ - " dist2_im_cert INTEGER, " \ - " dist2_signer_cert INTEGER)" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO \ - "CREATE TRIGGER IF NOT EXISTS update_cert_info " \ - "AFTER UPDATE ON package_cert_info " \ - "WHEN (NEW.package_count = 0) " \ - "BEGIN" \ - " DELETE FROM package_cert_info WHERE package=OLD.package;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2 \ - "CREATE TRIGGER IF NOT EXISTS update_cert_info2 " \ - "AFTER UPDATE ON package_cert_info " \ - "WHEN (NEW.package_count = OLD.package_count + 1) " \ - "BEGIN" \ - " UPDATE package_cert_index_info SET" \ - " cert_ref_count = cert_ref_count - 1" \ - " WHERE cert_id = OLD.author_root_cert" \ - " OR cert_id = OLD.author_im_cert" \ - " OR cert_id = OLD.author_signer_cert" \ - " OR cert_id = OLD.dist_root_cert" \ - " OR cert_id = OLD.dist_im_cert" \ - " OR cert_id = OLD.dist_signer_cert" \ - " OR cert_id = OLD.dist2_root_cert" \ - " OR cert_id = OLD.dist2_im_cert" \ - " OR cert_id = OLD.dist2_signer_cert;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_DELETE_CERT_INFO \ - "CREATE TRIGGER IF NOT EXISTS delete_cert_info " \ - "AFTER DELETE ON package_cert_info " \ - "BEGIN" \ - " UPDATE package_cert_index_info SET" \ - " cert_ref_count = cert_ref_count - 1" \ - " WHERE cert_id = OLD.author_root_cert" \ - " OR cert_id = OLD.author_im_cert" \ - " OR cert_id = OLD.author_signer_cert" \ - " OR cert_id = OLD.dist_root_cert" \ - " OR cert_id = OLD.dist_im_cert" \ - " OR cert_id = OLD.dist_signer_cert" \ - " OR cert_id = OLD.dist2_root_cert" \ - " OR cert_id = OLD.dist2_im_cert" \ - " OR cert_id = OLD.dist2_signer_cert;" \ - "END;" - -#define QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO \ - "CREATE TRIGGER IF NOT EXISTS update_cert_index_info " \ - "AFTER UPDATE ON package_cert_index_info " \ - "WHEN ((SELECT cert_ref_count FROM package_cert_index_info " \ - " WHERE cert_id = OLD.cert_id) = 0) "\ - "BEGIN" \ - " DELETE FROM package_cert_index_info WHERE cert_id = OLD.cert_id;" \ - "END;" +#include "pkgmgr_parser_db.h" __thread db_handle manifest_db; __thread db_handle cert_db; @@ -214,41 +143,11 @@ static int __attach_and_create_view(sqlite3 *handle, const char *db, const char return SQLITE_OK; } -static int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data) +int _check_create_cert_db(void) { - char *error_message = NULL; - int ret = sqlite3_exec(db, query, callback, data, &error_message); - if (SQLITE_OK != ret) { - _LOGE("Don't execute query = %s error message = %s ret = %d\n", query, - error_message, ret); - sqlite3_free(error_message); - return -1; - } - sqlite3_free(error_message); - return 0; + return pkgmgr_parser_initialize_cert_db(); } -int _check_create_cert_db(sqlite3 *certdb) -{ - int ret = 0; - ret = __exec_db_query(certdb, QUERY_CREATE_TABLE_PACKAGE_CERT_INDEX_INFO, NULL, NULL); - if (ret < 0) - return ret; - ret = __exec_db_query(certdb, QUERY_CREATE_TABLE_PACKAGE_CERT_INFO, NULL, NULL); - if (ret < 0) - return ret; - ret = __exec_db_query(certdb, QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO, NULL, NULL); - if (ret < 0) - return ret; - ret = __exec_db_query(certdb, QUERY_CREATE_TRIGGER_UPDATE_CERT_INFO2, NULL, NULL); - if (ret < 0) - return ret; - ret = __exec_db_query(certdb, QUERY_CREATE_TRIGGER_DELETE_CERT_INFO, NULL, NULL); - if (ret < 0) - return ret; - ret = __exec_db_query(certdb, QUERY_CREATE_TRIGGER_UPDATE_CERT_INDEX_INFO, NULL, NULL); - return ret; -} static gid_t _get_gid(const char *name) { char buf[BUFSIZE]; diff --git a/src/pkgmgrinfo_private.h b/src/pkgmgrinfo_private.h index 7bc8a40..5e2a58a 100644 --- a/src/pkgmgrinfo_private.h +++ b/src/pkgmgrinfo_private.h @@ -237,7 +237,7 @@ pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const c pkgmgrinfo_pkginfo_filter_prop_range _pminfo_pkginfo_convert_to_prop_range(const char *property); -int _check_create_cert_db(sqlite3 *certdb); +int _check_create_cert_db(void); int __close_manifest_db(void); int __open_manifest_db(uid_t uid, bool readonly); int __close_cert_db(void); -- 2.7.4