Remove duplicated memory setting
[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_free(gpointer item)
21 {
22         media_tag_item_s *_item = (media_tag_item_s *)item;
23         SAFE_FREE(_item->media_id);
24         SAFE_FREE(_item->tag_name);
25         SAFE_FREE(_item);
26 }
27
28 static void __media_tag_item_release(media_tag_s *tag)
29 {
30         if (!tag || !tag->item_list)
31                 return;
32
33         g_list_free_full(tag->item_list, __media_tag_item_free);
34         tag->item_list = NULL;
35 }
36
37 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
38 {
39         int ret = MEDIA_CONTENT_ERROR_NONE;
40         char *query_str = NULL;
41
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());
44
45         return _content_error_capi(ret);
46 }
47
48 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
49 {
50         int ret = MEDIA_CONTENT_ERROR_NONE;
51         char *query_str = NULL;
52
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());
55
56         return _content_error_capi(ret);
57 }
58
59 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
60 {
61         int ret = MEDIA_CONTENT_ERROR_NONE;
62         char *query_str = NULL;
63
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());
66
67         return _content_error_capi(ret);
68 }
69
70 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
71 {
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;
76
77         content_retip_if_fail(tag);
78
79         select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
80
81         ret = _content_get_result(select_query, &stmt);
82         SQLITE3_SAFE_FREE(select_query);
83         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
84
85         if (sqlite3_step(stmt) == SQLITE_ROW) {
86                 _tag->tag_id = sqlite3_column_int(stmt, 0);
87                 _tag->name = g_strdup(name);
88         } else {
89                 content_error("Nonexistent tag name[%s]", name);
90                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
91         }
92
93         SQLITE3_FINALIZE(stmt);
94
95         return ret;
96 }
97
98 int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
99 {
100         int ret = MEDIA_CONTENT_ERROR_NONE;
101         char *query_str = NULL;
102
103         content_retip_if_fail(STRING_VALID(tag_name));
104         content_retip_if_fail(tag);
105
106         query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
107         ret = _content_query_sql(query_str);
108         SQLITE3_SAFE_FREE(query_str);
109
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");
113
114                 ret = __media_tag_get_tag_info_from_db(tag_name, (media_tag_h)_tag);
115                 *tag = (media_tag_h)_tag;
116         }
117
118         return ret;
119 }
120
121 int media_tag_delete_from_db(int tag_id)
122 {
123         int ret = MEDIA_CONTENT_ERROR_NONE;
124         char *query_str = NULL;
125
126         content_retipm_if_fail(tag_id > 0, "%d", tag_id);
127
128         query_str = sqlite3_mprintf(DELETE_TAG_FROM_TAG, tag_id);
129         ret = _content_query_sql(query_str);
130
131         SQLITE3_SAFE_FREE(query_str);
132
133         return ret;
134 }
135
136 int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
137 {
138         content_retip_if_fail(tag_count);
139
140         return _media_db_get_group_count(filter, MEDIA_GROUP_TAG, tag_count);
141 }
142
143 int media_tag_foreach_tag_from_db(filter_h filter, media_tag_cb callback, void *user_data)
144 {
145         content_retip_if_fail(callback);
146
147         return _media_db_get_tag(NULL, filter, callback, user_data);
148 }
149
150 int media_tag_get_media_count_from_db(int tag_id, filter_h filter, int *media_count)
151 {
152         content_retipm_if_fail(tag_id > 0, "%d", tag_id);
153         content_retip_if_fail(media_count);
154
155         return _media_db_get_group_item_count_by_id(tag_id, filter, MEDIA_GROUP_TAG, media_count);
156 }
157
158 int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb callback, void *user_data)
159 {
160         content_retip_if_fail(callback);
161
162         return _media_db_get_group_item_by_id(tag_id, filter, callback, user_data, MEDIA_GROUP_TAG);
163 }
164
165 int media_tag_destroy(media_tag_h tag)
166 {
167         media_tag_s *_tag = (media_tag_s *)tag;
168         content_retip_if_fail(tag);
169
170         SAFE_FREE(_tag->name);
171         SAFE_FREE(_tag);
172
173         return MEDIA_CONTENT_ERROR_NONE;
174 }
175
176 int media_tag_clone(media_tag_h *dst, media_tag_h src)
177 {
178         media_tag_s *_src = (media_tag_s *)src;
179         media_tag_s *_dst = NULL;
180
181         content_retip_if_fail(src);
182         content_retip_if_fail(dst);
183
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");
186
187         _dst->tag_id = _src->tag_id;
188         _dst->name = g_strdup(_src->name);
189
190         *dst = (media_tag_h)_dst;
191
192         return MEDIA_CONTENT_ERROR_NONE;
193 }
194
195 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
196 {
197         media_tag_s *_tag = (media_tag_s *)tag;
198         content_retip_if_fail(tag);
199         content_retip_if_fail(tag_id);
200
201         *tag_id = _tag->tag_id;
202
203         return MEDIA_CONTENT_ERROR_NONE;
204 }
205
206 int media_tag_get_name(media_tag_h tag, char **name)
207 {
208         media_tag_s *_tag = (media_tag_s *)tag;
209         content_retip_if_fail(tag);
210         content_retip_if_fail(name);
211
212         *name = g_strdup(_tag->name);
213
214         return MEDIA_CONTENT_ERROR_NONE;
215 }
216
217 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
218 {
219         int ret = MEDIA_CONTENT_ERROR_NONE;
220         sqlite3_stmt *stmt = NULL;
221         char *query = NULL;
222         media_tag_s *_tag = NULL;
223
224         content_retipm_if_fail(tag_id > 0, "%d", tag_id);
225         content_retip_if_fail(tag);
226
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);
231
232         if (sqlite3_step(stmt) == SQLITE_ROW) {
233                 _tag = (media_tag_s *)calloc(1, sizeof(media_tag_s));
234                 if (_tag == NULL) {
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;
238                 }
239
240                 _tag->tag_id = tag_id;
241                 _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
242
243                 *tag = (media_tag_h)_tag;
244         } else {
245                 content_error("Nonexistent tag id[%d]", tag_id);
246                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
247         }
248
249         SQLITE3_FINALIZE(stmt);
250
251         return ret;
252 }
253
254 int media_tag_add_media(media_tag_h tag, const char *media_id)
255 {
256         int ret = MEDIA_CONTENT_ERROR_NONE;
257         media_tag_s *_tag = (media_tag_s *)tag;
258         media_tag_item_s *_item = NULL;
259
260         content_retip_if_fail(tag);
261         content_retip_if_fail(STRING_VALID(media_id));
262
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");
265
266         _item->media_id = g_strdup(media_id);
267         _item->function = MEDIA_TAG_ADD;
268
269         _tag->item_list = g_list_append(_tag->item_list, _item);
270
271         return ret;
272 }
273
274 int media_tag_remove_media(media_tag_h tag, const char *media_id)
275 {
276         int ret = MEDIA_CONTENT_ERROR_NONE;
277         media_tag_s *_tag = (media_tag_s *)tag;
278         media_tag_item_s *_item = NULL;
279
280         content_retip_if_fail(tag);
281         content_retip_if_fail(STRING_VALID(media_id));
282
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");
285
286         _item->media_id = g_strdup(media_id);
287         _item->function = MEDIA_TAG_REMOVE;
288
289         _tag->item_list = g_list_append(_tag->item_list, _item);
290
291         return ret;
292 }
293
294 int media_tag_set_name(media_tag_h tag, const char *tag_name)
295 {
296         int ret = MEDIA_CONTENT_ERROR_NONE;
297         media_tag_s *_tag = (media_tag_s *)tag;
298         media_tag_item_s *_item = NULL;
299
300         content_retip_if_fail(tag);
301         content_retip_if_fail(STRING_VALID(tag_name));
302
303         SAFE_FREE(_tag->name);
304
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");
307
308         _item->tag_name = g_strdup(tag_name);
309         _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
310
311         _tag->name = g_strdup(tag_name);
312
313         _tag->item_list = g_list_append(_tag->item_list, _item);
314
315         return ret;
316 }
317
318 void __media_tag_foreach_request(gpointer data, gpointer user_data)
319 {
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);
323
324         if (!_tag_item)
325                 return;
326
327         switch (_tag_item->function) {
328         case MEDIA_TAG_ADD:
329                 ret = __media_tag_insert_item_to_tag(tag_id, _tag_item->media_id);
330                 break;
331
332         case MEDIA_TAG_REMOVE:
333                 ret = __media_tag_remove_item_from_tag(tag_id, _tag_item->media_id);
334                 break;
335
336         case MEDIA_TAG_UPDATE_TAG_NAME:
337                 ret = __media_tag_update_tag_name(tag_id, _tag_item->tag_name);
338                 break;
339
340         default:
341                 break;
342         }
343
344         if (ret != MEDIA_CONTENT_ERROR_NONE)
345                 content_error("Failed some operation[%d]", _tag_item->function);
346 }
347
348 int media_tag_update_to_db(media_tag_h tag)
349 {
350         int ret = MEDIA_CONTENT_ERROR_NONE;
351         media_tag_s *_tag = (media_tag_s *)tag;
352
353         content_retip_if_fail(tag);
354         content_retvm_if(_tag->item_list == NULL, MEDIA_CONTENT_ERROR_NONE, "operation list length is 0");
355
356         g_list_foreach(_tag->item_list, __media_tag_foreach_request, GINT_TO_POINTER(_tag->tag_id));
357
358         ret = media_svc_send_query(_content_get_uid());
359
360         __media_tag_item_release(_tag);
361
362         return _content_error_capi(ret);
363 }
364
365 int media_tag_create(media_tag_h *tag)
366 {
367         content_retip_if_fail(tag);
368
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");
371
372         _tag->tag_id = -1;
373         _tag->name = NULL;
374         _tag->item_list = NULL;
375
376         *tag = (media_tag_h)_tag;
377
378         return MEDIA_CONTENT_ERROR_NONE;
379 }
380
381 int media_tag_insert_to_db_v2(media_tag_h tag)
382 {
383         int ret = MEDIA_CONTENT_ERROR_NONE;
384         media_tag_s *_tag = (media_tag_s *)tag;
385         media_tag_h tag_1;
386         int tag_id = -1;
387
388         content_retip_if_fail(tag);
389         content_retip_if_fail(STRING_VALID(_tag->name));
390         content_retip_if_fail(_tag->tag_id == -1);
391
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");
395                 goto ERROR;
396         }
397
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");
401                 goto ERROR;
402         }
403
404          _tag->tag_id = tag_id;
405
406         ret = media_tag_update_to_db(tag);
407
408 ERROR:
409         __media_tag_item_release(_tag);
410         media_tag_destroy(tag_1);
411
412         return ret;
413 }
414
415 int media_tag_update_to_db_v2(int tag_id, media_tag_h tag)
416 {
417         media_tag_s *_tag = (media_tag_s *)tag;
418
419         content_retip_if_fail(tag);
420         content_retip_if_fail(tag_id > 0);
421
422         _tag->tag_id = tag_id;
423
424         return media_tag_update_to_db(tag);
425 }