Add for upgrade from 5.0 to 5.5 00/210800/11
authorMinje Ahn <minje.ahn@samsung.com>
Thu, 25 Jul 2019 02:22:42 +0000 (11:22 +0900)
committerMinje ahn <minje.ahn@samsung.com>
Tue, 30 Jul 2019 06:30:37 +0000 (06:30 +0000)
Change-Id: I72ad8f0aeafaeeda01f08114fc5a05c90be4345d
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
include/media_controller_private.h
svc/include/media_controller_db_util.h
svc/media_controller_db_util.c
svc/media_controller_svc.c

index 79fb844e7dd8925901927c3a8bb3ae027587399b..a20743b3bd35c312a8091a2ad222688dd98f3dc4 100644 (file)
@@ -119,7 +119,9 @@ extern "C" {
 #define MC_DB_NAME ".media_controller.db"
 
 /* USER VERSION */
-#define MC_DB_LATEST_VERSION   5
+#define MC_DB_USER_V1  1               /* Tizen 5.5 */
+
+#define MC_DB_LATEST_VERSION   MC_DB_USER_V1
 
 /* TABLE */
 #define MC_DB_TABLE_APP_LIST           "app_list"
index a155a6a07d97e11cc7f5be801b880647e67e4c54..bed09aa015242bbafb5c516912c2c7d31f4bb7e2 100644 (file)
@@ -35,5 +35,9 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size);
 int mc_db_add_application(uid_t uid, const char *app_id, mc_priv_type_e priv_type);
 int mc_db_remove_application(uid_t uid, const char *app_id, mc_priv_type_e priv_type);
 
+gboolean mc_db_util_is_exist_table(sqlite3 *handle, const char *table_name);
+int mc_db_util_get_latest_server(sqlite3 *handle, char **latest_server_name);
+int mc_db_util_drop_table(sqlite3 *handle, const char *table_name);
+int mc_db_util_migration(sqlite3 *handle, const char *table_name);
 
 #endif /*__TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_DB_UTIL_H__*/
