Add to remove and update information for dead application on database 67/199467/5
authorjiyong.min <jiyong.min@samsung.com>
Tue, 12 Feb 2019 00:57:40 +0000 (09:57 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Wed, 13 Feb 2019 06:21:24 +0000 (15:21 +0900)
Change-Id: I0dfe7eef25ae2552d87dd3dd5a1aeea926071065

packaging/capi-media-controller.spec
svc/include/media_controller_db_util.h [changed mode: 0755->0644]
svc/media_controller_db_util.c [changed mode: 0755->0644]
svc/media_controller_svc.c

index f92d49c..c78bafb 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.1.81
+Version:    0.1.82
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
old mode 100755 (executable)
new mode 100644 (file)
index de03b57..441a180
@@ -29,6 +29,7 @@ int mc_db_util_update_db(void *handle, const char *sql_str);
 int mc_db_util_delete_whole_server_tables(void *handle);
 int mc_db_util_init_latest_server_table(void *handle);
 int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size);
+int mc_db_util_remove_dead_application(uid_t uid, const char *app_id, mc_priv_type_e priv_type);
 
 
 #endif /*__TIZEN_MEDIA_CONTROLLER_DB_UTIL_H__*/
old mode 100755 (executable)
new mode 100644 (file)
index 6dd04a5..9b25533
 
 #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)
 {
@@ -87,7 +91,7 @@ static int __mc_db_util_delete_server_table(void *handle, const char *server_nam
        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)
@@ -174,6 +178,63 @@ static int __mc_create_playlist_table(sqlite3 *handle)
        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, };
@@ -506,7 +567,7 @@ int mc_db_util_init_latest_server_table(void *handle)
        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);
@@ -517,28 +578,25 @@ int mc_db_util_init_latest_server_table(void *handle)
        }
 
        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");
 
@@ -623,7 +681,7 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size)
                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) {
@@ -697,13 +755,13 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size)
                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) {
@@ -747,3 +805,38 @@ ERROR:
 
        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;
+}
index 0226dde..10738b2 100644 (file)
@@ -44,6 +44,7 @@ typedef struct {
 } mc_list_user_data;
 
 typedef struct {
+       uid_t uid;
        int pid;
        mc_priv_type_e priv_type;
        char *app_id;
@@ -381,6 +382,7 @@ static int _mc_service_add_connection(GList **connected_list, mc_comm_msg_s *req
                return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
        }
 
+       data->uid = request_msg->uid;
        data->pid = request_msg->pid;
        data->priv_type = request_msg->priv_type;
        data->app_id = g_strdup(request_msg->msg);
@@ -514,7 +516,9 @@ static int _mc_service_app_dead_handler(int pid, void *data)
                if (app_data->pid == pid) {
                        mc_secure_debug("app_dead(appid) : %s", app_data->app_id);
 
-                       /* TODO: Delete application from database */
+                       /* Delete and update information of dead application on database */
+                       if (MEDIA_CONTROLLER_ERROR_NONE != mc_db_util_remove_dead_application(app_data->uid, app_data->app_id, app_data->priv_type))
+                               mc_secure_error("Fail to remove dead application");
 
                        /* Sends notification for deactivated server via dbus */
                        if (app_data->priv_type == MC_PRIV_TYPE_SERVER) {