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