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>
20 static void __media_tag_item_free(gpointer item)
22 media_tag_item_s *_item = (media_tag_item_s *)item;
23 SAFE_FREE(_item->media_id);
24 SAFE_FREE(_item->tag_name);
28 static void __media_tag_item_release(media_tag_s *tag)
30 if (!tag || !tag->item_list)
33 g_list_free_full(tag->item_list, __media_tag_item_free);
34 tag->item_list = NULL;
37 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
39 int ret = MEDIA_CONTENT_ERROR_NONE;
40 char *query_str = NULL;
42 query_str = sqlite3_mprintf("INSERT OR IGNORE INTO %q (tag_id, media_id) values (%d, '%q');", DB_TABLE_TAG_MAP, tag_id, media_id);
43 ret = media_svc_append_query(query_str, _content_get_uid());
45 return _content_error_capi(ret);
48 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
50 int ret = MEDIA_CONTENT_ERROR_NONE;
51 char *query_str = NULL;
53 query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
54 ret = media_svc_append_query(query_str, _content_get_uid());
56 return _content_error_capi(ret);
59 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
61 int ret = MEDIA_CONTENT_ERROR_NONE;
62 char *query_str = NULL;
64 query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
65 ret = media_svc_append_query(query_str, _content_get_uid());
67 return _content_error_capi(ret);
70 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
72 int ret = MEDIA_CONTENT_ERROR_NONE;
73 sqlite3_stmt *stmt = NULL;
74 char *select_query = NULL;
75 media_tag_s *_tag = (media_tag_s *)tag;
77 content_retip_if_fail(tag);
79 select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
81 ret = _content_get_result(select_query, &stmt);
82 SQLITE3_SAFE_FREE(select_query);
83 content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
85 if (sqlite3_step(stmt) == SQLITE_ROW) {
86 _tag->tag_id = sqlite3_column_int(stmt, 0);
87 _tag->name = g_strdup(name);
89 content_error("Nonexistent tag name[%s]", name);
90 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
93 SQLITE3_FINALIZE(stmt);
98 int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
100 int ret = MEDIA_CONTENT_ERROR_NONE;
101 char *query_str = NULL;
103 content_retip_if_fail(STRING_VALID(tag_name));
104 content_retip_if_fail(tag);
106 query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
107 ret = _content_query_sql(query_str);
108 SQLITE3_SAFE_FREE(query_str);
110 if (ret == MEDIA_CONTENT_ERROR_NONE) {
111 media_tag_s *_tag = (media_tag_s *)calloc(1, sizeof(media_tag_s));
112 content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
114 ret = __media_tag_get_tag_info_from_db(tag_name, (media_tag_h)_tag);
115 *tag = (media_tag_h)_tag;
121 int media_tag_delete_from_db(int tag_id)
123 int ret = MEDIA_CONTENT_ERROR_NONE;
124 char *query_str = NULL;
126 content_retipm_if_fail(tag_id > 0, "%d", tag_id);
128 query_str = sqlite3_mprintf(DELETE_TAG_FROM_TAG, tag_id);
129 ret = _content_query_sql(query_str);
131 SQLITE3_SAFE_FREE(query_str);
136 int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
138 content_retip_if_fail(tag_count);
140 return _media_db_get_group_count(filter, MEDIA_GROUP_TAG, tag_count);
143 int media_tag_foreach_tag_from_db(filter_h filter, media_tag_cb callback, void *user_data)
145 content_retip_if_fail(callback);
147 return _media_db_get_tag(NULL, filter, callback, user_data);
150 int media_tag_get_media_count_from_db(int tag_id, filter_h filter, int *media_count)
152 content_retipm_if_fail(tag_id > 0, "%d", tag_id);
153 content_retip_if_fail(media_count);
155 return _media_db_get_group_item_count_by_id(tag_id, filter, MEDIA_GROUP_TAG, media_count);
158 int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb callback, void *user_data)
160 content_retip_if_fail(callback);
162 return _media_db_get_group_item_by_id(tag_id, filter, callback, user_data, MEDIA_GROUP_TAG);
165 int media_tag_destroy(media_tag_h tag)
167 media_tag_s *_tag = (media_tag_s *)tag;
168 content_retip_if_fail(tag);
170 SAFE_FREE(_tag->name);
173 return MEDIA_CONTENT_ERROR_NONE;
176 int media_tag_clone(media_tag_h *dst, media_tag_h src)
178 media_tag_s *_src = (media_tag_s *)src;
179 media_tag_s *_dst = NULL;
181 content_retip_if_fail(src);
182 content_retip_if_fail(dst);
184 _dst = (media_tag_s *)calloc(1, sizeof(media_tag_s));
185 content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
187 _dst->tag_id = _src->tag_id;
188 _dst->name = g_strdup(_src->name);
190 *dst = (media_tag_h)_dst;
192 return MEDIA_CONTENT_ERROR_NONE;
195 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
197 media_tag_s *_tag = (media_tag_s *)tag;
198 content_retip_if_fail(tag);
199 content_retip_if_fail(tag_id);
201 *tag_id = _tag->tag_id;
203 return MEDIA_CONTENT_ERROR_NONE;
206 int media_tag_get_name(media_tag_h tag, char **name)
208 media_tag_s *_tag = (media_tag_s *)tag;
209 content_retip_if_fail(tag);
210 content_retip_if_fail(name);
212 *name = g_strdup(_tag->name);
214 return MEDIA_CONTENT_ERROR_NONE;
217 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
219 int ret = MEDIA_CONTENT_ERROR_NONE;
220 sqlite3_stmt *stmt = NULL;
222 media_tag_s *_tag = NULL;
224 content_retipm_if_fail(tag_id > 0, "%d", tag_id);
225 content_retip_if_fail(tag);
227 query = sqlite3_mprintf(SELECT_TAG_FROM_TAG, tag_id);
228 ret = _content_get_result(query, &stmt);
229 SQLITE3_SAFE_FREE(query);
230 content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
232 if (sqlite3_step(stmt) == SQLITE_ROW) {
233 _tag = (media_tag_s *)calloc(1, sizeof(media_tag_s));
235 SQLITE3_FINALIZE(stmt);
236 content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
237 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
240 _tag->tag_id = tag_id;
241 _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
243 *tag = (media_tag_h)_tag;
245 content_error("Nonexistent tag id[%d]", tag_id);
246 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
249 SQLITE3_FINALIZE(stmt);
254 int media_tag_add_media(media_tag_h tag, const char *media_id)
256 int ret = MEDIA_CONTENT_ERROR_NONE;
257 media_tag_s *_tag = (media_tag_s *)tag;
258 media_tag_item_s *_item = NULL;
260 content_retip_if_fail(tag);
261 content_retip_if_fail(STRING_VALID(media_id));
263 _item = (media_tag_item_s *)calloc(1, sizeof(media_tag_item_s));
264 content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
266 _item->media_id = g_strdup(media_id);
267 _item->function = MEDIA_TAG_ADD;
269 _tag->item_list = g_list_append(_tag->item_list, _item);
274 int media_tag_remove_media(media_tag_h tag, const char *media_id)
276 int ret = MEDIA_CONTENT_ERROR_NONE;
277 media_tag_s *_tag = (media_tag_s *)tag;
278 media_tag_item_s *_item = NULL;
280 content_retip_if_fail(tag);
281 content_retip_if_fail(STRING_VALID(media_id));
283 _item = (media_tag_item_s *)calloc(1, sizeof(media_tag_item_s));
284 content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
286 _item->media_id = g_strdup(media_id);
287 _item->function = MEDIA_TAG_REMOVE;
289 _tag->item_list = g_list_append(_tag->item_list, _item);
294 int media_tag_set_name(media_tag_h tag, const char *tag_name)
296 int ret = MEDIA_CONTENT_ERROR_NONE;
297 media_tag_s *_tag = (media_tag_s *)tag;
298 media_tag_item_s *_item = NULL;
300 content_retip_if_fail(tag);
301 content_retip_if_fail(STRING_VALID(tag_name));
303 SAFE_FREE(_tag->name);
305 _item = (media_tag_item_s *)calloc(1, sizeof(media_tag_item_s));
306 content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
308 _item->tag_name = g_strdup(tag_name);
309 _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
311 _tag->name = g_strdup(tag_name);
313 _tag->item_list = g_list_append(_tag->item_list, _item);
318 void __media_tag_foreach_request(gpointer data, gpointer user_data)
320 int ret = MEDIA_CONTENT_ERROR_NONE;
321 media_tag_item_s *_tag_item = (media_tag_item_s *)data;
322 int tag_id = GPOINTER_TO_INT(user_data);
327 switch (_tag_item->function) {
329 ret = __media_tag_insert_item_to_tag(tag_id, _tag_item->media_id);
332 case MEDIA_TAG_REMOVE:
333 ret = __media_tag_remove_item_from_tag(tag_id, _tag_item->media_id);
336 case MEDIA_TAG_UPDATE_TAG_NAME:
337 ret = __media_tag_update_tag_name(tag_id, _tag_item->tag_name);
344 if (ret != MEDIA_CONTENT_ERROR_NONE)
345 content_error("Failed some operation[%d]", _tag_item->function);
348 int media_tag_update_to_db(media_tag_h tag)
350 int ret = MEDIA_CONTENT_ERROR_NONE;
351 media_tag_s *_tag = (media_tag_s *)tag;
353 content_retip_if_fail(tag);
354 content_retvm_if(_tag->item_list == NULL, MEDIA_CONTENT_ERROR_NONE, "operation list length is 0");
356 g_list_foreach(_tag->item_list, __media_tag_foreach_request, GINT_TO_POINTER(_tag->tag_id));
358 ret = media_svc_send_query(_content_get_uid());
360 __media_tag_item_release(_tag);
362 return _content_error_capi(ret);
365 int media_tag_create(media_tag_h *tag)
367 content_retip_if_fail(tag);
369 media_tag_s *_tag = (media_tag_s *)calloc(1, sizeof(media_tag_s));
370 content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
374 _tag->item_list = NULL;
376 *tag = (media_tag_h)_tag;
378 return MEDIA_CONTENT_ERROR_NONE;
381 int media_tag_insert_to_db_v2(media_tag_h tag)
383 int ret = MEDIA_CONTENT_ERROR_NONE;
384 media_tag_s *_tag = (media_tag_s *)tag;
388 content_retip_if_fail(tag);
389 content_retip_if_fail(STRING_VALID(_tag->name));
390 content_retip_if_fail(_tag->tag_id == -1);
392 ret = media_tag_insert_to_db(_tag->name, &tag_1);
393 if (ret != MEDIA_CONTENT_ERROR_NONE) {
394 content_error("fail media_tag_insert_to_db");
398 ret = media_tag_get_tag_id(tag_1, &tag_id);
399 if (ret != MEDIA_CONTENT_ERROR_NONE) {
400 content_error("fail media_tag_get_tag_id");
404 _tag->tag_id = tag_id;
406 ret = media_tag_update_to_db(tag);
409 __media_tag_item_release(_tag);
410 media_tag_destroy(tag_1);
415 int media_tag_update_to_db_v2(int tag_id, media_tag_h tag)
417 media_tag_s *_tag = (media_tag_s *)tag;
419 content_retip_if_fail(tag);
420 content_retip_if_fail(tag_id > 0);
422 _tag->tag_id = tag_id;
424 return media_tag_update_to_db(tag);