Tizen 2.1 base
[platform/core/api/media-content.git] / src / media_tag.c
1 /*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17
18 #include <media_content.h>
19 #include <media_info_private.h>
20
21
22 static __thread GList *g_tag_item_list = NULL;
23
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);
30
31 static void __media_tag_item_add(media_tag_item_s *item_s)
32 {
33         g_tag_item_list = g_list_append(g_tag_item_list, item_s);
34 }
35
36 static void __media_tag_item_release(void)
37 {
38         int idx = 0;
39         int list_cnt = 0;
40         media_tag_item_s *item = NULL;
41
42         list_cnt = g_list_length(g_tag_item_list);
43
44         media_content_debug("list_cnt : [%d]", list_cnt);
45
46         for(idx = 0; idx < list_cnt; idx++)
47         {
48                 item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
49                 if(item != NULL)
50                 {
51                         SAFE_FREE(item->media_id);
52                         SAFE_FREE(item->tag_name);
53                         SAFE_FREE(item);
54                 }
55         }
56
57         g_list_free(g_tag_item_list);
58         g_tag_item_list = NULL;
59
60 }
61
62 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
63 {
64         int ret = MEDIA_CONTENT_ERROR_NONE;
65         char *query_str = NULL;
66
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);
71
72         return ret;
73 }
74
75 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
76 {
77         int ret = MEDIA_CONTENT_ERROR_NONE;
78         char *query_str = NULL;
79
80         query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
81
82         ret = _content_query_sql(query_str);
83         sqlite3_free(query_str);
84
85         return ret;
86 }
87
88 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
89 {
90         int ret = MEDIA_CONTENT_ERROR_NONE;
91         char *query_str = NULL;
92
93         query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
94
95         ret = _content_query_sql(query_str);
96         sqlite3_free(query_str);
97
98         return ret;
99 }
100
101 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
102 {
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;
107
108         if(_tag == NULL)
109         {
110                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
111                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
112         }
113
114         select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
115
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);
119
120         while(sqlite3_step(stmt) == SQLITE_ROW)
121         {
122                 _tag->tag_id = (int)sqlite3_column_int(stmt,0);
123
124                 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
125                 {
126                         _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));
127                 }
128         }
129
130         SQLITE3_FINALIZE(stmt);
131
132         return ret;
133 }
134
135 int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
136 {
137         int ret = MEDIA_CONTENT_ERROR_NONE;
138         char *query_str = NULL;
139
140         if(!STRING_VALID(tag_name))
141         {
142                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
143                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
144         }
145
146         query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
147         ret = _content_query_sql(query_str);
148         sqlite3_free(query_str);
149
150         if(ret == MEDIA_CONTENT_ERROR_NONE)
151         {
152                 media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
153                 if(_tag == NULL)
154                 {
155                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
156                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
157                 }
158
159                 ret = __media_tag_get_tag_info_from_db(tag_name, (media_tag_h)_tag);
160                 *tag = (media_tag_h)_tag;
161         }
162
163         return ret;
164 }
165
166 int media_tag_delete_from_db(int tag_id)
167 {
168         int ret = MEDIA_CONTENT_ERROR_NONE;
169         char *query_str = NULL;
170
171         if(tag_id < 0)
172         {
173                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
174                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
175         }
176
177         query_str = sqlite3_mprintf(DELETE_TAG_FROM_TAG, tag_id);
178
179         ret = _content_query_sql(query_str);
180
181         sqlite3_free(query_str);
182
183         return ret;
184 }
185
186 int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
187 {
188         int ret = MEDIA_CONTENT_ERROR_NONE;
189
190         media_content_debug_func();
191
192         if(tag_count != NULL)
193         {
194                 ret = _media_db_get_group_count(filter, MEDIA_GROUP_TAG, tag_count);
195         }
196         else
197         {
198                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
199                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
200         }
201
202         return ret;
203 }
204
205 int media_tag_foreach_tag_from_db (filter_h filter, media_tag_cb callback, void *user_data)
206 {
207         int ret = MEDIA_CONTENT_ERROR_NONE;
208
209         media_content_debug_func();
210
211         if(callback == NULL)
212         {
213                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
214                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
215         }
216
217         ret = _media_db_get_tag(NULL, filter, callback, user_data);
218
219         return ret;
220 }
221
222 int media_tag_get_media_count_from_db(int tag_id, filter_h filter, int *media_count)
223 {
224         int ret = MEDIA_CONTENT_ERROR_NONE;
225
226         media_content_debug_func();
227
228         if((tag_id > 0) && (media_count != NULL))
229         {
230                 ret = _media_db_get_group_item_count_by_id(tag_id, filter, MEDIA_GROUP_TAG, media_count);
231         }
232         else
233         {
234                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
235                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
236         }
237
238         return ret;
239 }
240
241 int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb callback, void *user_data)
242 {
243         int ret = MEDIA_CONTENT_ERROR_NONE;
244
245         media_content_debug_func();
246
247         if(callback == NULL)
248         {
249                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
250                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
251         }
252
253         ret = _media_db_get_group_item_by_id(tag_id, filter, callback, user_data, MEDIA_GROUP_TAG);
254
255         return ret;
256 }
257
258 int media_tag_destroy(media_tag_h tag)
259 {
260         int ret = MEDIA_CONTENT_ERROR_NONE;
261         media_tag_s *_tag = (media_tag_s*)tag;
262         if(_tag)
263         {
264                 SAFE_FREE(_tag->name);
265                 SAFE_FREE(_tag);
266                 ret = MEDIA_CONTENT_ERROR_NONE;
267         }
268         else
269         {
270                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
271                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
272         }
273
274         return ret;
275 }
276 int media_tag_clone(media_tag_h *dst, media_tag_h src)
277 {
278         int ret = MEDIA_CONTENT_ERROR_NONE;
279         media_tag_s *_src = (media_tag_s*)src;
280         media_tag_s *_dst = NULL;
281
282         if((_src != NULL))
283         {
284                 _dst = (media_tag_s*)calloc(1, sizeof(media_tag_s));
285
286                 if(_dst == NULL)
287                 {
288                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
289                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
290                 }
291
292                 _dst->tag_id = _src->tag_id;
293
294                 if(STRING_VALID(_src->name))
295                 {
296                         _dst->name = strdup(_src->name);
297                         if(_dst->name == NULL)
298                         {
299                                 SAFE_FREE(_dst);
300                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
301                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
302                         }
303                 }
304                 *dst = (media_tag_h)_dst;
305                 ret = MEDIA_CONTENT_ERROR_NONE;
306         }
307         else
308         {
309                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
310                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
311         }
312
313         return ret;
314 }
315
316 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
317 {
318         int ret = MEDIA_CONTENT_ERROR_NONE;
319         media_tag_s *_tag = (media_tag_s*)tag;
320
321         if((_tag != NULL) && (tag_id != NULL))
322         {
323                 *tag_id = _tag->tag_id;
324                 ret = MEDIA_CONTENT_ERROR_NONE;
325         }
326         else
327         {
328                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
329                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
330         }
331
332         return ret;
333 }
334
335 int media_tag_get_name(media_tag_h tag, char **name)
336 {
337         int ret = MEDIA_CONTENT_ERROR_NONE;
338         media_tag_s *_tag = (media_tag_s*)tag;
339         if(_tag)
340         {
341                 if(STRING_VALID(_tag->name))
342                 {
343                         *name = strdup(_tag->name);
344                         if(*name == NULL)
345                         {
346                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
347                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
348                         }
349                 }
350                 else
351                 {
352                         *name = NULL;
353                 }
354                 ret = MEDIA_CONTENT_ERROR_NONE;
355
356         }
357         else
358         {
359                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
360                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
361         }
362
363         return ret;
364 }
365
366 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
367 {
368         int ret = MEDIA_CONTENT_ERROR_NONE;
369         sqlite3_stmt *stmt = NULL;
370         char select_query[DEFAULT_QUERY_SIZE];
371
372         if(tag_id <= 0)
373         {
374                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
375                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
376         }
377
378         memset(select_query, 0x00, sizeof(select_query));
379
380         snprintf(select_query, sizeof(select_query), SELECT_TAG_FROM_TAG, tag_id);
381
382         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
383         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
384
385         while(sqlite3_step(stmt) == SQLITE_ROW)
386         {
387                 media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
388
389                 if(_tag == NULL)
390                 {
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;
394                 }
395
396                 _tag->tag_id = (int)sqlite3_column_int(stmt, 0);
397
398                 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
399                 {
400                         _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));
401                 }
402
403                 *tag = (media_tag_h)_tag;
404         }
405
406         SQLITE3_FINALIZE(stmt);
407
408         return ret;
409 }
410
411 int media_tag_add_media(media_tag_h tag, const char *media_id)
412 {
413         int ret = MEDIA_CONTENT_ERROR_NONE;
414         media_tag_s *_tag = (media_tag_s*)tag;
415
416         if((_tag != NULL) && STRING_VALID(media_id))
417         {
418                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
419
420                 _item->media_id = strdup(media_id);
421                 _item->function = MEDIA_TAG_ADD;
422
423                 if(_item->media_id == NULL)
424                 {
425                         SAFE_FREE(_item);
426                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
427                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
428                 }
429
430                 __media_tag_item_add(_item);
431         }
432         else
433         {
434                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
435                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
436         }
437
438         return ret;
439 }
440
441 int media_tag_remove_media(media_tag_h tag, const char *media_id)
442 {
443         int ret = MEDIA_CONTENT_ERROR_NONE;
444         media_tag_s *_tag = (media_tag_s*)tag;
445
446         if(_tag != NULL && STRING_VALID(media_id))
447         {
448                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
449
450                 _item->media_id = strdup(media_id);
451                 _item->function = MEDIA_TAG_REMOVE;
452
453                 if(_item->media_id == NULL)
454                 {
455                         SAFE_FREE(_item);
456                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
457                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
458                 }
459
460                 __media_tag_item_add(_item);
461         }
462         else
463         {
464                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
465                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
466         }
467
468         return ret;
469 }
470
471 int media_tag_set_name(media_tag_h tag, char *tag_name)
472 {
473         int ret = MEDIA_CONTENT_ERROR_NONE;
474         media_tag_s *_tag = (media_tag_s*)tag;
475
476         if(_tag != NULL && STRING_VALID(tag_name))
477         {
478                 SAFE_FREE(_tag->name);
479
480                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
481
482                 _item->tag_name = strdup(tag_name);
483                 _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
484
485                 if(_item->tag_name == NULL)
486                 {
487                         SAFE_FREE(_item);
488                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
489                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
490                 }
491
492                 _tag->name = strdup(tag_name);
493                 if(_tag->name == NULL)
494                 {
495                         SAFE_FREE(_item->tag_name);
496                         SAFE_FREE(_item);
497                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
498                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
499                 }
500
501                 __media_tag_item_add(_item);
502         }
503         else
504         {
505                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
506                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
507         }
508
509         return ret;
510 }
511
512 int media_tag_update_to_db(media_tag_h tag)
513 {
514         int ret = MEDIA_CONTENT_ERROR_NONE;
515         media_tag_s *_tag = (media_tag_s*)tag;
516         int idx = 0;
517         int length = 0;
518         media_tag_item_s *_tag_item = NULL;
519
520         if(_tag == NULL)
521         {
522                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
523                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
524         }
525
526         length = g_list_length(g_tag_item_list);
527
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) {
532                                 case MEDIA_TAG_ADD:
533                                 {
534                                         ret = __media_tag_insert_item_to_tag(_tag->tag_id, _tag_item->media_id);
535                                 }
536                                 break;
537
538                                 case MEDIA_TAG_REMOVE:
539                                 {
540                                         ret = __media_tag_remove_item_from_tag(_tag->tag_id, _tag_item->media_id);
541                                 }
542                                 break;
543
544                                 case MEDIA_TAG_UPDATE_TAG_NAME:
545                                 {
546                                         ret = __media_tag_update_tag_name(_tag->tag_id, _tag_item->tag_name);
547                                 }
548                                 break;
549                         }
550                 }
551         }
552
553         __media_tag_item_release();
554
555         return ret;
556 }