index 4a2b75d5f33f6ae4b32535219b051f40f9af2b7b..f0027c4d66a42ca8aae03f1a789a1d00d9873d38 100644 (file)
@@ -196,7 +196,7 @@ static int __mc_db_deactivate_server(sqlite3 *db_handle, const char *app_id)
        mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid app_id");
 
        /* Update server_state to deactivated, if the server is latest.
-        * Drop the table of server_name, if it is not latest.
+        * Remove server from app_list, if it is not latest.
         */
        if (__mc_db_is_latest(db_handle, app_id)) {
                ret = __mc_update_latest_server_info_to_db(db_handle, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED);
@@ -845,14 +845,12 @@ int mc_db_remove_application(uid_t uid, const char *app_id, const mc_priv_type_e
                return ret;
        }
 
-       /* Delete application from server/client list */
+       /* Delete application from app list */
        ret = __mc_db_delete_from_list(db_handle, app_id, priv_type);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                mc_secure_error("__mc_db_delete_from_list error : %d", ret);
 
-       /* Drop server table to remove application information if it is not latest.
-        * Update application information if it is latest.
-        */
+       /* Update application information if it is server */
        if (priv_type == MC_PRIV_TYPE_SERVER) {
                ret = __mc_db_deactivate_server(db_handle, app_id);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
@@ -863,3 +861,109 @@ int mc_db_remove_application(uid_t uid, const char *app_id, const mc_priv_type_e
 
        return ret;
 }
+
+gboolean mc_db_util_is_exist_table(sqlite3 *handle, const char *table_name)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       int result = 0;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(!table_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "table_name is NULL");
+
+       sql_str = sqlite3_mprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name=%Q", table_name);
+       mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
+
+       ret = sqlite3_prepare_v2(handle, sql_str, strlen(sql_str), &stmt, NULL);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(SQLITE_OK != ret, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "prepare error [%s]", sqlite3_errmsg(handle));
+
+       if (sqlite3_step(stmt) == SQLITE_ROW)
+               result = sqlite3_column_int(stmt, 0);
+
+       SQLITE3_FINALIZE(stmt);
+
+       return (gboolean)result;
+}
+
+int mc_db_util_get_latest_server(sqlite3 *handle, char **latest_server_name)
+{
+       /* NOTICE : This function for upgrade tizen 5.0 to 5.5 only. */
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(!latest_server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "latest_server_name is NULL");
+
+       sql_str = sqlite3_mprintf("SELECT server_name FROM %q", MC_DB_TABLE_LATEST_SERVER);
+       mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
+
+       ret = sqlite3_prepare_v2(handle, sql_str, strlen(sql_str), &stmt, NULL);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(SQLITE_OK != ret, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "prepare error [%s]", sqlite3_errmsg(handle));
+
+       if (sqlite3_step(stmt) == SQLITE_ROW)
+               *latest_server_name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
+
+       SQLITE3_FINALIZE(stmt);
+
+       return ret;
+}
+
+int mc_db_util_drop_table(sqlite3 *handle, const char *table_name)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(!MC_STRING_VALID(table_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "table_name is NULL");
+
+       sql_str = sqlite3_mprintf("DROP TABLE %Q", table_name);
+       ret = mc_db_util_update_db(handle, sql_str);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Drop table failed [%d]", ret);
+
+       return ret;
+}
+
+int mc_db_util_migration(sqlite3 *handle, const char *table_name)
+{
+       /* NOTICE : This function for upgrade tizen 5.0 to 5.5 only. */
+       /* If latest_server is exists, insert into new table and drop {latest_server_name} table */
+       /* Insert into server_meta */
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(!MC_STRING_VALID(table_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "table_name is NULL");
+
+       /* Insert into latest_server */
+       sql_str = sqlite3_mprintf("INSERT INTO %q VALUES (%Q)", MC_DB_TABLE_LATEST_SERVER, table_name);
+       ret = mc_db_util_update_db(handle, sql_str);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Insert into latest_server failed [%d]", ret);
+
+       /* Insert into server_info */
+       sql_str = sqlite3_mprintf("INSERT INTO %q(name, playback_position, playlist_name, playlist_index, playback_content_type, age_rating, shuffle_mode, repeat_mode, icon_uri, ability_decided, ability_supported) \
+               SELECT server_name, playback_position, playlist_name, playlist_index, playback_content_type, age_rating, shuffle_mode, repeat_mode, icon_uri, ability_decided, ability_supported FROM %Q", MC_DB_TABLE_SERVER_INFO, table_name);
+
+       ret = mc_db_util_update_db(handle, sql_str);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Insert into server_info failed [%d]", ret);
+
+       /* Insert into server_meta */
+       sql_str = sqlite3_mprintf("INSERT INTO %q(name, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture) \
+               SELECT %Q, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture FROM %Q", MC_DB_TABLE_LATEST_META, table_name, table_name);
+
+       ret = mc_db_util_update_db(handle, sql_str);
+       SQLITE3_SAFE_FREE(sql_str);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Insert into latest_meta failed [%d]", ret);
+
+       /* Drop {table_name} table */
+       ret = mc_db_util_drop_table(handle, table_name);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_drop_table failed [%d]", ret);
+
+       return ret;
+}
\ No newline at end of file
index 6e21a8f7ccc349ae01830fbc709248d78db3c4c5..f48f517685d814a98ddb3e7b559b197410ef189e 100644 (file)
@@ -291,6 +291,8 @@ static int _mc_service_reset_db(uid_t uid)
 {
        int res = MEDIA_CONTROLLER_ERROR_NONE;
        int version = 0;
+       gboolean is_exist = FALSE;
+       char *latest_server_name = NULL;
        sqlite3 *db_handle = NULL;
 
        /* Connect media controller DB*/
@@ -300,6 +302,37 @@ static int _mc_service_reset_db(uid_t uid)
        /* Create tables */
        res = mc_db_util_get_user_version(db_handle, &version);
        if (res == MEDIA_CONTROLLER_ERROR_NONE && version == 0) {
+               /* Notice : User version of tizen 5.0 is 0. So, need to check table count. */
+               is_exist = mc_db_util_is_exist_table(db_handle, "server_list");
+               if (is_exist) {
+                       mc_info("Upgrade tables");
+                       /* Get latest server name */
+                       res = mc_db_util_get_latest_server(db_handle, &latest_server_name);
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_get_latest_server failed [%d]", res);
+
+                       /* Drop old tables */
+                       res = mc_db_util_drop_table(db_handle, "server_list");
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_drop_table failed [%d]", res);
+
+                       res = mc_db_util_drop_table(db_handle, "client_list");
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_drop_table failed [%d]", res);
+
+                       res = mc_db_util_drop_table(db_handle, "server_playlist");
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_drop_table failed [%d]", res);
+
+                       res = mc_db_util_drop_table(db_handle, "latest_server");
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_drop_table failed [%d]", res);
+
+               } else {
+                       mc_info("Create tables");
+               }
+
+               /* Create tables */
                res = mc_db_util_create_tables(db_handle);
                if (res != MEDIA_CONTROLLER_ERROR_NONE)
                        mc_error("mc_db_util_create_tables failed [%d]", res);
@@ -307,6 +340,14 @@ static int _mc_service_reset_db(uid_t uid)
                res = mc_db_util_set_user_version(db_handle);
                if (res != MEDIA_CONTROLLER_ERROR_NONE)
                        mc_error("mc_db_util_set_user_version failed [%d]", res);
+
+               if (MC_STRING_VALID(latest_server_name)) {
+                       res = mc_db_util_migration(db_handle, latest_server_name);
+                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("mc_db_util_migration failed [%d]", res);
+
+                       MC_SAFE_FREE(latest_server_name);
+               }
        }
 
        /* Delete app_list */