X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmedia_filter.c;h=29e023ad20f29a43108a60b6a598d78b32457da6;hb=bb176dbaf91fa60ad4f08a3760adfcd84654af85;hp=0197debef13bf8a8a376929d9f24e9f478208140;hpb=5851b37c23f2c8562951c9159672128173711cea;p=platform%2Fcore%2Fapi%2Fmedia-content.git diff --git a/src/media_filter.c b/src/media_filter.c index 0197deb..29e023a 100755 --- a/src/media_filter.c +++ b/src/media_filter.c @@ -39,10 +39,6 @@ typedef struct _token_t { char *str; } token_t; - -#define MAX_LEFT_VALUE 512 -#define SPACE_LEN 1 -#define SPACE " " #define UNKNOWN_TYPE 1000 #define STRING_TYPE 100 @@ -697,20 +693,26 @@ int _media_filter_attribute_destory(attribute_h attr) return ret; } -int _media_filter_attribute_generate(attribute_h attr, char *condition, media_content_collation_e collate_type, char **generated_condition) +int _media_filter_attribute_generate(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; + char tmp_condition[MAX_QUERY_SIZE] = {0, }; - media_content_retvm_if(condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition"); - media_content_retvm_if(generated_condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_condition"); 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"); - if (__tokenize(&token_list, condition) < 0) { + _filter = (filter_s*)filter; + + media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition"); + media_content_retvm_if(_filter->condition_collate_type < MEDIA_CONTENT_COLLATE_DEFAULT || + _filter->condition_collate_type > MEDIA_CONTENT_COLLATE_LOCALIZED, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition collate"); + + 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; } @@ -718,48 +720,53 @@ int _media_filter_attribute_generate(attribute_h attr, char *condition, media_co 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) { + if ((token != NULL) && (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; + } else { + SAFE_FREE(replace_str); } } - - total_str_size += strlen(token->str)+1; - /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */ } /* make the statment */ - size = total_str_size + COLLATE_STR_SIZE + 1; - *generated_condition = (char*)calloc(size, sizeof(char)); + memset(tmp_condition, 0, sizeof(tmp_condition)); + SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_OPEN_BRACKET, sizeof(tmp_condition)); 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_STRLCAT(tmp_condition, token->str, sizeof(tmp_condition)); + SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_SPACE, sizeof(tmp_condition)); SAFE_FREE(token->str); SAFE_FREE(token); } } - if (collate_type == MEDIA_CONTENT_COLLATE_NOCASE || collate_type == MEDIA_CONTENT_COLLATE_RTRIM || collate_type == MEDIA_CONTENT_COLLATE_LOCALIZED) { - SAFE_STRLCAT(*generated_condition, "COLLATE ", size); - SAFE_STRLCAT(*generated_condition, __get_collate_str(collate_type), size); - SAFE_STRLCAT(*generated_condition, SPACE, size); + /* Process for filter v1 */ + if (_filter->is_full_condition == false && _filter->condition_collate_type != MEDIA_CONTENT_COLLATE_DEFAULT) { + SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_COLLATE, sizeof(tmp_condition)); + SAFE_STRLCAT(tmp_condition, __get_collate_str(_filter->condition_collate_type), sizeof(tmp_condition)); + SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_SPACE, sizeof(tmp_condition)); } - /* media_content_debug("statement : %s(%d) (total:%d)", *generated_condition, strlen(*generated_condition), total_str_size); */ - media_content_sec_debug("Condition : %s", *generated_condition); + SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_BRACKET, sizeof(tmp_condition)); - /* if(*generated_condition != NULL) - res = 1; */ + if (STRING_VALID(tmp_condition)) + *generated_condition = g_strdup(tmp_condition); + else + *generated_condition = NULL; - if (token_list != NULL) + media_content_sec_debug("Condition : %s", *generated_condition); + + if (token_list != NULL) { g_list_free(token_list); + token_list = NULL; + } return ret; } @@ -768,22 +775,20 @@ int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, c { int ret = MEDIA_CONTENT_ERROR_NONE; filter_s *_filter = NULL; - char option_query[DEFAULT_QUERY_SIZE] = {0, }; - char condition[DEFAULT_QUERY_SIZE] = {0, }; - int size = 0; + 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"); _filter = (filter_s*)filter; - memset(option_query, 0x00, sizeof(option_query)); + memset(query, 0x00, sizeof(query)); /* Order by*/ if (STRING_VALID(_filter->order_keyword)) { if ((_filter->order_type == MEDIA_CONTENT_ORDER_ASC) || (_filter->order_type == MEDIA_CONTENT_ORDER_DESC)) { unsigned int idx = 0; - int total_str_size = 0; GList *token_list = NULL; token_t *token; char *attr_str; @@ -796,7 +801,7 @@ int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, c 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) { + if ((token != NULL) && (token->type == UNKNOWN_TYPE)) { char *replace_str = __media_filter_replace_attr(attr, token->str); if (STRING_VALID(replace_str)) { attr_str = (char*)calloc(strlen(replace_str) + COLLATE_STR_SIZE + 1, sizeof(char)); @@ -816,57 +821,131 @@ int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, c SAFE_FREE(replace_str); } else { media_content_error("There is no matched db field for %s", token->str); + SAFE_FREE(replace_str); } } - - total_str_size += strlen(token->str) + 1; - /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */ } /* make the statment */ - char *generated_condition = NULL; - size = total_str_size + COLLATE_STR_SIZE + 1; - generated_condition = (char*)calloc(size, sizeof(char)); + SAFE_STRLCAT(query, QUERY_KEYWORD_ORDER_BY, 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)) { - /* media_content_debug("[%d] %s", idx, token->str); */ - SAFE_STRLCAT(generated_condition, token->str, size); - SAFE_STRLCAT(generated_condition, SPACE, size); + SAFE_STRLCAT(query, token->str, sizeof(query)); + SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query)); SAFE_FREE(token->str); SAFE_FREE(token); } } - snprintf(condition, sizeof(condition), "ORDER BY %s", generated_condition); - SAFE_STRLCAT(option_query, condition, sizeof(option_query)); - - if (token_list != NULL) + if (token_list != NULL) { g_list_free(token_list); - - SAFE_FREE(generated_condition); + token_list = NULL; + } } else { - SAFE_STRLCAT(option_query, _filter->order_keyword, sizeof(option_query)); - media_content_error("option_query [%s]", option_query); + SAFE_STRLCAT(query, _filter->order_keyword, sizeof(query)); } } /* offset */ - SAFE_STRLCAT(option_query, SPACE, sizeof(option_query)); - snprintf(condition, sizeof(condition), "LIMIT %d, %d", _filter->offset, _filter->count); - SAFE_STRLCAT(option_query, condition, sizeof(option_query)); + SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query)); - if (STRING_VALID(option_query)) - *generated_option = strdup(option_query); - else + 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_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 = NULL; + 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; + + memset(query, 0, sizeof(query)); + + /* 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 != NULL) && (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; + } else { + SAFE_FREE(replace_str); + } + } + } + + /* make the statment */ + SAFE_STRLCAT(query, QUERY_KEYWORD_ORDER_BY, 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, QUERY_KEYWORD_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; @@ -884,6 +963,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; @@ -933,6 +1014,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); @@ -963,18 +1047,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; @@ -986,6 +1068,7 @@ int media_filter_set_order(filter_h filter, media_content_order_e order_type, co int media_filter_set_storage(filter_h filter, const char *storage_id) { int ret = MEDIA_CONTENT_ERROR_NONE; + media_content_warn("DEPRECATION WARNING: media_filter_set_storage() is deprecated and will be removed from next release. Use media_filter_set_condition() with MEDIA_PATH keyword instead."); filter_s *_filter = (filter_s*)filter; if ((_filter != NULL) && STRING_VALID(storage_id)) { @@ -1026,7 +1109,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); @@ -1053,7 +1136,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 { @@ -1073,6 +1156,7 @@ int media_filter_get_order(filter_h filter, media_content_order_e* order_type, c int media_filter_get_storage(filter_h filter, char **storage_id) { int ret = MEDIA_CONTENT_ERROR_NONE; + media_content_warn("DEPRECATION WARNING: media_filter_get_storage() is deprecated and will be removed from next release."); filter_s *_filter = (filter_s*)filter; if (_filter) { @@ -1089,3 +1173,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; +} +