From bdc7708b447fd2b9d914b8ed4325e4e9a1832757 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 4 Jul 2017 14:50:10 +0900 Subject: [PATCH] Fix batch remove API 1. Modified to check all storages. 2. Only the modified storage(root path) will be announced. Change-Id: I5b594df4d3ab46e4891960017a0cb7de0a67f7a8 Signed-off-by: Minje Ahn --- include/media_info_private.h | 6 +- include_product/media_info_private.h | 6 +- packaging/capi-content-media-content.spec | 2 +- src/media_info.c | 180 +++++++++++++++++++++--------- 4 files changed, 140 insertions(+), 54 deletions(-) diff --git a/include/media_info_private.h b/include/media_info_private.h index b0faebc..81bf41a 100755 --- a/include/media_info_private.h +++ b/include/media_info_private.h @@ -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" diff --git a/include_product/media_info_private.h b/include_product/media_info_private.h index 4468bba..b89764a 100755 --- a/include_product/media_info_private.h +++ b/include_product/media_info_private.h @@ -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" diff --git a/packaging/capi-content-media-content.spec b/packaging/capi-content-media-content.spec index 1b2ba1e..fdf19ee 100755 --- a/packaging/capi-content-media-content.spec +++ b/packaging/capi-content-media-content.spec @@ -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 diff --git a/src/media_info.c b/src/media_info.c index f33f679..b933baa 100755 --- a/src/media_info.c +++ b/src/media_info.c @@ -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; } -- 2.7.4