Use g_canonicalize_filename() instead
[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
24         g_free(_item->media_id);
25         g_free(_item->tag_name);
26         g_free(_item);
27 }
28
29 static void __media_tag_item_release(media_tag_s *tag)
30 {
31         if (!tag || !tag->item_list)
32                 return;
33
34         g_list_free_full(tag->item_list, __media_tag_item_free);
35         tag->item_list = NULL;
36 }
37
38 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
39 {
40         int ret = MEDIA_CONTENT_ERROR_NONE;
41         char *query_str = NULL;
42
43         query_str = sqlite3_mprintf("INSERT OR IGNORE INTO %q (tag_id, media_id) values (%d, '%q');", DB_TABLE_TAG_MAP, tag_id, media_id);
44         ret = media_svc_append_query(query_str, _content_get_uid());
45
46         return _content_error_capi(ret);
47 }
48
49 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
50 {
51         int ret = MEDIA_CONTENT_ERROR_NONE;
52         char *query_str = NULL;
53
54         query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
55         ret = media_svc_append_query(query_str, _content_get_uid());
56
57         return _content_error_capi(ret);
58 }
59
60 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
61 {
62         int ret = MEDIA_CONTENT_ERROR_NONE;
63         char *query_str = NULL;
64
65         query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
66         ret = media_svc_append_query(query_str, _content_get_uid());
67
68         return _content_error_capi(ret);
69 }
70
71 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
72 {
73         int ret = MEDIA_CONTENT_ERROR_NONE;
74         sqlite3_stmt *stmt = NULL;
75         char *select_query = NULL;
76         media_tag_s *_tag = (media_tag_s *)tag;
77
78         content_retip_if_fail(tag);
79
80         select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
81
82         ret = _content_get_result(select_query, &stmt);
83         SQLITE3_SAFE_FREE(select_query);
84         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
85
86         if (sqlite3_step(stmt) == SQLITE_ROW) {
87                 _tag->tag_id = sqlite3_column_int(stmt, 0);
88                 _tag->name = g_strdup(name);
89         } else {
90                 content_error("Nonexistent tag name[%s]", name);
91                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
92         }
93
94         SQLITE3_FINALIZE(stmt);
95
96         return ret;
97 }
98
99 int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
100 {
101         int ret = MEDIA_CONTENT_ERROR_NONE;
102         char *query_str = NULL;
103         media_tag_s *_tag = NULL;
104
105         content_retip_if_fail(STRING_VALID(tag_name));
106         content_retip_if_fail(tag);
107
108         query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
109         ret = _content_query_sql(query_str);
110         SQLITE3_SAFE_FREE(query_str);
111         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "fail to insert tag");
112
113         _tag = g_new0(media_tag_s, 1);
114
115         ret = __media_tag_get_tag_info_from_db(tag_name, (media_tag_h)_tag);
116         *tag = (media_tag_h)_tag;
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
169         content_retip_if_fail(tag);
170
171         __media_tag_item_release(_tag);
172
173         g_free(_tag->name);
174         g_free(_tag);
175
176         return MEDIA_CONTENT_ERROR_NONE;
177 }
178
179 int media_tag_clone(media_tag_h *dst, media_tag_h src)
180 {
181         media_tag_s *_src = (media_tag_s *)src;
182         media_tag_s *_dst = NULL;
183
184         content_retip_if_fail(src);
185         content_retip_if_fail(dst);
186
187         _dst = g_new0(media_tag_s, 1);
188
189         _dst->tag_id = _src->tag_id;
190         _dst->name = g_strdup(_src->name);
191
192         *dst = (media_tag_h)_dst;
193
194         return MEDIA_CONTENT_ERROR_NONE;
195 }
196
197 int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
198 {
199         media_tag_s *_tag = (media_tag_s *)tag;
200
201         content_retip_if_fail(tag);
202         content_retip_if_fail(tag_id);
203
204         *tag_id = _tag->tag_id;
205
206         return MEDIA_CONTENT_ERROR_NONE;
207 }
208
209 int media_tag_get_name(media_tag_h tag, char **name)
210 {
211         media_tag_s *_tag = (media_tag_s *)tag;
212
213         content_retip_if_fail(tag);
214         content_retip_if_fail(name);
215
216         *name = g_strdup(_tag->name);
217
218         return MEDIA_CONTENT_ERROR_NONE;
219 }
220
221 int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
222 {
223         int ret = MEDIA_CONTENT_ERROR_NONE;
224         sqlite3_stmt *stmt = NULL;
225         char *query = NULL;
226         media_tag_s *_tag = NULL;
227
228         content_retipm_if_fail(tag_id > 0, "%d", tag_id);
229         content_retip_if_fail(tag);
230
231         query = sqlite3_mprintf(SELECT_TAG_FROM_TAG, tag_id);
232         ret = _content_get_result(query, &stmt);
233         SQLITE3_SAFE_FREE(query);
234         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
235
236         if (sqlite3_step(stmt) == SQLITE_ROW) {
237                 _tag = g_new0(media_tag_s, 1);
238
239                 _tag->tag_id = tag_id;
240                 _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
241
242                 *tag = (media_tag_h)_tag;
243         } else {
244                 content_error("Nonexistent tag id[%d]", tag_id);
245                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
246         }
247
248         SQLITE3_FINALIZE(stmt);
249
250         return ret;
251 }
252
253 int media_tag_add_media(media_tag_h tag, const char *media_id)
254 {
255         int ret = MEDIA_CONTENT_ERROR_NONE;
256         media_tag_s *_tag = (media_tag_s *)tag;
257         media_tag_item_s *_item = NULL;
258
259         content_retip_if_fail(tag);
260         content_retip_if_fail(STRING_VALID(media_id));
261
262         _item = g_new0(media_tag_item_s, 1);
263
264         _item->media_id = g_strdup(media_id);
265         _item->function = MEDIA_TAG_ADD;
266
267         _tag->item_list = g_list_append(_tag->item_list, _item);
268
269         return ret;
270 }
271
272 int media_tag_remove_media(media_tag_h tag, const char *media_id)
273 {
274         int ret = MEDIA_CONTENT_ERROR_NONE;
275         media_tag_s *_tag = (media_tag_s *)tag;
276         media_tag_item_s *_item = NULL;
277
278         content_retip_if_fail(tag);
279         content_retip_if_fail(STRING_VALID(media_id));
280
281         _item = g_new0(media_tag_item_s, 1);
282
283         _item->media_id = g_strdup(media_id);
284         _item->function = MEDIA_TAG_REMOVE;
285
286         _tag->item_list = g_list_append(_tag->item_list, _item);
287
288         return ret;
289 }
290
291 int media_tag_set_name(media_tag_h tag, const char *tag_name)
292 {
293         int ret = MEDIA_CONTENT_ERROR_NONE;
294         media_tag_s *_tag = (media_tag_s *)tag;
295         media_tag_item_s *_item = NULL;
296
297         content_retip_if_fail(tag);
298         content_retip_if_fail(STRING_VALID(tag_name));
299
300         g_free(_tag->name);
301
302         _item = g_new0(media_tag_item_s, 1);
303
304         _item->tag_name = g_strdup(tag_name);
305         _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
306
307         _tag->name = g_strdup(tag_name);
308
309         _tag->item_list = g_list_append(_tag->item_list, _item);
310
311         return ret;
312 }
313
314 void __media_tag_foreach_request(gpointer data, gpointer user_data)
315 {
316         int ret = MEDIA_CONTENT_ERROR_NONE;
317         media_tag_item_s *_tag_item = (media_tag_item_s *)data;
318         int tag_id = GPOINTER_TO_INT(user_data);
319
320         if (!_tag_item)
321                 return;
322
323         switch (_tag_item->function) {
324         case MEDIA_TAG_ADD:
325                 ret = __media_tag_insert_item_to_tag(tag_id, _tag_item->media_id);
326                 break;
327
328         case MEDIA_TAG_REMOVE:
329                 ret = __media_tag_remove_item_from_tag(tag_id, _tag_item->media_id);
330                 break;
331
332         case MEDIA_TAG_UPDATE_TAG_NAME:
333                 ret = __media_tag_update_tag_name(tag_id, _tag_item->tag_name);
334                 break;
335
336         default:
337                 break;
338         }
339
340         if (ret != MEDIA_CONTENT_ERROR_NONE)
341                 content_error("Failed some operation[%d]", _tag_item->function);
342 }
343
344 int media_tag_update_to_db(media_tag_h tag)
345 {
346         int ret = MEDIA_CONTENT_ERROR_NONE;
347         media_tag_s *_tag = (media_tag_s *)tag;
348
349         content_retip_if_fail(tag);
350         content_retvm_if(_tag->item_list == NULL, MEDIA_CONTENT_ERROR_NONE, "operation list length is 0");
351
352         g_list_foreach(_tag->item_list, __media_tag_foreach_request, GINT_TO_POINTER(_tag->tag_id));
353
354         ret = media_svc_send_query(_content_get_uid());
355
356         __media_tag_item_release(_tag);
357
358         return _content_error_capi(ret);
359 }
360
361 int media_tag_create(media_tag_h *tag)
362 {
363         content_retip_if_fail(tag);
364
365         media_tag_s *_tag = g_new0(media_tag_s, 1);
366
367         _tag->tag_id = -1;
368         _tag->name = NULL;
369         _tag->item_list = NULL;
370
371         *tag = (media_tag_h)_tag;
372
373         return MEDIA_CONTENT_ERROR_NONE;
374 }
375
376 int media_tag_insert_to_db_v2(media_tag_h tag)
377 {
378         int ret = MEDIA_CONTENT_ERROR_NONE;
379         media_tag_s *_tag = (media_tag_s *)tag;
380         media_tag_h tag_1;
381         int tag_id = -1;
382
383         content_retip_if_fail(tag);
384         content_retip_if_fail(STRING_VALID(_tag->name));
385         content_retip_if_fail(_tag->tag_id == -1);
386
387         ret = media_tag_insert_to_db(_tag->name, &tag_1);
388         if (ret != MEDIA_CONTENT_ERROR_NONE) {
389                 content_error("fail media_tag_insert_to_db");
390                 goto ERROR;
391         }
392
393         ret = media_tag_get_tag_id(tag_1, &tag_id);
394         if (ret != MEDIA_CONTENT_ERROR_NONE) {
395                 content_error("fail media_tag_get_tag_id");
396                 goto ERROR;
397         }
398
399          _tag->tag_id = tag_id;
400
401         ret = media_tag_update_to_db(tag);
402
403 ERROR:
404         __media_tag_item_release(_tag);
405         media_tag_destroy(tag_1);
406
407         return ret;
408 }
409
410 int media_tag_update_to_db_v2(int tag_id, media_tag_h tag)
411 {
412         media_tag_s *_tag = (media_tag_s *)tag;
413
414         content_retip_if_fail(tag);
415         content_retip_if_fail(tag_id > 0);
416
417         _tag->tag_id = tag_id;
418
419         return media_tag_update_to_db(tag);
420 }