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