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