summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung-jae Park <nicesj.park@samsung.com>2013-11-02 00:53:23 +0900
committerSung-jae Park <nicesj.park@samsung.com>2013-11-02 00:53:23 +0900
commit24e3ee79eb8d7d23eb91236e67c162273960fa69 (patch)
treeb3193525b78716e922b5a6c509dc4d7eb3d9e39d
parent9e82fff9e71a7259a010862de975bffe9cee66a0 (diff)
downloadshortcut-24e3ee79eb8d7d23eb91236e67c162273960fa69.tar.gz
shortcut-24e3ee79eb8d7d23eb91236e67c162273960fa69.tar.bz2
shortcut-24e3ee79eb8d7d23eb91236e67c162273960fa69.zip
Add version table
Change-Id: I27025bcb250fd5ca33e6e0edd8e3a9a346286bf1
-rw-r--r--pkgmgr_shortcut/src/service_register.c197
1 files changed, 132 insertions, 65 deletions
diff --git a/pkgmgr_shortcut/src/service_register.c b/pkgmgr_shortcut/src/service_register.c
index b4a3e2a..83864ef 100644
--- a/pkgmgr_shortcut/src/service_register.c
+++ b/pkgmgr_shortcut/src/service_register.c
@@ -144,6 +144,111 @@ static inline int commit_transaction(void)
sqlite3_finalize(stmt);
return EXIT_SUCCESS;
}
+
+static void db_create_version(void)
+{
+ static const char *ddl = "CREATE TABLE version (version INTEGER)";
+ char *err;
+
+ if (sqlite3_exec(s_info.handle, ddl, NULL, NULL, &err) != SQLITE_OK) {
+ ErrPrint("Failed to execute the DDL (%s)\n", err);
+ return;
+ }
+
+ if (sqlite3_changes(s_info.handle) == 0) {
+ ErrPrint("No changes to DB\n");
+ }
+}
+
+static int set_version(int version)
+{
+ static const char *dml = "INSERT INTO version (version) VALUES (?)";
+ sqlite3_stmt *stmt;
+ int ret;
+
+ ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ ErrPrint("Failed to prepare the initial DML(%s)\n", sqlite3_errmsg(s_info.handle));
+ return -EIO;
+ }
+
+ if (sqlite3_bind_int(stmt, 1, version) != SQLITE_OK) {
+ ErrPrint("Failed to bind a id(%s)\n", sqlite3_errmsg(s_info.handle));
+ ret = -EIO;
+ goto out;
+ }
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ ErrPrint("Failed to execute the DML for version: %d\n", ret);
+ ret = -EIO;
+ } else {
+ ret = 0;
+ }
+
+out:
+ sqlite3_reset(stmt);
+ sqlite3_clear_bindings(stmt);
+ sqlite3_finalize(stmt);
+ return ret;
+}
+
+static int update_version(int version)
+{
+ static const char *dml = "UPDATE version SET version = ?";
+ sqlite3_stmt *stmt;
+ int ret;
+
+ ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ ErrPrint("Failed to prepare the initial DML(%s)\n", sqlite3_errmsg(s_info.handle));
+ return -EIO;
+ }
+
+ if (sqlite3_bind_int(stmt, 1, version) != SQLITE_OK) {
+ ErrPrint("Failed to bind a version: %s\n", sqlite3_errmsg(s_info.handle));
+ ret = -EIO;
+ goto out;
+ }
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ ErrPrint("Failed to execute DML: %d\n", ret);
+ ret = -EIO;
+ } else {
+ ret = 0;
+ }
+
+out:
+ sqlite3_reset(stmt);
+ sqlite3_clear_bindings(stmt);
+ sqlite3_finalize(stmt);
+ return ret;
+}
+
+static int get_version(void)
+{
+ static const char *dml = "SELECT version FROM version";
+ sqlite3_stmt *stmt;
+ int ret;
+
+ ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ return -ENOSYS;
+ }
+
+ if (sqlite3_step(stmt) != SQLITE_ROW) {
+ ret = -ENOENT;
+ } else {
+ ret = sqlite3_column_int(stmt, 0);
+ }
+
+ sqlite3_reset(stmt);
+ sqlite3_clear_bindings(stmt);
+ sqlite3_finalize(stmt);
+ return ret;
+}
+
static void db_create_table(void)
{
char *err;
@@ -175,6 +280,8 @@ static void db_create_table(void)
if (sqlite3_changes(s_info.handle) == 0) {
ErrPrint("No changes to DB\n");
}
+
+ db_create_version();
}
static void alter_shortcut_name(void)
@@ -247,74 +354,36 @@ out:
return ret;
}
-static int do_upgrade_db_schema(void)
+static void do_upgrade_db_schema(void)
{
- static const char *dml = ".schema";
- sqlite3_stmt *stmt;
- const char *schema;
- char *table;
- char *ddl;
- int ret;
- int bufsz;
-
- ret = sqlite3_prepare_v2(s_info.handle, dml, -1, &stmt, NULL);
- if (ret != SQLITE_OK) {
- ErrPrint("Failed to prepare the initial DML(%s)\n", sqlite3_errmsg(s_info.handle));
- return -EIO;
- }
+ int version;
- ret = 0;
- while (sqlite3_step(stmt) == SQLITE_ROW) {
- schema = (const char *)sqlite3_column_text(stmt, 0);
- if (!schema || !strlen(schema)) {
- continue;
- }
+ version = get_version();
- bufsz = strlen(schema) + 1;
-
- table = malloc(bufsz);
- if (!table) {
- ErrPrint("Heap: %s\n", strerror(errno));
- ret = -ENOMEM;
- break;
+ switch (version) {
+ case -ENOSYS:
+ db_create_version();
+ /* Need to create version table */
+ case -ENOENT:
+ if (set_version(1) < 0) {
+ ErrPrint("Failed to set version\n");
}
-
- ddl = malloc(bufsz);
- if (!ddl) {
- ErrPrint("Heap: %s\n", strerror(errno));
- free(table);
- ret = -ENOMEM;
- break;
- }
-
- if (sscanf(schema, "CREATE TABLE %s (%[^)])", table, ddl) != 2) {
- free(table);
- free(ddl);
- ErrPrint("Invalid syntax: (%s)\n", schema);
- continue;
+ /* Need to set version */
+ alter_shortcut_name();
+ alter_shortcut_service();
+ case 1:
+ break;
+ default:
+ /* Need to update version */
+ DbgPrint("Old version: %d\n", version);
+ if (update_version(1) < 0) {
+ ErrPrint("Failed to update version\n");
}
- if (!strcmp(table, "shortcut_name")) {
- if (!strstr(ddl, "pkgid")) {
- alter_shortcut_name();
- }
- } else if (!strcmp(table, "shortcut_service")) {
- if (!strstr(ddl, "pkgid")) {
- alter_shortcut_service();
- }
- } else {
- ErrPrint("Unknown table: %s\n", table);
- }
-
- free(table);
- free(ddl);
- ret++;
+ alter_shortcut_name();
+ alter_shortcut_service();
+ break;
}
-
- sqlite3_reset(stmt);
- sqlite3_clear_bindings(stmt);
- sqlite3_finalize(stmt);
- return ret;
}
@@ -1003,8 +1072,7 @@ int PKGMGR_PARSER_PLUGIN_PRE_INSTALL(const char *appid)
ret = do_uninstall(appid);
if (ret < 0) {
ErrPrint("Failed to remove record: %s\n", appid);
- rollback_transaction();
- return ret;
+ /* Keep going */
}
commit_transaction();
return 0;
@@ -1037,8 +1105,7 @@ int PKGMGR_PARSER_PLUGIN_PRE_UPGRADE(const char *appid)
ret = do_uninstall(appid);
if (ret < 0) {
ErrPrint("Failed to remove a record: %s\n", appid);
- rollback_transaction();
- return ret;
+ /* Keep going */
}
commit_transaction();
return 0;