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