Add name field in bookmark table and change user_version from 5 to 6
[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         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V6, NULL, false, false, false);
816         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
817
818         /*storage*/
819         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);
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_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, true, 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_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT 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_account", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "storage_type", 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], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
830         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
831         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);
832         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
833
834         /*face scan list*/
835         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);
836         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
837         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);
838         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
839
840         /*face*/
841         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);
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], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, true, 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_x", 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_y", 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_w", 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], "face_rect_h", 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], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
854         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
855         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);
856         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
857
858         /*uhd*/
859         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);
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], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "uhd_storage_id_idx", true, 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], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 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], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT 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], "content_title", 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], "file_name", 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], "folder_uuid", 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], "release_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "modified_time", 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], "played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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], "sub_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, false);
882         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
883         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);
884         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
885
886         /*pvr*/
887         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);
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], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "pvr_storage_id_idx", 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], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, 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], "size", 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], "duration", 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], "timezone", 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], "ptc", 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], "major", 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], "minor", 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_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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_name", 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], "channel_num", 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_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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_num", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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], "program_crid", 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], "guidance", 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], "synopsis", 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], "genre", 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], "language", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "embargo_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], "expiry_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], "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_start_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_end_time", 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], "program_date", 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], "parental_rating", 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], "timer_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], "series_record", 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], "hd", 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], "subtitle", 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], "ttx", 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], "ad", 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], "hard_of_hearing_radio", 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], "data_service", 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_lock", 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], "content_watch", 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], "has_audio_only", 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], "is_local_record", 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], "resolution", 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], "aspectratio", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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], "modified_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "sports_type", 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], "guidance_length", 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], "tvmode", 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], "play_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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], "private_data", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "highlight", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
980         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
981         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);
982         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
983
984         return ret;
985 }
986 void __media_svc_table_free(table_info_s *tb)
987 {
988         SAFE_FREE(tb->trigger_name);
989         SAFE_FREE(tb->view_name);
990         SAFE_FREE(tb->event_table);
991         SAFE_FREE(tb->action_table);
992         SAFE_FREE(tb);
993 }
994
995 void __media_svc_column_free(column_info_s *col)
996 {
997         SAFE_FREE(col->name);
998         SAFE_FREE(col->type);
999         SAFE_FREE(col->option);
1000         SAFE_FREE(col->index_name);
1001         SAFE_FREE(col);
1002 }
1003
1004 void _media_svc_destroy_table_query()
1005 {
1006         int i = 0;
1007         table_info_s *tb = NULL;
1008         column_info_s *col_ptr = NULL;
1009         int len = 0;
1010
1011         /* Table Free */
1012         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
1013         __media_svc_table_free(tb);
1014         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
1015
1016         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
1017         __media_svc_table_free(tb);
1018         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
1019
1020         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1021         __media_svc_table_free(tb);
1022         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1023
1024         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1025         __media_svc_table_free(tb);
1026         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1027
1028         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
1029         __media_svc_table_free(tb);
1030         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
1031
1032         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
1033         __media_svc_table_free(tb);
1034         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
1035
1036         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1037         __media_svc_table_free(tb);
1038         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1039
1040         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1041         __media_svc_table_free(tb);
1042         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1043
1044         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
1045         __media_svc_table_free(tb);
1046         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
1047
1048         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_UHD);
1049         __media_svc_table_free(tb);
1050         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_UHD);
1051
1052         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PVR);
1053         __media_svc_table_free(tb);
1054         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PVR);
1055
1056         g_hash_table_destroy(table);
1057
1058         /* Column Free */
1059         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
1060
1061         for (i = 1; i < len; i++) {
1062                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
1063                 __media_svc_column_free(col_ptr);
1064         }
1065
1066         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
1067
1068         for (i = 1; i < len; i++) {
1069                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
1070                 __media_svc_column_free(col_ptr);
1071         }
1072
1073         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
1074
1075         for (i = 1; i < len; i++) {
1076                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
1077                 __media_svc_column_free(col_ptr);
1078         }
1079
1080         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
1081
1082         for (i = 1; i < len; i++) {
1083                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
1084                 __media_svc_column_free(col_ptr);
1085         }
1086
1087         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
1088
1089         for (i = 1; i < len; i++) {
1090                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
1091                 __media_svc_column_free(col_ptr);
1092         }
1093
1094         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
1095
1096         for (i = 1; i < len; i++) {
1097                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
1098                 __media_svc_column_free(col_ptr);
1099         }
1100
1101         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
1102
1103         for (i = 1; i < len; i++) {
1104                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
1105                 __media_svc_column_free(col_ptr);
1106         }
1107
1108         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
1109
1110         for (i = 1; i < len; i++) {
1111                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
1112                 __media_svc_column_free(col_ptr);
1113         }
1114
1115         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
1116
1117         for (i = 1; i < len; i++) {
1118                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
1119                 __media_svc_column_free(col_ptr);
1120         }
1121
1122         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
1123                 g_slist_free(column_list[i]);
1124
1125 }
1126
1127 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1128 {
1129         int ret = MS_MEDIA_ERR_NONE;
1130         char *sql = NULL;
1131
1132         ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1133         if (ret != MS_MEDIA_ERR_NONE) {
1134                  media_svc_error("Query initialization failed");
1135                 goto ERROR;
1136         }
1137
1138         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
1139         if (ret != MS_MEDIA_ERR_NONE) {
1140                  media_svc_error("_media_svc_upgrade_table_query failed");
1141                 goto ERROR;
1142         }
1143
1144         /* Upgrade issue in folder table */
1145         if (cur_version < USER_V4) {
1146                 /* Create tmp table */
1147                 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
1148                 if (sql == NULL) {
1149                          media_svc_error("_media_svc_upgrade_table_query failed");
1150                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1151                         goto ERROR;
1152                 }
1153
1154                 ret = _media_svc_sql_query(sql, uid);
1155                 if (ret != MS_MEDIA_ERR_NONE)
1156                         media_svc_error("Error when create backup folder table");
1157                 SQLITE3_SAFE_FREE(sql);
1158
1159                 /* Drop original table */
1160                 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
1161                 if (sql == NULL) {
1162                          media_svc_error("_media_svc_upgrade_table_query failed");
1163                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1164                         goto ERROR;
1165                 }
1166
1167                 ret = _media_svc_sql_query(sql, uid);
1168                 if (ret != MS_MEDIA_ERR_NONE)
1169                         media_svc_error("Error when drop table");
1170                 SQLITE3_SAFE_FREE(sql);
1171
1172                 /* Create new table */
1173                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1174                 if (ret != MS_MEDIA_ERR_NONE) {
1175                          media_svc_error("_media_svc_make_table_query failed");
1176                         goto ERROR;
1177                 }
1178
1179                 /* Insert into new table */
1180                 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);
1181                 if (sql == NULL) {
1182                          media_svc_error("Query creation failed");
1183                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1184                         goto ERROR;
1185                 }
1186
1187                 ret = _media_svc_sql_query(sql, uid);
1188                 if (ret != MS_MEDIA_ERR_NONE)
1189                         media_svc_error("Error when backup folder table");
1190                 SQLITE3_SAFE_FREE(sql);
1191
1192                 /* Drop tmp table*/
1193                 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1194                 if (sql == NULL) {
1195                          media_svc_error("Query creation failed");
1196                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1197                         goto ERROR;
1198                 }
1199
1200                 ret = _media_svc_sql_query(sql, uid);
1201                 if (ret != MS_MEDIA_ERR_NONE)
1202                         media_svc_error("Error when drop backup folder table");
1203                 SQLITE3_SAFE_FREE(sql);
1204
1205         } else {
1206                 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1207                 if (ret != MS_MEDIA_ERR_NONE) {
1208                          media_svc_error("_media_svc_upgrade_table_query failed");
1209                         goto ERROR;
1210                 }
1211         }
1212
1213         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1214         if (ret != MS_MEDIA_ERR_NONE) {
1215                  media_svc_error("_media_svc_upgrade_table_query failed");
1216                 goto ERROR;
1217         }
1218
1219         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
1220         if (ret != MS_MEDIA_ERR_NONE) {
1221                  media_svc_error("_media_svc_upgrade_table_query failed");
1222                 goto ERROR;
1223         }
1224
1225         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1226         if (ret != MS_MEDIA_ERR_NONE) {
1227                  media_svc_error("_media_svc_upgrade_table_query failed");
1228                 goto ERROR;
1229         }
1230
1231         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1232         if (ret != MS_MEDIA_ERR_NONE) {
1233                  media_svc_error("_media_svc_upgrade_table_query failed");
1234                 goto ERROR;
1235         }
1236
1237         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
1238         if (ret != MS_MEDIA_ERR_NONE) {
1239                  media_svc_error("_media_svc_upgrade_table_query failed");
1240                 goto ERROR;
1241         }
1242
1243         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1244         if (ret != MS_MEDIA_ERR_NONE) {
1245                  media_svc_error("_media_svc_upgrade_table_query failed");
1246                 goto ERROR;
1247         }
1248
1249         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1250         if (ret != MS_MEDIA_ERR_NONE) {
1251                  media_svc_error("_media_svc_upgrade_table_query failed");
1252                 goto ERROR;
1253         }
1254
1255         if (cur_version < USER_V4) {
1256                 /* Need to default value in storage_uuid */
1257                 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_MEDIA, "media");
1258                 if (sql == NULL) {
1259                          media_svc_error("Query creation failed");
1260                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1261                         goto ERROR;
1262                 }
1263
1264                 ret = _media_svc_sql_query(sql, uid);
1265                 SQLITE3_SAFE_FREE(sql);
1266
1267                 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_FOLDER, "media");
1268                 if (sql == NULL) {
1269                          media_svc_error("Query creation failed");
1270                          ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1271                         goto ERROR;
1272                 }
1273
1274                 ret = _media_svc_sql_query(sql, uid);
1275                 SQLITE3_SAFE_FREE(sql);
1276         }
1277
1278         ret = __media_svc_rebuild_view_query(db_handle, uid);
1279
1280         sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1281         if (sql == NULL) {
1282                  media_svc_error("Query creation failed");
1283                  ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1284                 goto ERROR;
1285         }
1286
1287         ret = _media_svc_sql_query(sql, uid);
1288         SQLITE3_SAFE_FREE(sql);
1289
1290         _media_svc_destroy_table_query();
1291
1292         return ret;
1293
1294 ERROR:
1295         _media_svc_destroy_table_query();
1296
1297         return ret;
1298 }
1299
1300 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1301 {
1302         int ret = MS_MEDIA_ERR_NONE;
1303
1304         media_svc_sec_debug("[SQL query] : %s", sql_str);
1305
1306         ret = media_db_request_update_db(sql_str, uid);
1307
1308         return ret;
1309 }
1310
1311 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1312 {
1313         int ret = MS_MEDIA_ERR_NONE;
1314         sqlite3_stmt *sql_stmt = NULL;
1315         char *sql = sqlite3_mprintf("PRAGMA user_version;");
1316
1317         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1318         if (ret != MS_MEDIA_ERR_NONE) {
1319                 media_svc_error("error when get user_version.");
1320                 return ret;
1321         }
1322
1323         *user_version = sqlite3_column_int(sql_stmt, 0);
1324         SQLITE3_FINALIZE(sql_stmt);
1325
1326         return MS_MEDIA_ERR_NONE;
1327 }
1328
1329 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1330 {
1331         int err = -1;
1332
1333         media_svc_sec_debug("[SQL query] : %s", sql_str);
1334
1335         if (!STRING_VALID(sql_str)) {
1336                 media_svc_error("invalid query");
1337                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1338         }
1339
1340         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1341         sqlite3_free((char *)sql_str);
1342
1343         if (err != SQLITE_OK) {
1344                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1345                 if (err == SQLITE_CORRUPT)
1346                         return MS_MEDIA_ERR_DB_CORRUPT;
1347                 else if (err == SQLITE_PERM)
1348                         return MS_MEDIA_ERR_DB_PERMISSION;
1349
1350                 return MS_MEDIA_ERR_DB_INTERNAL;
1351         }
1352
1353         err = sqlite3_step(*stmt);
1354         if (err != SQLITE_ROW) {
1355                 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1356                 SQLITE3_FINALIZE(*stmt);
1357                 return MS_MEDIA_ERR_DB_NO_RECORD;
1358         }
1359
1360         return MS_MEDIA_ERR_NONE;
1361 }
1362
1363 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1364 {
1365         int err = -1;
1366
1367         media_svc_sec_debug("[SQL query] : %s", sql_str);
1368
1369         if (!STRING_VALID(sql_str)) {
1370                 media_svc_error("invalid query");
1371                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1372         }
1373
1374         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1375         sqlite3_free((char *)sql_str);
1376
1377         if (err != SQLITE_OK) {
1378                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1379                 if (err == SQLITE_CORRUPT)
1380                         return MS_MEDIA_ERR_DB_CORRUPT;
1381                 else if (err == SQLITE_PERM)
1382                         return MS_MEDIA_ERR_DB_PERMISSION;
1383
1384                 return MS_MEDIA_ERR_DB_INTERNAL;
1385         }
1386
1387         return MS_MEDIA_ERR_NONE;
1388 }
1389
1390 int _media_svc_sql_begin_trans(uid_t uid)
1391 {
1392         int ret = MS_MEDIA_ERR_NONE;
1393
1394         media_svc_error("========_media_svc_sql_begin_trans");
1395
1396         ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1397
1398         return ret;
1399 }
1400
1401 int _media_svc_sql_end_trans(uid_t uid)
1402 {
1403         int ret = MS_MEDIA_ERR_NONE;
1404
1405         media_svc_error("========_media_svc_sql_end_trans");
1406
1407         ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1408
1409         return ret;
1410 }
1411
1412 int _media_svc_sql_rollback_trans(uid_t uid)
1413 {
1414         media_svc_error("========_media_svc_sql_rollback_trans");
1415
1416         return _media_svc_sql_query("ROLLBACK;", uid);
1417 }
1418
1419 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1420 {
1421         int ret = MS_MEDIA_ERR_NONE;
1422         int idx = 0;
1423         int length = g_list_length(*query_list);
1424         char *sql = NULL;
1425         char query_bundle[SQLITE3_QUERY_MAX_LEN] = {0, };
1426         int query_len = 0;
1427         int total_len = 0;
1428
1429         media_svc_debug("query list length : [%d]", length);
1430
1431         for (idx = 0; idx < length; idx++) {
1432                 sql = (char *)g_list_nth_data(*query_list, idx);
1433                 if (sql != NULL) {
1434                         query_len = strlen(sql);
1435                         if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1436                                 ret = media_db_request_update_db_batch(query_bundle, uid);
1437                                 if (ret != MS_MEDIA_ERR_NONE)
1438                                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1439                                 memset(query_bundle, 0, sizeof(query_bundle));
1440                                 total_len = 0;
1441                                 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1442                                 /*                              Consider inserting the basic information without metadata */
1443                                 /* Refer : SQLITE3 spec In Tizen 3.0 */
1444                                 /* Single query limit size = 1 billion bytes(1GiB) */
1445                                 /* DB limit size = 1 billion bytes(1GiB) */
1446                                 /* column limit = 2000 */
1447                                 if (query_len >= SQLITE3_QUERY_MAX_LEN) {
1448                                         media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1449                                 } else {
1450                                         strncpy(query_bundle, sql, query_len);
1451                                         total_len = query_len;
1452                                 }
1453                         } else {
1454                                 strncat(query_bundle, sql, query_len);
1455                                 total_len += query_len;
1456                         }
1457
1458                         sqlite3_free(sql);
1459                         sql = NULL;
1460                 }
1461         }
1462
1463         if (total_len > 0) {
1464                 ret = media_db_request_update_db_batch(query_bundle, uid);
1465                 if (ret != MS_MEDIA_ERR_NONE)
1466                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1467
1468                 memset(query_bundle, 0, sizeof(query_bundle));
1469                 total_len = 0;
1470         }
1471
1472         _media_svc_sql_query_release(query_list);
1473
1474         return MS_MEDIA_ERR_NONE;
1475
1476 }
1477
1478 void _media_svc_sql_query_add(GList **query_list, char **query)
1479 {
1480         *query_list = g_list_append(*query_list, *query);
1481 }
1482
1483 void _media_svc_sql_query_release(GList **query_list)
1484 {
1485         if (*query_list) {
1486                 media_svc_debug("_svc_sql_query_release");
1487                 g_list_free(*query_list);
1488                 *query_list = NULL;
1489         }
1490 }
1491
1492 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1493 {
1494         if (user_version < LATEST_VERSION_NUMBER) {
1495                 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1496                 return __media_svc_db_upgrade(db_handle, user_version, uid);
1497         } else {
1498                 return MS_MEDIA_ERR_NONE;
1499         }
1500 }
1501
1502 int _media_db_check_corrupt(sqlite3 *db_handle)
1503 {
1504         int ret = MS_MEDIA_ERR_NONE;
1505         char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
1506         sqlite3_stmt *sql_stmt = NULL;
1507         char *result = NULL;
1508
1509         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1510         if (ret != MS_MEDIA_ERR_NONE) {
1511                 media_svc_error("error when check db. err = [%d]", ret);
1512                 return ret;
1513         }
1514
1515         result = (char *)sqlite3_column_text(sql_stmt, 0);
1516         SQLITE3_FINALIZE(sql_stmt);
1517
1518         if (result != NULL) {
1519                 media_svc_debug("result %s", result);
1520                 if (strcasecmp(result, "OK"))
1521                         ret = MS_MEDIA_ERR_DB_CORRUPT;
1522         } else {
1523                 media_svc_error("result is NULL");
1524                 ret = MS_MEDIA_ERR_DB_INTERNAL;
1525         }
1526
1527         return ret;
1528 }
1529
1530
1531 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1532 {
1533         int ret = MS_MEDIA_ERR_NONE;
1534
1535         ret = _media_svc_init_table_query(table_id);
1536         if (ret != MS_MEDIA_ERR_NONE) {
1537                 media_svc_error("_media_svc_init_table_query failed");
1538                 goto ERROR;
1539         }
1540
1541         ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1542         if (ret != MS_MEDIA_ERR_NONE) {
1543                 media_svc_error("_media_svc_make_table_query failed");
1544                 goto ERROR;
1545         }
1546
1547         /* Add for trigger */
1548         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1549         if (ret != MS_MEDIA_ERR_NONE) {
1550                 media_svc_error("_media_svc_make_table_query failed");
1551                 goto ERROR;
1552         }
1553
1554         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1555         if (ret != MS_MEDIA_ERR_NONE) {
1556                 media_svc_error("_media_svc_make_table_query failed");
1557                 goto ERROR;
1558         }
1559
1560         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1561         if (ret != MS_MEDIA_ERR_NONE) {
1562                 media_svc_error("_media_svc_make_table_query failed");
1563                 goto ERROR;
1564         }
1565
1566         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1567         if (ret != MS_MEDIA_ERR_NONE) {
1568                 media_svc_error("_media_svc_make_table_query failed");
1569                 goto ERROR;
1570         }
1571
1572         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1573         if (ret != MS_MEDIA_ERR_NONE) {
1574                 media_svc_error("_media_svc_make_table_query failed");
1575                 goto ERROR;
1576         }
1577
1578         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_UHD, MEDIA_SVC_DB_LIST_UHD, uid);
1579         if (ret != MS_MEDIA_ERR_NONE) {
1580                 media_svc_error("_media_svc_make_table_query failed");
1581                 goto ERROR;
1582         }
1583
1584         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PVR, MEDIA_SVC_DB_LIST_PVR, uid);
1585         if (ret != MS_MEDIA_ERR_NONE) {
1586                 media_svc_error("_media_svc_make_table_query failed");
1587                 goto ERROR;
1588         }
1589
1590         _media_svc_destroy_table_query();
1591
1592         return ret;
1593 ERROR:
1594
1595         _media_svc_destroy_table_query();
1596
1597         return ret;
1598 }
1599
1600 int _media_svc_drop_media_table(const char *storage_id, uid_t uid)
1601 {
1602         int ret = MS_MEDIA_ERR_NONE;
1603
1604         char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1605
1606         ret = _media_svc_sql_query(sql, uid);
1607         sqlite3_free(sql);
1608
1609         return ret;
1610 }
1611
1612 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1613 {
1614         int ret = MS_MEDIA_ERR_NONE;
1615         char *sql = NULL;
1616         sqlite3_stmt *sql_stmt = NULL;
1617         int item_cnt = 0;
1618         int idx = 0;
1619         GList *storage_list = NULL;
1620         char view_query[4096] = {0, };
1621         memset(view_query, 0x00, sizeof(view_query));
1622
1623         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);
1624
1625         /*Select list of storage*/
1626         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);
1627         ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1628         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1629
1630         while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1631                 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1632                         storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1633         }
1634         SQLITE3_FINALIZE(sql_stmt);
1635
1636         if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1637                 item_cnt = g_list_length(storage_list);
1638
1639                 for (idx = 0; idx < item_cnt; idx++) {
1640                         int table_cnt = 0;
1641                         char *storage_id = NULL;
1642                         storage_id = g_list_nth_data(storage_list, idx);
1643
1644                         if (STRING_VALID(storage_id)) {
1645                                 /*Select list of storage*/
1646                                 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1647                                 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1648                                 if (ret != MS_MEDIA_ERR_NONE) {
1649                                         SAFE_FREE(storage_id);
1650                                         continue;
1651                                 }
1652
1653                                 table_cnt = sqlite3_column_int(sql_stmt, 0);
1654                                 SQLITE3_FINALIZE(sql_stmt);
1655
1656                                 if (table_cnt > 0) {
1657                                         char append_query[128] = {0, };
1658                                         memset(append_query, 0x00, sizeof(append_query));
1659                                         snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1660                                         strncat(view_query, append_query, strlen(append_query));
1661                                 } else {
1662                                         media_svc_error("media table not exist for storage [%s]", storage_id);
1663                                 }
1664
1665                                 SAFE_FREE(storage_id);
1666                         }
1667                 }
1668                 g_list_free(storage_list);
1669         }
1670
1671         ret = _media_svc_sql_query(view_query, uid);
1672         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1673
1674         return ret;
1675 }