2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <media_info_private.h>
19 #include <media_util_private.h>
22 static const char *media_token[] = {
37 typedef struct _token_t {
43 #define MAX_LEFT_VALUE 512
46 #define UNKNOWN_TYPE 1000
47 #define STRING_TYPE 100
49 static char *__get_order_str(media_content_order_e order_enum);
50 static char *__get_collate_str(media_content_collation_e collate_type);
51 static void __filter_attribute_free_value(gpointer key, gpointer value, gpointer user_data);
52 static char *__media_filter_replace_attr(attribute_h attr, char *name);
53 static int __tokenize_operator(token_t *token, const char *str, int op_type);
54 static int __tokenize(GList **token_list, const char *str);
56 static bool __is_pinyin_needed(void)
59 const char *china = "zh_CN";
60 const char *hongkong = "zh_HK";
64 bool pinyin_support = FALSE;
65 media_svc_check_pinyin_support(&pinyin_support);
67 /*Check Language Setting*/
68 lang = vconf_get_str(VCONFKEY_LANGSET);
69 media_content_retvm_if(lang == NULL, ret, "Fail to get string of language set");
71 if ((strncmp(china, lang, strlen(china)) == 0) ||
72 (strncmp(hongkong, lang, strlen(hongkong)) == 0)) {
82 static char *__get_order_str(media_content_order_e order_enum)
85 case MEDIA_CONTENT_ORDER_ASC:
87 case MEDIA_CONTENT_ORDER_DESC:
88 return (char *)"DESC";
94 static char *__get_collate_str(media_content_collation_e collate_type)
96 switch (collate_type) {
97 case MEDIA_CONTENT_COLLATE_NOCASE:
98 return (char *)"NOCASE";
99 case MEDIA_CONTENT_COLLATE_RTRIM:
100 return (char *)"RTRIM";
101 case MEDIA_CONTENT_COLLATE_LOCALIZED:
102 if (__is_pinyin_needed())
103 return (char *)"NOCASE";
105 return (char *)"localized";
106 default: return (char *)" ";
110 static void __filter_attribute_free_value(gpointer key, gpointer value, gpointer user_data)
116 static char *__media_filter_replace_attr(attribute_h attr, char *name)
118 char *key_temp = NULL;
119 char *generated_value = NULL;
120 attribute_s *_attr = (attribute_s *)attr;
122 if (!g_hash_table_lookup_extended(_attr->attr_map, name, (gpointer)&key_temp, (gpointer)&generated_value)) {
123 /* can't find the value */
124 /* media_content_error("NOT_FOUND_VALUE(%s)", name); */
128 if (STRING_VALID(generated_value))
129 return strdup(generated_value);
131 media_content_error("__media_filter_replace_attr fail");
136 static int __tokenize_operator(token_t *token, const char *str, int op_type)
139 const char *tmp = str;
141 if (token != NULL && STRING_VALID(tmp)) {
142 token->type = op_type;
143 int token_size = strlen(media_token[op_type]);
144 media_content_retvm_if(token_size == 0, -1, "Invalid token_size. op_type[%d]", op_type);
146 token->str = (char*)calloc(token_size+1, sizeof(char));
147 media_content_retvm_if(token->str == NULL, -1, "OUT_OF_MEMORY");
149 strncpy(token->str, tmp, token_size);
150 /*media_content_debug("type : [%d] str : [%s]", token->type, token->str);*/
159 static int __tokenize_string(token_t *token, const char *str, int size)
162 const char *tmp = str;
164 if (token != NULL && STRING_VALID(tmp) && size > 0) {
165 token->str = (char*)calloc(size+1, sizeof(char));
166 media_content_retvm_if(token->str == NULL, -1, "OUT_OF_MEMORY");
168 token->type = UNKNOWN_TYPE;
169 strncpy(token->str, tmp, size);
170 /*media_content_debug("type : [%d] str : [%s]", token->type, token->str);*/
178 static int __tokenize_attribute(GList **token_list, const char *str)
183 media_content_retvm_if(!STRING_VALID(str), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Parameter string is invalid");
185 const char *tmp = str;
186 const char *dst_ptr = str + strlen(str);
188 for (idx = 0; (*(tmp+idx)) && (tmp < dst_ptr); idx++) {
189 /*media_content_debug("[%d] '%c'", idx, tmp[idx]);*/
190 if (tmp[idx] == ' ') { /* " " */
191 if (idx == 0) { /* ignore the space. */
196 token_t *token = (token_t*)calloc(1, sizeof(token_t));
197 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
199 token->type = UNKNOWN_TYPE;
200 token->str = (char*)calloc(idx+1, sizeof(char));
201 if (token->str == NULL) {
203 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
206 strncpy(token->str, tmp, idx);
207 /*media_content_debug("type : [%d] str : [%s]", token->type, token->str);*/
208 *token_list = g_list_append(*token_list, token);
209 tmp = tmp +idx + strlen(media_token[0]);
211 } else if (tmp[idx] == ',') { /* " , " */
213 token_t *token = (token_t*)calloc(1, sizeof(token_t));
214 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
216 ret = __tokenize_string(token, tmp, idx);
219 media_content_error("tokenize error occured");
222 *token_list = g_list_append(*token_list, token);
227 token_t *token = (token_t*)calloc(1, sizeof(token_t));
228 int size = __tokenize_operator(token, tmp, 3);
230 if (token != NULL && STRING_VALID(token->str)) {
231 *token_list = g_list_append(*token_list, token);
236 media_content_error("tokenize error occured");
242 if (*tmp) { /* remained string */
243 token_t *token = (token_t*)calloc(1, sizeof(token_t));
244 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
246 ret = __tokenize_string(token, tmp, idx);
249 media_content_error("tokenize error occured");
253 if (token != NULL && STRING_VALID(token->str)) {
254 *token_list = g_list_append(*token_list, token);
257 media_content_error("tokenize error occured");
262 return MEDIA_CONTENT_ERROR_NONE;
265 static int __tokenize(GList **token_list, const char *str)
270 media_content_retvm_if(!STRING_VALID(str), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Parameter string is invalid");
272 const char *tmp = str;
273 const char *dst_ptr = str + strlen(str);
275 for (idx = 0; (*(tmp+idx)) && (tmp < dst_ptr); idx++) {
276 /* media_content_debug("[%d] '%c'", idx, tmp[idx]); */
277 if (tmp[idx] == media_token[0][0]) { /* " " */
278 if (idx == 0) { /* ignore the space. */
284 token_t *token = (token_t*)calloc(1, sizeof(token_t));
285 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
287 token->type = UNKNOWN_TYPE;
288 token->str = (char *)calloc(idx+1, sizeof(char));
289 if (token->str == NULL) {
291 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
294 strncpy(token->str, tmp, idx);
295 /* media_content_debug("type : [%d] str : [%s]", token->type, token->str); */
296 *token_list = g_list_append(*token_list, token);
297 tmp = tmp +idx + strlen(media_token[0]);
299 } else if (tmp[idx] == media_token[1][0]) { /* " \" " */
302 for (j = idx+1; tmp[j]; j++) { /* find next quotation */
303 if (tmp[j] == media_token[1][0] && tmp[j+1] == media_token[1][0]) {
307 if (tmp[j] == media_token[1][0]) {
308 token_t *token = (token_t*)calloc(1, sizeof(token_t));
309 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
311 token->str = (char*) calloc(j+1+1, sizeof(char));
312 if (token->str == NULL) {
314 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
317 token->type = STRING_TYPE;
318 strncpy(token->str, tmp, j+1);
319 /* media_content_debug("type : [%d] str : [%s], j : %d", token->type, token->str, j); */
320 *token_list = g_list_append(*token_list, token);
321 tmp = tmp + strlen(token->str);
328 if (!flag && *tmp != '\0' && tmp[j] == '\0') {
329 token_t *token = (token_t*)calloc(1, sizeof(token_t));
330 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
332 token->str = (char *) calloc(j+1, sizeof(char));
333 if (token->str == NULL) {
335 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
338 token->type = UNKNOWN_TYPE;
339 strncpy(token->str, tmp, j);
340 /* media_content_debug("type : [%d] str : [%s]", token->type, token->str);*/
341 *token_list = g_list_append(*token_list, token);
342 tmp = tmp +strlen(token->str);
345 } else if (tmp[idx] == media_token[2][0]) { /* " \' "*/
348 for (j = idx+1; tmp[j]; j++) {
349 if (tmp[j] == media_token[2][0] && tmp[j+1] == media_token[2][0]) {
353 if (tmp[j] == media_token[2][0]) {
354 token_t *token = (token_t*)calloc(1, sizeof(token_t));
355 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
357 token->str = (char *) calloc(j+1+1, sizeof(char));
358 if (token->str == NULL) {
360 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
363 token->type = STRING_TYPE;
364 strncpy(token->str, tmp, j+1);
365 /* media_content_debug("type : [%d] str : [%s]", token->type, token->str); */
366 *token_list = g_list_append(*token_list, token);
367 tmp = tmp + strlen(token->str);
374 if (!flag && *tmp != '\0' && tmp[j] == '\0') {
375 token_t *token = (token_t*)calloc(1, sizeof(token_t));
376 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
378 token->str = (char*) calloc(j+1, sizeof(char));
379 if (token->str == NULL) {
381 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
384 token->type = UNKNOWN_TYPE;
385 strncpy(token->str, tmp, j);
386 /* media_content_debug("type : [%d] str : [%s]", token->type, token->str); */
387 *token_list = g_list_append(*token_list, token);
388 tmp = tmp + strlen(token->str);
391 } else if (tmp[idx] == media_token[3][0]) { /* "(" */
393 token_t *token = (token_t*)calloc(1, sizeof(token_t));
394 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
396 ret = __tokenize_string(token, tmp, idx);
399 media_content_error("tokenize error occured");
402 *token_list = g_list_append(*token_list, token);
406 token_t *token = (token_t*)calloc(1, sizeof(token_t));
407 int size = __tokenize_operator(token, tmp, 3);
409 if (token != NULL && STRING_VALID(token->str)) {
410 *token_list = g_list_append(*token_list, token);
415 media_content_error("tokenize error occured");
419 } else if (tmp[idx] == media_token[4][0]) { /* ")" */
421 token_t *token = (token_t*)calloc(1, sizeof(token_t));
422 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
424 ret = __tokenize_string(token, tmp, idx);
427 media_content_error("tokenize error occured");
430 *token_list = g_list_append(*token_list, token);
434 token_t *token = (token_t*)calloc(1, sizeof(token_t));
435 int size = __tokenize_operator(token, tmp, 4);
437 if (token != NULL && STRING_VALID(token->str)) {
438 *token_list = g_list_append(*token_list, token);
443 media_content_error("tokenize error occured");
447 } else if (tmp[idx] == media_token[5][0]) { /* "=" */
449 token_t *token = (token_t*)calloc(1, sizeof(token_t));
450 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
452 ret = __tokenize_string(token, tmp, idx);
455 media_content_error("tokenize error occured");
458 *token_list = g_list_append(*token_list, token);
462 token_t *token = (token_t*)calloc(1, sizeof(token_t));
463 int size = __tokenize_operator(token, tmp, 5);
465 if (token != NULL && STRING_VALID(token->str)) {
466 *token_list = g_list_append(*token_list, token);
471 media_content_error("tokenize error occured");
475 } else if (tmp[idx] == media_token[6][0] && tmp[idx+1] == media_token[6][1]) { /* "<=", */
477 token_t *token = (token_t*)calloc(1, sizeof(token_t));
478 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
480 ret = __tokenize_string(token, tmp, idx);
483 media_content_error("tokenize error occured");
486 *token_list = g_list_append(*token_list, token);
490 token_t *token = (token_t*)calloc(1, sizeof(token_t));
491 int size = __tokenize_operator(token, tmp, 6);
493 if (token != NULL && STRING_VALID(token->str)) {
494 *token_list = g_list_append(*token_list, token);
499 media_content_error("tokenize error occured");
503 } else if (tmp[idx] == media_token[7][0]) { /* "<", */
505 token_t *token = (token_t*)calloc(1, sizeof(token_t));
506 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
508 ret = __tokenize_string(token, tmp, idx);
511 media_content_error("tokenize error occured");
514 *token_list = g_list_append(*token_list, token);
518 token_t *token = (token_t*)calloc(1, sizeof(token_t));
519 int size = __tokenize_operator(token, tmp, 7);
521 if (token != NULL && STRING_VALID(token->str)) {
522 *token_list = g_list_append(*token_list, token);
527 media_content_error("tokenize error occured");
531 } else if (tmp[idx] == media_token[8][0] && tmp[idx+1] == media_token[8][1]) { /* ">=", */
533 token_t *token = (token_t*)calloc(1, sizeof(token_t));
534 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
536 ret = __tokenize_string(token, tmp, idx);
539 media_content_error("tokenize error occured");
542 *token_list = g_list_append(*token_list, token);
546 token_t *token = (token_t*)calloc(1, sizeof(token_t));
547 int size = __tokenize_operator(token, tmp, 8);
549 if (token != NULL && STRING_VALID(token->str)) {
550 *token_list = g_list_append(*token_list, token);
555 media_content_error("tokenize error occured");
559 } else if (tmp[idx] == media_token[9][0]) { /* ">", */
561 token_t *token = (token_t*)calloc(1, sizeof(token_t));
562 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
564 ret = __tokenize_string(token, tmp, idx);
567 media_content_error("tokenize error occured");
570 *token_list = g_list_append(*token_list, token);
574 token_t *token = (token_t*)calloc(1, sizeof(token_t));
575 int size = __tokenize_operator(token, tmp, 9);
577 if (token != NULL && STRING_VALID(token->str)) {
578 *token_list = g_list_append(*token_list, token);
583 media_content_error("tokenize error occured");
586 } else if (tmp[idx] == media_token[10][0] && tmp[idx+1] == media_token[10][1]) { /* "!=", */
588 token_t *token = (token_t*)calloc(1, sizeof(token_t));
589 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
591 ret = __tokenize_string(token, tmp, idx);
594 media_content_error("tokenize error occured");
597 *token_list = g_list_append(*token_list, token);
601 token_t *token = (token_t*)calloc(1, sizeof(token_t));
602 int size = __tokenize_operator(token, tmp, 10);
604 if (token != NULL && STRING_VALID(token->str)) {
605 *token_list = g_list_append(*token_list, token);
610 media_content_error("tokenize error occured");
616 if (*tmp) { /* remained string */
617 token_t *token = (token_t*)calloc(1, sizeof(token_t));
618 media_content_retvm_if(token == NULL, -1, "OUT_OF_MEMORY");
620 ret = __tokenize_string(token, tmp, idx);
623 media_content_error("tokenize error occured");
627 if (token != NULL && STRING_VALID(token->str)) {
628 *token_list = g_list_append(*token_list, token);
631 media_content_error("tokenize error occured");
636 return MEDIA_CONTENT_ERROR_NONE;
639 int _media_filter_attribute_create(attribute_h *attr)
641 int ret = MEDIA_CONTENT_ERROR_NONE;
643 media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr");
645 attribute_s *_attr = (attribute_s*)calloc(1, sizeof(attribute_s));
646 media_content_retvm_if(_attr == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
648 _attr->attr_map = g_hash_table_new(g_str_hash, g_str_equal);
649 *attr = (attribute_h)_attr;
654 int _media_filter_attribute_add(attribute_h attr, const char *user_attr, const char *platform_attr)
656 int ret = MEDIA_CONTENT_ERROR_NONE;
658 char *_platform = NULL;
659 attribute_s *_attr = (attribute_s*)attr;
661 media_content_retvm_if(_attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr");
663 if (STRING_VALID(user_attr) && STRING_VALID(platform_attr)) {
664 _user = g_strdup(user_attr);
665 media_content_retvm_if(_user == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
667 _platform = g_strdup(platform_attr);
668 if (_platform == NULL) {
670 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
671 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
674 g_hash_table_insert(_attr->attr_map, _user, _platform);
676 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
677 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
683 int _media_filter_attribute_destory(attribute_h attr)
685 int ret = MEDIA_CONTENT_ERROR_NONE;
686 attribute_s *_attr = (attribute_s*)attr;
688 media_content_retvm_if(_attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr");
690 if (_attr->attr_map != NULL) {
691 g_hash_table_foreach(_attr->attr_map, __filter_attribute_free_value, NULL);
692 g_hash_table_destroy(_attr->attr_map);
700 int _media_filter_attribute_generate(attribute_h attr, char *condition, media_content_collation_e collate_type, char **generated_condition)
702 unsigned int idx = 0;
703 GList *token_list = NULL;
705 int ret = MEDIA_CONTENT_ERROR_NONE;
706 int total_str_size = 0;
709 media_content_retvm_if(condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition");
710 media_content_retvm_if(generated_condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_condition");
711 media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_DB_FAILED, "DB field mapping table doesn't exist. Check db connection");
713 if (__tokenize(&token_list, condition) < 0) {
714 media_content_error("INVALID_PARAMETER(0x%08x):Invalid the condition", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
715 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
718 for (idx = 0; idx < g_list_length(token_list); idx++) {
719 token = (token_t*)g_list_nth_data(token_list, idx);
721 if (token->type == UNKNOWN_TYPE) {
722 char *replace_str = __media_filter_replace_attr(attr, token->str);
723 if (STRING_VALID(replace_str)) {
724 SAFE_FREE(token->str);
725 token->str = replace_str;
729 total_str_size += strlen(token->str)+1;
730 /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */
733 /* make the statment */
734 size = total_str_size + COLLATE_STR_SIZE + 1;
735 *generated_condition = (char*)calloc(size, sizeof(char));
737 for (idx = 0; idx < g_list_length(token_list); idx++) {
738 token = (token_t*)g_list_nth_data(token_list, idx);
740 if ((token != NULL) && STRING_VALID(token->str)) {
741 SAFE_STRLCAT(*generated_condition, token->str, size);
742 SAFE_STRLCAT(*generated_condition, SPACE, size);
744 SAFE_FREE(token->str);
749 if (collate_type == MEDIA_CONTENT_COLLATE_NOCASE || collate_type == MEDIA_CONTENT_COLLATE_RTRIM || collate_type == MEDIA_CONTENT_COLLATE_LOCALIZED) {
750 SAFE_STRLCAT(*generated_condition, "COLLATE ", size);
751 SAFE_STRLCAT(*generated_condition, __get_collate_str(collate_type), size);
752 SAFE_STRLCAT(*generated_condition, SPACE, size);
755 /* Always close in here (condition collate option issue)*/
756 SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_BRACKET, size);
758 /* media_content_debug("statement : %s(%d) (total:%d)", *generated_condition, strlen(*generated_condition), total_str_size); */
759 media_content_sec_debug("Condition : %s", *generated_condition);
761 /* if(*generated_condition != NULL)
764 if (token_list != NULL)
765 g_list_free(token_list);
770 int _media_filter_attribute_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_condition)
772 unsigned int idx = 0;
773 GList *token_list = NULL;
775 int ret = MEDIA_CONTENT_ERROR_NONE;
776 int total_str_size = 0;
778 filter_s * _filter = NULL;
780 media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_DB_FAILED, "DB field mapping table doesn't exist. Check db connection");
781 media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter");
782 media_content_retvm_if(generated_condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_condition");
784 _filter = (filter_s*)filter;
786 media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid condition");
788 if (__tokenize(&token_list, _filter->condition) < 0) {
789 media_content_error("INVALID_PARAMETER(0x%08x):Invalid the condition", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
790 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
793 for (idx = 0; idx < g_list_length(token_list); idx++) {
794 token = (token_t*)g_list_nth_data(token_list, idx);
796 if (token->type == UNKNOWN_TYPE) {
797 char *replace_str = __media_filter_replace_attr(attr, token->str);
798 if (STRING_VALID(replace_str)) {
799 SAFE_FREE(token->str);
800 token->str = replace_str;
804 total_str_size += strlen(token->str)+1;
805 /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */
808 /* make the statment */
809 /*COLLATE_STR_SIZE is to give a margin - Add : +2 */
810 size = total_str_size + COLLATE_STR_SIZE + 1;
811 *generated_condition = (char*)calloc(size, sizeof(char));
813 SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_OPEN_BRACKET, size);
815 for (idx = 0; idx < g_list_length(token_list); idx++) {
816 token = (token_t*)g_list_nth_data(token_list, idx);
818 if ((token != NULL) && STRING_VALID(token->str)) {
819 SAFE_STRLCAT(*generated_condition, token->str, size);
820 SAFE_STRLCAT(*generated_condition, SPACE, size);
822 SAFE_FREE(token->str);
827 SAFE_STRLCAT(*generated_condition, QUERY_KEYWORD_BRACKET, size);
829 media_content_sec_debug("Condition : %s", *generated_condition);
831 if (token_list != NULL) {
832 g_list_free(token_list);
839 int _media_filter_attribute_option_generate(attribute_h attr, filter_h filter, char **generated_option)
841 int ret = MEDIA_CONTENT_ERROR_NONE;
842 filter_s *_filter = NULL;
843 char option_query[DEFAULT_QUERY_SIZE] = {0, };
844 char condition[DEFAULT_QUERY_SIZE] = {0, };
847 media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr");
848 media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter");
850 _filter = (filter_s*)filter;
852 memset(option_query, 0x00, sizeof(option_query));
855 if (STRING_VALID(_filter->order_keyword)) {
856 if ((_filter->order_type == MEDIA_CONTENT_ORDER_ASC) || (_filter->order_type == MEDIA_CONTENT_ORDER_DESC)) {
857 unsigned int idx = 0;
858 int total_str_size = 0;
859 GList *token_list = NULL;
863 if (__tokenize_attribute(&token_list, _filter->order_keyword) < 0) {
864 media_content_error("INVALID_PARAMETER(0x%08x):Invalid the condition", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
865 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
868 for (idx = 0; idx < g_list_length(token_list); idx++) {
869 token = (token_t*)g_list_nth_data(token_list, idx);
871 if (token->type == UNKNOWN_TYPE) {
872 char *replace_str = __media_filter_replace_attr(attr, token->str);
873 if (STRING_VALID(replace_str)) {
874 attr_str = (char*)calloc(strlen(replace_str) + COLLATE_STR_SIZE + 1, sizeof(char));
875 if (attr_str == NULL) {
876 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
877 SAFE_FREE(replace_str);
881 if (_filter->order_collate_type == MEDIA_CONTENT_COLLATE_NOCASE || _filter->order_collate_type == MEDIA_CONTENT_COLLATE_RTRIM || _filter->order_collate_type == MEDIA_CONTENT_COLLATE_LOCALIZED)
882 snprintf(attr_str, strlen(replace_str) + COLLATE_STR_SIZE + 1, "%s COLLATE %s %s", replace_str, __get_collate_str(_filter->order_collate_type), __get_order_str(_filter->order_type));
884 snprintf(attr_str, strlen(replace_str) + COLLATE_STR_SIZE + 1, "%s %s", replace_str, __get_order_str(_filter->order_type));
886 SAFE_FREE(token->str);
887 token->str = attr_str;
888 SAFE_FREE(replace_str);
890 media_content_error("There is no matched db field for %s", token->str);
894 total_str_size += strlen(token->str) + 1;
895 /* media_content_debug("[%d][type:%d]:%s", idx, token->type, token->str); */
898 /* make the statment */
899 char *generated_condition = NULL;
900 size = total_str_size + COLLATE_STR_SIZE + 1;
901 generated_condition = (char*)calloc(size, sizeof(char));
903 for (idx = 0; idx < g_list_length(token_list); idx++) {
904 token = (token_t*)g_list_nth_data(token_list, idx);
906 if ((token != NULL) && STRING_VALID(token->str)) {
907 /* media_content_debug("[%d] %s", idx, token->str); */
908 SAFE_STRLCAT(generated_condition, token->str, size);
909 SAFE_STRLCAT(generated_condition, SPACE, size);
911 SAFE_FREE(token->str);
916 snprintf(condition, sizeof(condition), "ORDER BY %s", generated_condition);
917 SAFE_STRLCAT(option_query, condition, sizeof(option_query));
919 if (token_list != NULL)
920 g_list_free(token_list);
922 SAFE_FREE(generated_condition);
924 SAFE_STRLCAT(option_query, _filter->order_keyword, sizeof(option_query));
925 media_content_error("option_query [%s]", option_query);
930 SAFE_STRLCAT(option_query, SPACE, sizeof(option_query));
931 snprintf(condition, sizeof(condition), "LIMIT %d, %d", _filter->offset, _filter->count);
932 SAFE_STRLCAT(option_query, condition, sizeof(option_query));
934 if (STRING_VALID(option_query))
935 *generated_option = g_strdup(option_query);
937 *generated_option = NULL;
942 int _media_filter_attribute_option_generate_with_full_query(attribute_h attr, filter_h filter, char **generated_option)
944 unsigned int idx = 0;
945 GList *token_list = NULL;
946 int ret = MEDIA_CONTENT_ERROR_NONE;
948 filter_s * _filter = NULL;
949 char query[DEFAULT_QUERY_SIZE] = {0, };
950 char option[DEFAULT_QUERY_SIZE] = {0, };
952 media_content_retvm_if(attr == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid attr");
953 media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter");
954 media_content_retvm_if(generated_option == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid generated_option");
956 _filter = (filter_s*)filter;
959 if (STRING_VALID(_filter->order_keyword)) {
960 if (__tokenize_attribute(&token_list, _filter->order_keyword) < 0) {
961 media_content_error("INVALID_PARAMETER(0x%08x):Invalid the order", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
962 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
965 for (idx = 0; idx < g_list_length(token_list); idx++) {
966 token = (token_t*)g_list_nth_data(token_list, idx);
968 if (token->type == UNKNOWN_TYPE) {
969 char *replace_str = __media_filter_replace_attr(attr, token->str);
970 if (STRING_VALID(replace_str)) {
971 SAFE_FREE(token->str);
972 token->str = replace_str;
977 memset(query, 0, sizeof(query));
979 /* make the statment */
980 SAFE_STRLCAT(query, QUERY_KEYWORD_ORDER_BY, sizeof(query));
981 SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query));
983 for (idx = 0; idx < g_list_length(token_list); idx++) {
984 token = (token_t*)g_list_nth_data(token_list, idx);
986 if ((token != NULL) && STRING_VALID(token->str)) {
987 SAFE_STRLCAT(query, token->str, sizeof(query));
988 SAFE_STRLCAT(query, SPACE, sizeof(query));
990 SAFE_FREE(token->str);
995 if (token_list != NULL) {
996 g_list_free(token_list);
1002 SAFE_STRLCAT(query, QUERY_KEYWORD_SPACE, sizeof(query));
1004 memset(option, 0, sizeof(option));
1005 snprintf(option, sizeof(option), "%s %d, %d", QUERY_KEYWORD_LIMIT, _filter->offset, _filter->count);
1006 SAFE_STRLCAT(query, option, sizeof(query));
1008 if (STRING_VALID(query)) {
1009 *generated_option = g_strdup(query);
1010 media_content_sec_debug("Option : %s", *generated_option);
1012 *generated_option = NULL;
1019 int media_filter_create(filter_h *filter)
1021 int ret = MEDIA_CONTENT_ERROR_NONE;
1023 media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid filter");
1025 filter_s *_filter = (filter_s*)calloc(1, sizeof(filter_s));
1026 media_content_retvm_if(_filter == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1028 _filter->storage_id = NULL;
1029 _filter->condition = NULL;
1030 _filter->order_keyword = NULL;
1031 _filter->order_type = -1;
1032 _filter->condition_collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;
1033 _filter->order_collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;
1034 _filter->offset = -1;
1035 _filter->count = -1;
1036 _filter->is_full_condition = false;
1037 _filter->is_full_order = false;
1039 *filter = (filter_h)_filter;
1044 int media_filter_destroy(filter_h filter)
1046 int ret = MEDIA_CONTENT_ERROR_NONE;
1047 filter_s *_filter = (filter_s*)filter;
1050 SAFE_FREE(_filter->storage_id);
1051 SAFE_FREE(_filter->condition);
1052 SAFE_FREE(_filter->order_keyword);
1055 ret = MEDIA_CONTENT_ERROR_NONE;
1057 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1058 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1064 int media_filter_set_offset(filter_h filter, int offset, int count)
1066 int ret = MEDIA_CONTENT_ERROR_NONE;
1067 filter_s *_filter = (filter_s*)filter;
1069 if (_filter != NULL) {
1070 _filter->offset = offset;
1071 _filter->count = count;
1073 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1074 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1080 int media_filter_set_condition(filter_h filter, const char *condition, media_content_collation_e collate_type)
1082 int ret = MEDIA_CONTENT_ERROR_NONE;
1083 filter_s *_filter = (filter_s*)filter;
1085 if ((_filter != NULL) && STRING_VALID(condition)
1086 && ((collate_type >= MEDIA_CONTENT_COLLATE_DEFAULT) && (collate_type <= MEDIA_CONTENT_COLLATE_LOCALIZED))) {
1088 _filter->is_full_condition = false;
1090 if (STRING_VALID(_filter->condition))
1091 SAFE_FREE(_filter->condition);
1093 char new_condition[MAX_QUERY_SIZE] = {0, };
1094 memset(new_condition, 0, sizeof(new_condition));
1095 ret = _media_content_replace_path_in_condition(condition, new_condition, TRUE);
1096 media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1098 _filter->condition = strdup(new_condition);
1099 media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1101 media_content_sec_debug("Condition string : %s", _filter->condition);
1103 _filter->condition_collate_type = collate_type;
1105 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1106 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1112 int media_filter_set_order(filter_h filter, media_content_order_e order_type, const char *order_keyword, media_content_collation_e collate_type)
1114 int ret = MEDIA_CONTENT_ERROR_NONE;
1115 filter_s *_filter = (filter_s*)filter;
1117 if ((_filter != NULL) && STRING_VALID(order_keyword)
1118 && ((order_type == MEDIA_CONTENT_ORDER_ASC) || (order_type == MEDIA_CONTENT_ORDER_DESC))
1119 && ((collate_type >= MEDIA_CONTENT_COLLATE_DEFAULT) && (collate_type <= MEDIA_CONTENT_COLLATE_LOCALIZED))) {
1121 _filter->is_full_order = false;
1123 SAFE_FREE(_filter->order_keyword);
1125 _filter->order_keyword = strdup(order_keyword);
1126 media_content_retvm_if(_filter->order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1128 _filter->order_type = order_type;
1129 _filter->order_collate_type = collate_type;
1131 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1132 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1138 int media_filter_set_storage(filter_h filter, const char *storage_id)
1140 int ret = MEDIA_CONTENT_ERROR_NONE;
1141 filter_s *_filter = (filter_s*)filter;
1143 if ((_filter != NULL) && STRING_VALID(storage_id)) {
1144 if (STRING_VALID(_filter->storage_id))
1145 SAFE_FREE(_filter->storage_id);
1147 _filter->storage_id = strdup(storage_id);
1148 media_content_retvm_if(_filter->storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1150 media_content_sec_debug("storage_id : %s", _filter->storage_id);
1152 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1153 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1159 int media_filter_get_offset(filter_h filter, int *offset, int *count)
1161 int ret = MEDIA_CONTENT_ERROR_NONE;
1162 filter_s *_filter = (filter_s*)filter;
1165 *offset = _filter->offset;
1166 *count = _filter->count;
1168 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1169 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1175 int media_filter_get_condition(filter_h filter, char **condition, media_content_collation_e *collate_type)
1177 int ret = MEDIA_CONTENT_ERROR_NONE;
1178 filter_s *_filter = (filter_s*)filter;
1181 if (STRING_VALID(_filter->condition) && _filter->is_full_condition == false) {
1182 char new_condition[MAX_QUERY_SIZE] = {0, };
1183 memset(new_condition, 0, sizeof(new_condition));
1184 ret = _media_content_replace_path_in_condition(_filter->condition, new_condition, FALSE);
1185 media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1187 *condition = strdup(new_condition);
1188 media_content_retvm_if(*condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1193 *collate_type = _filter->condition_collate_type;
1195 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1196 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1202 int media_filter_get_order(filter_h filter, media_content_order_e* order_type, char **order_keyword, media_content_collation_e *collate_type)
1204 int ret = MEDIA_CONTENT_ERROR_NONE;
1205 filter_s *_filter = (filter_s*)filter;
1208 if (STRING_VALID(_filter->order_keyword) && _filter->is_full_order == false) {
1209 *order_keyword = strdup(_filter->order_keyword);
1210 media_content_retvm_if(*order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1212 *order_keyword = NULL;
1215 *order_type = _filter->order_type;
1216 *collate_type = _filter->order_collate_type;
1218 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1219 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1225 int media_filter_get_storage(filter_h filter, char **storage_id)
1227 int ret = MEDIA_CONTENT_ERROR_NONE;
1228 filter_s *_filter = (filter_s*)filter;
1231 if (STRING_VALID(_filter->storage_id)) {
1232 *storage_id = strdup(_filter->storage_id);
1233 media_content_retvm_if(*storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1238 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1239 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1245 int media_filter_set_condition_v2(filter_h filter, const char *condition)
1247 int ret = MEDIA_CONTENT_ERROR_NONE;
1248 filter_s *_filter = (filter_s*)filter;
1250 if ((_filter != NULL) && STRING_VALID(condition)) {
1251 _filter->is_full_condition = true;
1253 if (STRING_VALID(_filter->condition))
1254 SAFE_FREE(_filter->condition);
1256 char new_condition[MAX_QUERY_SIZE] = {0, };
1257 memset(new_condition, 0, sizeof(new_condition));
1258 ret = _media_content_replace_path_in_condition(condition, new_condition, TRUE);
1259 media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1261 _filter->condition = strdup(new_condition);
1262 media_content_retvm_if(_filter->condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1264 media_content_sec_debug("Condition string : %s", _filter->condition);
1266 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1267 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1273 int media_filter_get_condition_v2(filter_h filter, char **condition)
1275 int ret = MEDIA_CONTENT_ERROR_NONE;
1276 filter_s *_filter = (filter_s*)filter;
1279 if (STRING_VALID(_filter->condition) && _filter->is_full_condition == true) {
1280 char new_condition[MAX_QUERY_SIZE] = {0, };
1281 memset(new_condition, 0, sizeof(new_condition));
1282 ret = _media_content_replace_path_in_condition(_filter->condition, new_condition, FALSE);
1283 media_content_retvm_if(!STRING_VALID(new_condition), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1285 *condition = strdup(new_condition);
1286 media_content_retvm_if(*condition == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1291 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1292 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1298 int media_filter_set_order_v2(filter_h filter, const char *order)
1300 int ret = MEDIA_CONTENT_ERROR_NONE;
1301 filter_s *_filter = (filter_s*)filter;
1303 if ((_filter != NULL) && STRING_VALID(order)) {
1304 _filter->is_full_order = true;
1306 SAFE_FREE(_filter->order_keyword);
1308 _filter->order_keyword = strdup(order);
1309 media_content_retvm_if(_filter->order_keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1311 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1312 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1318 int media_filter_get_order_v2(filter_h filter, char **order)
1320 int ret = MEDIA_CONTENT_ERROR_NONE;
1321 filter_s *_filter = (filter_s*)filter;
1324 if (STRING_VALID(_filter->order_keyword) && _filter->is_full_order == true) {
1325 *order = strdup(_filter->order_keyword);
1326 media_content_retvm_if(*order == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1331 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1332 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;