0a839decb02e9aa3ad27ff2ec2f41624984225b9
[platform/core/multimedia/libmedia-service.git] / src / common / media-svc-db-utils.c
1 /*
2  * libmedia-service
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #include <unistd.h>
23 #include <sys/stat.h>
24 #include <db-util.h>
25 #include <media-util.h>
26 #include <errno.h>
27 #include "media-svc-env.h"
28 #include "media-svc-debug.h"
29 #include "media-svc-util.h"
30 #include "media-svc-db-utils.h"
31 #include "media-util-err.h"
32 #include "media-util-db.h"
33 #include "media-svc-media.h"
34
35 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid);
36 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid);
37
38
39 static GHashTable *table;
40 static GSList *column_list[MEDIA_SVC_DB_LIST_MAX];
41
42 char *_media_svc_get_path(uid_t uid)
43 {
44         int ret = 0;
45         char *result_path = NULL;
46
47         ret = tzplatform_set_user(uid);
48         if (ret != 0) {
49                 media_svc_error("Invalid UID[%d]", uid);
50                 return NULL;
51         } else {
52                 const char *result = tzplatform_getenv(TZ_USER_CONTENT);
53                 result_path = strndup(result, strlen(result));
54                 tzplatform_reset_user();
55         }
56
57         return result_path;
58 }
59
60 int __media_svc_add_table_info(const char *name, const char *trigger_name, const char *event_table, const char *action_table, const char *view_name)
61 {
62         table_info_s *tbl = NULL;
63
64         media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
65
66         if (STRING_VALID(trigger_name)) {
67                 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
68                 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
69         }
70
71         tbl = malloc(sizeof(table_info_s));
72         if (tbl == NULL) {
73                 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
74                 return MS_MEDIA_ERR_OUT_OF_MEMORY;
75         }
76
77         memset(tbl, 0x00, sizeof(table_info_s));
78
79         if (STRING_VALID(trigger_name)) {
80                 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
81                 if (tbl->trigger_name == NULL) {
82                         media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
83                         SAFE_FREE(tbl);
84                         return MS_MEDIA_ERR_OUT_OF_MEMORY;
85                 }
86
87                 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
88                 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
89
90                 tbl->event_table = strndup(event_table, strlen(event_table));
91                 tbl->action_table = strndup(action_table, strlen(action_table));
92         }
93
94         if (STRING_VALID(view_name))
95                 tbl->view_name = strndup(view_name, strlen(view_name));
96
97         g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
98
99         return MS_MEDIA_ERR_NONE;
100 }
101
102 int __media_svc_add_column_info(GSList **slist, const char *name, const char *type, const char *option, int version, const char *index_name, bool is_unique, bool is_trigger, bool is_view)
103 {
104         column_info_s *col = NULL;
105         col = malloc(sizeof(column_info_s));
106         if (col == NULL) {
107                 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
108                 return MS_MEDIA_ERR_OUT_OF_MEMORY;
109         }
110         memset(col, 0, sizeof(column_info_s));
111
112         col->name = strndup(name, strlen(name));
113         col->type = strndup(type, strlen(type));
114         if (option != NULL) {
115                 col->has_option = true;
116                 col->option = strndup(option, strlen(option));
117         } else {
118                 col->has_option = false;
119         }
120         col->version = version;
121         if (index_name != NULL) {
122                 col->is_index = true;
123                 col->index_name = strndup(index_name, strlen(index_name));
124         } else {
125                 col->is_index = false;
126         }
127         col->is_unique = is_unique;
128         col->is_trigger = is_trigger;
129         col->is_view = is_view;
130         *slist = g_slist_append(*slist, col);
131
132         return MS_MEDIA_ERR_NONE;
133 }
134
135 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
136 {
137         int ret = MS_MEDIA_ERR_NONE;
138         column_info_s *col_ptr = NULL;
139         char *sql = NULL;
140         char table_query[4096] = {0, };
141         char temp[1024] = {0, };
142         bool sflag = false;
143         int i, len;
144         /*media */
145         _media_svc_update_media_view(db_handle, uid);
146
147         /*drop playlist_view, tag_view */
148         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
149         ret = _media_svc_sql_query(sql, uid);
150         sqlite3_free(sql);
151         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
152
153         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
154         ret = _media_svc_sql_query(sql, uid);
155         sqlite3_free(sql);
156         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
157
158         /*create playlist_view */
159         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
160         for (i = 1; i < len; i++) {
161                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
162                 if (col_ptr->is_view) {
163                         if (sflag == true) {
164                                 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
165                                         snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
166                                 else
167                                         snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
168                                 strncat(table_query, temp, strlen(temp));
169                         } else {
170                                 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
171                                 strncpy(table_query, temp, strlen(temp));
172                                 sflag = true;
173                         }
174                 }
175                 memset(temp, 0, sizeof(temp));
176         }
177         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
178         for (i = 1; i < len; i++) {
179                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
180                 if (col_ptr->is_view) {
181                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
182                                 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
183                         else
184                                 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
185                         strncat(table_query, temp, strlen(temp));
186                 }
187                 memset(temp, 0, sizeof(temp));
188         }
189
190         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
191         for (i = 1; i < len; i++) {
192                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
193                 if (col_ptr->is_view) {
194                         snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
195                         strncat(table_query, temp, strlen(temp));
196                 }
197                 memset(temp, 0, sizeof(temp));
198         }
199         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
200         ret = _media_svc_sql_query(sql, uid);
201         sqlite3_free(sql);
202         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
203
204         /*create tag_view */
205         sflag = false;
206         memset(table_query, 0, sizeof(table_query));
207
208         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
209         for (i = 1; i < len; i++) {
210                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
211                 if (col_ptr->is_view) {
212                         if (sflag == true) {
213                                 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
214                                 strncat(table_query, temp, strlen(temp));
215                         } else {
216                                 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
217                                 strncpy(table_query, temp, strlen(temp));
218                                 sflag = true;
219                         }
220                 }
221                 memset(temp, 0, sizeof(temp));
222         }
223         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
224         for (i = 1; i < len; i++) {
225                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
226                 if (col_ptr->is_view) {
227                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
228                                 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
229                         else
230                                 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
231                         strncat(table_query, temp, strlen(temp));
232                 }
233                 memset(temp, 0, sizeof(temp));
234         }
235
236         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
237         for (i = 1; i < len; i++) {
238                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
239                 if (col_ptr->is_view) {
240                         snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
241                         strncat(table_query, temp, strlen(temp));
242                 }
243                 memset(temp, 0, sizeof(temp));
244         }
245         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
246         ret = _media_svc_sql_query(sql, uid);
247         sqlite3_free(sql);
248         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
249
250         return MS_MEDIA_ERR_NONE;
251 }
252
253 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
254 {
255         int ret = MS_MEDIA_ERR_NONE;
256         table_info_s *tb = NULL;
257         column_info_s *col_ptr = NULL;
258         char *sql = NULL;
259         char table_query[4096] = {0, };
260         char index_query[4096] = {0, };
261         char trigger_query[4096] = {0, };
262         char table_query_sub[1024] = {0, };
263         char temp[1024] = {0 ,};
264         int sflag = false;
265         int index_len = 0;
266         int trigger_len = 0;
267         int table_sub_len = 0;
268         int len = 0;
269         int i = 0;
270
271         tb = g_hash_table_lookup(table, table_name);
272         if (tb == NULL) {
273                 media_svc_debug("lookup fail.. table name [%s] ", table_name);
274                 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
275         }
276
277         len = g_slist_length(column_list[list]);
278
279         if (len == 0) {
280                 media_svc_error("Invalid column");
281                 return MS_MEDIA_ERR_INTERNAL;
282         }
283
284         for (i = 1; i < len; i++) {
285                 col_ptr = g_slist_nth_data(column_list[list], i);
286                 /*create table */
287                 if (col_ptr->has_option) {
288                         if (sflag == true) {
289                                 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
290                                 strncat(table_query, temp, strlen(temp));
291                         } else {
292                                 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
293                                 strncpy(table_query, temp, strlen(temp));
294                                 sflag = true;
295                         }
296                 } else {
297                         if (sflag == true) {
298                                 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
299                                 strncat(table_query, temp, strlen(temp));
300                         } else {
301                                 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
302                                 strncpy(table_query, temp, strlen(temp));
303                                 sflag = true;
304                         }
305                 }
306                 memset(temp, 0, sizeof(temp));
307
308                 /*unique */
309                 if (col_ptr->is_unique) {
310                         if (table_sub_len > 0) {
311                                 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
312                                 strncat(table_query_sub, temp, strlen(temp));
313                                 table_sub_len = strlen(table_query_sub);
314                         } else {
315                                 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
316                                 strncpy(table_query_sub, temp, strlen(temp));
317                                 table_sub_len = strlen(table_query_sub);
318                         }
319                 }
320                 memset(temp, 0, sizeof(temp));
321
322                 /*create index */
323                 if (col_ptr->is_index) {
324                         if (index_len > 0) {
325                                 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
326                                 strncat(index_query, temp, strlen(temp));
327                                 index_len = strlen(index_query);
328                         } else {
329                                 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
330                                 strncpy(index_query, temp, strlen(temp));
331                                 index_len = strlen(index_query);
332                         }
333                 }
334                 memset(temp, 0, sizeof(temp));
335
336                 /*create trigger */
337                 if (col_ptr->is_trigger) {
338                         if (STRING_VALID(tb->trigger_name)) {
339                                 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0) {
340                                         snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER_WITH_COUNT, tb->trigger_name, tb->event_table, tb->action_table, tb->event_table, col_ptr->name, col_ptr->name, col_ptr->name, col_ptr->name);
341                                         strncpy(trigger_query, temp, strlen(temp));
342                                         trigger_len = strlen(trigger_query);
343                                 } else {
344                                         snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
345                                         strncpy(trigger_query, temp, strlen(temp));
346                                         trigger_len = strlen(trigger_query);
347                                 }
348                         } else {
349                                 media_svc_error("invalid trigger name");
350                         }
351                 }
352                 memset(temp, 0, sizeof(temp));
353         }
354
355         /*send queries */
356         if (table_sub_len > 0) {
357                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
358                 ret = _media_svc_sql_query(sql, uid);
359                 sqlite3_free(sql);
360                 memset(table_query, 0, sizeof(table_query));
361                 memset(table_query_sub, 0, sizeof(table_query_sub));
362                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
363         } else {
364                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
365                 ret = _media_svc_sql_query(sql, uid);
366                 sqlite3_free(sql);
367                 memset(table_query, 0, sizeof(table_query));
368                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
369         }
370
371         if (index_len > 0) {
372                 ret = _media_svc_sql_query(index_query, uid);
373                 memset(index_query, 0, sizeof(index_query));
374                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
375         }
376
377         if (trigger_len > 0) {
378                 ret = _media_svc_sql_query(trigger_query, uid);
379                 memset(trigger_query, 0, sizeof(trigger_query));
380                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
381         }
382
383         /*create view */
384         sflag = false;
385         if (tb != NULL && tb->view_name != NULL) {
386                 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
387                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->view_name, table_name);
388                         ret = _media_svc_sql_query(sql, uid);
389                         sqlite3_free(sql);
390                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
391
392                 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
393                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
394                         for (i = 1; i < len; i++) {
395                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
396                                 if (col_ptr->is_view) {
397                                         if (sflag == true) {
398                                                 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
399                                                         snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
400                                                 else
401                                                         snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
402                                                 strncat(table_query, temp, strlen(temp));
403                                         } else {
404                                                 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
405                                                 strncpy(table_query, temp, strlen(temp));
406                                                 sflag = true;
407                                         }
408                                 }
409                                 memset(temp, 0, sizeof(temp));
410                         }
411                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
412                         for (i = 1; i < len; i++) {
413                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
414                                 if (col_ptr->is_view) {
415                                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
416                                                 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
417                                         else
418                                                 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
419                                         strncat(table_query, temp, strlen(temp));
420                                 }
421                                 memset(temp, 0, sizeof(temp));
422                         }
423
424                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
425                         for (i = 1; i < len; i++) {
426                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
427                                 if (col_ptr->is_view) {
428                                         snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
429                                         strncat(table_query, temp, strlen(temp));
430                                 }
431                                 memset(temp, 0, sizeof(temp));
432                         }
433                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->view_name, table_query);
434                         ret = _media_svc_sql_query(sql, uid);
435                         sqlite3_free(sql);
436                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
437
438                 } else {
439                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
440                         for (i = 1; i < len; i++) {
441                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
442                                 if (col_ptr->is_view) {
443                                         if (sflag == true) {
444                                                 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
445                                                 strncat(table_query, temp, strlen(temp));
446                                         } else {
447                                                 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
448                                                 strncpy(table_query, temp, strlen(temp));
449                                                 sflag = true;
450                                         }
451                                 }
452                                 memset(temp, 0, sizeof(temp));
453                         }
454                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
455                         for (i = 1; i < len; i++) {
456                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
457                                 if (col_ptr->is_view) {
458                                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
459                                                 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
460                                         else
461                                                 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
462                                         strncat(table_query, temp, strlen(temp));
463                                 }
464                                 memset(temp, 0, sizeof(temp));
465                         }
466
467                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
468                         for (i = 1; i < len; i++) {
469                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
470                                 if (col_ptr->is_view) {
471                                         snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
472                                         strncat(table_query, temp, strlen(temp));
473                                 }
474                                 memset(temp, 0, sizeof(temp));
475                         }
476                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->view_name, table_query);
477                         ret = _media_svc_sql_query(sql, uid);
478                         sqlite3_free(sql);
479                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
480
481                 }
482         }
483
484         return MS_MEDIA_ERR_NONE;
485 }
486
487 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
488 {
489         int ret = MS_MEDIA_ERR_NONE;
490         column_info_s *col_ptr = NULL;
491         char *sql = NULL;
492         char temp[1024] = {0, };
493         int len, i;
494         int cur_version = 0;
495         sqlite3_stmt *sql_stmt = NULL;
496
497         len = g_slist_length(column_list[list]);
498
499         sql = sqlite3_mprintf("PRAGMA user_version");
500         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
501
502         if (ret != MS_MEDIA_ERR_NONE) {
503                 media_svc_error("error when get user_version. err = [%d]", ret);
504                 return ret;
505         }
506         cur_version = sqlite3_column_int(sql_stmt, 0);
507         SQLITE3_FINALIZE(sql_stmt);
508
509         len = g_slist_length(column_list[list]);
510         for (i = 1; i < len; i++) {
511                 col_ptr = g_slist_nth_data(column_list[list], i);
512                 if (col_ptr->version > cur_version) {
513                         /*alter table */
514                         if (col_ptr->has_option)
515                                 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
516                         else
517                                 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
518                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
519                         ret = _media_svc_sql_query(sql, uid);
520                         sqlite3_free(sql);
521                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
522                         /*create index */
523                         if (col_ptr->is_index) {
524                                 memset(temp, 0, sizeof(temp));
525                                 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
526                                 ret = _media_svc_sql_query(temp, uid);
527                                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
528                         }
529                 }
530                 memset(temp, 0, sizeof(temp));
531         }
532
533         return MS_MEDIA_ERR_NONE;
534 }
535
536 int _media_svc_init_table_query(const char *event_table_name)
537 {
538         int ret = MS_MEDIA_ERR_NONE;
539         int i = 0;
540
541         /*variable initialize.. */
542         table = g_hash_table_new(g_str_hash, g_str_equal);
543         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
544                 column_list[i] = g_slist_alloc();
545
546         /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
547         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
548         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
549         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TRIGGER_FOLDER, event_table_name, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
550         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
551         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP, event_table_name, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, NULL);
552         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
553         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP1, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_VIEW_PLAYLIST);
554         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
555         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_TRIGGER_ALBUM, event_table_name, MEDIA_SVC_DB_TABLE_ALBUM, NULL);
556         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
557         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_TRIGGER_TAG_MAP, event_table_name, MEDIA_SVC_DB_TABLE_TAG_MAP, NULL);
558         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
559         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TRIGGER_TAG_MAP1, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_VIEW_TAG);
560         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
561         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TRIGGER_BOOKMARK, event_table_name, MEDIA_SVC_DB_TABLE_BOOKMARK, NULL);
562         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
563         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
564         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
565         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, NULL);
566         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
567         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, NULL);
568         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
569         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_UHD, MEDIA_SVC_DB_TRIGGER_UHD, event_table_name, MEDIA_SVC_DB_TABLE_UHD, NULL);
570         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
571         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PVR, MEDIA_SVC_DB_TRIGGER_PVR, event_table_name, MEDIA_SVC_DB_TABLE_PVR, NULL);
572         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
573
574         /*insert column info.. */
575         /*media*/
576         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, true);
577         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
578         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, true, false, true);
579         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
580         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", true, false, true);
581         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
582         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
583         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
584         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
585         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
586         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
587         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
588         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
589         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
590         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", false, false, true);
591         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
592         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
593         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
594         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
595         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
596         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_title_idx", false, false, true);
597         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
598         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
599         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
600         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_album_idx", false, false, true);
601         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
602         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_artist_idx", false, false, true);
603         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
604         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
605         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
606         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_genre_idx", false, false, true);
607         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
608         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_composer_idx", false, false, true);
609         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
610         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
611         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
612         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
613         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
614         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
615         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
616         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
617         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
618         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
619         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
620         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
621         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
622         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
623         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
624         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
625         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
626         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
627         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
628         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
629         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
630         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
631         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
632         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
633         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
634         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
635         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
636         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
637         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
638         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
639         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
640         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
641         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
642         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
643         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
644         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
645         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
646         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
647         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
648         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
649         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
650         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
651         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
652         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "burst_id", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
653         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
654         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
655         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
656         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
657         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
658         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
659         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
660         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
661         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
662         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
663         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
664         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_author_idx", false, false, true);
665         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
666         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_provider_idx", false, false, true);
667         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
668         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_content_name_idx", false, false, true);
669         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
670         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
671         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
672         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_location_tag_idx", false, false, true);
673         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
674         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
675         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
676         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
677         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
678         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
679         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
680         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
681         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
682         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
683         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
684         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "weather", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
685         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
686         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
687         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
688         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
689         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
690         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
691         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
692         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
693         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
694         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
695         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
696         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
697         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
698         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
699         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
700         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
701         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
702         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
703         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
704         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
705         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
706         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
707         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
708         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
709         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
710         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
711         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
712         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
713         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
714         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
715         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
716         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
717         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
718         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
719         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
720         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
721         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
722         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
723         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V2, NULL, false, false, false);
724         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
725         /* color column is added with dcm. (DB v5) */
726         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_r", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
727         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
728         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_g", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
729         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
730         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_b", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
731         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
732         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_360", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V5, NULL, false, false, true);
733         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
734
735         /*folder*/
736         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, false);
737         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
738         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, false, false);
739         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
740         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
741         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
742         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
743         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
744         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
745         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
746         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, false);
747         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
748         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
749         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, true, false, false);
750         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
751         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_order", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
752         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
753         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "parent_folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
754         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
755         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V4, NULL, false, false, false);
756         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
757         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
758         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
759
760         /*playlist_map*/
761         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
762         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
763         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, false);
764         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
765         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, true, false);
766         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
767         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "play_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, true);
768         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
769
770         /*playlist*/
771         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
772         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
773         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
774         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
775         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
776         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
777         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
778         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
779
780         /*album*/
781         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, false);
782         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
783         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
784         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
785         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
786         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
787         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_art", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
788         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
789
790         /*tag_map*/
791         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
792         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
793         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "tag_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, true, false, false);
794         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
795         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
796         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
797
798         /*tag*/
799         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_id ", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
800         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
801         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
802         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
803         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
804         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
805
806         /*bookmark*/
807         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, false);
808         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
809         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
810         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
811         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "marked_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, true, false, false);
812         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
813         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
814         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
815
816         /*storage*/
817         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, true, false, false);
818         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
819         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, true, false, false);
820         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
821         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
822         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
823         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_account", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, false, false, false);
824         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
825         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
826         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
827         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
828         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
829         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V3, NULL, false, false, false);
830         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
831
832         /*face scan list*/
833         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, true, true, false);
834         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
835         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
836         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
837
838         /*face*/
839         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V3, NULL, true, false, false);
840         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
841         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, true, false);
842         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
843         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_x", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
844         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
845         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_y", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
846         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
847         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_w", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
848         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
849         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_h", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
850         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
851         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
852         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
853         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, false, false, false);
854         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
855
856         /*uhd*/
857         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V4, NULL, true, true, false);
858         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
859         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "uhd_storage_id_idx", true, false, false);
860         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
861         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, false, false, false);
862         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
863         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
864         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
865         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "content_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, false, false, false);
866         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
867         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "content_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
868         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
869         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "file_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
870         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
871         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
872         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
873         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "release_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
874         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
875         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
876         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
877         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
878         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
879         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "sub_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, false);
880         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
881         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
882         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
883
884         /*pvr*/
885         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V4, NULL, false, true, false);
886         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
887         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "pvr_storage_id_idx", true, false, false);
888         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
889         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, false, false);
890         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
891         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
892         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
893         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
894         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
895         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "timezone", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
896         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
897         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ptc", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
898         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
899         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "major", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
900         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
901         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "minor", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
902         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
903         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
904         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
905         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
906         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
907         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
908         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
909         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
910         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
911         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_num", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
912         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
913         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_crid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
914         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
915         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "guidance", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
916         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
917         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "synopsis", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
918         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
919         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
920         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
921         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "language", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
922         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
923         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "embargo_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
924         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
925         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "expiry_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
926         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
927         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "start_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
928         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
929         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_start_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
930         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
931         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_end_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
932         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
933         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_date", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
934         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
935         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "parental_rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
936         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
937         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "timer_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
938         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
939         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "series_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
940         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
941         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "hd", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
942         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
943         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "subtitle", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
944         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
945         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ttx", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
946         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
947         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ad", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
948         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
949         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "hard_of_hearing_radio", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
950         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
951         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "data_service", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
952         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
953         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "content_lock", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
954         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
955         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "content_watch", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
956         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
957         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "has_audio_only", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
958         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
959         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "is_local_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
960         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
961         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "resolution", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
962         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
963         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "aspectratio", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
964         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
965         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "modified_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
966         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
967         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "sports_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
968         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
969         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "guidance_length", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
970         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
971         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "tvmode", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
972         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
973         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "play_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
974         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
975         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "private_data", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
976         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
977         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "highlight", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
978         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
979         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
980         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
981
982         return ret;
983 }
984 void __media_svc_table_free(table_info_s *tb)
985 {
986         SAFE_FREE(tb->trigger_name);
987         SAFE_FREE(tb->view_name);
988         SAFE_FREE(tb->event_table);
989         SAFE_FREE(tb->action_table);
990         SAFE_FREE(tb);
991 }
992
993 void __media_svc_column_free(column_info_s *col)
994 {
995         SAFE_FREE(col->name);
996         SAFE_FREE(col->type);
997         SAFE_FREE(col->option);
998         SAFE_FREE(col->index_name);
999         SAFE_FREE(col);
1000 }
1001
1002 void _media_svc_destroy_table_query()
1003 {
1004         int i = 0;
1005         table_info_s *tb = NULL;
1006         column_info_s *col_ptr = NULL;
1007         int len = 0;
1008
1009         /* Table Free */
1010         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
1011         __media_svc_table_free(tb);
1012         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
1013
1014         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
1015         __media_svc_table_free(tb);
1016         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
1017
1018         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1019         __media_svc_table_free(tb);
1020         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1021
1022         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1023         __media_svc_table_free(tb);
1024         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1025
1026         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
1027         __media_svc_table_free(tb);
1028         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
1029
1030         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
1031         __media_svc_table_free(tb);
1032         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
1033
1034         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1035         __media_svc_table_free(tb);
1036         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1037
1038         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1039         __media_svc_table_free(tb);
1040         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1041
1042         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
1043         __media_svc_table_free(tb);
1044         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
1045
1046         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_UHD);
1047         __media_svc_table_free(tb);
1048         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_UHD);
1049
1050         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PVR);
1051         __media_svc_table_free(tb);
1052         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PVR);
1053
1054         g_hash_table_destroy(table);
1055
1056         /* Column Free */
1057         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
1058
1059         for (i = 1; i < len; i++) {
1060                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
1061                 __media_svc_column_free(col_ptr);
1062         }
1063
1064         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
1065
1066         for (i = 1; i < len; i++) {
1067                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
1068                 __media_svc_column_free(col_ptr);
1069         }
1070
1071         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
1072
1073         for (i = 1; i < len; i++) {
1074                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
1075                 __media_svc_column_free(col_ptr);
1076         }
1077
1078         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
1079
1080         for (i = 1; i < len; i++) {
1081                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
1082                 __media_svc_column_free(col_ptr);
1083         }
1084
1085         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
1086
1087         for (i = 1; i < len; i++) {
1088                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
1089                 __media_svc_column_free(col_ptr);
1090         }
1091
1092         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
1093
1094         for (i = 1; i < len; i++) {
1095                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
1096                 __media_svc_column_free(col_ptr);
1097         }
1098
1099         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
1100
1101         for (i = 1; i < len; i++) {
1102                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
1103                 __media_svc_column_free(col_ptr);
1104         }
1105
1106         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
1107
1108         for (i = 1; i < len; i++) {
1109                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
1110                 __media_svc_column_free(col_ptr);
1111         }
1112
1113         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
1114
1115         for (i = 1; i < len; i++) {
1116                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
1117                 __media_svc_column_free(col_ptr);
1118         }
1119
1120         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
1121                 g_slist_free(column_list[i]);
1122
1123 }
1124
1125 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1126 {
1127         int ret = MS_MEDIA_ERR_NONE;
1128         char *sql = NULL;
1129
1130         ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1131         if (ret != MS_MEDIA_ERR_NONE) {
1132                  media_svc_error("Query initialization failed");
1133                 goto ERROR;
1134         }
1135
1136         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
1137         if (ret != MS_MEDIA_ERR_NONE) {
1138                  media_svc_error("_media_svc_upgrade_table_query failed");
1139                 goto ERROR;
1140         }
1141
1142         /* Upgrade issue in folder table */
1143         if (cur_version < USER_V4) {
1144                 /* Create tmp table */
1145                 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
1146                 if (sql == NULL) {
1147                          media_svc_error("_media_svc_upgrade_table_query failed");
1148                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1149                         goto ERROR;
1150                 }
1151
1152                 ret = _media_svc_sql_query(sql, uid);
1153                 if (ret != MS_MEDIA_ERR_NONE)
1154                         media_svc_error("Error when create backup folder table");
1155                 SQLITE3_SAFE_FREE(sql);
1156
1157                 /* Drop original table */
1158                 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
1159                 if (sql == NULL) {
1160                          media_svc_error("_media_svc_upgrade_table_query failed");
1161                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1162                         goto ERROR;
1163                 }
1164
1165                 ret = _media_svc_sql_query(sql, uid);
1166                 if (ret != MS_MEDIA_ERR_NONE)
1167                         media_svc_error("Error when drop table");
1168                 SQLITE3_SAFE_FREE(sql);
1169
1170                 /* Create new table */
1171                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1172                 if (ret != MS_MEDIA_ERR_NONE) {
1173                          media_svc_error("_media_svc_make_table_query failed");
1174                         goto ERROR;
1175                 }
1176
1177                 /* Insert into new table */
1178                 sql = sqlite3_mprintf("INSERT INTO '%q'(folder_uuid, path, name, modified_time, name_pinyin, storage_type) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type FROM '%q';", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1179                 if (sql == NULL) {
1180                          media_svc_error("Query creation failed");
1181                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1182                         goto ERROR;
1183                 }
1184
1185                 ret = _media_svc_sql_query(sql, uid);
1186                 if (ret != MS_MEDIA_ERR_NONE)
1187                         media_svc_error("Error when backup folder table");
1188                 SQLITE3_SAFE_FREE(sql);
1189
1190                 /* Drop tmp table*/
1191                 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1192                 if (sql == NULL) {
1193                          media_svc_error("Query creation failed");
1194                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1195                         goto ERROR;
1196                 }
1197
1198                 ret = _media_svc_sql_query(sql, uid);
1199                 if (ret != MS_MEDIA_ERR_NONE)
1200                         media_svc_error("Error when drop backup folder table");
1201                 SQLITE3_SAFE_FREE(sql);
1202
1203         } else {
1204                 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1205                 if (ret != MS_MEDIA_ERR_NONE) {
1206                          media_svc_error("_media_svc_upgrade_table_query failed");
1207                         goto ERROR;
1208                 }
1209         }
1210
1211         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1212         if (ret != MS_MEDIA_ERR_NONE) {
1213                  media_svc_error("_media_svc_upgrade_table_query failed");
1214                 goto ERROR;
1215         }
1216
1217         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
1218         if (ret != MS_MEDIA_ERR_NONE) {
1219                  media_svc_error("_media_svc_upgrade_table_query failed");
1220                 goto ERROR;
1221         }
1222
1223         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1224         if (ret != MS_MEDIA_ERR_NONE) {
1225                  media_svc_error("_media_svc_upgrade_table_query failed");
1226                 goto ERROR;
1227         }
1228
1229         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1230         if (ret != MS_MEDIA_ERR_NONE) {
1231                  media_svc_error("_media_svc_upgrade_table_query failed");
1232                 goto ERROR;
1233         }
1234
1235         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
1236         if (ret != MS_MEDIA_ERR_NONE) {
1237                  media_svc_error("_media_svc_upgrade_table_query failed");
1238                 goto ERROR;
1239         }
1240
1241         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1242         if (ret != MS_MEDIA_ERR_NONE) {
1243                  media_svc_error("_media_svc_upgrade_table_query failed");
1244                 goto ERROR;
1245         }
1246
1247         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1248         if (ret != MS_MEDIA_ERR_NONE) {
1249                  media_svc_error("_media_svc_upgrade_table_query failed");
1250                 goto ERROR;
1251         }
1252
1253         if (cur_version < USER_V4) {
1254                 /* Need to default value in storage_uuid */
1255                 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_MEDIA, "media");
1256                 if (sql == NULL) {
1257                          media_svc_error("Query creation failed");
1258                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1259                         goto ERROR;
1260                 }
1261
1262                 ret = _media_svc_sql_query(sql, uid);
1263                 SQLITE3_SAFE_FREE(sql);
1264
1265                 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_FOLDER, "media");
1266                 if (sql == NULL) {
1267                          media_svc_error("Query creation failed");
1268                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1269                         goto ERROR;
1270                 }
1271
1272                 ret = _media_svc_sql_query(sql, uid);
1273                 SQLITE3_SAFE_FREE(sql);
1274         }
1275
1276         ret = __media_svc_rebuild_view_query(db_handle, uid);
1277
1278         sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1279         if (sql == NULL) {
1280                  media_svc_error("Query creation failed");
1281                  ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1282                 goto ERROR;
1283         }
1284
1285         ret = _media_svc_sql_query(sql, uid);
1286         SQLITE3_SAFE_FREE(sql);
1287
1288         _media_svc_destroy_table_query();
1289
1290         return ret;
1291
1292 ERROR:
1293         _media_svc_destroy_table_query();
1294
1295         return ret;
1296 }
1297
1298 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1299 {
1300         int ret = MS_MEDIA_ERR_NONE;
1301
1302         media_svc_sec_debug("[SQL query] : %s", sql_str);
1303
1304         ret = media_db_request_update_db(sql_str, uid);
1305
1306         return ret;
1307 }
1308
1309 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1310 {
1311         int ret = MS_MEDIA_ERR_NONE;
1312         sqlite3_stmt *sql_stmt = NULL;
1313         char *sql = sqlite3_mprintf("PRAGMA user_version;");
1314
1315         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1316         if (ret != MS_MEDIA_ERR_NONE) {
1317                 media_svc_error("error when get user_version.");
1318                 return ret;
1319         }
1320
1321         *user_version = sqlite3_column_int(sql_stmt, 0);
1322         SQLITE3_FINALIZE(sql_stmt);
1323
1324         return MS_MEDIA_ERR_NONE;
1325 }
1326
1327 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1328 {
1329         int err = -1;
1330
1331         media_svc_sec_debug("[SQL query] : %s", sql_str);
1332
1333         if (!STRING_VALID(sql_str)) {
1334                 media_svc_error("invalid query");
1335                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1336         }
1337
1338         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1339         sqlite3_free((char *)sql_str);
1340
1341         if (err != SQLITE_OK) {
1342                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1343                 if (err == SQLITE_CORRUPT)
1344                         return MS_MEDIA_ERR_DB_CORRUPT;
1345                 else if (err == SQLITE_PERM)
1346                         return MS_MEDIA_ERR_DB_PERMISSION;
1347
1348                 return MS_MEDIA_ERR_DB_INTERNAL;
1349         }
1350
1351         err = sqlite3_step(*stmt);
1352         if (err != SQLITE_ROW) {
1353                 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1354                 SQLITE3_FINALIZE(*stmt);
1355                 return MS_MEDIA_ERR_DB_NO_RECORD;
1356         }
1357
1358         return MS_MEDIA_ERR_NONE;
1359 }
1360
1361 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1362 {
1363         int err = -1;
1364
1365         media_svc_sec_debug("[SQL query] : %s", sql_str);
1366
1367         if (!STRING_VALID(sql_str)) {
1368                 media_svc_error("invalid query");
1369                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1370         }
1371
1372         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1373         sqlite3_free((char *)sql_str);
1374
1375         if (err != SQLITE_OK) {
1376                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1377                 if (err == SQLITE_CORRUPT)
1378                         return MS_MEDIA_ERR_DB_CORRUPT;
1379                 else if (err == SQLITE_PERM)
1380                         return MS_MEDIA_ERR_DB_PERMISSION;
1381
1382                 return MS_MEDIA_ERR_DB_INTERNAL;
1383         }
1384
1385         return MS_MEDIA_ERR_NONE;
1386 }
1387
1388 int _media_svc_sql_begin_trans(uid_t uid)
1389 {
1390         int ret = MS_MEDIA_ERR_NONE;
1391
1392         media_svc_error("========_media_svc_sql_begin_trans");
1393
1394         ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1395
1396         return ret;
1397 }
1398
1399 int _media_svc_sql_end_trans(uid_t uid)
1400 {
1401         int ret = MS_MEDIA_ERR_NONE;
1402
1403         media_svc_error("========_media_svc_sql_end_trans");
1404
1405         ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1406
1407         return ret;
1408 }
1409
1410 int _media_svc_sql_rollback_trans(uid_t uid)
1411 {
1412         media_svc_error("========_media_svc_sql_rollback_trans");
1413
1414         return _media_svc_sql_query("ROLLBACK;", uid);
1415 }
1416
1417 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1418 {
1419         int ret = MS_MEDIA_ERR_NONE;
1420         int idx = 0;
1421         int length = g_list_length(*query_list);
1422         char *sql = NULL;
1423         char query_bundle[SQLITE3_QUERY_MAX_LEN] = {0, };
1424         int query_len = 0;
1425         int total_len = 0;
1426
1427         media_svc_debug("query list length : [%d]", length);
1428
1429         for (idx = 0; idx < length; idx++) {
1430                 sql = (char *)g_list_nth_data(*query_list, idx);
1431                 if (sql != NULL) {
1432                         query_len = strlen(sql);
1433                         if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1434                                 ret = media_db_request_update_db_batch(query_bundle, uid);
1435                                 if (ret != MS_MEDIA_ERR_NONE)
1436                                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1437                                 memset(query_bundle, 0, sizeof(query_bundle));
1438                                 total_len = 0;
1439                                 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1440                                 /*                              Consider inserting the basic information without metadata */
1441                                 /* Refer : SQLITE3 spec In Tizen 3.0 */
1442                                 /* Single query limit size = 1 billion bytes(1GiB) */
1443                                 /* DB limit size = 1 billion bytes(1GiB) */
1444                                 /* column limit = 2000 */
1445                                 if (query_len >= SQLITE3_QUERY_MAX_LEN) {
1446                                         media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1447                                 } else {
1448                                         strncpy(query_bundle, sql, query_len);
1449                                         total_len = query_len;
1450                                 }
1451                         } else {
1452                                 strncat(query_bundle, sql, query_len);
1453                                 total_len += query_len;
1454                         }
1455
1456                         sqlite3_free(sql);
1457                         sql = NULL;
1458                 }
1459         }
1460
1461         if (total_len > 0) {
1462                 ret = media_db_request_update_db_batch(query_bundle, uid);
1463                 if (ret != MS_MEDIA_ERR_NONE)
1464                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1465
1466                 memset(query_bundle, 0, sizeof(query_bundle));
1467                 total_len = 0;
1468         }
1469
1470         _media_svc_sql_query_release(query_list);
1471
1472         return MS_MEDIA_ERR_NONE;
1473
1474 }
1475
1476 void _media_svc_sql_query_add(GList **query_list, char **query)
1477 {
1478         *query_list = g_list_append(*query_list, *query);
1479 }
1480
1481 void _media_svc_sql_query_release(GList **query_list)
1482 {
1483         if (*query_list) {
1484                 media_svc_debug("_svc_sql_query_release");
1485                 g_list_free(*query_list);
1486                 *query_list = NULL;
1487         }
1488 }
1489
1490 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1491 {
1492         if (user_version < LATEST_VERSION_NUMBER) {
1493                 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1494                 return __media_svc_db_upgrade(db_handle, user_version, uid);
1495         } else {
1496                 return MS_MEDIA_ERR_NONE;
1497         }
1498 }
1499
1500 int _media_db_check_corrupt(sqlite3 *db_handle)
1501 {
1502         int ret = MS_MEDIA_ERR_NONE;
1503         char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
1504         sqlite3_stmt *sql_stmt = NULL;
1505         char *result = NULL;
1506
1507         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1508         if (ret != MS_MEDIA_ERR_NONE) {
1509                 media_svc_error("error when check db. err = [%d]", ret);
1510                 return ret;
1511         }
1512
1513         result = (char *)sqlite3_column_text(sql_stmt, 0);
1514         SQLITE3_FINALIZE(sql_stmt);
1515
1516         if (result != NULL) {
1517                 media_svc_debug("result %s", result);
1518                 if (strcasecmp(result, "OK"))
1519                         ret = MS_MEDIA_ERR_DB_CORRUPT;
1520         } else {
1521                 media_svc_error("result is NULL");
1522                 ret = MS_MEDIA_ERR_DB_INTERNAL;
1523         }
1524
1525         return ret;
1526 }
1527
1528
1529 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1530 {
1531         int ret = MS_MEDIA_ERR_NONE;
1532
1533         ret = _media_svc_init_table_query(table_id);
1534         if (ret != MS_MEDIA_ERR_NONE) {
1535                 media_svc_error("_media_svc_init_table_query failed");
1536                 goto ERROR;
1537         }
1538
1539         ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1540         if (ret != MS_MEDIA_ERR_NONE) {
1541                 media_svc_error("_media_svc_make_table_query failed");
1542                 goto ERROR;
1543         }
1544
1545         /* Add for trigger */
1546         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1547         if (ret != MS_MEDIA_ERR_NONE) {
1548                 media_svc_error("_media_svc_make_table_query failed");
1549                 goto ERROR;
1550         }
1551
1552         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1553         if (ret != MS_MEDIA_ERR_NONE) {
1554                 media_svc_error("_media_svc_make_table_query failed");
1555                 goto ERROR;
1556         }
1557
1558         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1559         if (ret != MS_MEDIA_ERR_NONE) {
1560                 media_svc_error("_media_svc_make_table_query failed");
1561                 goto ERROR;
1562         }
1563
1564         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1565         if (ret != MS_MEDIA_ERR_NONE) {
1566                 media_svc_error("_media_svc_make_table_query failed");
1567                 goto ERROR;
1568         }
1569
1570         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1571         if (ret != MS_MEDIA_ERR_NONE) {
1572                 media_svc_error("_media_svc_make_table_query failed");
1573                 goto ERROR;
1574         }
1575
1576         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_UHD, MEDIA_SVC_DB_LIST_UHD, uid);
1577         if (ret != MS_MEDIA_ERR_NONE) {
1578                 media_svc_error("_media_svc_make_table_query failed");
1579                 goto ERROR;
1580         }
1581
1582         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PVR, MEDIA_SVC_DB_LIST_PVR, uid);
1583         if (ret != MS_MEDIA_ERR_NONE) {
1584                 media_svc_error("_media_svc_make_table_query failed");
1585                 goto ERROR;
1586         }
1587
1588         _media_svc_destroy_table_query();
1589
1590         return ret;
1591 ERROR:
1592
1593         _media_svc_destroy_table_query();
1594
1595         return ret;
1596 }
1597
1598 int _media_svc_drop_media_table(const char *storage_id, uid_t uid)
1599 {
1600         int ret = MS_MEDIA_ERR_NONE;
1601
1602         char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1603
1604         ret = _media_svc_sql_query(sql, uid);
1605         sqlite3_free(sql);
1606
1607         return ret;
1608 }
1609
1610 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1611 {
1612         int ret = MS_MEDIA_ERR_NONE;
1613         char *sql = NULL;
1614         sqlite3_stmt *sql_stmt = NULL;
1615         int item_cnt = 0;
1616         int idx = 0;
1617         GList *storage_list = NULL;
1618         char view_query[4096] = {0, };
1619         memset(view_query, 0x00, sizeof(view_query));
1620
1621         snprintf(view_query, sizeof(view_query), "DROP VIEW IF EXISTS %s; CREATE VIEW IF NOT EXISTS %s AS SELECT * from %s ", MEDIA_SVC_DB_VIEW_MEDIA, MEDIA_SVC_DB_VIEW_MEDIA, MEDIA_SVC_DB_TABLE_MEDIA);
1622
1623         /*Select list of storage*/
1624         sql = sqlite3_mprintf("SELECT storage_uuid FROM '%s' WHERE validity=1 AND storage_uuid != '%s'", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_MEDIA);
1625         ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1626         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1627
1628         while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1629                 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1630                         storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1631         }
1632         SQLITE3_FINALIZE(sql_stmt);
1633
1634         if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1635                 item_cnt = g_list_length(storage_list);
1636
1637                 for (idx = 0; idx < item_cnt; idx++) {
1638                         int table_cnt = 0;
1639                         char *storage_id = NULL;
1640                         storage_id = g_list_nth_data(storage_list, idx);
1641
1642                         if (STRING_VALID(storage_id)) {
1643                                 /*Select list of storage*/
1644                                 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1645                                 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1646                                 if (ret != MS_MEDIA_ERR_NONE) {
1647                                         SAFE_FREE(storage_id);
1648                                         continue;
1649                                 }
1650
1651                                 table_cnt = sqlite3_column_int(sql_stmt, 0);
1652                                 SQLITE3_FINALIZE(sql_stmt);
1653
1654                                 if (table_cnt > 0) {
1655                                         char append_query[128] = {0, };
1656                                         memset(append_query, 0x00, sizeof(append_query));
1657                                         snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1658                                         strncat(view_query, append_query, strlen(append_query));
1659                                 } else {
1660                                         media_svc_error("media table not exist for storage [%s]", storage_id);
1661                                 }
1662
1663                                 SAFE_FREE(storage_id);
1664                         }
1665                 }
1666                 g_list_free(storage_list);
1667         }
1668
1669         ret = _media_svc_sql_query(view_query, uid);
1670         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1671
1672         return ret;
1673 }