From: Minje Ahn Date: Thu, 25 Jul 2019 02:22:42 +0000 (+0900) Subject: Add for upgrade from 5.0 to 5.5 X-Git-Tag: submit/tizen/20190805.013641~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c73e3385a3e73544742060a6f552e7f3c9cfffc;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add for upgrade from 5.0 to 5.5 Change-Id: I72ad8f0aeafaeeda01f08114fc5a05c90be4345d Signed-off-by: Minje Ahn --- diff --git a/include/media_controller_private.h b/include/media_controller_private.h index 79fb844..a20743b 100644 --- a/include/media_controller_private.h +++ b/include/media_controller_private.h @@ -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" diff --git a/svc/include/media_controller_db_util.h b/svc/include/media_controller_db_util.h index a155a6a..bed09aa 100644 --- a/svc/include/media_controller_db_util.h +++ b/svc/include/media_controller_db_util.h @@ -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__*/ diff --git a/svc/media_controller_db_util.c b/svc/media_controller_db_util.c index 4a2b75d..f0027c4 100644 --- a/svc/media_controller_db_util.c +++ b/svc/media_controller_db_util.c @@ -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 diff --git a/svc/media_controller_svc.c b/svc/media_controller_svc.c index 6e21a8f..f48f517 100644 --- a/svc/media_controller_svc.c +++ b/svc/media_controller_svc.c @@ -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 */