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