From bda60f13cda4d0efa6f07913f7ef56e0146894fc Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Thu, 22 Jun 2017 11:28:16 +0900 Subject: [PATCH] Add internal Filter APIs to support Csharp Add media_filter_condition_v2 Add media_filter_order_v2 Change-Id: I8fe6d76d973a0c89fa950dd89c4d7df01a6123db Signed-off-by: Minje Ahn --- include/media_content_internal.h | 7 + include/media_info_private.h | 7 + include_product/media_content_internal.h | 7 + include_product/media_info_private.h | 6 + src/media_db.c | 48 ++++-- src/media_filter.c | 267 +++++++++++++++++++++++++++++-- 6 files changed, 316 insertions(+), 26 deletions(-) diff --git a/include/media_content_internal.h b/include/media_content_internal.h index e8d4a3e..1275311 100755 --- a/include/media_content_internal.h +++ b/include/media_content_internal.h @@ -48,6 +48,13 @@ int media_tag_create(media_tag_h *tag); int media_tag_insert_to_db_v2(media_tag_h tag); int media_tag_update_to_db_v2(int tag_id, media_tag_h tag); +/*Filter for C#*/ +int media_filter_set_condition_v2(filter_h filter, const char *condition); +int media_filter_get_condition_v2(filter_h filter, char **condition); +int media_filter_set_order_v2(filter_h filter, const char *order); +int media_filter_get_order_v2(filter_h filter, char **order); + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/include/media_info_private.h b/include/media_info_private.h index 1cba67c..80665a6 100755 --- a/include/media_info_private.h +++ b/include/media_info_private.h @@ -184,6 +184,8 @@ typedef struct _filter_s { media_content_collation_e order_collate_type; int offset; int count; + bool is_full_condition; + bool is_full_order; } filter_s; typedef struct { @@ -763,6 +765,8 @@ int _media_filter_attribute_destory(attribute_h attr); */ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_content_collation_e collate_type, char **generated_condition); +int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_condition); + /** * @internal @@ -783,6 +787,9 @@ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_co int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, char **generated_option); +int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_option); + + #define FONT_COLOR_RESET "\033[0m" #define FONT_COLOR_RED "\033[31m" #define FONT_COLOR_GREEN "\033[32m" diff --git a/include_product/media_content_internal.h b/include_product/media_content_internal.h index e8d4a3e..1275311 100755 --- a/include_product/media_content_internal.h +++ b/include_product/media_content_internal.h @@ -48,6 +48,13 @@ int media_tag_create(media_tag_h *tag); int media_tag_insert_to_db_v2(media_tag_h tag); int media_tag_update_to_db_v2(int tag_id, media_tag_h tag); +/*Filter for C#*/ +int media_filter_set_condition_v2(filter_h filter, const char *condition); +int media_filter_get_condition_v2(filter_h filter, char **condition); +int media_filter_set_order_v2(filter_h filter, const char *order); +int media_filter_get_order_v2(filter_h filter, char **order); + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/include_product/media_info_private.h b/include_product/media_info_private.h index 490c98e..cc4fd07 100755 --- a/include_product/media_info_private.h +++ b/include_product/media_info_private.h @@ -196,6 +196,8 @@ typedef struct _filter_s { media_content_collation_e order_collate_type; int offset; int count; + bool is_full_condition; + bool is_full_order; } filter_s; typedef struct { @@ -992,6 +994,8 @@ int _media_filter_attribute_destory(attribute_h attr); */ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_content_collation_e collate_type, char **generated_condition); +int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_condition); + /** * @internal @@ -1012,6 +1016,8 @@ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_co int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, char **generated_option); +int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_option); + GMutex* _content_get_db_mutex(void); diff --git a/src/media_db.c b/src/media_db.c index cfea9a8..e37b544 100755 --- a/src/media_db.c +++ b/src/media_db.c @@ -208,23 +208,43 @@ static int __media_db_make_query(filter_h filter, attribute_h attr, char *select if (filter != NULL) { _filter = (filter_s*)filter; - if (STRING_VALID(_filter->condition)) { - /*bracket should be added to condition. If application use "OR" condition, F/W restriction condition like "validity=1" is disregared - ex) select path from media where validity=1 and media_type=3 or media_type=1;*/ - char bracket_added_condition[MAX_QUERY_SIZE] = {0, }; - memset(bracket_added_condition, 0x00, sizeof(bracket_added_condition)); - - SAFE_STRLCAT(bracket_added_condition, QUERY_KEYWORD_OPEN_BRACKET, sizeof(bracket_added_condition)); - SAFE_STRLCAT(bracket_added_condition, _filter->condition, sizeof(bracket_added_condition)); + if (_filter->is_full_condition == false) { + /* Process for filter v1 */ + if (STRING_VALID(_filter->condition)) { + /*bracket should be added to condition. If application use "OR" condition, F/W restriction condition like "validity=1" is disregared + ex) select path from media where validity=1 and media_type=3 or media_type=1;*/ + char bracket_added_condition[MAX_QUERY_SIZE] = {0, }; + memset(bracket_added_condition, 0x00, sizeof(bracket_added_condition)); + + SAFE_STRLCAT(bracket_added_condition, QUERY_KEYWORD_OPEN_BRACKET, sizeof(bracket_added_condition)); + SAFE_STRLCAT(bracket_added_condition, _filter->condition, sizeof(bracket_added_condition)); + + ret = _media_filter_attribute_generate(attr, bracket_added_condition, _filter->condition_collate_type, condition_query); + media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret); + } - ret = _media_filter_attribute_generate(attr, bracket_added_condition, _filter->condition_collate_type, condition_query); - media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret); + } else { + /* Process for filter v2 */ + if (STRING_VALID(_filter->condition)) { + ret = _media_filter_attribute_generate_with_full_query(attr, filter, condition_query); + media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret); + } } - ret = _media_filter_attribute_option_generate(attr, filter, option_query); - if (ret != MEDIA_CONTENT_ERROR_NONE) { - SAFE_FREE(*condition_query); - return ret; + if (_filter->is_full_order == false) { + /* Process for filter v1 */ + ret = _media_filter_attribute_option_generate(attr, filter, option_query); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SAFE_FREE(*condition_query); + return ret; + } + } else { + /* Process for filter v2 */ + ret = _media_filter_attribute_option_generate_with_full_query(attr, filter, option_query); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SAFE_FREE(*condition_query); + return ret; + } } if (STRING_VALID(*condition_query)) { diff --git a/src/media_filter.c b/src/media_filter.c index 451e5c3..b9c32c1 100755 --- a/src/media_filter.c +++ b/src/media_filter.c @@ -767,6 +767,75 @@ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_co return ret; } +int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_condition) +{ + unsigned int idx = 0; + GList *token_list = NULL; + int size = 0; + int ret = MEDIA_CONTENT_ERROR_NONE; + int total_str_size = 0; + token_t *token; + filter_s * _filter = NULL; + + media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_DB_FAILED, "DB field mapping table doesn't exist. Check db connection"); + media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter"); + media_content_retvm_if(generated_condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_condition"); + + _filter = (filter_s*)filter; + + media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition"); + + if (__tokenize(&token_list, _filter->condition) < 0) { + media_content_error("INVALID_PARAMETER(0x%08x):Invalid the condition", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + return MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + for (idx = 0; idx < g_list_length(token_list); idx++) { + token = (token_t*)g_list_nth_data(token_list, idx); + + if (token->type == UNKNOWN_TYPE) { + char *replace_str = __media_filter_replace_attr(attr, token->str); + if (STRING_VALID(replace_str)) { + SAFE_FREE(token->str); + token->str = replace_str; + } + } + + total_str_size += strlen(token->str)+1; + /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */ + } + + /* make the statment */ + /*COLLATE_STR_SIZE is to give a margin - Add : +2 */ + size = total_str_size + COLLATE_STR_SIZE + 1; + *generated_condition = (char*)calloc(size, sizeof(char)); + + SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_OPEN_BRACKET, size); + + for (idx = 0; idx < g_list_length(token_list); idx++) { + token = (token_t*)g_list_nth_data(token_list, idx); + + if ((token != NULL) && STRING_VALID(token->str)) { + SAFE_STRLCAT(*generated_condition, token->str, size); + SAFE_STRLCAT(*generated_condition, SPACE, size); + + SAFE_FREE(token->str); + SAFE_FREE(token); + } + } + + SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_BRACKET, size); + + media_content_sec_debug("Condition : %s", *generated_condition); + + if (token_list != NULL) { + g_list_free(token_list); + token_list = NULL; + } + + return ret; +} + int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, char **generated_option) { int ret = MEDIA_CONTENT_ERROR_NONE; @@ -863,13 +932,90 @@ int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, c SAFE_STRLCAT(option_query, condition, sizeof(option_query)); if (STRING_VALID(option_query)) - *generated_option = strdup(option_query); + *generated_option = g_strdup(option_query); else *generated_option = NULL; return ret; } +int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_option) +{ + unsigned int idx = 0; + GList *token_list = NULL; + int ret = MEDIA_CONTENT_ERROR_NONE; + token_t *token; + filter_s * _filter = NULL; + char query[DEFAULT_QUERY_SIZE] = {0, }; + char option[DEFAULT_QUERY_SIZE] = {0, }; + + media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr"); + media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter"); + media_content_retvm_if(generated_option == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_option"); + + _filter = (filter_s*)filter; + + /* Order by*/ + if (STRING_VALID(_filter->order_keyword)) { + if (__tokenize_attribute(&token_list, _filter->order_keyword) < 0) { + media_content_error("INVALID_PARAMETER(0x%08x):Invalid the order", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + return MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + for (idx = 0; idx < g_list_length(token_list); idx++) { + token = (token_t*)g_list_nth_data(token_list, idx); + + if (token->type == UNKNOWN_TYPE) { + char *replace_str = __media_filter_replace_attr(attr, token->str); + if (STRING_VALID(replace_str)) { + SAFE_FREE(token->str); + token->str = replace_str; + } + } + } + + memset(query, 0, sizeof(query)); + + /* make the statment */ + SAFE_STRLCAT(query, QUERY_KEYWORD_ORDER_BY, sizeof(query)); + SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query)); + + for (idx = 0; idx < g_list_length(token_list); idx++) { + token = (token_t*)g_list_nth_data(token_list, idx); + + if ((token != NULL) && STRING_VALID(token->str)) { + SAFE_STRLCAT(query, token->str, sizeof(query)); + SAFE_STRLCAT(query, SPACE, sizeof(query)); + + SAFE_FREE(token->str); + SAFE_FREE(token); + } + } + + if (token_list != NULL) { + g_list_free(token_list); + token_list = NULL; + } + } + + /* offset */ + SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query)); + + memset(option, 0, sizeof(option)); + snprintf(option, sizeof(option), "%s %d, %d", QUERY_KEYWORD_LIMIT, _filter->offset, _filter->count); + SAFE_STRLCAT(query, option, sizeof(query)); + + if (STRING_VALID(query)) { + *generated_option = g_strdup(query); + media_content_sec_debug("Option : %s", *generated_option); + } else { + *generated_option = NULL; + } + + return ret; +} + + int media_filter_create(filter_h *filter) { int ret = MEDIA_CONTENT_ERROR_NONE; @@ -887,6 +1033,8 @@ int media_filter_create(filter_h *filter) _filter->order_collate_type = MEDIA_CONTENT_COLLATE_DEFAULT; _filter->offset = -1; _filter->count = -1; + _filter->is_full_condition = false; + _filter->is_full_order = false; *filter = (filter_h)_filter; @@ -936,6 +1084,9 @@ int media_filter_set_condition(filter_h filter, const char *condition, media_con if ((_filter != NULL) && STRING_VALID(condition) && ((collate_type >= MEDIA_CONTENT_COLLATE_DEFAULT) && (collate_type <= MEDIA_CONTENT_COLLATE_LOCALIZED))) { + + _filter->is_full_condition = false; + if (STRING_VALID(_filter->condition)) SAFE_FREE(_filter->condition); @@ -966,18 +1117,16 @@ int media_filter_set_order(filter_h filter, media_content_order_e order_type, co if ((_filter != NULL) && STRING_VALID(order_keyword) && ((order_type == MEDIA_CONTENT_ORDER_ASC) || (order_type == MEDIA_CONTENT_ORDER_DESC)) && ((collate_type >= MEDIA_CONTENT_COLLATE_DEFAULT) && (collate_type <= MEDIA_CONTENT_COLLATE_LOCALIZED))) { + + _filter->is_full_order = false; + SAFE_FREE(_filter->order_keyword); - if (STRING_VALID(order_keyword)) { - _filter->order_keyword = strdup(order_keyword); - media_content_retvm_if(_filter->order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + _filter->order_keyword = strdup(order_keyword); + media_content_retvm_if(_filter->order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - _filter->order_type = order_type; - _filter->order_collate_type = collate_type; - } else { - media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); - ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; - } + _filter->order_type = order_type; + _filter->order_collate_type = collate_type; } else { media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; @@ -1029,7 +1178,7 @@ int media_filter_get_condition(filter_h filter, char **condition, media_content_ filter_s *_filter = (filter_s*)filter; if (_filter) { - if (STRING_VALID(_filter->condition)) { + if (STRING_VALID(_filter->condition) && _filter->is_full_condition == false) { char new_condition[MAX_QUERY_SIZE] = {0, }; memset(new_condition, 0, sizeof(new_condition)); ret = _media_content_replace_path_in_condition(_filter->condition, new_condition, FALSE); @@ -1056,7 +1205,7 @@ int media_filter_get_order(filter_h filter, media_content_order_e* order_type, c filter_s *_filter = (filter_s*)filter; if (_filter) { - if (STRING_VALID(_filter->order_keyword)) { + if (STRING_VALID(_filter->order_keyword) && _filter->is_full_order == false) { *order_keyword = strdup(_filter->order_keyword); media_content_retvm_if(*order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); } else { @@ -1092,3 +1241,97 @@ int media_filter_get_storage(filter_h filter, char **storage_id) return ret; } + +int media_filter_set_condition_v2(filter_h filter, const char *condition) +{ + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_s *_filter = (filter_s*)filter; + + if ((_filter != NULL) && STRING_VALID(condition)) { + _filter->is_full_condition = true; + + if (STRING_VALID(_filter->condition)) + SAFE_FREE(_filter->condition); + + char new_condition[MAX_QUERY_SIZE] = {0, }; + memset(new_condition, 0, sizeof(new_condition)); + ret = _media_content_replace_path_in_condition(condition, new_condition, TRUE); + media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed"); + + _filter->condition = strdup(new_condition); + media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + + media_content_sec_debug("Condition string : %s", _filter->condition); + } else { + media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + return ret; +} + +int media_filter_get_condition_v2(filter_h filter, char **condition) +{ + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_s *_filter = (filter_s*)filter; + + if (_filter) { + if (STRING_VALID(_filter->condition) && _filter->is_full_condition == true) { + char new_condition[MAX_QUERY_SIZE] = {0, }; + memset(new_condition, 0, sizeof(new_condition)); + ret = _media_content_replace_path_in_condition(_filter->condition, new_condition, FALSE); + media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed"); + + *condition = strdup(new_condition); + media_content_retvm_if(*condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + } else { + *condition = NULL; + } + } else { + media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + return ret; +} + +int media_filter_set_order_v2(filter_h filter, const char *order) +{ + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_s *_filter = (filter_s*)filter; + + if ((_filter != NULL) && STRING_VALID(order)) { + _filter->is_full_order = true; + + SAFE_FREE(_filter->order_keyword); + + _filter->order_keyword = strdup(order); + media_content_retvm_if(_filter->order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + } else { + media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + return ret; +} + +int media_filter_get_order_v2(filter_h filter, char **order) +{ + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_s *_filter = (filter_s*)filter; + + if (_filter) { + if (STRING_VALID(_filter->order_keyword) && _filter->is_full_order == true) { + *order = strdup(_filter->order_keyword); + media_content_retvm_if(*order == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + } else { + *order = NULL; + } + } else { + media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER); + ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER; + } + + return ret; +} + -- 2.7.4