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_content.h>
19 #include <media_info_private.h>
22 static __thread GList *g_tag_item_list = NULL;
24 static void __media_tag_item_add(media_tag_item_s *item_s);
25 static void __media_tag_item_release(void);
26 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id);
27 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id);
28 static int __media_tag_update_tag_name(int tag_id, const char *tag_name);
29 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag);
31 static void __media_tag_item_add(media_tag_item_s *item_s)
33 g_tag_item_list = g_list_append(g_tag_item_list, item_s);
36 static void __media_tag_item_release(void)
40 media_tag_item_s *item = NULL;
42 list_cnt = g_list_length(g_tag_item_list);
44 media_content_debug("list_cnt : [%d]", list_cnt);
46 for(idx = 0; idx < list_cnt; idx++)
48 item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
51 SAFE_FREE(item->media_id);
52 SAFE_FREE(item->tag_name);
57 g_list_free(g_tag_item_list);
58 g_tag_item_list = NULL;
62 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
64 int ret = MEDIA_CONTENT_ERROR_NONE;
65 char *query_str = NULL;
67 query_str = sqlite3_mprintf("INSERT INTO %q (tag_id, media_uuid) values (%d, '%q')",
68 DB_TABLE_TAG_MAP, tag_id, media_id);
69 ret = _content_query_sql(query_str);
70 sqlite3_free(query_str);
75 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
77 int ret = MEDIA_CONTENT_ERROR_NONE;
78 char *query_str = NULL;
80 query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
82 ret = _content_query_sql(query_str);
83 sqlite3_free(query_str);
88 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
90 int ret = MEDIA_CONTENT_ERROR_NONE;
91 char *query_str = NULL;
93 query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
95 ret = _content_query_sql(query_str);
96 sqlite3_free(query_str);
101 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
103 int ret = MEDIA_CONTENT_ERROR_NONE;
104 sqlite3_stmt *stmt = NULL;
105 char *select_query = NULL;
106 media_tag_s *_tag = (media_tag_s*)tag;
110 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
111 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
114 select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
116 ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
117 sqlite3_free(select_query);
118 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
120 while(sqlite3_step(stmt) == SQLITE_ROW)
122 _tag->tag_id = (int)sqlite3_column_int(stmt,0);
124 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
126 _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));
130 SQLITE3_FINALIZE(stmt);
135 int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
137 int ret = MEDIA_CONTENT_ERROR_NONE;
138 char *query_str = NULL;
140 if(!STRING_VALID(tag_name))
142 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
143 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
146 query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
147 ret = _content_query_sql(query_str);
148 sqlite3_free(query_str);
150 if(ret == MEDIA_CONTENT_ERROR_NONE)
152 media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
155 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
156 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
159 ret = __media_tag_get_tag_info_from_db(tag_name, (media_tag_h)_tag);
160 *tag = (media_tag_h)_tag;
166 int media_tag_delete_from_db(int tag_id)
168 int ret = MEDIA_CONTENT_ERROR_NONE;
169 char *query_str = NULL;
173 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
174 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
177 query_str = sqlite3_mprintf(DELETE_TAG_FROM_TAG, tag_id);
179 ret = _content_query_sql(query_str);
181 sqlite3_free(query_str);
186 int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
188 int ret = MEDIA_CONTENT_ERROR_NONE;
190 media_content_debug_func();
192 if(tag_count != NULL)
194 ret = _media_db_get_group_count(filter, MEDIA_GROUP_TAG, tag_count);
198 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
199 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
205 int media_tag_foreach_tag_from_db (filter_h filter, media_tag_cb callback, void *user_data)
207 int ret = MEDIA_CONTENT_ERROR_NONE;
209 media_content_debug_func();
213 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
214 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
217 ret = _media_db_get_tag(NULL, filter, callback, user_data);
222 int media_tag_get_media_count_from_db(int tag_id, filter_h filter, int *media_count)
224 int ret = MEDIA_CONTENT_ERROR_NONE;
226 media_content_debug_func();
228 if((tag_id > 0) && (media_count != NULL))
230 ret = _media_db_get_group_item_count_by_id(tag_id, filter, MEDIA_GROUP_TAG, media_count);
234 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
235 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
241 int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb callback, void *user_data)
243 int ret = MEDIA_CONTENT_ERROR_NONE;
245 media_content_debug_func();
249 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
250 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
253 ret = _media_db_get_group_item_by_id(tag_id, filter, callback, user_data, MEDIA_GROUP_TAG);
258 int media_tag_destroy(media_tag_h tag)
260 int ret = MEDIA_CONTENT_ERROR_NONE;
261 media_tag_s *_tag = (media_tag_s*)tag;
264 SAFE_FREE(_tag->name);
266 ret = MEDIA_CONTENT_ERROR_NONE;
270 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
271 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
276 int media_tag_clone(media_tag_h *dst, media_tag_h src)
278 int ret = MEDIA_CONTENT_ERROR_NONE;
279 media_tag_s *_src = (media_tag_s*)src;
280 media_tag_s *_dst = NULL;
284 _dst = (media_tag_s*)calloc(1, sizeof(media_tag_s));
288 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
289 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
292 _dst->tag_id = _src->tag_id;
294 if(STRING_VALID(_src->name))
296 _dst->name = strdup(_src->name);
297 if(_dst->name == NULL)
300 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
301 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
304 *dst = (media_tag_h)_dst;
305 ret = MEDIA_CONTENT_ERROR_NONE;
309 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
310 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
316 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
318 int ret = MEDIA_CONTENT_ERROR_NONE;
319 media_tag_s *_tag = (media_tag_s*)tag;
321 if((_tag != NULL) && (tag_id != NULL))
323 *tag_id = _tag->tag_id;
324 ret = MEDIA_CONTENT_ERROR_NONE;
328 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
329 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
335 int media_tag_get_name(media_tag_h tag, char **name)
337 int ret = MEDIA_CONTENT_ERROR_NONE;
338 media_tag_s *_tag = (media_tag_s*)tag;
341 if(STRING_VALID(_tag->name))
343 *name = strdup(_tag->name);
346 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
347 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
354 ret = MEDIA_CONTENT_ERROR_NONE;
359 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
360 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
366 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
368 int ret = MEDIA_CONTENT_ERROR_NONE;
369 sqlite3_stmt *stmt = NULL;
370 char select_query[DEFAULT_QUERY_SIZE];
374 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
375 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
378 memset(select_query, 0x00, sizeof(select_query));
380 snprintf(select_query, sizeof(select_query), SELECT_TAG_FROM_TAG, tag_id);
382 ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
383 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
385 while(sqlite3_step(stmt) == SQLITE_ROW)
387 media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
391 SQLITE3_FINALIZE(stmt);
392 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
393 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
396 _tag->tag_id = (int)sqlite3_column_int(stmt, 0);
398 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
400 _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));
403 *tag = (media_tag_h)_tag;
406 SQLITE3_FINALIZE(stmt);
411 int media_tag_add_media(media_tag_h tag, const char *media_id)
413 int ret = MEDIA_CONTENT_ERROR_NONE;
414 media_tag_s *_tag = (media_tag_s*)tag;
416 if((_tag != NULL) && STRING_VALID(media_id))
418 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
420 _item->media_id = strdup(media_id);
421 _item->function = MEDIA_TAG_ADD;
423 if(_item->media_id == NULL)
426 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
427 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
430 __media_tag_item_add(_item);
434 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
435 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
441 int media_tag_remove_media(media_tag_h tag, const char *media_id)
443 int ret = MEDIA_CONTENT_ERROR_NONE;
444 media_tag_s *_tag = (media_tag_s*)tag;
446 if(_tag != NULL && STRING_VALID(media_id))
448 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
450 _item->media_id = strdup(media_id);
451 _item->function = MEDIA_TAG_REMOVE;
453 if(_item->media_id == NULL)
456 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
457 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
460 __media_tag_item_add(_item);
464 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
465 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
471 int media_tag_set_name(media_tag_h tag, char *tag_name)
473 int ret = MEDIA_CONTENT_ERROR_NONE;
474 media_tag_s *_tag = (media_tag_s*)tag;
476 if(_tag != NULL && STRING_VALID(tag_name))
478 SAFE_FREE(_tag->name);
480 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
482 _item->tag_name = strdup(tag_name);
483 _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
485 if(_item->tag_name == NULL)
488 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
489 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
492 _tag->name = strdup(tag_name);
493 if(_tag->name == NULL)
495 SAFE_FREE(_item->tag_name);
497 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
498 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
501 __media_tag_item_add(_item);
505 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
506 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
512 int media_tag_update_to_db(media_tag_h tag)
514 int ret = MEDIA_CONTENT_ERROR_NONE;
515 media_tag_s *_tag = (media_tag_s*)tag;
518 media_tag_item_s *_tag_item = NULL;
522 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
523 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
526 length = g_list_length(g_tag_item_list);
528 for (idx = 0; idx < length; idx++) {
529 _tag_item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
530 if(_tag_item != NULL) {
531 switch(_tag_item->function) {
534 ret = __media_tag_insert_item_to_tag(_tag->tag_id, _tag_item->media_id);
538 case MEDIA_TAG_REMOVE:
540 ret = __media_tag_remove_item_from_tag(_tag->tag_id, _tag_item->media_id);
544 case MEDIA_TAG_UPDATE_TAG_NAME:
546 ret = __media_tag_update_tag_name(_tag->tag_id, _tag_item->tag_name);
553 __media_tag_item_release();