return tzplatform_mkpath(TZ_SYS_DB, ".pkgmgr_cert.db");
}
+#define DB_VERSION_PATH SYSCONFDIR "/package-manager/pkg_db_version.txt"
static int __set_db_version(sqlite3 *db)
{
- static const char query_raw[] = "PRAGMA user_version=";
- char query[BUFSIZE];
int ret;
- int version;
+ FILE *fp = NULL;
+ char version[PKG_STRING_LEN_MAX] = { 0 };
+ char *query = NULL;
+
+ fp = fopen(DB_VERSION_PATH, "r");
+ retvm_if(fp == NULL, -1, "Failed to open db version file");
+ if (fgets(version, sizeof(version), fp) == NULL) {
+ _LOGE("Failed to get version information");
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
- version = atoi(TIZEN_MAJOR_VER) * 10000 + atoi(TIZEN_MINOR_VER) * 100 +
- atoi(TIZEN_PATCH_VER);
- snprintf(query, sizeof(query), "%s%d", query_raw, version);
+ query = sqlite3_mprintf("PRAGMA user_version=%Q", version);
+ if (!query) {
+ _LOGE("Out of memory");
+ return -1;
+ }
ret = sqlite3_exec(db, query, NULL, NULL, NULL);
if (ret != SQLITE_OK) {
_LOGE("exec failed: %s", sqlite3_errmsg(db));
+ sqlite3_free(query);
return -1;
}
+ sqlite3_free(query);
return 0;
}
QUERY_CREATE_TABLE_PACKAGE_INFO,
QUERY_CREATE_TABLE_PACKAGE_LOCALIZED_INFO,
QUERY_CREATE_TABLE_PACKAGE_PRIVILEGE_INFO,
+ QUERY_CREATE_TABLE_PACKAGE_APPDEFINED_PRIVILEGE_INFO,
+ QUERY_CREATE_TABLE_PACKAGE_UPDATE_INFO,
QUERY_CREATE_TABLE_PACKAGE_APP_INFO,
QUERY_CREATE_TABLE_PACKAGE_APP_LOCALIZED_INFO,
- QUERY_CREATE_TABLE_PACKAGE_APP_ICON_SECTION_INFO, /* ? */
- QUERY_CREATE_TABLE_PACKAGE_APP_IMAGE_INFO, /* ? */
QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL,
+ QUERY_CREATE_TABLE_PACKAGE_APP_APP_CONTROL_PRIVILEGE,
QUERY_CREATE_TABLE_PACKAGE_APP_APP_CATEGORY,
QUERY_CREATE_TABLE_PACKAGE_APP_APP_METADATA,
- QUERY_CREATE_TABLE_PACKAGE_APP_APP_PERMISSION, /* ? */
- QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, /* ? */
- QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, /* ? */
QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
+ QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
if (ret != SQLITE_OK)
return ret;
+ ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("failed to register busy handler: %s",
+ sqlite3_errmsg(*db));
+ sqlite3_close_v2(*db);
+ return ret;
+ }
+
if (flags & SQLITE_OPEN_CREATE) {
ret = __initialize_db(*db, path, uid);
if (ret) {
- _LOGE("failed to initialize db: %s\n");
+ _LOGE("failed to initialize db: %s", path);
sqlite3_close_v2(*db);
return -1;
}
return ret;
}
- ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
- if (ret != SQLITE_OK) {
- _LOGE("failed to register busy handler: %s",
- sqlite3_errmsg(*db));
- sqlite3_close_v2(*db);
- return ret;
- }
-
return ret;
}
return NULL;
}
+static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
+ appcontrol_x *ac)
+{
+ static const char query[] =
+ "INSERT INTO package_app_app_control_privilege (app_id,"
+ " app_control, privilege) VALUES (?, ?, ?)";
+ int ret;
+ sqlite3_stmt *stmt;
+ int idx;
+ char app_control[BUFSIZE];
+ GList *tmp;
+ char *privilege;
+
+ if (ac == NULL)
+ return 0;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ for (tmp = ac->privileges; tmp; tmp = tmp->next) {
+ privilege = (char *)tmp->data;
+ if (privilege == NULL || !strlen(privilege))
+ continue;
+
+ idx = 1;
+ snprintf(app_control, sizeof(app_control), "%s|%s|%s",
+ ac->operation ? (strlen(ac->operation) > 0 ?
+ ac->operation : "NULL") : "NULL",
+ ac->uri ? (strlen(ac->uri) > 0 ?
+ ac->uri : "NULL") : "NULL",
+ ac->mime ? (strlen(ac->mime) > 0 ?
+ ac->mime : "NULL") : "NULL");
+ __BIND_TEXT(db, stmt, idx++, appid);
+ __BIND_TEXT(db, stmt, idx++, app_control);
+ __BIND_TEXT(db, stmt, idx++, privilege);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
+ sqlite3_reset(stmt);
+ }
+
+ sqlite3_finalize(stmt);
+
+ return 0;
+}
+
static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
{
static const char query[] =
- "INSERT INTO package_app_app_control (app_id, app_control) "
- "VALUES (?, ?)";
+ "INSERT INTO package_app_app_control (app_id, app_control,"
+ " visibility) "
+ "VALUES (?, ?, ?)";
int ret;
sqlite3_stmt *stmt;
int idx;
ac->mime : "NULL") : "NULL");
__BIND_TEXT(db, stmt, idx++, app->appid);
__BIND_TEXT(db, stmt, idx++, app_control);
+ __BIND_TEXT(db, stmt, idx++, ac->visibility);
ret = sqlite3_step(stmt);
if (ret != SQLITE_DONE) {
return -1;
}
+ if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
sqlite3_reset(stmt);
}
return 0;
}
+static int __insert_app_data_control_privilege_info(sqlite3 *db,
+ datacontrol_x *datacontrol)
+{
+ static const char query[] =
+ "INSERT INTO package_app_data_control_privilege (providerid,"
+ " privilege, type) VALUES (?, ?, ?)";
+
+ int ret;
+ sqlite3_stmt *stmt;
+ int idx;
+ GList *privileges;
+ char *priv;
+
+ if (datacontrol == NULL)
+ return 0;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ for (privileges = datacontrol->privileges; privileges;
+ privileges = privileges->next) {
+ priv = (char *)privileges->data;
+ if (priv == NULL)
+ continue;
+
+ idx = 1;
+ __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
+ __BIND_TEXT(db, stmt, idx++, priv);
+ __BIND_TEXT(db, stmt, idx++, datacontrol->type);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
+ sqlite3_reset(stmt);
+ }
+
+ sqlite3_finalize(stmt);
+ return 0;
+}
+
static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
{
static const char query[] =
return -1;
}
+ if (dc->privileges &&
+ __insert_app_data_control_privilege_info(db, dc)) {
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
sqlite3_reset(stmt);
}
GList *list = NULL;
splashscreen_x *ss;
+ if (splashscreens == NULL)
+ return NULL;
+
g_list_foreach(splashscreens,
__find_appcontrol_splashscreen_with_dpi, &list);
g_list_foreach(splashscreens,
return list;
}
-static int __insert_splashscreen_info(sqlite3 *db, application_x *app)
+static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
+ GList *ss_list)
{
static const char query[] =
"INSERT INTO package_app_splash_screen (app_id, src, type,"
int idx;
GList *tmp;
splashscreen_x *ss;
- GList *ss_list;
if (app->splashscreens == NULL)
return 0;
- ss_list = __find_splashscreens(app->splashscreens);
if (ss_list == NULL)
return 0;
sqlite3_reset(stmt);
- if (strcasecmp(app->mainapp, "true")) {
+ if (strcasecmp(app->mainapp, "true") == 0) {
if (__insert_mainapp_localized_info(db, app, locale,
label, icon))
_LOGE("insert mainapp localized info failed");
return 0;
}
+static int __insert_package_appdefined_privilege_info(sqlite3 *db,
+ manifest_x *mfx)
+{
+ static const char query[] =
+ "INSERT INTO package_appdefined_privilege_info "
+ "(package, privilege, license, type) "
+ "VALUES (?, ?, ?, ?)";
+ int ret;
+ sqlite3_stmt *stmt;
+ int idx;
+ GList *tmp;
+ appdefined_privilege_x *priv;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
+ priv = (appdefined_privilege_x *)tmp->data;
+ if (priv == NULL)
+ continue;
+
+ idx = 1;
+ __BIND_TEXT(db, stmt, idx++, mfx->package);
+ __BIND_TEXT(db, stmt, idx++, priv->value);
+ __BIND_TEXT(db, stmt, idx++, priv->license);
+ __BIND_TEXT(db, stmt, idx++, priv->type);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+ sqlite3_reset(stmt);
+ }
+
+ sqlite3_finalize(stmt);
+
+ return 0;
+}
+
/* _PRODUCT_LAUNCHING_ENHANCED_
* app->indicatordisplay, app->portraitimg, app->landscapeimg,
* app->guestmode_appstatus
" app_effective_appid, app_splash_screen_display,"
" app_package_system, app_removable,"
" app_package_installed_time, app_support_ambient,"
- " app_setup_appid) "
+ " app_external_path, app_setup_appid) "
"VALUES (?, ?, "
" ?, LOWER(?), ?, LOWER(?), LOWER(?),"
" LOWER(?), LOWER(?), ?,"
" ?, LOWER(?),"
" LOWER(?), LOWER(?),"
" ?, LOWER(?),"
- " ?)";
+ " ?, ?)";
int ret;
sqlite3_stmt *stmt;
int idx;
application_x *app;
int bg_category;
const char *effective_appid;
+ GList *ss_list;
ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
if (ret != SQLITE_OK) {
__BIND_TEXT(db, stmt, idx++, mfx->api_version);
__BIND_TEXT(db, stmt, idx++, effective_appid);
__BIND_TEXT(db, stmt, idx++,
- __get_bool(app->splash_screen_display, false));
+ __get_bool(app->splash_screen_display, true));
__BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
__BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
__BIND_TEXT(db, stmt, idx++, mfx->installed_time);
__BIND_TEXT(db, stmt, idx++,
__get_bool(app->support_ambient, false));
+ __BIND_TEXT(db, stmt, idx++, mfx->external_path);
__BIND_TEXT(db, stmt, idx++, app->setup_appid);
ret = sqlite3_step(stmt);
sqlite3_finalize(stmt);
return -1;
}
- if (__insert_splashscreen_info(db, app)) {
+ ss_list = __find_splashscreens(app->splashscreens);
+ if (__insert_splashscreen_info(db, app, ss_list)) {
+ g_list_free(ss_list);
sqlite3_finalize(stmt);
return -1;
}
+ g_list_free(ss_list);
if (__insert_app_localized_info(db, app)) {
sqlite3_finalize(stmt);
return -1;
return 0;
}
+static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
+{
+ static const char query[] =
+ "INSERT INTO package_update_info (package, update_version) "
+ "VALUES (?, ?)";
+ int ret;
+ int idx;
+ sqlite3_stmt *stmt;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ idx = 1;
+ __BIND_TEXT(db, stmt, idx++, mfx->package);
+ __BIND_TEXT(db, stmt, idx, mfx->version);
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+ sqlite3_finalize(stmt);
+
+ return 0;
+}
+
static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
{
static const char query[] =
sqlite3_finalize(stmt);
+ if (__insert_package_update_info(db, mfx))
+ return -1;
if (__insert_package_localized_info(db, mfx))
return -1;
if (__insert_application_info(db, mfx))
return -1;
if (__insert_package_privilege_info(db, mfx))
return -1;
+ if (__insert_package_appdefined_privilege_info(db, mfx))
+ return -1;
return 0;
}
return PM_PARSER_R_EINVAL;
}
- dbpath = __get_parser_db_path(uid);
+ dbpath = __get_parser_db_path(GLOBAL_USER);
- ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
+ ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
if (ret != SQLITE_OK) {
_LOGE("open db failed: %d", ret);
return PM_PARSER_R_ERROR;
return PM_PARSER_R_EINVAL;
}
- dbpath = __get_parser_db_path(uid);
+ dbpath = __get_parser_db_path(GLOBAL_USER);
- ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
+ ret = __open_db(GLOBAL_USER, dbpath, &db, SQLITE_OPEN_READWRITE);
if (ret != SQLITE_OK) {
_LOGE("open db failed: %d", ret);
return PM_PARSER_R_ERROR;
label);
}
+static int __set_app_icon(sqlite3 *db, const char *appid, const char *icon_path)
+{
+ static const char query[] =
+ "UPDATE package_app_localized_info SET app_icon=? "
+ "WHERE app_id=? AND app_icon IS NOT NULL";
+ int ret;
+ sqlite3_stmt *stmt;
+ int idx = 1;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ __BIND_TEXT(db, stmt, idx++, icon_path);
+ __BIND_TEXT(db, stmt, idx++, appid);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
+ sqlite3_finalize(stmt);
+
+ return 0;
+}
+
+API int pkgmgr_parser_update_app_icon_info_in_usr_db(const char *appid,
+ uid_t uid, const char *icon_path)
+{
+ int ret;
+ const char *dbpath;
+ sqlite3 *db;
+
+ if (appid == NULL) {
+ _LOGE("invalid parameter");
+ return PM_PARSER_R_EINVAL;
+ }
+
+ dbpath = __get_parser_db_path(uid);
+
+ ret = __open_db(uid, dbpath, &db, SQLITE_OPEN_READWRITE);
+ if (ret != SQLITE_OK) {
+ _LOGE("open db failed: %d", ret);
+ return PM_PARSER_R_ERROR;
+ }
+
+ __BEGIN_TRANSACTION(db);
+ __DO_TRANSACTION(db, __set_app_icon(db, appid, icon_path));
+ __END_TRANSACTION(db);
+
+ sqlite3_close_v2(db);
+
+ return PM_PARSER_R_OK;
+}
+
+API int pkgmgr_parser_update_app_icon_info_in_db(const char *appid,
+ const char *icon_path)
+{
+ return pkgmgr_parser_update_app_icon_info_in_usr_db(appid, __getuid(),
+ icon_path);
+}
+
static int __set_tep_path(sqlite3 *db, const char *pkgid, const char *tep_path)
{
static const char query[] =