initialize array
[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 int media_tag_clone(media_tag_h *dst, media_tag_h src)
237 {
238         int ret = MEDIA_CONTENT_ERROR_NONE;
239         media_tag_s *_src = (media_tag_s*)src;
240         media_tag_s *_dst = NULL;
241
242         if ((_src != NULL)) {
243                 _dst = (media_tag_s*)calloc(1, sizeof(media_tag_s));
244                 media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
245
246                 _dst->tag_id = _src->tag_id;
247
248                 if (STRING_VALID(_src->name)) {
249                         _dst->name = strdup(_src->name);
250                         if (_dst->name == NULL) {
251                                 SAFE_FREE(_dst);
252                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
253                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
254                         }
255                 }
256                 *dst = (media_tag_h)_dst;
257                 ret = MEDIA_CONTENT_ERROR_NONE;
258         } else {
259                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
260                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
261         }
262
263         return ret;
264 }
265
266 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
267 {
268         int ret = MEDIA_CONTENT_ERROR_NONE;
269         media_tag_s *_tag = (media_tag_s*)tag;
270
271         if ((_tag != NULL) && (tag_id != NULL)) {
272                 *tag_id = _tag->tag_id;
273                 ret = MEDIA_CONTENT_ERROR_NONE;
274         } else {
275                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
276                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
277         }
278
279         return ret;
280 }
281
282 int media_tag_get_name(media_tag_h tag, char **name)
283 {
284         int ret = MEDIA_CONTENT_ERROR_NONE;
285         media_tag_s *_tag = (media_tag_s*)tag;
286         if (_tag) {
287                 if (STRING_VALID(_tag->name)) {
288                         *name = strdup(_tag->name);
289                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
290                 } else {
291                         *name = NULL;
292                 }
293                 ret = MEDIA_CONTENT_ERROR_NONE;
294
295         } else {
296                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
297                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
298         }
299
300         return ret;
301 }
302
303 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
304 {
305         int ret = MEDIA_CONTENT_ERROR_NONE;
306         sqlite3_stmt *stmt = NULL;
307         char select_query[DEFAULT_QUERY_SIZE] = {0, };
308
309         if (tag_id <= 0) {
310                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
311                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
312         }
313
314         memset(select_query, 0x00, sizeof(select_query));
315
316         snprintf(select_query, sizeof(select_query), SELECT_TAG_FROM_TAG, tag_id);
317
318         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
319         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
320
321         media_tag_s *_tag = NULL;
322
323         while (sqlite3_step(stmt) == SQLITE_ROW) {
324                 if (_tag)
325                         media_tag_destroy((media_tag_h)_tag);
326
327                 _tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
328                 if (_tag == NULL) {
329                         SQLITE3_FINALIZE(stmt);
330                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
331                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
332                 }
333
334                 _tag->tag_id = (int)sqlite3_column_int(stmt, 0);
335                 _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
336
337                 *tag = (media_tag_h)_tag;
338         }
339
340         SQLITE3_FINALIZE(stmt);
341
342         return ret;
343 }
344
345 int media_tag_add_media(media_tag_h tag, const char *media_id)
346 {
347         int ret = MEDIA_CONTENT_ERROR_NONE;
348         media_tag_s *_tag = (media_tag_s*)tag;
349
350         if ((_tag != NULL) && STRING_VALID(media_id)) {
351                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
352                 media_content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
353
354                 _item->media_id = strdup(media_id);
355                 _item->function = MEDIA_TAG_ADD;
356
357                 if (_item->media_id == NULL) {
358                         SAFE_FREE(_item);
359                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
360                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
361                 }
362
363                 __media_tag_item_add(_tag, _item);
364         } else {
365                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
366                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
367         }
368
369         return ret;
370 }
371
372 int media_tag_remove_media(media_tag_h tag, const char *media_id)
373 {
374         int ret = MEDIA_CONTENT_ERROR_NONE;
375         media_tag_s *_tag = (media_tag_s*)tag;
376
377         if (_tag != NULL && STRING_VALID(media_id)) {
378                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
379                 media_content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
380
381                 _item->media_id = strdup(media_id);
382                 _item->function = MEDIA_TAG_REMOVE;
383
384                 if (_item->media_id == NULL) {
385                         SAFE_FREE(_item);
386                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
387                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
388                 }
389
390                 __media_tag_item_add(_tag, _item);
391         } else {
392                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
393                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
394         }
395
396         return ret;
397 }
398
399 int media_tag_set_name(media_tag_h tag, char *tag_name)
400 {
401         int ret = MEDIA_CONTENT_ERROR_NONE;
402         media_tag_s *_tag = (media_tag_s*)tag;
403
404         if (_tag != NULL && STRING_VALID(tag_name)) {
405                 SAFE_FREE(_tag->name);
406
407                 media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
408                 media_content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
409
410                 _item->tag_name = strdup(tag_name);
411                 _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
412
413                 if (_item->tag_name == NULL) {
414                         SAFE_FREE(_item);
415                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
416                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
417                 }
418
419                 _tag->name = strdup(tag_name);
420                 if (_tag->name == NULL) {
421                         SAFE_FREE(_item->tag_name);
422                         SAFE_FREE(_item);
423                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
424                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
425                 }
426
427                 __media_tag_item_add(_tag, _item);
428         } else {
429                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
430                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
431         }
432
433         return ret;
434 }
435
436 int media_tag_update_to_db(media_tag_h tag)
437 {
438         int ret = MEDIA_CONTENT_ERROR_NONE;
439         media_tag_s *_tag = (media_tag_s*)tag;
440         int idx = 0;
441         int length = 0;
442         media_tag_item_s *_tag_item = NULL;
443
444         if (_tag == NULL) {
445                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
446                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
447         }
448
449         if (_tag->item_list != NULL) {
450                 length = g_list_length(_tag->item_list);
451         } else {
452                 media_content_debug("operation list length is 0");
453                 return MEDIA_CONTENT_ERROR_NONE;
454         }
455
456         for (idx = 0; idx < length; idx++) {
457                 _tag_item = (media_tag_item_s*)g_list_nth_data(_tag->item_list, idx);
458                 if (_tag_item != NULL) {
459                         switch (_tag_item->function) {
460                         case MEDIA_TAG_ADD:
461                         {
462                                 ret = __media_tag_insert_item_to_tag(_tag->tag_id, _tag_item->media_id);
463                         }
464                         break;
465
466                         case MEDIA_TAG_REMOVE:
467                         {
468                                 ret = __media_tag_remove_item_from_tag(_tag->tag_id, _tag_item->media_id);
469                         }
470                         break;
471
472                         case MEDIA_TAG_UPDATE_TAG_NAME:
473                         {
474                                 ret = __media_tag_update_tag_name(_tag->tag_id, _tag_item->tag_name);
475                         }
476                         break;
477
478                         default:
479                         break;
480                         }
481                 }
482         }
483
484         ret = media_svc_send_query(tzplatform_getuid(TZ_USER_NAME));
485
486         __media_tag_item_release(_tag);
487
488         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
489 }