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