Match columns of playlist with filter keyword
[platform/core/api/media-content.git] / src / media_filter.c
index b9c32c1..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,85 +693,14 @@ 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;
-
-       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");
-
-       if (__tokenize(&token_list, 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 */
-       size = total_str_size + COLLATE_STR_SIZE + 1;
-       *generated_condition = (char*)calloc(size, sizeof(char));
-
-       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);
-               }
-       }
-
-       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);
-       }
-
-       /* Always close in here (condition collate option issue)*/
-       SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_BRACKET, size);
-
-       /* media_content_debug("statement : %s(%d) (total:%d)", *generated_condition, strlen(*generated_condition), total_str_size); */
-       media_content_sec_debug("Condition : %s", *generated_condition);
-
-       /* if(*generated_condition != NULL)
-               res = 1; */
-
-       if (token_list != NULL)
-               g_list_free(token_list);
-
-       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;
+       filter_s *_filter = NULL;
+       char tmp_condition[MAX_QUERY_SIZE] = {0, };
 
        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");
@@ -784,6 +709,8 @@ int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h
        _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);
@@ -793,38 +720,46 @@ int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h
        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 */
-       /*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);
+       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);
                }
        }
 
-       SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_BRACKET, 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));
+       }
+
+       SAFE_STRLCAT(tmp_condition, QUERY_KEYWORD_BRACKET, sizeof(tmp_condition));
+
+       if (STRING_VALID(tmp_condition))
+               *generated_condition = g_strdup(tmp_condition);
+       else
+               *generated_condition = NULL;
 
        media_content_sec_debug("Condition : %s", *generated_condition);
 
@@ -840,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;
@@ -868,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));
@@ -888,53 +821,49 @@ 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 = g_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;
 }
@@ -944,7 +873,7 @@ int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, fi
        unsigned int idx = 0;
        GList *token_list = NULL;
        int ret = MEDIA_CONTENT_ERROR_NONE;
-       token_t *token;
+       token_t *token = NULL;
        filter_s * _filter = NULL;
        char query[DEFAULT_QUERY_SIZE] = {0, };
        char option[DEFAULT_QUERY_SIZE] = {0, };
@@ -955,6 +884,8 @@ int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, fi
 
        _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) {
@@ -965,27 +896,26 @@ int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, fi
                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);
                                }
                        }
                }
 
-               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_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query));
 
                                SAFE_FREE(token->str);
                                SAFE_FREE(token);
@@ -1138,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)) {
@@ -1225,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) {