32c91cc5f44332b42885ea95b7c42db390a6fb24
[platform/core/api/media-content.git] / src / media_db.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_content.h>
19 #include <media_info_private.h>
20 #include <media_util_private.h>
21
22 static const char * __media_db_get_group_name(media_group_e group)
23 {
24         switch (group) {
25         case MEDIA_CONTENT_GROUP_DISPLAY_NAME:
26                 return DB_FIELD_MEDIA_DISPLAY_NAME;
27         case MEDIA_CONTENT_GROUP_TYPE:
28                 return DB_FIELD_MEDIA_TYPE;
29         case MEDIA_CONTENT_GROUP_MIME_TYPE:
30                 return DB_FIELD_MEDIA_MIME_TYPE;
31         case MEDIA_CONTENT_GROUP_SIZE:
32                 return DB_FIELD_MEDIA_SIZE;
33         case MEDIA_CONTENT_GROUP_ADDED_TIME:
34                 return DB_FIELD_MEDIA_ADDED_TIME;
35         case MEDIA_CONTENT_GROUP_MODIFIED_TIME:
36                 return DB_FIELD_MEDIA_MODIFIED_TIME;
37         case MEDIA_CONTENT_GROUP_TITLE:
38                 return DB_FIELD_MEDIA_TITLE;
39         case MEDIA_CONTENT_GROUP_ARTIST:
40                 return DB_FIELD_MEDIA_ARTIST;
41         case MEDIA_CONTENT_GROUP_ALBUM_ARTIST:
42                 return DB_FIELD_MEDIA_ALBUM_ARTIST;
43         case MEDIA_CONTENT_GROUP_GENRE:
44                 return DB_FIELD_MEDIA_GENRE;
45         case MEDIA_CONTENT_GROUP_COMPOSER:
46                 return DB_FIELD_MEDIA_COMPOSER;
47         case MEDIA_CONTENT_GROUP_YEAR:
48                 return DB_FIELD_MEDIA_YEAR;
49         case MEDIA_CONTENT_GROUP_RECORDED_DATE:
50                 return DB_FIELD_MEDIA_RECORDED_DATE;
51         case MEDIA_CONTENT_GROUP_COPYRIGHT:
52                 return DB_FIELD_MEDIA_COPYRIGHT;
53         case MEDIA_CONTENT_GROUP_TRACK_NUM:
54                 return DB_FIELD_MEDIA_TRACK_NUM;
55         case MEDIA_CONTENT_GROUP_DESCRIPTION:
56                 return DB_FIELD_MEDIA_DESCRIPTION;
57         case MEDIA_CONTENT_GROUP_LONGITUDE:
58                 return DB_FIELD_MEDIA_LONGITUDE;
59         case MEDIA_CONTENT_GROUP_LATITUDE:
60                 return DB_FIELD_MEDIA_LATITUDE;
61         case MEDIA_CONTENT_GROUP_ALTITUDE:
62                 return DB_FIELD_MEDIA_ALTITUDE;
63         case MEDIA_CONTENT_GROUP_RATING:
64                 return DB_FIELD_MEDIA_RATING;
65 #ifdef _USE_TVPD_MODE
66         case MEDIA_CONTENT_GROUP_MODIFIED_DATE:
67                 return DB_FIELD_MEDIA_MODIFIED_DATE;
68         case MEDIA_CONTENT_GROUP_ALBUM:
69                 return DB_FIELD_MEDIA_ALBUM;
70         case MEDIA_PVR_GROUP_DURATION:
71                 return DB_FIELD_PVR_DURATION;
72         case MEDIA_PVR_GROUP_TIME_ZONE:
73                 return DB_FIELD_PVR_TIME_ZONE;
74         case MEDIA_PVR_GROUP_PTC:
75                 return DB_FIELD_PVR_PTC;
76         case MEDIA_PVR_GROUP_MAJOR:
77                 return DB_FIELD_PVR_MAJOR;
78         case MEDIA_PVR_GROUP_MINOR:
79                 return DB_FIELD_PVR_MINOR;
80         case MEDIA_PVR_GROUP_CHANNEL_TYPE:
81                 return DB_FIELD_PVR_CHANNEL_TYPE;
82         case MEDIA_PVR_GROUP_CHANNEL_NAME:
83                 return DB_FIELD_PVR_CHANNEL_NAME;
84         case MEDIA_PVR_GROUP_CHANNEL_NUM:
85                 return DB_FIELD_PVR_CHANNEL_NUM;
86         case MEDIA_PVR_GROUP_PROGRAM_TITLE:
87                 return DB_FIELD_PVR_PROGRAM_TITLE;
88         case MEDIA_PVR_GROUP_PROGRAM_NUM:
89                 return DB_FIELD_PVR_PROGRAM_NUM;
90         case MEDIA_PVR_GROUP_PROGRAM_CRID:
91                 return DB_FIELD_PVR_PROGRAM_CRID;
92         case MEDIA_PVR_GROUP_GUIDANCE:
93                 return DB_FIELD_PVR_GUIDANCE;
94         case MEDIA_PVR_GROUP_SYNOPSIS:
95                 return DB_FIELD_PVR_SYNOPSIS;
96         case MEDIA_PVR_GROUP_GENRE:
97                 return DB_FIELD_PVR_GENRE;
98         case MEDIA_PVR_GROUP_LANGUAGE:
99                 return DB_FIELD_PVR_LANGUAGE;
100         case MEDIA_PVR_GROUP_EMBARGO_TIME:
101                 return DB_FIELD_PVR_EMBARGO_TIME;
102         case MEDIA_PVR_GROUP_EXPIRY_TIME:
103                 return DB_FIELD_PVR_EXPIRY_TIME;
104         case MEDIA_PVR_GROUP_START_TIME:
105                 return DB_FIELD_PVR_START_TIME;
106         case MEDIA_PVR_GROUP_PROGRAM_START_TIME:
107                 return DB_FIELD_PVR_PROGRAM_START_TIME;
108         case MEDIA_PVR_GROUP_PROGRAM_END_TIME:
109                 return DB_FIELD_PVR_PROGRAM_END_TIME;
110         case MEDIA_PVR_GROUP_PROGRAM_DATE:
111                 return DB_FIELD_PVR_PROGRAM_DATE;
112         case MEDIA_PVR_GROUP_PARENTAL_RATING:
113                 return DB_FIELD_PVR_PARENTAL_RATING;
114         case MEDIA_PVR_GROUP_TIMER_RECORD:
115                 return DB_FIELD_PVR_TIMER_RECORD;
116         case MEDIA_PVR_GROUP_SERIES_RECORD:
117                 return DB_FIELD_PVR_SERIES_RECORD;
118         case MEDIA_PVR_GROUP_HD:
119                 return DB_FIELD_PVR_HD;
120         case MEDIA_PVR_GROUP_SUBTITLE:
121                 return DB_FIELD_PVR_SUBTITLE;
122         case MEDIA_PVR_GROUP_TTX:
123                 return DB_FIELD_PVR_TTX;
124         case MEDIA_PVR_GROUP_AD:
125                 return DB_FIELD_PVR_AD;
126         case MEDIA_PVR_GROUP_HARDOF_HEARINGRADIO:
127                 return DB_FIELD_PVR_HARDOF_HEARINGRADIO;
128         case MEDIA_PVR_GROUP_DATA_SERVICE:
129                 return DB_FIELD_PVR_DATA_SERVICE;
130         case MEDIA_PVR_GROUP_CONTENT_LOCK:
131                 return DB_FIELD_PVR_CONTENT_LOCK;
132         case MEDIA_PVR_GROUP_CONTENT_WATCH:
133                 return DB_FIELD_PVR_CONTENT_WATCH;
134         case MEDIA_PVR_GROUP_HAS_AUDIO_ONLY:
135                 return DB_FIELD_PVR_HAS_AUDIO_ONLY;
136         case MEDIA_PVR_GROUP_IS_LOCAL_RECORDED:
137                 return DB_FIELD_PVR_IS_LOCAL_RECORD;
138         case MEDIA_PVR_GROUP_RESOLUTION:
139                 return DB_FIELD_PVR_RESOLUTION;
140         case MEDIA_PVR_GROUP_ASPECTRATIO:
141                 return DB_FIELD_PVR_ASPECTRATIO;
142         case MEDIA_PVR_GROUP_MODIFIED_MONTH:
143                 return DB_FIELD_PVR_MODIFIED_DATE;
144         case MEDIA_PVR_GROUP_MODIFIED_DATE:
145                 return DB_FIELD_PVR_MODIFIED_DATE;
146         case MEDIA_PVR_GROUP_SPORTS_TYPE:
147                 return DB_FIELD_PVR_SPORTS_TYPE;
148         case MEDIA_PVR_GROUP_GUIDANCE_LENGTH:
149                 return DB_FIELD_PVR_GUIDANCE_LENGTH;
150         case MEDIA_PVR_GROUP_TVMODE:
151                 return DB_FIELD_PVR_TVMODE;
152         case MEDIA_PVR_GROUP_PLAY_COUNT:
153                 return DB_FIELD_PVR_PLAY_COUNT;
154         case MEDIA_PVR_GROUP_PRIVATE_DATA:
155                 return DB_FIELD_PVR_PRIVATE_DATA;
156         case MEDIA_UHD_GROUP_CONTENT_TITLE:
157                 return DB_FIELD_UHD_CONTENT_TITLE;
158         case MEDIA_UHD_GROUP_RELEASE_DATE:
159                 return DB_FIELD_UHD_RELEASE_DATE;
160         case MEDIA_UHD_GROUP_SUB_TYPE:
161                 return DB_FIELD_UHD_SUB_TYPE;
162         case MEDIA_UHD_GROUP_FILE_NAME:
163                 return DB_FIELD_UHD_FILE_NAME;
164         case MEDIA_UHD_GROUP_PLAYED_COUNT:
165                 return DB_FIELD_UHD_PLAYED_COUNT;
166 #endif
167         default:
168                 return NULL;
169         }
170
171         return NULL;
172 }
173
174 static int __media_db_make_query(filter_h filter, char **condition_query, char **option_query)
175 {
176         int ret = MEDIA_CONTENT_ERROR_NONE;
177         filter_s *_filter = (filter_s *)filter;
178
179         content_retv_if(!_filter, MEDIA_CONTENT_ERROR_NONE);
180
181         if (STRING_VALID(_filter->condition)) {
182                 ret = _media_filter_build_condition(_filter->is_full_condition, _filter->condition, _filter->condition_collate_type, condition_query);
183                 content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
184         }
185
186         ret = _media_filter_build_option(filter, option_query);
187         if (ret != MEDIA_CONTENT_ERROR_NONE)
188                 g_free(*condition_query);
189
190         return ret;
191 }
192
193 #ifdef _USE_TVPD_MODE
194 int _media_db_get_group_count(filter_h filter, group_list_e group_type, int *group_count)
195 {
196         int ret = MEDIA_CONTENT_ERROR_NONE;
197         sqlite3_stmt *stmt = NULL;
198         char *select_query = NULL;
199         char *condition_query = NULL;
200         char *option_query = NULL;
201         filter_s *_filter = (filter_s *)filter;
202
203         switch (group_type) {
204         case MEDIA_GROUP_ALBUM:
205                 if (_filter && STRING_VALID(_filter->storage_id))
206                         select_query = g_strdup_printf(SELECT_ALBUM_COUNT, _filter->storage_id);
207                 else
208                         select_query = g_strdup_printf(SELECT_ALBUM_COUNT, DB_VIEW_MEDIA);
209                 break;
210
211         case MEDIA_GROUP_FOLDER:
212                 if (_filter && STRING_VALID(_filter->storage_id))
213                         select_query = g_strdup_printf(SELECT_FOLDER_COUNT_BY_STORAGE_ID, _filter->storage_id, _filter->storage_id);
214                 else
215                         select_query = g_strdup_printf(SELECT_FOLDER_COUNT, DB_VIEW_MEDIA);
216                 break;
217
218         case MEDIA_GROUP_PLAYLIST:
219                 select_query = g_strdup(SELECT_PLAYLIST_COUNT);
220                 break;
221
222         case MEDIA_GROUP_TAG:
223                 select_query = g_strdup(SELECT_TAG_COUNT);
224                 break;
225
226         case MEDIA_GROUP_BOOKMARK:
227                 if (_filter && STRING_VALID(_filter->storage_id))
228                         select_query = g_strdup_printf(SELECT_BOOKMARK_COUNT, _filter->storage_id);
229                 else
230                         select_query = g_strdup_printf(SELECT_BOOKMARK_COUNT, DB_VIEW_MEDIA);
231
232                 break;
233
234         case MEDIA_GROUP_FACE:
235                 if (_filter && STRING_VALID(_filter->storage_id))
236                         select_query = g_strdup_printf(SELECT_FACE_COUNT, _filter->storage_id);
237                 else
238                         select_query = g_strdup_printf(SELECT_FACE_COUNT, DB_VIEW_MEDIA);
239                 break;
240
241         default:
242                 content_error("Invalid group type [%d]", group_type);
243                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
244         }
245
246         ret = __media_db_make_query(filter, &condition_query, &option_query);
247         if (ret != MEDIA_CONTENT_ERROR_NONE) {
248                 g_free(select_query);
249                 return ret;
250         }
251
252         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
253         g_free(select_query);
254         g_free(condition_query);
255         g_free(option_query);
256         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
257
258         if (sqlite3_step(stmt) == SQLITE_ROW)
259                 *group_count = sqlite3_column_int(stmt, 0);
260
261         SQLITE3_FINALIZE(stmt);
262
263         return ret;
264 }
265
266 int _media_db_get_media_group_count(media_group_e group, filter_h filter, int *group_count)
267 {
268         int ret = MEDIA_CONTENT_ERROR_NONE;
269         sqlite3_stmt *stmt = NULL;
270         char select_query[MAX_QUERY_SIZE] = {0, };
271         char *condition_query = NULL;
272         char *option_query = NULL;
273         char *tmp_option = NULL;
274         filter_s *_filter = (filter_s *)filter;
275
276         if (group < MEDIA_PVR_GROUP_DURATION) { /*media content*/
277                 if (_filter && STRING_VALID(_filter->storage_id))
278                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_COUNT, __media_db_get_group_name(group), _filter->storage_id);
279                 else
280                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_COUNT, __media_db_get_group_name(group), DB_VIEW_MEDIA);
281         } else if (group < MEDIA_UHD_GROUP_CONTENT_TITLE) { /*pvr content*/
282                 if (_filter && STRING_VALID(_filter->storage_id))
283                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_COUNT_BY_STORAGE_ID, __media_db_get_group_name(group), _filter->storage_id);
284                 else
285                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_COUNT, __media_db_get_group_name(group));
286         } else { /*uhd content*/
287                 if (_filter && STRING_VALID(_filter->storage_id))
288                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_COUNT_BY_STORAGE_ID, __media_db_get_group_name(group), _filter->storage_id);
289                 else
290                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_COUNT, __media_db_get_group_name(group));
291         }
292         ret = __media_db_make_query(filter, &condition_query, &option_query);
293         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
294
295         if (option_query) {
296                 tmp_option = g_strconcat(option_query, ")", NULL);
297                 g_free(option_query);
298                 option_query = tmp_option;
299         } else {
300                 SAFE_STRLCAT(select_query, ")", sizeof(select_query));
301         }
302
303         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
304         g_free(condition_query);
305         g_free(option_query);
306         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
307
308         if (sqlite3_step(stmt) == SQLITE_ROW)
309                 *group_count = sqlite3_column_int(stmt, 0);
310
311         SQLITE3_FINALIZE(stmt);
312
313         return ret;
314 }
315
316 int _media_db_get_media_group(media_group_e group, filter_h filter, media_group_cb callback, void *user_data)
317 {
318         int ret = MEDIA_CONTENT_ERROR_NONE;
319         char select_query[MAX_QUERY_SIZE] = {0, };
320         char *condition_query = NULL;
321         char *option_query = NULL;
322         char *name = NULL;
323         sqlite3_stmt *stmt = NULL;
324         filter_s *_filter = (filter_s *)filter;
325
326         if (group < MEDIA_PVR_GROUP_DURATION) { /*media content */
327                 if (_filter && STRING_VALID(_filter->storage_id))
328                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_LIST, __media_db_get_group_name(group), _filter->storage_id);
329                 else
330                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_LIST, __media_db_get_group_name(group), DB_VIEW_MEDIA);
331         } else if (group < MEDIA_UHD_GROUP_CONTENT_TITLE) { /*pvr content */
332                 if (_filter && STRING_VALID(_filter->storage_id))
333                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_LIST_BY_STORAGE_ID, __media_db_get_group_name(group), _filter->storage_id);
334                 else
335                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_LIST, __media_db_get_group_name(group));
336         } else { /* uhd content */
337                 if (_filter && STRING_VALID(_filter->storage_id))
338                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_LIST_BY_STORAGE_ID, __media_db_get_group_name(group), _filter->storage_id);
339                 else
340                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_LIST, __media_db_get_group_name(group));
341         }
342         ret = __media_db_make_query(filter, &condition_query, &option_query);
343         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
344
345         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
346         g_free(condition_query);
347         g_free(option_query);
348         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
349
350         while (sqlite3_step(stmt) == SQLITE_ROW) {
351                 name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
352
353                 if (callback(name, user_data) == false) {
354                         g_free(name);
355                         break;
356                 }
357
358                 g_free(name);
359         }
360
361         SQLITE3_FINALIZE(stmt);
362
363         return ret;
364 }
365
366 int _media_db_get_media_group_and_count(media_group_e group, filter_h filter, media_group_and_count_cb callback, void *user_data)
367 {
368         int ret = MEDIA_CONTENT_ERROR_NONE;
369         char select_query[DEFAULT_QUERY_SIZE] = {0, };
370         char group_query[DEFAULT_QUERY_SIZE] = {0, };
371         char *condition_query = NULL;
372         char *option_query = NULL;
373         char *name = NULL;
374         sqlite3_stmt *stmt = NULL;
375         filter_s *_filter = (filter_s *)filter;
376
377         const char* group_name = __media_db_get_group_name(group);
378         content_retip_if_fail(STRING_VALID(group_name));
379
380         if (group < MEDIA_PVR_GROUP_DURATION) { /*media content*/
381                 if (_filter && STRING_VALID(_filter->storage_id))
382                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_AND_COUNT, group_name, _filter->storage_id);
383                 else
384                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_GROUP_AND_COUNT, group_name, DB_VIEW_MEDIA);
385         } else if (group < MEDIA_UHD_GROUP_CONTENT_TITLE) {/*pvr content*/
386                 if (_filter && STRING_VALID(_filter->storage_id))
387                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_AND_COUNT_BY_STORAGE_ID, group_name, _filter->storage_id);
388                 else
389                         snprintf(select_query, sizeof(select_query), SELECT_PVR_GROUP_AND_COUNT, group_name);
390         } else {/*uhd content*/
391                 if (_filter && STRING_VALID(_filter->storage_id))
392                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_AND_COUNT_BY_STORAGE_ID, group_name, _filter->storage_id);
393                 else
394                         snprintf(select_query, sizeof(select_query), SELECT_UHD_GROUP_AND_COUNT, group_name);
395         }
396
397         ret = __media_db_make_query(filter, &condition_query, &option_query);
398         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
399
400         if (STRING_VALID(option_query))
401                 snprintf(group_query, sizeof(group_query), "GROUP BY %s %s", group_name, option_query);
402         else
403                 snprintf(group_query, sizeof(group_query), "GROUP BY %s", group_name);
404
405         ret = _content_query_prepare(select_query, condition_query, group_query, &stmt);
406         g_free(condition_query);
407         g_free(option_query);
408         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
409
410         while (sqlite3_step(stmt) == SQLITE_ROW) {
411                 name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
412
413                 if (callback(name, sqlite3_column_int(stmt, 1), user_data) == false) {
414                         g_free(name);
415                         break;
416                 }
417
418                 g_free(name);
419         }
420
421         SQLITE3_FINALIZE(stmt);
422
423         return ret;
424 }
425 #else
426 int _media_db_get_group_count(filter_h filter, group_list_e group_type, int *group_count)
427 {
428         int ret = MEDIA_CONTENT_ERROR_NONE;
429         sqlite3_stmt *stmt = NULL;
430         char *select_query = NULL;
431         char *condition_query = NULL;
432         char *option_query = NULL;
433
434         switch (group_type) {
435         case MEDIA_GROUP_ALBUM:
436                 select_query = g_strdup(SELECT_ALBUM_COUNT);
437                 break;
438
439         case MEDIA_GROUP_FOLDER:
440                 select_query = g_strdup(SELECT_FOLDER_COUNT);
441                 break;
442
443         case MEDIA_GROUP_PLAYLIST:
444                 select_query = g_strdup(SELECT_PLAYLIST_COUNT);
445                 break;
446
447         case MEDIA_GROUP_TAG:
448                 select_query = g_strdup(SELECT_TAG_COUNT);
449                 break;
450
451         case MEDIA_GROUP_BOOKMARK:
452                 select_query = g_strdup(SELECT_BOOKMARK_COUNT);
453                 break;
454
455         case MEDIA_GROUP_FACE:
456                 select_query = g_strdup(SELECT_FACE_COUNT);
457                 break;
458
459         default:
460                 content_error("Invalid group type [%d]", group_type);
461                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
462         }
463
464         ret = __media_db_make_query(filter, &condition_query, &option_query);
465         if (ret != MEDIA_CONTENT_ERROR_NONE) {
466                 g_free(select_query);
467                 return ret;
468         }
469
470         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
471         g_free(select_query);
472         g_free(condition_query);
473         g_free(option_query);
474         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
475
476         if (sqlite3_step(stmt) == SQLITE_ROW)
477                 *group_count = sqlite3_column_int(stmt, 0);
478
479         SQLITE3_FINALIZE(stmt);
480
481         return ret;
482 }
483
484 int _media_db_get_media_group_count(media_group_e group, filter_h filter, int *group_count)
485 {
486         int ret = MEDIA_CONTENT_ERROR_NONE;
487         sqlite3_stmt *stmt = NULL;
488         char *select_query = NULL;
489         char *condition_query = NULL;
490         char *option_query = NULL;
491
492         select_query = g_strdup_printf(SELECT_MEDIA_GROUP_COUNT, __media_db_get_group_name(group), __media_db_get_group_name(group));
493
494         ret = __media_db_make_query(filter, &condition_query, &option_query);
495         if (ret != MEDIA_CONTENT_ERROR_NONE) {
496                 g_free(select_query);
497                 return ret;
498         }
499
500         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
501         g_free(select_query);
502         g_free(condition_query);
503         g_free(option_query);
504         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
505
506         if (sqlite3_step(stmt) == SQLITE_ROW)
507                 *group_count = sqlite3_column_int(stmt, 0);
508
509         SQLITE3_FINALIZE(stmt);
510
511         return ret;
512 }
513
514 int _media_db_get_media_group(media_group_e group, filter_h filter, media_group_cb callback, void *user_data)
515 {
516         int ret = MEDIA_CONTENT_ERROR_NONE;
517         char *select_query = NULL;
518         char *condition_query = NULL;
519         char *option_query = NULL;
520         char *name = NULL;
521         sqlite3_stmt *stmt = NULL;
522
523         select_query = g_strdup_printf(SELECT_MEDIA_GROUP_LIST, __media_db_get_group_name(group));
524
525         ret = __media_db_make_query(filter, &condition_query, &option_query);
526         if (ret != MEDIA_CONTENT_ERROR_NONE) {
527                 g_free(select_query);
528                 return ret;
529         }
530
531         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
532         g_free(select_query);
533         g_free(condition_query);
534         g_free(option_query);
535         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
536
537         while (sqlite3_step(stmt) == SQLITE_ROW) {
538                 name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
539
540                 if (callback(name, user_data) == false) {
541                         g_free(name);
542                         break;
543                 }
544
545                 g_free(name);
546         }
547
548         SQLITE3_FINALIZE(stmt);
549
550         return ret;
551 }
552 #endif
553
554 int _media_db_get_album(filter_h filter, media_album_cb callback, void *user_data)
555 {
556         int ret = MEDIA_CONTENT_ERROR_NONE;
557         char *select_query = NULL;
558         char *condition_query = NULL;
559         char *option_query = NULL;
560         sqlite3_stmt *stmt = NULL;
561 #ifdef _USE_TVPD_MODE
562         filter_s *_filter = (filter_s *)filter;
563         if (_filter && STRING_VALID(_filter->storage_id))
564                 select_query = g_strdup_printf(SELECT_ALBUM_LIST, _filter->storage_id);
565         else
566                 select_query = g_strdup_printf(SELECT_ALBUM_LIST, DB_VIEW_MEDIA);
567 #else
568         select_query = g_strdup(SELECT_ALBUM_LIST);
569 #endif
570         ret = __media_db_make_query(filter, &condition_query, &option_query);
571         if (ret != MEDIA_CONTENT_ERROR_NONE) {
572                 g_free(select_query);
573                 return ret;
574         }
575
576         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
577         g_free(select_query);
578         g_free(condition_query);
579         g_free(option_query);
580         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
581
582         while (sqlite3_step(stmt) == SQLITE_ROW) {
583                 media_album_s *album = g_new0(media_album_s, 1);
584
585                 album->album_id = sqlite3_column_int(stmt, 0);
586                 album->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
587                 album->artist = g_strdup((const char *)sqlite3_column_text(stmt, 2));
588                 album->album_art_path = g_strdup((const char *)sqlite3_column_text(stmt, 3));
589
590                 if (callback((media_album_h)album, user_data) == false) {
591                         media_album_destroy((media_album_h)album);
592                         break;
593                 }
594
595                 media_album_destroy((media_album_h)album);
596         }
597
598         SQLITE3_FINALIZE(stmt);
599
600         return ret;
601 }
602
603 int _media_db_get_folder(filter_h filter, media_folder_cb callback, void *user_data)
604 {
605         int ret = MEDIA_CONTENT_ERROR_NONE;
606         char *select_query = NULL;
607         char *condition_query = NULL;
608         char *option_query = NULL;
609         sqlite3_stmt *stmt = NULL;
610 #ifdef _USE_TVPD_MODE
611         filter_s *_filter = (filter_s *)filter;
612         if (_filter && STRING_VALID(_filter->storage_id))
613                 select_query = g_strdup_printf(SELECT_FOLDER_LIST_BY_STORAGE_ID, _filter->storage_id, _filter->storage_id);
614         else
615                 select_query = g_strdup_printf(SELECT_FOLDER_LIST, DB_VIEW_MEDIA);
616 #else
617         select_query = g_strdup(SELECT_FOLDER_LIST);
618 #endif
619         ret = __media_db_make_query(filter, &condition_query, &option_query);
620         if (ret != MEDIA_CONTENT_ERROR_NONE) {
621                 g_free(select_query);
622                 return ret;
623         }
624
625         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
626         g_free(select_query);
627         g_free(condition_query);
628         g_free(option_query);
629         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
630
631         while (sqlite3_step(stmt) == SQLITE_ROW) {
632                 media_folder_s *_folder = g_new0(media_folder_s, 1);
633                 _folder->folder_id = g_strdup_printf("%lld", sqlite3_column_int64(stmt, 0));
634                 _folder->path = g_strdup((const char *)sqlite3_column_text(stmt, 1));
635                 _folder->name = g_strdup((const char *)sqlite3_column_text(stmt, 2));
636                 _folder->storage_uuid = g_strdup((const char *)sqlite3_column_text(stmt, 3));
637
638                 if (callback((media_folder_h)_folder, user_data) == false) {
639                         media_folder_destroy((media_folder_h) _folder);
640                         break;
641                 }
642
643                 media_folder_destroy((media_folder_h) _folder);
644         }
645
646         SQLITE3_FINALIZE(stmt);
647
648         return ret;
649 }
650
651 int _media_db_get_playlist(filter_h filter, media_playlist_cb callback, void *user_data)
652 {
653         int ret = MEDIA_CONTENT_ERROR_NONE;
654         char *condition_query = NULL;
655         char *option_query = NULL;
656         sqlite3_stmt *stmt = NULL;
657
658         ret = __media_db_make_query(filter, &condition_query, &option_query);
659         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
660
661         ret = _content_query_prepare(SELECT_PLAYLIST_LIST, condition_query, option_query, &stmt);
662         g_free(condition_query);
663         g_free(option_query);
664         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
665
666         while (sqlite3_step(stmt) == SQLITE_ROW) {
667                 media_playlist_s *_playlist = g_new0(media_playlist_s, 1);
668
669                 _playlist->playlist_id = sqlite3_column_int(stmt, 0);
670                 _playlist->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
671                 _playlist->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 2));
672
673                 if (callback((media_playlist_h)_playlist, user_data) == false) {
674                         media_playlist_destroy((media_playlist_h)_playlist);
675                         break;
676                 }
677                 media_playlist_destroy((media_playlist_h)_playlist);
678         }
679
680         SQLITE3_FINALIZE(stmt);
681
682         return ret;
683 }
684
685 int _media_db_get_playlist_item(int playlist_id, filter_h filter, playlist_member_cb callback, void *user_data)
686 {
687         int ret = MEDIA_CONTENT_ERROR_NONE;
688         char *select_query = NULL;
689         char *condition_query = NULL;
690         char *option_query = NULL;
691         sqlite3_stmt *stmt = NULL;
692
693         select_query = g_strdup_printf(SELECT_PLAYLIST_ITEM_ALL_FROM_PLAYLIST_VIEW, playlist_id);
694
695         ret = __media_db_make_query(filter, &condition_query, &option_query);
696         if (ret != MEDIA_CONTENT_ERROR_NONE) {
697                 g_free(select_query);
698                 return ret;
699         }
700
701         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
702         g_free(select_query);
703         g_free(condition_query);
704         g_free(option_query);
705         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
706
707         while (sqlite3_step(stmt) == SQLITE_ROW) {
708                 int playlist_member_id = 0;
709                 playlist_member_id = sqlite3_column_int(stmt, MEDIA_INFO_ITEM_MAX);     /*MEDIA_INFO_ITEM_MAX is pm_id*/
710
711                 media_info_s *_media = g_new0(media_info_s, 1);
712
713                 _media_info_item_get_detail(stmt, (media_info_h)_media);
714
715                 if (callback(playlist_member_id, (media_info_h)_media, user_data) == false) {
716                         media_info_destroy((media_info_h)_media);
717                         break;
718                 }
719                 media_info_destroy((media_info_h)_media);
720
721         }
722
723         SQLITE3_FINALIZE(stmt);
724
725         return ret;
726 }
727
728 int _media_db_get_tag(const char *media_id, filter_h filter, media_tag_cb callback, void *user_data)
729 {
730         int ret = MEDIA_CONTENT_ERROR_NONE;
731         char *select_query = NULL;
732         char *condition_query = NULL;
733         char *option_query = NULL;
734         sqlite3_stmt *stmt = NULL;
735
736         if (STRING_VALID(media_id))
737                 select_query = g_strdup_printf(SELECT_TAG_LIST_BY_MEDIA_ID, media_id);
738         else
739                 select_query = g_strdup(SELECT_TAG_LIST);
740
741         ret = __media_db_make_query(filter, &condition_query, &option_query);
742         if (ret != MEDIA_CONTENT_ERROR_NONE) {
743                 g_free(select_query);
744                 return ret;
745         }
746
747         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
748         g_free(select_query);
749         g_free(condition_query);
750         g_free(option_query);
751         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
752
753         while (sqlite3_step(stmt) == SQLITE_ROW) {
754                 media_tag_s *_tag = g_new0(media_tag_s, 1);
755
756                 _tag->tag_id = sqlite3_column_int(stmt, 0);
757                 _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
758
759                 if (callback((media_tag_h)_tag, user_data) == false) {
760                         media_tag_destroy((media_tag_h)_tag);
761                         break;
762                 }
763                 media_tag_destroy((media_tag_h)_tag);
764         }
765
766         SQLITE3_FINALIZE(stmt);
767
768         return ret;
769 }
770
771 int _media_db_get_bookmark(const char *media_id, filter_h filter, media_bookmark_cb callback, void *user_data)
772 {
773         int ret = MEDIA_CONTENT_ERROR_NONE;
774         char *select_query = NULL;
775         char *condition_query = NULL;
776         char *option_query = NULL;
777         sqlite3_stmt *stmt = NULL;
778 #ifdef _USE_TVPD_MODE
779         filter_s *_filter = (filter_s *)filter;
780         if (STRING_VALID(media_id)) {   //get bookmark by media_id
781                 if (_filter && STRING_VALID(_filter->storage_id))
782                         select_query = g_strdup_printf(SELECT_BOOKMARK_LIST_BY_MEDIA_ID, _filter->storage_id, media_id);
783                 else
784                         select_query = g_strdup_printf(SELECT_BOOKMARK_LIST_BY_MEDIA_ID, DB_VIEW_MEDIA, media_id);
785         } else {
786                 if (_filter && STRING_VALID(_filter->storage_id))
787                         select_query = g_strdup_printf(SELECT_BOOKMARK_LIST, _filter->storage_id);
788                 else
789                         select_query = g_strdup_printf(SELECT_BOOKMARK_LIST, DB_VIEW_MEDIA);
790         }
791 #else
792         if (STRING_VALID(media_id))
793                 select_query = g_strdup_printf(SELECT_BOOKMARK_LIST_BY_MEDIA_ID, media_id);
794         else
795                 select_query = g_strdup(SELECT_BOOKMARK_LIST);
796 #endif
797
798         ret = __media_db_make_query(filter, &condition_query, &option_query);
799         if (ret != MEDIA_CONTENT_ERROR_NONE) {
800                 g_free(select_query);
801                 return ret;
802         }
803
804         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
805         g_free(select_query);
806         g_free(condition_query);
807         g_free(option_query);
808         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
809
810         while (sqlite3_step(stmt) == SQLITE_ROW) {
811                 media_bookmark_s *bookmark = g_new0(media_bookmark_s, 1);
812
813                 bookmark->bookmark_id = sqlite3_column_int(stmt, 0);
814                 bookmark->media_id = g_strdup((const char *)sqlite3_column_text(stmt, 1));
815                 bookmark->marked_time = sqlite3_column_int(stmt, 2);
816                 bookmark->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 3));
817                 bookmark->name = g_strdup((const char *)sqlite3_column_text(stmt, 4));
818
819                 if (callback((media_bookmark_h)bookmark, user_data) == false) {
820                         media_bookmark_destroy((media_bookmark_h)bookmark);
821                         break;
822                 }
823
824                 media_bookmark_destroy((media_bookmark_h)bookmark);
825         }
826
827         SQLITE3_FINALIZE(stmt);
828
829         return ret;
830
831 }
832
833 int _media_db_get_face(const char *media_id, filter_h filter, media_face_cb callback, void *user_data)
834 {
835         int ret = MEDIA_CONTENT_ERROR_NONE;
836         char *select_query = NULL;
837         char *condition_query = NULL;
838         char *option_query = NULL;
839         sqlite3_stmt *stmt = NULL;
840 #ifdef _USE_TVPD_MODE
841         filter_s *_filter = (filter_s *)filter;
842         if (STRING_VALID(media_id)) {   //get face by media_id
843                 if (_filter && STRING_VALID(_filter->storage_id))
844                         select_query = g_strdup_printf(SELECT_FACE_LIST_BY_MEDIA_ID, _filter->storage_id, media_id);
845                 else
846                         select_query = g_strdup_printf(SELECT_FACE_LIST_BY_MEDIA_ID, DB_VIEW_MEDIA, media_id);
847         } else {
848                 if (_filter && STRING_VALID(_filter->storage_id))
849                         select_query = g_strdup_printf(SELECT_FACE_LIST, _filter->storage_id);
850                 else
851                         select_query = g_strdup_printf(SELECT_FACE_LIST, DB_VIEW_MEDIA);
852         }
853 #else
854         if (STRING_VALID(media_id))
855                 select_query = g_strdup_printf(SELECT_FACE_LIST_BY_MEDIA_ID, media_id);
856         else
857                 select_query = g_strdup(SELECT_FACE_LIST);
858 #endif
859         ret = __media_db_make_query(filter, &condition_query, &option_query);
860         if (ret != MEDIA_CONTENT_ERROR_NONE) {
861                 g_free(select_query);
862                 return ret;
863         }
864
865         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
866         g_free(select_query);
867         g_free(condition_query);
868         g_free(option_query);
869         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
870
871         while (sqlite3_step(stmt) == SQLITE_ROW) {
872                 media_face_s *face = g_new0(media_face_s, 1);
873
874                 face->face_id = sqlite3_column_int(stmt, 0);
875                 face->media_id = g_strdup((const char *)sqlite3_column_text(stmt, 1));
876                 face->face_rect_x = sqlite3_column_int(stmt, 2);
877                 face->face_rect_y = sqlite3_column_int(stmt, 3);
878                 face->face_rect_w = sqlite3_column_int(stmt, 4);
879                 face->face_rect_h = sqlite3_column_int(stmt, 5);
880                 face->orientation = sqlite3_column_int(stmt, 6);
881                 face->face_tag = g_strdup((const char *)sqlite3_column_text(stmt, 7));
882
883                 if (callback((media_face_h)face, user_data) == false) {
884                         media_face_destroy((media_face_h)face);
885                         break;
886                 }
887
888                 media_face_destroy((media_face_h)face);
889         }
890
891         SQLITE3_FINALIZE(stmt);
892
893         return ret;
894
895 }
896
897 int _media_db_get_group_item_count_by_id(int group_id, filter_h filter, group_list_e group_type, int *item_count)
898 {
899         int ret = MEDIA_CONTENT_ERROR_NONE;
900         sqlite3_stmt *stmt = NULL;
901         char *select_query = NULL;
902         char *condition_query = NULL;
903         char *option_query = NULL;
904 #ifdef _USE_TVPD_MODE
905         filter_s *_filter = (filter_s *)filter;
906 #endif
907         switch (group_type) {
908         case MEDIA_GROUP_ALBUM:
909 #ifdef _USE_TVPD_MODE
910                 if (_filter && STRING_VALID(_filter->storage_id))
911                         select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_ALBUM, _filter->storage_id, group_id);
912                 else
913                         select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_ALBUM, DB_VIEW_MEDIA, group_id);
914 #else
915                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_ALBUM, group_id);
916 #endif
917                 break;
918
919         case MEDIA_GROUP_PLAYLIST:
920                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_PLAYLIST, group_id);
921                 break;
922
923         case MEDIA_GROUP_TAG:
924                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_TAG, group_id);
925                 break;
926
927         default:
928                 content_error("INVALID_PARAMETER");
929                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
930         }
931
932         ret = __media_db_make_query(filter, &condition_query, &option_query);
933         if (ret != MEDIA_CONTENT_ERROR_NONE) {
934                 g_free(select_query);
935                 return ret;
936         }
937
938         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
939         g_free(select_query);
940         g_free(condition_query);
941         g_free(option_query);
942         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
943
944         if (sqlite3_step(stmt) == SQLITE_ROW)
945                 *item_count = sqlite3_column_int(stmt, 0);
946
947         SQLITE3_FINALIZE(stmt);
948
949         return ret;
950 }
951
952 int _media_db_get_group_item_count(const char *group_name, filter_h filter, group_list_e group_type, int *item_count)
953 {
954         int ret = MEDIA_CONTENT_ERROR_NONE;
955         sqlite3_stmt *stmt = NULL;
956         char *select_query = NULL;
957         char *condition_query = NULL;
958         char *option_query = NULL;
959         char *tmp_option = NULL;
960         bool need_bracket = false;
961         filter_s *_filter = (filter_s *)filter;
962
963         switch (group_type) {
964         case MEDIA_GROUP_NONE:
965                 if (!_filter) {
966 #ifdef _USE_TVPD_MODE
967                         select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_MEDIA_SIMPLE, DB_VIEW_MEDIA);
968 #else
969                         select_query = g_strdup(SELECT_MEDIA_COUNT_FROM_MEDIA_SIMPLE);
970 #endif
971                         break;
972                 }
973
974                 if (_filter->offset < 0 && _filter->count < 0) {
975 #ifdef _USE_TVPD_MODE
976                         if (STRING_VALID(_filter->storage_id))
977                                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_MEDIA_SIMPLE, _filter->storage_id);
978                         else
979                                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_MEDIA_SIMPLE, DB_VIEW_MEDIA);
980 #else
981                         select_query = g_strdup(SELECT_MEDIA_COUNT_FROM_MEDIA_SIMPLE);
982 #endif
983                 } else {
984 #ifdef _USE_TVPD_MODE
985                         if (STRING_VALID(_filter->storage_id))
986                                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_MEDIA, _filter->storage_id);
987                         else
988                                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_MEDIA, DB_VIEW_MEDIA);
989 #else
990                         select_query = g_strdup(SELECT_MEDIA_COUNT_FROM_MEDIA);
991 #endif
992                         need_bracket = true;
993                 }
994                 break;
995
996         case MEDIA_GROUP_FOLDER:
997 #ifdef _USE_TVPD_MODE
998                 if (_filter && STRING_VALID(_filter->storage_id))
999                         select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_FOLDER, _filter->storage_id, group_name);
1000                 else
1001                         select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_FOLDER, DB_VIEW_MEDIA, group_name);
1002 #else
1003                 select_query = g_strdup_printf(SELECT_MEDIA_COUNT_FROM_FOLDER, group_name);
1004 #endif
1005                 break;
1006
1007         case MEDIA_GROUP_TAG_BY_MEDIA_ID:
1008                 select_query = g_strdup_printf(SELECT_TAG_COUNT_BY_MEDIA_ID, group_name);
1009                 break;
1010
1011         case MEDIA_GROUP_BOOKMARK_BY_MEDIA_ID:
1012 #ifdef _USE_TVPD_MODE
1013                 if (_filter && STRING_VALID(_filter->storage_id))
1014                         select_query = g_strdup_printf(SELECT_BOOKMARK_COUNT_BY_MEDIA_ID, _filter->storage_id, group_name);
1015                 else
1016                         select_query = g_strdup_printf(SELECT_BOOKMARK_COUNT_BY_MEDIA_ID, DB_VIEW_MEDIA, group_name);
1017 #else
1018                 select_query = g_strdup_printf(SELECT_BOOKMARK_COUNT_BY_MEDIA_ID, group_name);
1019 #endif
1020                 break;
1021
1022         case MEDIA_GROUP_FACE_BY_MEDIA_ID:
1023 #ifdef _USE_TVPD_MODE
1024                 if (_filter && STRING_VALID(_filter->storage_id))
1025                         select_query = g_strdup_printf(SELECT_FACE_COUNT_BY_MEDIA_ID, _filter->storage_id, group_name);
1026                 else
1027                         select_query = g_strdup_printf(SELECT_FACE_COUNT_BY_MEDIA_ID, DB_VIEW_MEDIA, group_name);
1028 #else
1029                 select_query = g_strdup_printf(SELECT_FACE_COUNT_BY_MEDIA_ID, group_name);
1030 #endif
1031                 break;
1032
1033 #ifdef _USE_TVPD_MODE
1034         case MEDIA_GROUP_PVR:
1035                 if (_filter && STRING_VALID(_filter->storage_id))
1036                         select_query = g_strdup_printf(SELECT_PVR_COUNT_BY_STORAGE_ID, _filter->storage_id);
1037                 else
1038                         select_query = g_strdup(SELECT_PVR_COUNT);
1039                 break;
1040
1041         case MEDIA_GROUP_UHD:
1042                 if (_filter && STRING_VALID(_filter->storage_id))
1043                         select_query = g_strdup_printf(SELECT_UHD_COUNT_BY_STORAGE_ID, _filter->storage_id);
1044                 else
1045                         select_query = g_strdup(SELECT_UHD_COUNT);
1046                 break;
1047 #endif
1048         default:
1049                 content_error("INVALID_PARAMETER");
1050                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1051         }
1052
1053         ret = __media_db_make_query(filter, &condition_query, &option_query);
1054         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1055                 g_free(select_query);
1056                 return ret;
1057         }
1058
1059         if (need_bracket) {
1060                 tmp_option = g_strconcat(option_query, ")", NULL);
1061                 g_free(option_query);
1062                 option_query = tmp_option;
1063         }
1064
1065         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1066         g_free(select_query);
1067         g_free(condition_query);
1068         g_free(option_query);
1069         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1070
1071         if (sqlite3_step(stmt) == SQLITE_ROW)
1072                 *item_count = sqlite3_column_int(stmt, 0);
1073
1074         SQLITE3_FINALIZE(stmt);
1075
1076         return ret;
1077 }
1078
1079 int _media_db_get_group_item_by_id(int group_id, filter_h filter, media_info_cb callback, void *user_data, group_list_e group_type)
1080 {
1081         int ret = MEDIA_CONTENT_ERROR_NONE;
1082         char *select_query = NULL;
1083         char *condition_query = NULL;
1084         char *option_query = NULL;
1085         sqlite3_stmt *stmt = NULL;
1086 #ifdef _USE_TVPD_MODE
1087         filter_s *_filter = (filter_s *)filter;
1088 #endif
1089
1090         switch (group_type) {
1091         case MEDIA_GROUP_ALBUM:
1092 #ifdef _USE_TVPD_MODE
1093                 if (_filter && STRING_VALID(_filter->storage_id))
1094                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_ALBUM, _filter->storage_id, group_id);
1095                 else
1096                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_ALBUM, DB_VIEW_MEDIA, group_id);
1097 #else
1098                 select_query = g_strdup_printf(SELECT_MEDIA_FROM_ALBUM, group_id);
1099 #endif
1100                 break;
1101
1102         case MEDIA_GROUP_PLAYLIST:
1103 #ifdef _USE_TVPD_MODE
1104                 if (_filter && STRING_VALID(_filter->storage_id))
1105                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_PLAYLIST, _filter->storage_id, group_id);
1106                 else
1107                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_PLAYLIST, DB_VIEW_MEDIA, group_id);
1108 #else
1109                 select_query = g_strdup_printf(SELECT_MEDIA_FROM_PLAYLIST, group_id);
1110 #endif
1111                 break;
1112
1113         case MEDIA_GROUP_TAG:
1114 #ifdef _USE_TVPD_MODE
1115                 if (_filter && STRING_VALID(_filter->storage_id))
1116                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_TAG, _filter->storage_id, group_id);
1117                 else
1118                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_TAG, DB_VIEW_MEDIA, group_id);
1119 #else
1120                 select_query = g_strdup_printf(SELECT_MEDIA_FROM_TAG, group_id);
1121 #endif
1122                 break;
1123
1124         default:
1125                 content_error("INVALID_PARAMETER");
1126                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1127         }
1128
1129         ret = __media_db_make_query(filter, &condition_query, &option_query);
1130         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1131                 g_free(select_query);
1132                 return ret;
1133         }
1134
1135         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1136         g_free(select_query);
1137         g_free(condition_query);
1138         g_free(option_query);
1139         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1140
1141         while (sqlite3_step(stmt) == SQLITE_ROW) {
1142                 media_info_s *item = g_new0(media_info_s, 1);
1143
1144                 _media_info_item_get_detail(stmt, (media_info_h)item);
1145
1146                 if (callback((media_info_h)item, user_data) == false) {
1147                         media_info_destroy((media_info_h)item);
1148                         break;
1149                 }
1150
1151                 media_info_destroy((media_info_h)item);
1152         }
1153
1154         SQLITE3_FINALIZE(stmt);
1155
1156         return ret;
1157 }
1158
1159 int _media_db_get_group_item(const char *group_name, filter_h filter, media_info_cb callback, void *user_data, group_list_e group_type)
1160 {
1161         int ret = MEDIA_CONTENT_ERROR_NONE;
1162         char *select_query = NULL;
1163         char *condition_query = NULL;
1164         char *option_query = NULL;
1165         sqlite3_stmt *stmt = NULL;
1166 #ifdef _USE_TVPD_MODE
1167         filter_s *_filter = (filter_s *)filter;
1168 #endif
1169
1170         switch (group_type) {
1171         case MEDIA_GROUP_NONE:
1172 #ifdef _USE_TVPD_MODE
1173                 if (_filter && STRING_VALID(_filter->storage_id))
1174                         select_query = g_strdup_printf(SELECT_MEDIA_ITEM, _filter->storage_id);
1175                 else
1176                         select_query = g_strdup_printf(SELECT_MEDIA_ITEM, DB_VIEW_MEDIA);
1177 #else
1178                 select_query = g_strdup(SELECT_MEDIA_ITEM);
1179 #endif
1180                 break;
1181
1182         case MEDIA_GROUP_FOLDER:
1183 #ifdef _USE_TVPD_MODE
1184                 if (_filter && STRING_VALID(_filter->storage_id))
1185                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_FOLDER, _filter->storage_id, group_name);
1186                 else
1187                         select_query = g_strdup_printf(SELECT_MEDIA_FROM_FOLDER, DB_VIEW_MEDIA, group_name);
1188 #else
1189                 select_query = g_strdup_printf(SELECT_MEDIA_FROM_FOLDER, group_name);
1190 #endif
1191                 break;
1192
1193         default:
1194                 content_error("INVALID_PARAMETER");
1195                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1196         }
1197
1198         ret = __media_db_make_query(filter, &condition_query, &option_query);
1199         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1200                 g_free(select_query);
1201                 return ret;
1202         }
1203
1204         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1205         g_free(select_query);
1206         g_free(condition_query);
1207         g_free(option_query);
1208         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1209
1210         while (sqlite3_step(stmt) == SQLITE_ROW) {
1211                 media_info_s *item = g_new0(media_info_s, 1);
1212
1213                 _media_info_item_get_detail(stmt, (media_info_h)item);
1214
1215                 if (callback((media_info_h)item, user_data) == false) {
1216                         media_info_destroy((media_info_h)item);
1217                         break;
1218                 }
1219
1220                 media_info_destroy((media_info_h)item);
1221         }
1222
1223         SQLITE3_FINALIZE(stmt);
1224
1225         return ret;
1226 }
1227
1228 int _media_db_get_media_group_item_count(const char *group_name, filter_h filter, media_group_e group, int *item_count)
1229 {
1230         int ret = MEDIA_CONTENT_ERROR_NONE;
1231         sqlite3_stmt *stmt = NULL;
1232         char select_query[MAX_QUERY_SIZE] = {0, };
1233         char *tmp_option = NULL;
1234         char *condition_query = NULL;
1235         char *option_query = NULL;
1236 #ifdef _USE_TVPD_MODE
1237         filter_s *_filter = (filter_s *)filter;
1238         if (group < MEDIA_PVR_GROUP_DURATION) { /*media content */
1239                 if (group_name) {
1240                         if (_filter && STRING_VALID(_filter->storage_id))
1241                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_MEDIA_COUNT_FROM_GROUP, _filter->storage_id, __media_db_get_group_name(group), group_name);
1242                         else
1243                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_MEDIA_COUNT_FROM_GROUP, DB_VIEW_MEDIA, __media_db_get_group_name(group), group_name);
1244                 } else {
1245                         if (_filter && STRING_VALID(_filter->storage_id))
1246                                 snprintf(select_query, sizeof(select_query), SELECT_MEDIA_COUNT_FROM_GROUP_NULL, _filter->storage_id, __media_db_get_group_name(group));
1247                         else
1248                                 snprintf(select_query, sizeof(select_query), SELECT_MEDIA_COUNT_FROM_GROUP_NULL, DB_VIEW_MEDIA, __media_db_get_group_name(group));
1249                 }
1250         } else if (group < MEDIA_UHD_GROUP_CONTENT_TITLE) {/*pvr content*/
1251                 if (group_name) {
1252                         if (_filter && STRING_VALID(_filter->storage_id))
1253                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_PVR_COUNT_FROM_GROUP_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group), group_name);
1254                         else
1255                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_PVR_COUNT_FROM_GROUP, __media_db_get_group_name(group), group_name);
1256                 } else {
1257                         if (_filter && STRING_VALID(_filter->storage_id))
1258                                 snprintf(select_query, sizeof(select_query), SELECT_PVR_COUNT_FROM_GROUP_NULL_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group));
1259                         else
1260                                 snprintf(select_query, sizeof(select_query), SELECT_PVR_COUNT_FROM_GROUP_NULL, __media_db_get_group_name(group));
1261                 }
1262         } else {/*uhd content*/
1263                 if (group_name) {
1264                         if (_filter && STRING_VALID(_filter->storage_id))
1265                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_UHD_COUNT_FROM_GROUP_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group), group_name);
1266                         else
1267                                 sqlite3_snprintf(sizeof(select_query), select_query, SELECT_UHD_COUNT_FROM_GROUP, __media_db_get_group_name(group), group_name);
1268                 } else {
1269                         if (_filter && STRING_VALID(_filter->storage_id))
1270                                 snprintf(select_query, sizeof(select_query), SELECT_UHD_COUNT_FROM_GROUP_NULL_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group));
1271                         else
1272                                 snprintf(select_query, sizeof(select_query), SELECT_UHD_COUNT_FROM_GROUP_NULL, __media_db_get_group_name(group));
1273                 }
1274         }
1275 #else
1276         if (group_name)
1277                 sqlite3_snprintf(MAX_QUERY_SIZE, select_query, SELECT_MEDIA_COUNT_FROM_GROUP, __media_db_get_group_name(group), group_name);
1278         else
1279                 snprintf(select_query, MAX_QUERY_SIZE, SELECT_MEDIA_COUNT_FROM_GROUP_NULL, __media_db_get_group_name(group));
1280 #endif
1281         ret = __media_db_make_query(filter, &condition_query, &option_query);
1282         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1283
1284         /* If 'filter' is not NULL, 'option_query' must be created. */
1285         if (option_query) {
1286                 tmp_option = g_strconcat(option_query, ")", NULL);
1287                 g_free(option_query);
1288                 option_query = tmp_option;
1289         } else {
1290                 SAFE_STRLCAT(select_query, ")", sizeof(select_query));
1291         }
1292
1293         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1294         g_free(condition_query);
1295         g_free(option_query);
1296         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1297
1298         if (sqlite3_step(stmt) == SQLITE_ROW)
1299                 *item_count = sqlite3_column_int(stmt, 0);
1300
1301         SQLITE3_FINALIZE(stmt);
1302
1303         return ret;
1304 }
1305
1306 int _media_db_get_media_group_item(const char *group_name, filter_h filter, media_group_e group, media_info_cb callback, void *user_data)
1307 {
1308         int ret = MEDIA_CONTENT_ERROR_NONE;
1309         char select_query[MAX_QUERY_SIZE] = {0, };
1310         char *condition_query = NULL;
1311         char *option_query = NULL;
1312         sqlite3_stmt *stmt = NULL;
1313 #ifdef _USE_TVPD_MODE
1314         filter_s *_filter = (filter_s *)filter;
1315         if (group_name) {
1316                 if (_filter && STRING_VALID(_filter->storage_id))
1317                         sqlite3_snprintf(sizeof(select_query), select_query, SELECT_MEDIA_FROM_GROUP, _filter->storage_id, __media_db_get_group_name(group), group_name);
1318                 else
1319                         sqlite3_snprintf(sizeof(select_query), select_query, SELECT_MEDIA_FROM_GROUP, DB_VIEW_MEDIA, __media_db_get_group_name(group), group_name);
1320         } else {
1321                 if (_filter && STRING_VALID(_filter->storage_id))
1322                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_FROM_GROUP_NULL, _filter->storage_id, __media_db_get_group_name(group));
1323                 else
1324                         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_FROM_GROUP_NULL, DB_VIEW_MEDIA, __media_db_get_group_name(group));
1325         }
1326 #else
1327         if (group_name)
1328                 sqlite3_snprintf(MAX_QUERY_SIZE, select_query, SELECT_MEDIA_FROM_GROUP, __media_db_get_group_name(group), group_name);
1329         else
1330                 snprintf(select_query, MAX_QUERY_SIZE, SELECT_MEDIA_FROM_GROUP_NULL, __media_db_get_group_name(group));
1331 #endif
1332         ret = __media_db_make_query(filter, &condition_query, &option_query);
1333         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1334
1335         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1336         g_free(condition_query);
1337         g_free(option_query);
1338         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1339
1340         while (sqlite3_step(stmt) == SQLITE_ROW) {
1341                 media_info_s *item = g_new0(media_info_s, 1);
1342
1343                 _media_info_item_get_detail(stmt, (media_info_h)item);
1344
1345                 if (callback((media_info_h)item, user_data) == false) {
1346                         media_info_destroy((media_info_h)item);
1347                         break;
1348                 }
1349
1350                 media_info_destroy((media_info_h)item);
1351         }
1352
1353         SQLITE3_FINALIZE(stmt);
1354
1355         return ret;
1356 }
1357
1358 #ifdef _USE_TVPD_MODE
1359 int _media_db_get_storage_id_by_media_id(const char *media_id, char **storage_id)
1360 {
1361         int ret = MEDIA_CONTENT_ERROR_NONE;
1362         sqlite3_stmt *stmt = NULL;
1363         char *select_query = NULL;
1364
1365         select_query = sqlite3_mprintf(SELECT_MEDIA_STORAGE_ID_BY_ID, media_id);
1366
1367         ret = _content_get_result(select_query, &stmt);
1368         SQLITE3_SAFE_FREE(select_query);
1369         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1370
1371         if (sqlite3_step(stmt) == SQLITE_ROW) {
1372                 *storage_id = g_strdup((const char *)sqlite3_column_text(stmt, 0));
1373         } else {
1374                 content_error("Invalid media_id[%s]", media_id);
1375                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1376         }
1377
1378         SQLITE3_FINALIZE(stmt);
1379
1380         return ret;
1381 }
1382
1383 int _media_db_get_pvr_group_item(const char *group_name, filter_h filter, media_group_e group, media_pvr_cb callback, void *user_data)
1384 {
1385         int ret = MEDIA_CONTENT_ERROR_NONE;
1386         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1387         char *condition_query = NULL;
1388         char *option_query = NULL;
1389         sqlite3_stmt *stmt = NULL;
1390         filter_s *_filter = (filter_s *)filter;
1391
1392         if (group_name) {
1393                 if (_filter && STRING_VALID(_filter->storage_id))
1394                         sqlite3_snprintf(sizeof(select_query), select_query, SELECT_PVR_FROM_GROUP_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group), group_name);
1395                 else
1396                         sqlite3_snprintf(sizeof(select_query), select_query, SELECT_PVR_FROM_GROUP, __media_db_get_group_name(group), group_name);
1397         } else {
1398                 if (_filter && STRING_VALID(_filter->storage_id))
1399                         snprintf(select_query, sizeof(select_query), SELECT_PVR_FROM_GROUP_NULL_BY_STORAGE_ID, _filter->storage_id, __media_db_get_group_name(group));
1400                 else
1401                         snprintf(select_query, sizeof(select_query), SELECT_PVR_FROM_GROUP_NULL, __media_db_get_group_name(group));
1402         }
1403
1404         ret = __media_db_make_query(filter, &condition_query, &option_query);
1405         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1406
1407         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1408         g_free(condition_query);
1409         g_free(option_query);
1410         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1411
1412         while (sqlite3_step(stmt) == SQLITE_ROW) {
1413                 media_pvr_s *item = g_new0(media_pvr_s, 1);
1414
1415                 _media_pvr_item_get_detail(stmt, (media_pvr_h)item);
1416
1417                 if (callback((media_pvr_h)item, user_data) == false) {
1418                         media_info_destroy((media_pvr_h)item);
1419                         break;
1420                 }
1421
1422                 media_pvr_destroy((media_pvr_h)item);
1423         }
1424
1425         SQLITE3_FINALIZE(stmt);
1426
1427         return ret;
1428 }
1429
1430 typedef enum {
1431         MEDIA_PVR_MEDIA_ID = 0,
1432         MEDIA_PVR_STORAGE_ID,
1433         MEDIA_PVR_PATH,
1434         MEDIA_PVR_SIZE,
1435         MEDIA_PVR_DURATION,
1436         MEDIA_PVR_TIME_ZONE,
1437         MEDIA_PVR_PTC,
1438         MEDIA_PVR_MAJOR,
1439         MEDIA_PVR_MINOR,
1440         MEDIA_PVR_CHANNEL_TYPE,
1441         MEDIA_PVR_CHANNEL_NAME,
1442         MEDIA_PVR_CHANNEL_NUM,
1443         MEDIA_PVR_SERVICE_PROFILE,
1444         MEDIA_PVR_PROGRAM_TITLE,
1445         MEDIA_PVR_PROGRAM_NUM,
1446         MEDIA_PVR_PROGRAM_CRID,
1447         MEDIA_PVR_GUIDANCE,
1448         MEDIA_PVR_SYNOPSIS,
1449         MEDIA_PVR_GENRE,
1450         MEDIA_PVR_LANGUAGE,
1451         MEDIA_PVR_EMBARGO_TIME,
1452         MEDIA_PVR_EXPIRY_TIME,
1453         MEDIA_PVR_START_TIME,
1454         MEDIA_PVR_PROGRAM_START_TIME,
1455         MEDIA_PVR_PROGRAM_END_TIME,
1456         MEDIA_PVR_PROGRAM_DATE,
1457         MEDIA_PVR_PARENTAL_RATING,
1458         MEDIA_PVR_TIMER_RECORD,
1459         MEDIA_PVR_SERIES_RECORD,
1460         MEDIA_PVR_HD,
1461         MEDIA_PVR_SUBTITLE,
1462         MEDIA_PVR_TTX,
1463         MEDIA_PVR_AD,
1464         MEDIA_PVR_HARDOF_HEARINGRADIO,
1465         MEDIA_PVR_DATA_SERVICE,
1466         MEDIA_PVR_CONTENT_LOCK,
1467         MEDIA_PVR_CONTENT_WATCH,
1468         MEDIA_PVR_HAS_AUDIO_ONLY,
1469         MEDIA_PVR_IS_LOCAL_RECORDED,
1470         MEDIA_PVR_RESOLUTION,
1471         MEDIA_PVR_ASPECTRATIO,
1472         MEDIA_PVR_MODIFIED_MONTH,
1473         MEDIA_PVR_SPORTS_TYPE,
1474         MEDIA_PVR_GUIDANCE_LENGTH,
1475         MEDIA_PVR_TVMODE,
1476         MEDIA_PVR_PLAY_COUNT,
1477         MEDIA_PVR_PRIVATE_DATA,
1478         MEDIA_PVR_HIGHLIGHT,
1479 } media_pvr_field_e;
1480
1481 void _media_pvr_item_get_detail(sqlite3_stmt* stmt, media_pvr_h pvr)
1482 {
1483         media_pvr_s *_pvr = (media_pvr_s*)pvr;
1484
1485         _pvr->media_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_MEDIA_ID));
1486         _pvr->storage_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_STORAGE_ID));
1487         _pvr->path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_PATH));
1488         _pvr->size = (unsigned long long)sqlite3_column_int64(stmt, MEDIA_PVR_SIZE);
1489         _pvr->duration = sqlite3_column_int(stmt, MEDIA_PVR_DURATION);
1490         _pvr->timezone = sqlite3_column_int(stmt, MEDIA_PVR_TIME_ZONE);
1491         _pvr->ptc = sqlite3_column_int(stmt, MEDIA_PVR_PTC);
1492         _pvr->major = sqlite3_column_int(stmt, MEDIA_PVR_MAJOR);
1493         _pvr->minor = sqlite3_column_int(stmt, MEDIA_PVR_MINOR);
1494         _pvr->channel_type = sqlite3_column_int(stmt, MEDIA_PVR_CHANNEL_TYPE);
1495         _pvr->service_profile = (unsigned int)sqlite3_column_int(stmt, MEDIA_PVR_SERVICE_PROFILE);
1496         _pvr->channel_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_CHANNEL_NAME));
1497         _pvr->channel_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_CHANNEL_NUM));
1498         _pvr->program_title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_PROGRAM_TITLE));
1499         _pvr->program_num = sqlite3_column_int(stmt, MEDIA_PVR_PROGRAM_NUM);
1500         _pvr->program_crid = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_PROGRAM_CRID));
1501         _pvr->guidance = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_GUIDANCE));
1502         _pvr->synopsis = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_SYNOPSIS));
1503         _pvr->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_GENRE));
1504         _pvr->language = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_LANGUAGE));
1505         _pvr->modified_month = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_MODIFIED_MONTH));
1506         _pvr->private_data = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_PVR_PRIVATE_DATA));
1507         _pvr->embargo_time = sqlite3_column_int(stmt, MEDIA_PVR_EMBARGO_TIME);
1508         _pvr->expiry_time = sqlite3_column_int(stmt, MEDIA_PVR_EXPIRY_TIME);
1509         _pvr->start_time = sqlite3_column_int(stmt, MEDIA_PVR_START_TIME);
1510         _pvr->program_start_time = sqlite3_column_int(stmt, MEDIA_PVR_PROGRAM_START_TIME);
1511         _pvr->program_end_time = sqlite3_column_int(stmt, MEDIA_PVR_PROGRAM_END_TIME);
1512         _pvr->program_date = sqlite3_column_int(stmt, MEDIA_PVR_PROGRAM_DATE);
1513         _pvr->parental_rating = sqlite3_column_int(stmt, MEDIA_PVR_PARENTAL_RATING);
1514         _pvr->timer_record = sqlite3_column_int(stmt, MEDIA_PVR_TIMER_RECORD);
1515         _pvr->series_record = sqlite3_column_int(stmt, MEDIA_PVR_SERIES_RECORD);
1516         _pvr->hd = sqlite3_column_int(stmt, MEDIA_PVR_HD);
1517         _pvr->subtitle = sqlite3_column_int(stmt, MEDIA_PVR_SUBTITLE);
1518         _pvr->ttx = sqlite3_column_int(stmt, MEDIA_PVR_TTX);
1519         _pvr->ad = sqlite3_column_int(stmt, MEDIA_PVR_AD);
1520         _pvr->hard_of_hearing_radio = sqlite3_column_int(stmt, MEDIA_PVR_HARDOF_HEARINGRADIO);
1521         _pvr->data_service = sqlite3_column_int(stmt, MEDIA_PVR_DATA_SERVICE);
1522         _pvr->content_lock = sqlite3_column_int(stmt, MEDIA_PVR_CONTENT_LOCK);
1523         _pvr->content_watch = sqlite3_column_int(stmt, MEDIA_PVR_CONTENT_WATCH);
1524         _pvr->has_audio_only = sqlite3_column_int(stmt, MEDIA_PVR_HAS_AUDIO_ONLY);
1525         _pvr->is_local_record = sqlite3_column_int(stmt, MEDIA_PVR_IS_LOCAL_RECORDED);
1526         _pvr->resolution = sqlite3_column_int(stmt, MEDIA_PVR_RESOLUTION);
1527         _pvr->aspectratio = sqlite3_column_int(stmt, MEDIA_PVR_ASPECTRATIO);
1528         _pvr->sports_type = sqlite3_column_int(stmt, MEDIA_PVR_SPORTS_TYPE);
1529         _pvr->guidance_length = sqlite3_column_int(stmt, MEDIA_PVR_GUIDANCE_LENGTH);
1530         _pvr->tvmode = sqlite3_column_int(stmt, MEDIA_PVR_TVMODE);
1531         _pvr->play_count = sqlite3_column_int(stmt, MEDIA_PVR_PLAY_COUNT);
1532         _pvr->highlight = sqlite3_column_int(stmt, MEDIA_PVR_HIGHLIGHT);
1533
1534         return;
1535 }
1536
1537 int _media_db_get_pvr(filter_h filter, media_pvr_cb callback, void *user_data)
1538 {
1539         int ret = MEDIA_CONTENT_ERROR_NONE;
1540         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1541         char *condition_query = NULL;
1542         char *option_query = NULL;
1543         sqlite3_stmt *stmt = NULL;
1544         filter_s *_filter = (filter_s *)filter;
1545
1546         if (_filter && STRING_VALID(_filter->storage_id))
1547                 snprintf(select_query, sizeof(select_query), SELECT_PVR_LIST_BY_STORAGE_ID, _filter->storage_id);
1548         else
1549                 SAFE_STRLCAT(select_query, SELECT_PVR_LIST, sizeof(select_query));
1550
1551         ret = __media_db_make_query(filter, &condition_query, &option_query);
1552         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1553
1554         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1555         g_free(condition_query);
1556         g_free(option_query);
1557         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1558
1559         while (sqlite3_step(stmt) == SQLITE_ROW) {
1560                 media_pvr_s *_pvr = g_new0(media_pvr_s, 1);
1561
1562                 _media_pvr_item_get_detail(stmt, (media_pvr_h)_pvr);
1563
1564                 if (callback((media_pvr_h)_pvr, user_data) == false) {
1565                         media_pvr_destroy((media_pvr_h) _pvr);
1566                         break;
1567                 }
1568
1569                 media_pvr_destroy((media_pvr_h) _pvr);
1570         }
1571
1572         SQLITE3_FINALIZE(stmt);
1573
1574         return ret;
1575 }
1576
1577 typedef enum {
1578         MEDIA_UHD_MEDIA_ID = 0,
1579         MEDIA_UHD_STORAGE_ID,
1580         MEDIA_UHD_PATH,
1581         MEDIA_UHD_SIZE,
1582         MEDIA_UHD_CONTENT_ID,
1583         MEDIA_UHD_CONTENT_TITLE,
1584         MEDIA_UHD_FILE_NAME,
1585         MEDIA_UHD_FOLDER_ID,
1586         MEDIA_UHD_RELEASE_DATE,
1587         MEDIA_UHD_MODIFIED_TIME,
1588         MEDIA_UHD_PLAYED_POSITION,
1589         MEDIA_UHD_SUB_TYPE,
1590         MEDIA_UHD_PLAYED_COUNT,
1591 } media_uhd_field_e;
1592
1593 void _media_uhd_item_get_detail(sqlite3_stmt* stmt, media_uhd_h uhd)
1594 {
1595         media_uhd_s *_uhd = (media_uhd_s*)uhd;
1596
1597         _uhd->media_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_MEDIA_ID));
1598         _uhd->storage_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_STORAGE_ID));
1599         _uhd->path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_PATH));
1600         _uhd->size = (unsigned long long)sqlite3_column_int64(stmt, MEDIA_UHD_SIZE);
1601         _uhd->content_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_CONTENT_ID));
1602         _uhd->content_title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_CONTENT_TITLE));
1603         _uhd->file_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_FILE_NAME));
1604         _uhd->release_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_UHD_RELEASE_DATE));
1605         _uhd->modified_time = sqlite3_column_int(stmt, MEDIA_UHD_MODIFIED_TIME);
1606         _uhd->played_position = sqlite3_column_int(stmt, MEDIA_UHD_PLAYED_POSITION);
1607         _uhd->sub_type = sqlite3_column_int(stmt, MEDIA_UHD_SUB_TYPE);
1608         _uhd->played_count = sqlite3_column_int(stmt, MEDIA_UHD_PLAYED_COUNT);
1609
1610         return;
1611 }
1612
1613 int _media_db_get_uhd(filter_h filter, media_uhd_cb callback, void *user_data)
1614 {
1615         int ret = MEDIA_CONTENT_ERROR_NONE;
1616         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1617         char *condition_query = NULL;
1618         char *option_query = NULL;
1619         sqlite3_stmt *stmt = NULL;
1620         filter_s *_filter = (filter_s *)filter;
1621
1622         if (_filter && STRING_VALID(_filter->storage_id))
1623                 snprintf(select_query, sizeof(select_query), SELECT_UHD_LIST_BY_STORAGE_ID, _filter->storage_id);
1624         else
1625                 SAFE_STRLCAT(select_query, SELECT_UHD_LIST, sizeof(select_query));
1626
1627         ret = __media_db_make_query(filter, &condition_query, &option_query);
1628         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1629
1630         ret = _content_query_prepare(select_query, condition_query, option_query, &stmt);
1631         g_free(condition_query);
1632         g_free(option_query);
1633         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1634
1635         while (sqlite3_step(stmt) == SQLITE_ROW) {
1636                 media_uhd_s *_uhd = g_new0(media_uhd_s, 1);
1637
1638                 _media_uhd_item_get_detail(stmt, (media_uhd_h)_uhd);
1639
1640                 if (callback((media_uhd_h)_uhd, user_data) == false) {
1641                         media_uhd_destroy((media_uhd_h) _uhd);
1642                         break;
1643                 }
1644                 media_uhd_destroy((media_uhd_h) _uhd);
1645         }
1646
1647         SQLITE3_FINALIZE(stmt);
1648
1649         return ret;
1650 }
1651
1652 int _media_db_get_storage(filter_h filter, media_storage_cb callback, void *user_data)
1653 {
1654         int ret = MEDIA_CONTENT_ERROR_NONE;
1655         char *condition_query = NULL;
1656         char *option_query = NULL;
1657         sqlite3_stmt *stmt = NULL;
1658
1659         ret = __media_db_make_query(filter, &condition_query, &option_query);
1660         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1661
1662         ret = _content_query_prepare(SELECT_STORAGE_LIST, condition_query, option_query, &stmt);
1663         g_free(condition_query);
1664         g_free(option_query);
1665         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1666
1667         while (sqlite3_step(stmt) == SQLITE_ROW) {
1668                 media_storage_s *_storage = g_new0(media_storage_s, 1);
1669
1670                 _storage->storage_id = g_strdup((const char *)sqlite3_column_text(stmt, 0));
1671                 _storage->storage_path = g_strdup((const char *)sqlite3_column_text(stmt, 1));
1672
1673                 if (callback((media_storage_h)_storage, user_data) == false) {
1674                         media_storage_destroy((media_storage_h) _storage);
1675                         break;
1676                 }
1677
1678                 media_storage_destroy((media_storage_h) _storage);
1679         }
1680
1681         SQLITE3_FINALIZE(stmt);
1682
1683         return ret;
1684 }
1685 #endif