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