Fix batch remove API 13/137013/8 accepted/tizen/unified/20170706.193248 submit/tizen/20170704.080931 submit/tizen/20170705.022417 submit/tizen/20170707.004637
authorMinje Ahn <minje.ahn@samsung.com>
Tue, 4 Jul 2017 05:50:10 +0000 (14:50 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Tue, 4 Jul 2017 07:37:59 +0000 (16:37 +0900)
1. Modified to check all storages.
2. Only the modified storage(root path) will be announced.

Change-Id: I5b594df4d3ab46e4891960017a0cb7de0a67f7a8
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
include/media_info_private.h
include_product/media_info_private.h
packaging/capi-content-media-content.spec
src/media_info.c

index b0faebc..81bf41a 100755 (executable)
@@ -646,11 +646,15 @@ typedef struct _media_content_cb_data {
 #define SELECT_MEDIA_STORAGE_ID_BY_ID          "SELECT storage_uuid FROM "DB_TABLE_MEDIA_VIEW" WHERE media_uuid='%q'"
 
 /* Delete */
-#define DELETE_MEDIA_FROM_MEDIA_BATCH  "DELETE FROM  '%s' WHERE %s"
+#define DELETE_MEDIA_FROM_MEDIA_BATCH  "DELETE FROM  '%s' WHERE %s AND storage_type = %d"
 #define DELETE_PLAYLIST_FROM_PLAYLIST          "DELETE FROM "DB_TABLE_PLAYLIST" WHERE playlist_id=%d"
 #define DELETE_TAG_FROM_TAG                            "DELETE FROM "DB_TABLE_TAG" WHERE tag_id=%d"
 #define DELETE_BOOKMARK_FROM_BOOKMARK  "DELETE FROM "DB_TABLE_BOOKMARK" WHERE bookmark_id=%d"
 
+/*For batch remove*/
+#define SELECT_STORAGE_BY_FILTER       "SELECT DISTINCT storage_uuid, storage_type FROM "DB_TABLE_MEDIA_VIEW" WHERE %s"
+#define SELECT_THUMBNAIL_BY_FILTER     "SELECT DISTINCT thumbnail_path FROM '%s' WHERE %s AND storage_type = %d"
+
 /* Storage*/
 #define SELECT_STORAGE_COUNT                           "SELECT COUNT(*) FROM "DB_TABLE_STORAGE" WHERE validity=1"
 #define SELECT_STORAGE_LIST                                    "SELECT * FROM "DB_TABLE_STORAGE" WHERE validity=1"
index 4468bba..b89764a 100755 (executable)
@@ -816,11 +816,15 @@ typedef struct _media_content_scan_cb_data_v2 {
 #define SELECT_MEDIA_STORAGE_ID_BY_ID          "SELECT storage_uuid FROM "DB_TABLE_MEDIA_VIEW" WHERE media_uuid='%q'"
 
 /* Delete */
-#define DELETE_MEDIA_FROM_MEDIA_BATCH  "DELETE FROM  '%s' WHERE %s"
+#define DELETE_MEDIA_FROM_MEDIA_BATCH  "DELETE FROM  '%s' WHERE %s AND storage_type = %d"
 #define DELETE_PLAYLIST_FROM_PLAYLIST          "DELETE FROM "DB_TABLE_PLAYLIST" WHERE playlist_id=%d"
 #define DELETE_TAG_FROM_TAG                            "DELETE FROM "DB_TABLE_TAG" WHERE tag_id=%d"
 #define DELETE_BOOKMARK_FROM_BOOKMARK  "DELETE FROM "DB_TABLE_BOOKMARK" WHERE bookmark_id=%d"
 
+/*For batch remove*/
+#define SELECT_STORAGE_BY_FILTER       "SELECT DISTINCT storage_uuid, storage_type FROM "DB_TABLE_MEDIA_VIEW" WHERE %s"
+#define SELECT_THUMBNAIL_BY_FILTER     "SELECT DISTINCT thumbnail_path FROM '%s' WHERE %s AND storage_type = %d"
+
 /* Storage*/
 #define SELECT_STORAGE_COUNT                           "SELECT COUNT(*) FROM "DB_TABLE_STORAGE" WHERE validity=1"
 #define SELECT_STORAGE_LIST                                    "SELECT * FROM "DB_TABLE_STORAGE" WHERE validity=1"
index 1b2ba1e..fdf19ee 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-content-media-content
 Summary:    A Media content library in Tizen Native API
-Version:    0.3.17
+Version:    0.3.18
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index f33f679..b933baa 100755 (executable)
@@ -25,7 +25,6 @@
 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data);
 static void __media_info_thumbnail_completed_cb(int error, const char *path, void *user_data);
 static void __media_info_face_completed_cb(int error, const int face_count, void *user_data);
-static bool __media_info_delete_batch_cb(media_info_h media, void *user_data);
 static int __media_info_insert_batch(media_batch_insert_e insert_type, const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data);
 static int __media_info_set_str_data(media_info_h media, media_info_item_e data_type, const char *str_data);
 
@@ -143,18 +142,6 @@ static void __media_info_face_completed_cb(int error, const int face_count, void
        return;
 }
 
-static bool __media_info_delete_batch_cb(media_info_h media, void *user_data)
-{
-       char *thumb_path = NULL;
-       GArray *thumb_list = (GArray *)user_data;
-
-       media_info_get_thumbnail_path(media, &thumb_path);
-       if (STRING_VALID(thumb_path))
-               g_array_append_val(thumb_list, thumb_path);
-
-       return true;
-}
-
 static int __media_info_insert_batch(media_batch_insert_e insert_type, const char **path_array,
                                        unsigned int array_length,
                                        media_insert_completed_cb completed_cb,
@@ -250,6 +237,76 @@ static int __media_info_insert_batch(media_batch_insert_e insert_type, const cha
        return ret;
 }
 
+int __media_info_get_storage_list_to_remove(const char *condition_query, GArray **storage_list)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+       char *query_string = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       media_content_retv_if(storage_list == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+       media_content_retv_if(!STRING_VALID(condition_query), MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+
+       query_string = sqlite3_mprintf(SELECT_STORAGE_BY_FILTER, condition_query);
+
+       ret = _content_query_prepare(&stmt, query_string, NULL, NULL);
+       SQLITE3_SAFE_FREE(query_string);
+
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       *storage_list = g_array_new(FALSE, FALSE, sizeof(media_storage_s *));
+
+       while (sqlite3_step(stmt) == SQLITE_ROW) {
+               media_storage_s *storage = (media_storage_s*)calloc(1, sizeof(media_storage_s));
+               if (storage == NULL) {
+                       media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
+                       SQLITE3_FINALIZE(stmt);
+                       return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
+               }
+               storage->storage_id = g_strdup((const char *)sqlite3_column_text(stmt, 0));
+               storage->storage_type = (int)sqlite3_column_int(stmt, 1);
+
+               g_array_append_val(*storage_list, storage);
+       }
+
+       SQLITE3_FINALIZE(stmt);
+
+       return ret;
+}
+
+int __media_info_get_thumbnail_to_remove(const char *condition_query, const char *storage_id, int storage_type, GArray **thumb_list)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+       char *query_string = NULL;
+       char *thumbnail_path = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       media_content_retv_if(thumb_list == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+       media_content_retv_if(storage_id == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+       media_content_retv_if(!STRING_VALID(condition_query), MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+
+       query_string = sqlite3_mprintf(SELECT_THUMBNAIL_BY_FILTER, storage_id, condition_query, storage_type);
+
+       ret = _content_query_prepare(&stmt, query_string, NULL, NULL);
+       SQLITE3_SAFE_FREE(query_string);
+
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       *thumb_list = g_array_new(FALSE, FALSE, sizeof(char*));
+
+       while (sqlite3_step(stmt) == SQLITE_ROW) {
+               thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 0));
+               if (STRING_VALID(thumbnail_path)) {
+                       g_array_append_val(*thumb_list, thumbnail_path);
+               } else {
+                       SAFE_FREE(thumbnail_path);
+               }
+       }
+
+       SQLITE3_FINALIZE(stmt);
+
+       return ret;
+}
+
 void _media_info_item_get_detail(sqlite3_stmt* stmt, media_info_h media)
 {
        media_info_s *_media = (media_info_s*)media;
@@ -732,15 +789,38 @@ static int __media_info_release_thumb_list(GArray *thumb_list)
        return MEDIA_CONTENT_ERROR_NONE;
 }
 
+static int __media_info_release_storage_list(GArray *storage_list)
+{
+       int i = 0;
+       int list_len = 0;
+       media_storage_s *storage = NULL;
+
+       if (storage_list != NULL) {
+               list_len = storage_list->len;
+               for (i = 0; i < list_len; i++) {
+                       storage = g_array_index(storage_list, media_storage_s *, 0);
+                       g_array_remove_index(storage_list, 0);
+                       SAFE_FREE(storage->storage_id);
+                       SAFE_FREE(storage);
+               }
+
+               g_array_free(storage_list, FALSE);
+       }
+
+       return MEDIA_CONTENT_ERROR_NONE;
+}
+
 int media_info_delete_batch_from_db(filter_h filter)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
-
        char *query_string = NULL;
        filter_s *_filter = NULL;
        attribute_h attr;
        char *condition_query = NULL;
+       GArray *storage_list = NULL;
        GArray *thumb_list = NULL;
+       int idx = 0;
+       media_storage_s *storage_item = NULL;
 
        media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid filter");
 
@@ -748,59 +828,57 @@ int media_info_delete_batch_from_db(filter_h filter)
 
        media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid condition");
 
-       thumb_list = g_array_new(FALSE, FALSE, sizeof(char*));
-
-       /* Delete thumbnail of each item */
-       ret = _media_db_get_group_item(NULL, filter, __media_info_delete_batch_cb, thumb_list, MEDIA_GROUP_NONE);
-       media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "Failed to get thumbnail path list");
-
        attr = _content_get_attirbute_handle();
 
        ret = _media_filter_attribute_generate(attr, filter, &condition_query);
+       media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "Invalid condition");
+
+       ret = __media_info_get_storage_list_to_remove(condition_query, &storage_list);
        if (ret != MEDIA_CONTENT_ERROR_NONE) {
-               __media_info_release_thumb_list(thumb_list);
+               SAFE_FREE(condition_query);
+               __media_info_release_storage_list(storage_list);
+
                return ret;
        }
 
-       if (STRING_VALID(condition_query)) {
-               if (_filter->storage_id == NULL) {
-                       /*FIX ME*/
-                       query_string = sqlite3_mprintf(DELETE_MEDIA_FROM_MEDIA_BATCH, DB_TABLE_MEDIA, condition_query);
-               } else {
-                       query_string = sqlite3_mprintf(DELETE_MEDIA_FROM_MEDIA_BATCH, _filter->storage_id, condition_query);
+       for (idx = 0; idx < storage_list->len; idx++) {
+               storage_item = g_array_index(storage_list, media_storage_s *, idx);
+               /*media_content_debug("storage_id[%s] storage_type[%d]", storage_item->storage_id, storage_item->storage_type);*/
+
+               ret = __media_info_get_thumbnail_to_remove(condition_query, storage_item->storage_id, storage_item->storage_type, &thumb_list);
+               if (ret != MEDIA_CONTENT_ERROR_NONE) {
+                       SAFE_FREE(condition_query);
+                       __media_info_release_storage_list(storage_list);
+                       __media_info_release_thumb_list(thumb_list);
+
+                       return ret;
                }
-       } else {
-               SAFE_FREE(condition_query);
-               __media_info_release_thumb_list(thumb_list);
 
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
+               query_string = sqlite3_mprintf(DELETE_MEDIA_FROM_MEDIA_BATCH, storage_item->storage_id, condition_query, storage_item->storage_type);
 
-       ret = _content_query_sql(query_string);
-       if (ret == MEDIA_CONTENT_ERROR_NONE) {
-               /* Send notification for this
-                       In this case, send noti for internal storage and external storage
-               */
-               media_content_debug("Batch deletion is successfull. Send notification for this");
-               if (_filter->storage_id != NULL) {
-                       char *storage_path = NULL;
-                       media_svc_get_storage_path(_content_get_db_handle(), _filter->storage_id, &storage_path);
-                       if (STRING_VALID(storage_path))
-                               media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, storage_path, -1, NULL, NULL);
+               ret = _content_query_sql(query_string);
+               SQLITE3_SAFE_FREE(query_string);
 
-                       SAFE_FREE(storage_path);
-               } else {
-                       /*FIX ME*/
-                       media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_INTERNAL, -1, NULL, NULL);
-                       media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_SDCARD, -1, NULL, NULL);
-               }
+               if (ret == MEDIA_CONTENT_ERROR_NONE) {
+                       media_content_debug("Batch deletion succeeded. Send notification for this");
+                       if (storage_item->storage_type == MEDIA_CONTENT_STORAGE_INTERNAL) {
+                               media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_INTERNAL, -1, NULL, NULL);
+                       } else {
+                               char *storage_path = NULL;
+                               media_svc_get_storage_path(_content_get_db_handle(), storage_item->storage_id, &storage_path);
+                               if (STRING_VALID(storage_path))
+                                       media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, storage_path, -1, NULL, NULL);
 
-               __media_info_delete_thumb_from_list(thumb_list);
+                               SAFE_FREE(storage_path);
+                       }
+                       __media_info_delete_thumb_from_list(thumb_list);
+               }
                __media_info_release_thumb_list(thumb_list);
+
        }
 
        SAFE_FREE(condition_query);
-       SQLITE3_SAFE_FREE(query_string);
+       __media_info_release_storage_list(storage_list);
 
        return ret;
 }