Match columns of playlist with filter keyword
[platform/core/api/media-content.git] / src / media_filter.c
index 0197deb..29e023a 100755 (executable)
@@ -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;
+}
+