#define MC_DB_TRIGGER_PLAYLIST "cleanup_playlist"
#define DB_SELECT_ALL_SERVER_LIST_EXCEPT_LATEST "SELECT name FROM SQLITE_MASTER WHERE type='table' AND (name != '%q') AND (name NOT IN (SELECT server_name FROM "MC_DB_TABLE_LATEST_SERVER"));"
+#define DB_DELETE_FROM_SERVER_LIST "DELETE FROM "MC_DB_TABLE_SERVER_LIST" WHERE (server_name = '%q');"
+#define DB_DELETE_FROM_CLIENT_LIST "DELETE FROM "MC_DB_TABLE_CLIENT_LIST" WHERE (client_name = '%q');"
+#define DB_UPDATE_STATE_PLAYBACK "UPDATE '%q' SET server_state=%d, playback_state=%d;"
+#define DB_DROP_TABLE "DROP TABLE IF EXISTS '%q';"
static int __mc_db_util_busy_handler(void *pData, int count)
{
mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
mc_retvm_if(server_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is NULL");
- sql_str = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", server_name);
+ sql_str = sqlite3_mprintf(DB_DROP_TABLE, server_name);
ret = mc_db_util_update_db(handle, sql_str);
if (MEDIA_CONTROLLER_ERROR_NONE != ret)
return ret;
}
+static int __mc_update_dead_server(void *handle, const char *server_name)
+{
+ int ret = MEDIA_CONTROLLER_ERROR_NONE;
+ sqlite3 *db_handle = (sqlite3 *)handle;
+ char *sql_str = NULL;
+ sqlite3_stmt *stmt = NULL;
+ gboolean is_latest_server = FALSE;
+ const char *latest_server_name;
+
+ mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+ mc_retvm_if(!MC_STRING_VALID(server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is invalid");
+
+ /* Get latest server */
+ 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(db_handle, sql_str, strlen(sql_str), &stmt, NULL);
+ if (SQLITE_OK != ret) {
+ mc_secure_error("prepare error [%s]", sqlite3_errmsg(db_handle));
+ SQLITE3_SAFE_FREE(sql_str);
+ return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+ }
+
+ ret = sqlite3_step(stmt);
+ if (SQLITE_ROW == ret) {
+ /* Get latest server name */
+ latest_server_name = (const char *)sqlite3_column_text(stmt, 0);
+ if (MC_STRING_VALID(latest_server_name)) {
+ mc_secure_debug("latest_server_name: %s", latest_server_name);
+ if (strcmp(server_name, latest_server_name) == 0)
+ is_latest_server = TRUE;
+ } else {
+ mc_secure_warning("invalid latest_server_name: %s", latest_server_name);
+ }
+ }
+
+ SQLITE3_FINALIZE(stmt);
+ SQLITE3_SAFE_FREE(sql_str);
+
+ /* Update server_state to deactivated, if the server is latest.
+ * Drop the table of server_name, if it is not latest.
+ */
+ if (is_latest_server)
+ sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED);
+ else
+ sql_str = sqlite3_mprintf(DB_DROP_TABLE, server_name);
+ mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
+
+ ret = mc_db_util_update_db(handle, sql_str);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+ mc_secure_error("Error mc_db_util_update_db %d", ret);
+
+ SQLITE3_SAFE_FREE(sql_str);
+
+ return ret;
+}
+
static char* __mc_get_db_name(uid_t uid)
{
char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, };
mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
/* Get latest server name */
- sql_str = sqlite3_mprintf("SELECT COUNT(*), server_name FROM '%q';", MC_DB_TABLE_LATEST_SERVER);
+ 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(db_handle, sql_str, strlen(sql_str), &stmt, NULL);
}
ret = sqlite3_step(stmt);
- while (SQLITE_ROW == ret) {
- if (sqlite3_column_int(stmt, 0) == 0) {
- mc_debug("latest_server table does not exist");
- SQLITE3_FINALIZE(stmt);
- SQLITE3_SAFE_FREE(sql_str);
- return MEDIA_CONTROLLER_ERROR_NONE;
- }
- if (MC_STRING_VALID((const char *)sqlite3_column_text(stmt, 1))) {
- latest_server_name = strdup((const char *)sqlite3_column_text(stmt, 1));
- mc_secure_debug("latest_server_name: %s", latest_server_name);
- break;
- }
- ret = sqlite3_step(stmt);
+ if (SQLITE_ROW != ret) {
+ mc_debug("[no record] latest_server does not exist");
+ SQLITE3_FINALIZE(stmt);
+ SQLITE3_SAFE_FREE(sql_str);
+ return MEDIA_CONTROLLER_ERROR_NONE;
+ }
+
+ if (MC_STRING_VALID((const char *)sqlite3_column_text(stmt, 0))) {
+ latest_server_name = strdup((const char *)sqlite3_column_text(stmt, 0));
+ mc_secure_debug("latest_server_name: %s", latest_server_name);
}
SQLITE3_FINALIZE(stmt);
SQLITE3_SAFE_FREE(sql_str);
- mc_retvm_if(latest_server_name == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "latest_server is not exist");
+ mc_retvm_if(latest_server_name == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "latest_server is null");
/* Update server_state and playback_state to 0 */
- sql_str = sqlite3_mprintf("UPDATE '%q' SET server_state=%d, playback_state=%d;", latest_server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED);
+ sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, latest_server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED);
MC_SAFE_FREE(latest_server_name);
mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
mc_safe_strtoi(params[2], &i_value);
mc_safe_strtoi(params[3], &i_value_1);
- sql_str = sqlite3_mprintf("UPDATE '%q' SET server_state=%d, playback_state=%d;", params[1], i_value, i_value_1);
+ sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, params[1], i_value, i_value_1);
} else if (strncmp(MC_DB_CMD_UPDATE_PLAYBACK, params[0], strlen(MC_DB_CMD_UPDATE_PLAYBACK)) == 0) {
if (params[2] == NULL || params[3] == NULL || params[4] == NULL || params[5] == NULL || params[6] == NULL) {
sql_str = sqlite3_mprintf("UPDATE '%q' SET ability_decided=%llu, ability_supported=%llu;", params[1], llu_value, llu_value2);
} else if (strncmp(MC_DB_CMD_REMOVE_SERVER_LIST, params[0], strlen(MC_DB_CMD_REMOVE_SERVER_LIST)) == 0) {
- sql_str = sqlite3_mprintf("DELETE FROM %q WHERE server_name = '%q';", MC_DB_TABLE_SERVER_LIST, params[1]);
+ sql_str = sqlite3_mprintf(DB_DELETE_FROM_SERVER_LIST, params[1]);
} else if (strncmp(MC_DB_CMD_REMOVE_CLIENT_LIST, params[0], strlen(MC_DB_CMD_REMOVE_CLIENT_LIST)) == 0) {
- sql_str = sqlite3_mprintf("DELETE FROM %q WHERE client_name = '%q';", MC_DB_TABLE_CLIENT_LIST, params[1]);
+ sql_str = sqlite3_mprintf(DB_DELETE_FROM_CLIENT_LIST, params[1]);
} else if (strncmp(MC_DB_CMD_REMOVE_SERVER, params[0], strlen(MC_DB_CMD_REMOVE_SERVER)) == 0) {
- sql_str = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", params[1]);
+ sql_str = sqlite3_mprintf(DB_DROP_TABLE, params[1]);
} else if (strncmp(MC_DB_CMD_REMOVE_PLAYLIST, params[0], strlen(MC_DB_CMD_REMOVE_PLAYLIST)) == 0) {
if (params[2] == NULL) {
return ret;
}
+
+int mc_db_util_remove_dead_application(uid_t uid, const char *app_id, const mc_priv_type_e priv_type)
+{
+ int ret = MEDIA_CONTROLLER_ERROR_NONE;
+ char *sql_str = NULL;
+ void* db_handle = NULL;
+
+ mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "app_id is NULL");
+
+ ret = mc_db_util_connect(&db_handle, uid);
+ mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_connect error : %d", ret);
+
+ /* Delete application from server/client list */
+ if (priv_type == MC_PRIV_TYPE_SERVER)
+ sql_str = sqlite3_mprintf(DB_DELETE_FROM_SERVER_LIST, app_id);
+ else
+ sql_str = sqlite3_mprintf(DB_DELETE_FROM_CLIENT_LIST, app_id);
+
+ ret = mc_db_util_update_db(db_handle, sql_str);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+ mc_secure_error("media_db_update_db error : %d", ret);
+
+ /* Drop server table to remove application information if it is not latest.
+ * Update application information if it is latest.
+ */
+ if (priv_type == MC_PRIV_TYPE_SERVER) {
+ ret = __mc_update_dead_server(db_handle, app_id);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+ mc_secure_error("__mc_drop_server_table error : %d", ret);
+ }
+
+ mc_db_util_disconnect(db_handle);
+
+ return ret;
+}