Add for upgrade tizen 4.0 to 5.5
[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 <media-util.h>
24 #include <errno.h>
25 #include "media-svc-env.h"
26 #include "media-svc-debug.h"
27 #include "media-svc-util.h"
28 #include "media-svc-db-utils.h"
29 #include "media-util-err.h"
30 #include "media-util-db.h"
31 #include "media-svc-media.h"
32
33 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid);
34 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid);
35 static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid);
36
37
38 static GHashTable *table;
39 static GSList *column_list[MEDIA_SVC_DB_LIST_MAX];
40
41 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)
42 {
43         table_info_s *tbl = NULL;
44
45         media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
46
47         if (STRING_VALID(trigger_name)) {
48                 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
49                 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
50         }
51
52         tbl = malloc(sizeof(table_info_s));
53         if (tbl == NULL) {
54                 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
55                 return MS_MEDIA_ERR_OUT_OF_MEMORY;
56         }
57
58         memset(tbl, 0x00, sizeof(table_info_s));
59
60         if (STRING_VALID(trigger_name)) {
61                 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
62                 if (tbl->trigger_name == NULL) {
63                         media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
64                         SAFE_FREE(tbl);
65                         return MS_MEDIA_ERR_OUT_OF_MEMORY;
66                 }
67
68                 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
69                 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
70
71                 tbl->event_table = strndup(event_table, strlen(event_table));
72                 tbl->action_table = strndup(action_table, strlen(action_table));
73         }
74
75         if (STRING_VALID(view_name))
76                 tbl->view_name = strndup(view_name, strlen(view_name));
77
78         g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
79
80         return MS_MEDIA_ERR_NONE;
81 }
82
83 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)
84 {
85         column_info_s *col = NULL;
86         col = malloc(sizeof(column_info_s));
87         if (col == NULL) {
88                 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
89                 return MS_MEDIA_ERR_OUT_OF_MEMORY;
90         }
91         memset(col, 0, sizeof(column_info_s));
92
93         col->name = strndup(name, strlen(name));
94         col->type = strndup(type, strlen(type));
95         if (option != NULL) {
96                 col->has_option = true;
97                 col->option = strndup(option, strlen(option));
98         } else {
99                 col->has_option = false;
100         }
101         col->version = version;
102         if (index_name != NULL) {
103                 col->is_index = true;
104                 col->index_name = strndup(index_name, strlen(index_name));
105         } else {
106                 col->is_index = false;
107         }
108         col->is_unique = is_unique;
109         col->is_trigger = is_trigger;
110         col->is_view = is_view;
111         *slist = g_slist_append(*slist, col);
112
113         return MS_MEDIA_ERR_NONE;
114 }
115
116 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
117 {
118         int ret = MS_MEDIA_ERR_NONE;
119         column_info_s *col_ptr = NULL;
120         char *sql = NULL;
121         char table_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
122         char temp[1024] = {0, };
123         bool sflag = false;
124         int i, len;
125         /*media */
126         _media_svc_update_media_view(db_handle, uid);
127
128         /*drop playlist_view, tag_view */
129         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
130         ret = _media_svc_sql_query(sql, uid);
131         SQLITE3_SAFE_FREE(sql);
132         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
133
134         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
135         ret = _media_svc_sql_query(sql, uid);
136         SQLITE3_SAFE_FREE(sql);
137         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
138
139         /*create playlist_view */
140         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
141         for (i = 1; i < len; i++) {
142                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
143                 if (col_ptr->is_view) {
144                         if (sflag == true) {
145                                 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
146                                         snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
147                                 else
148                                         snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
149                         } else {
150                                 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
151                                 sflag = true;
152                         }
153                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
154                 }
155                 memset(temp, 0, sizeof(temp));
156         }
157         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
158         for (i = 1; i < len; i++) {
159                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
160                 if (col_ptr->is_view) {
161                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
162                                 snprintf(temp, sizeof(temp), ", playlist_media_count IS NOT NULL AS playlist_media_count, playlist_map.%s AS pm_id", col_ptr->name);
163                         else
164                                 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
165                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
166                 }
167                 memset(temp, 0, sizeof(temp));
168         }
169
170         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
171         for (i = 1; i < len; i++) {
172                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
173                 if (col_ptr->is_view) {
174                         snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
175                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
176                 }
177                 memset(temp, 0, sizeof(temp));
178         }
179         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
180         ret = _media_svc_sql_query(sql, uid);
181         SQLITE3_SAFE_FREE(sql);
182         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
183
184         /*create tag_view */
185         sflag = false;
186         memset(table_query, 0, sizeof(table_query));
187
188         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
189         for (i = 1; i < len; i++) {
190                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
191                 if (col_ptr->is_view) {
192                         if (sflag == true) {
193                                 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
194                         } else {
195                                 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
196                                 sflag = true;
197                         }
198                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
199                 }
200                 memset(temp, 0, sizeof(temp));
201         }
202         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
203         for (i = 1; i < len; i++) {
204                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
205                 if (col_ptr->is_view) {
206                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
207                                 snprintf(temp, sizeof(temp), ", tag_media_count IS NOT NULL AS tag_media_count, tag_map.%s AS tm_id", col_ptr->name);
208                         else
209                                 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
210                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
211                 }
212                 memset(temp, 0, sizeof(temp));
213         }
214
215         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
216         for (i = 1; i < len; i++) {
217                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
218                 if (col_ptr->is_view) {
219                         snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
220                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
221                 }
222                 memset(temp, 0, sizeof(temp));
223         }
224         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
225         ret = _media_svc_sql_query(sql, uid);
226         SQLITE3_SAFE_FREE(sql);
227         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
228
229         return MS_MEDIA_ERR_NONE;
230 }
231
232 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
233 {
234         int ret = MS_MEDIA_ERR_NONE;
235         table_info_s *tb = NULL;
236         column_info_s *col_ptr = NULL;
237         char *sql = NULL;
238         char table_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
239         char index_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
240         char trigger_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
241         char table_query_sub[1024] = {0, };
242         char temp[1024] = {0 ,};
243         bool flag = false;
244         bool sub_flag = false;
245         int len = 0;
246         int i = 0;
247
248         tb = g_hash_table_lookup(table, table_name);
249         if (tb == NULL) {
250                 media_svc_debug("lookup fail.. table name [%s] ", table_name);
251                 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
252         }
253
254         len = g_slist_length(column_list[list]);
255
256         if (len == 0) {
257                 media_svc_error("Invalid column");
258                 return MS_MEDIA_ERR_INTERNAL;
259         }
260
261         for (i = 1; i < len; i++) {
262                 col_ptr = g_slist_nth_data(column_list[list], i);
263                 /*create table */
264                 if (col_ptr->has_option) {
265                         if (flag == true) {
266                                 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
267                         } else {
268                                 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
269                                 flag = true;
270                         }
271                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
272                 } else {
273                         if (flag == true) {
274                                 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
275                         } else {
276                                 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
277                                 flag = true;
278                         }
279                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
280                 }
281                 memset(temp, 0, sizeof(temp));
282
283                 /*unique */
284                 if (col_ptr->is_unique) {
285                         if (sub_flag == true) {
286                                 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
287                         } else {
288                                 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
289                                 sub_flag = true;
290                         }
291                         SAFE_STRLCAT(table_query_sub, temp, sizeof(table_query_sub));
292                 }
293                 memset(temp, 0, sizeof(temp));
294
295                 /*create index */
296                 if (col_ptr->is_index) {
297                         snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
298                         SAFE_STRLCAT(index_query, temp, sizeof(index_query));
299                 }
300                 memset(temp, 0, sizeof(temp));
301
302                 /*create trigger */
303                 if (col_ptr->is_trigger) {
304                         if (STRING_VALID(tb->trigger_name)) {
305                                 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0)
306                                         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);
307                                 else
308                                         snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
309
310                                 SAFE_STRLCAT(trigger_query, temp, sizeof(trigger_query));
311                         } else {
312                                 media_svc_error("invalid trigger name");
313                         }
314                 }
315                 memset(temp, 0, sizeof(temp));
316         }
317
318         /*send queries */
319         if (sub_flag == true) {
320                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
321                 ret = _media_svc_sql_query(sql, uid);
322                 SQLITE3_SAFE_FREE(sql);
323                 memset(table_query, 0, sizeof(table_query));
324                 memset(table_query_sub, 0, sizeof(table_query_sub));
325                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
326         } else {
327                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
328                 ret = _media_svc_sql_query(sql, uid);
329                 SQLITE3_SAFE_FREE(sql);
330                 memset(table_query, 0, sizeof(table_query));
331                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
332         }
333
334         if (STRING_VALID(index_query)) {
335                 ret = _media_svc_sql_query(index_query, uid);
336                 memset(index_query, 0, sizeof(index_query));
337                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
338         }
339
340         if (STRING_VALID(trigger_query)) {
341                 ret = _media_svc_sql_query(trigger_query, uid);
342                 memset(trigger_query, 0, sizeof(trigger_query));
343                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
344         }
345
346         /*create view */
347         flag = false;
348         if (tb != NULL && tb->view_name != NULL) {
349                 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
350                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->view_name, table_name);
351                         ret = _media_svc_sql_query(sql, uid);
352                         SQLITE3_SAFE_FREE(sql);
353                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
354
355                 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
356                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
357                         for (i = 1; i < len; i++) {
358                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
359                                 if (col_ptr->is_view) {
360                                         if (flag == true) {
361                                                 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
362                                                         snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
363                                                 else
364                                                         snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
365                                         } else {
366                                                 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
367                                                 flag = true;
368                                         }
369                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
370                                 }
371                                 memset(temp, 0, sizeof(temp));
372                         }
373                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
374                         for (i = 1; i < len; i++) {
375                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
376                                 if (col_ptr->is_view) {
377                                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
378                                                 snprintf(temp, sizeof(temp), ", playlist_media_count IS NOT NULL AS playlist_media_count, playlist_map.%s AS pm_id", col_ptr->name);
379                                         else
380                                                 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
381                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
382                                 }
383                                 memset(temp, 0, sizeof(temp));
384                         }
385
386                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
387                         for (i = 1; i < len; i++) {
388                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
389                                 if (col_ptr->is_view) {
390                                         snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
391                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
392                                 }
393                                 memset(temp, 0, sizeof(temp));
394                         }
395                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->view_name, table_query);
396                         ret = _media_svc_sql_query(sql, uid);
397                         SQLITE3_SAFE_FREE(sql);
398                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
399
400                 } else {
401                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
402                         for (i = 1; i < len; i++) {
403                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
404                                 if (col_ptr->is_view) {
405                                         if (flag == true) {
406                                                 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
407                                         } else {
408                                                 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
409                                                 flag = true;
410                                         }
411                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
412                                 }
413                                 memset(temp, 0, sizeof(temp));
414                         }
415                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
416                         for (i = 1; i < len; i++) {
417                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
418                                 if (col_ptr->is_view) {
419                                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
420                                                 snprintf(temp, sizeof(temp), ", tag_media_count IS NOT NULL AS tag_media_count, tag_map.%s AS tm_id", col_ptr->name);
421                                         else
422                                                 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
423                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
424                                 }
425                                 memset(temp, 0, sizeof(temp));
426                         }
427
428                         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
429                         for (i = 1; i < len; i++) {
430                                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
431                                 if (col_ptr->is_view) {
432                                         snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
433                                         SAFE_STRLCAT(table_query, temp, sizeof(table_query));
434                                 }
435                                 memset(temp, 0, sizeof(temp));
436                         }
437                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->view_name, table_query);
438                         ret = _media_svc_sql_query(sql, uid);
439                         SQLITE3_SAFE_FREE(sql);
440                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
441                 }
442         }
443
444         return MS_MEDIA_ERR_NONE;
445 }
446
447 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
448 {
449         int ret = MS_MEDIA_ERR_NONE;
450         column_info_s *col_ptr = NULL;
451         char *sql = NULL;
452         char temp[1024] = {0, };
453         int len, i;
454         int cur_version = 0;
455         sqlite3_stmt *sql_stmt = NULL;
456
457         len = g_slist_length(column_list[list]);
458
459         sql = sqlite3_mprintf("PRAGMA user_version");
460         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
461
462         if (ret != MS_MEDIA_ERR_NONE) {
463                 media_svc_error("error when get user_version. err = [%d]", ret);
464                 return ret;
465         }
466         cur_version = sqlite3_column_int(sql_stmt, 0);
467         SQLITE3_FINALIZE(sql_stmt);
468
469         len = g_slist_length(column_list[list]);
470         for (i = 1; i < len; i++) {
471                 col_ptr = g_slist_nth_data(column_list[list], i);
472                 if (col_ptr->version > cur_version) {
473                         /*alter table */
474                         if (col_ptr->has_option)
475                                 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
476                         else
477                                 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
478                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
479                         ret = _media_svc_sql_query(sql, uid);
480                         SQLITE3_SAFE_FREE(sql);
481                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
482                         /*create index */
483                         if (col_ptr->is_index) {
484                                 memset(temp, 0, sizeof(temp));
485                                 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
486                                 ret = _media_svc_sql_query(temp, uid);
487                                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
488                         }
489                 }
490                 memset(temp, 0, sizeof(temp));
491         }
492
493         return MS_MEDIA_ERR_NONE;
494 }
495
496 int _media_svc_init_table_query(const char *event_table_name)
497 {
498         int ret = MS_MEDIA_ERR_NONE;
499         int i = 0;
500
501         /*variable initialize.. */
502         table = g_hash_table_new(g_str_hash, g_str_equal);
503         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
504                 column_list[i] = g_slist_alloc();
505
506         /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
507         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
508         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
509         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);
510         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
511         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);
512         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
513         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);
514         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
515         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);
516         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
517         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);
518         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
519         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);
520         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
521         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);
522         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
523         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
524         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
525         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);
526         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
527         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);
528         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
529
530         /*insert column info.. */
531         /*media*/
532         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, true);
533         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
534         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
535         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
536         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_display_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", false, false, true);
537         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
538         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);
539         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
540         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
541         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
542         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
543         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
544         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
545         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
546         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", false, false, true);
547         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
548         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
549         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
550         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
551         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
552         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
553         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
554         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);
555         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
556         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
557         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
558         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
559         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
560         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
561         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
562         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
563         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
564         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
565         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
566         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
567         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
568         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
569         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
570         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
571         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
572         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
573         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
574         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
575         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
576         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
577         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
578         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
579         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
580         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
581         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
582         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
583         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
584         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
585         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
586         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
587         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
588         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
589         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
590         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
591         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
592         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
593         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
594         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
595         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
596         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
597         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
598         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
599         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
600         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
601         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
602         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
603         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
604         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
605         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
606         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
607         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
608         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
609         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
610         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
611         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
612         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
613         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
614         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
615         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
616         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
617         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
618         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
619         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
620         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
621         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
622         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
623         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
624         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
625         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
626         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
627         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
628         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
629         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
630         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
631         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
632         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
633         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
634         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
635         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
636         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
637         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
638         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
639         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
640         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
641         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
642         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
643         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);
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], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V2, NULL, false, false, false);
646         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
647         /* color column is added with dcm. (DB v5) */
648         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_360", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V5, NULL, false, false, true);
649         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
650
651         /*folder*/
652         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, false);
653         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
654         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, false, false);
655         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
656         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
657         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
658         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
659         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
660         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
661         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
662         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, false);
663         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
664         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
665         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);
666         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
667         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);
668         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
669
670         /*playlist_map*/
671         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);
672         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
673         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);
674         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
675         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, true, 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_PLAYLIST_MAP], "playlist_member_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, true);
678         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
679
680         /*playlist*/
681         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);
682         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
683         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
684         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
685         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
686         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
687
688         /*album*/
689         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);
690         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
691         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);
692         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
693         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);
694         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
695         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);
696         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
697
698         /*tag_map*/
699         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);
700         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
701         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);
702         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
703         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
704         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
705
706         /*tag*/
707         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);
708         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
709         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
710         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
711
712         /*bookmark*/
713         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);
714         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
715         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
716         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
717         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_marked_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, true, false, false);
718         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
719         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
720         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
721         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V6, NULL, false, false, false);
722         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
723
724         /*storage*/
725         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V3, NULL, false, false, false);
726         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
727         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
728         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
729         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
730         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
731         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V3, NULL, false, false, false);
732         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
733
734         /*face scan list*/
735         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V4, NULL, false, true, false);
736         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
737         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V6, NULL, false, false, false);
738         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
739
740         /*face*/
741         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_face_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V4, NULL, false, false, false);
742         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
743         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, true, false);
744         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
745         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);
746         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
747         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);
748         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
749         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);
750         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
751         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);
752         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
753         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
754         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
755         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
756         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
757
758         return ret;
759 }
760 void __media_svc_table_free(table_info_s *tb)
761 {
762         SAFE_FREE(tb->trigger_name);
763         SAFE_FREE(tb->view_name);
764         SAFE_FREE(tb->event_table);
765         SAFE_FREE(tb->action_table);
766         SAFE_FREE(tb);
767 }
768
769 void __media_svc_column_free(column_info_s *col)
770 {
771         SAFE_FREE(col->name);
772         SAFE_FREE(col->type);
773         SAFE_FREE(col->option);
774         SAFE_FREE(col->index_name);
775         SAFE_FREE(col);
776 }
777
778 void _media_svc_destroy_table_query()
779 {
780         int i = 0;
781         table_info_s *tb = NULL;
782         column_info_s *col_ptr = NULL;
783         int len = 0;
784
785         /* Table Free */
786         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
787         __media_svc_table_free(tb);
788         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
789
790         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
791         __media_svc_table_free(tb);
792         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
793
794         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
795         __media_svc_table_free(tb);
796         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
797
798         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
799         __media_svc_table_free(tb);
800         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
801
802         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
803         __media_svc_table_free(tb);
804         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
805
806         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
807         __media_svc_table_free(tb);
808         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
809
810         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
811         __media_svc_table_free(tb);
812         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
813
814         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
815         __media_svc_table_free(tb);
816         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
817
818         tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
819         __media_svc_table_free(tb);
820         g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
821
822         g_hash_table_destroy(table);
823
824         /* Column Free */
825         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
826
827         for (i = 1; i < len; i++) {
828                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
829                 __media_svc_column_free(col_ptr);
830         }
831
832         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
833
834         for (i = 1; i < len; i++) {
835                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
836                 __media_svc_column_free(col_ptr);
837         }
838
839         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
840
841         for (i = 1; i < len; i++) {
842                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
843                 __media_svc_column_free(col_ptr);
844         }
845
846         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
847
848         for (i = 1; i < len; i++) {
849                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
850                 __media_svc_column_free(col_ptr);
851         }
852
853         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
854
855         for (i = 1; i < len; i++) {
856                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
857                 __media_svc_column_free(col_ptr);
858         }
859
860         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
861
862         for (i = 1; i < len; i++) {
863                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
864                 __media_svc_column_free(col_ptr);
865         }
866
867         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
868
869         for (i = 1; i < len; i++) {
870                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
871                 __media_svc_column_free(col_ptr);
872         }
873
874         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
875
876         for (i = 1; i < len; i++) {
877                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
878                 __media_svc_column_free(col_ptr);
879         }
880
881         len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
882
883         for (i = 1; i < len; i++) {
884                 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
885                 __media_svc_column_free(col_ptr);
886         }
887
888         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
889                 g_slist_free(column_list[i]);
890
891 }
892
893 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
894 {
895         int ret = MS_MEDIA_ERR_NONE;
896         char *sql = NULL;
897
898         media_svc_debug_fenter();
899
900         ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
901         if (ret != MS_MEDIA_ERR_NONE) {
902                  media_svc_error("Query initialization failed");
903                 goto ERROR;
904         }
905
906         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
907         if (ret != MS_MEDIA_ERR_NONE) {
908                  media_svc_error("_media_svc_upgrade_table_query failed");
909                 goto ERROR;
910         }
911
912         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
913         if (ret != MS_MEDIA_ERR_NONE) {
914                  media_svc_error("_media_svc_upgrade_table_query failed");
915                 goto ERROR;
916         }
917
918         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
919         if (ret != MS_MEDIA_ERR_NONE) {
920                  media_svc_error("_media_svc_upgrade_table_query failed");
921                 goto ERROR;
922         }
923
924         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
925         if (ret != MS_MEDIA_ERR_NONE) {
926                  media_svc_error("_media_svc_upgrade_table_query failed");
927                 goto ERROR;
928         }
929
930         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
931         if (ret != MS_MEDIA_ERR_NONE) {
932                  media_svc_error("_media_svc_upgrade_table_query failed");
933                 goto ERROR;
934         }
935
936         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
937         if (ret != MS_MEDIA_ERR_NONE) {
938                  media_svc_error("_media_svc_upgrade_table_query failed");
939                 goto ERROR;
940         }
941
942         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
943         if (ret != MS_MEDIA_ERR_NONE) {
944                  media_svc_error("_media_svc_upgrade_table_query failed");
945                 goto ERROR;
946         }
947
948         ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
949         if (ret != MS_MEDIA_ERR_NONE) {
950                  media_svc_error("_media_svc_upgrade_table_query failed");
951                 goto ERROR;
952         }
953
954         /* Upgrade issue tizen 4.0 to 5.5 */
955         if (cur_version == USER_V6) {
956                 /*Drop view first*/
957                 sql = sqlite3_mprintf("DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q",
958                         MEDIA_SVC_DB_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_TAG, MEDIA_SVC_DB_VIEW_MEDIA);
959                 if (sql == NULL) {
960                         media_svc_error("Query creation failed");
961                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
962                         goto ERROR;
963                 }
964
965                 ret = _media_svc_sql_query(sql, uid);
966                 SQLITE3_SAFE_FREE(sql);
967                 if (ret != MS_MEDIA_ERR_NONE) {
968                         media_svc_error("_media_svc_sql_query failed");
969                         goto ERROR;
970                 }
971
972                 /******Upgrade Media Table******/
973                 /* remove user data columns */
974                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_TMP_TABLE);
975                 if (sql == NULL) {
976                         media_svc_error("Query creation failed");
977                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
978                         goto ERROR;
979                 }
980
981                 ret = _media_svc_sql_query(sql, uid);
982                 SQLITE3_SAFE_FREE(sql);
983                 if (ret != MS_MEDIA_ERR_NONE) {
984                         media_svc_error("_media_svc_sql_query failed");
985                         goto ERROR;
986                 }
987
988                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
989                 if (ret != MS_MEDIA_ERR_NONE) {
990                         media_svc_error("_media_svc_make_table_query failed");
991                         goto ERROR;
992                 }
993
994                 sql = sqlite3_mprintf("INSERT INTO %q (media_id, media_path, media_display_name, media_type, media_mime_type, media_size, media_added_time, media_modified_time, folder_id, media_thumbnail_path, media_title, album_id, media_album, media_artist, media_album_artist, media_genre, media_composer, media_year, media_recorded_date, media_copyright, media_track_num, media_description, media_bitrate, media_bitpersample, media_samplerate, media_channel, media_duration, media_longitude, media_latitude, media_altitude, exposure_time, fnumber, iso, model, media_width, media_height, media_datetaken, media_orientation, media_rating, media_favourite, media_is_drm, media_storage_type, media_timeline, sync_status, media_file_name_pinyin, media_title_pinyin, media_album_pinyin, media_artist_pinyin, media_album_artist_pinyin, media_genre_pinyin, media_composer_pinyin, media_copyright_pinyin, media_description_pinyin, age_rating_pinyin, keyword_pinyin, storage_uuid, validity, media_360) \
995                         SELECT media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, title, album_id, album, artist, album_artist, genre, composer, year, recorded_date, copyright, track_num, description, bitrate, bitpersample, samplerate, channel, duration, longitude, latitude, altitude, exposure_time, fnumber, iso, model, width, height, datetaken, orientation, rating, favourite, is_drm, storage_type, timeline, sync_status, file_name_pinyin, title_pinyin, album_pinyin, artist_pinyin, album_artist_pinyin, genre_pinyin, composer_pinyin, copyright_pinyin, description_pinyin, age_rating_pinyin, keyword_pinyin, storage_uuid, validity, is_360 FROM %q;",
996                         MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_TMP_TABLE);
997                 if (sql == NULL) {
998                         media_svc_error("Query creation failed");
999                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1000                         goto ERROR;
1001                 }
1002
1003                 ret = _media_svc_sql_query(sql, uid);
1004                 SQLITE3_SAFE_FREE(sql);
1005                 if (ret != MS_MEDIA_ERR_NONE) {
1006                         media_svc_error("_media_svc_sql_query failed");
1007                         goto ERROR;
1008                 }
1009
1010                 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1011                 if (sql == NULL) {
1012                         media_svc_error("Query creation failed");
1013                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1014                         goto ERROR;
1015                 }
1016
1017                 ret = _media_svc_sql_query(sql, uid);
1018                 SQLITE3_SAFE_FREE(sql);
1019                 if (ret != MS_MEDIA_ERR_NONE) {
1020                         media_svc_error("_media_svc_sql_query failed");
1021                         goto ERROR;
1022                 }
1023
1024                 /******Upgrade Folder Table******/
1025                 /* remove  "scan_status" column */
1026                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1027                 if (sql == NULL) {
1028                         media_svc_error("Query creation failed");
1029                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1030                         goto ERROR;
1031                 }
1032
1033                 ret = _media_svc_sql_query(sql, uid);
1034                 SQLITE3_SAFE_FREE(sql);
1035                 if (ret != MS_MEDIA_ERR_NONE) {
1036                         media_svc_error("_media_svc_sql_query failed");
1037                         goto ERROR;
1038                 }
1039
1040                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1041                 if (ret != MS_MEDIA_ERR_NONE) {
1042                         media_svc_error("_media_svc_make_table_query failed");
1043                         goto ERROR;
1044                 }
1045
1046                 sql = sqlite3_mprintf("INSERT INTO %q (folder_id, folder_path, folder_name, folder_modified_time, folder_name_pinyin, folder_storage_type, storage_uuid, validity) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, validity FROM %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1047                 if (sql == NULL) {
1048                         media_svc_error("Query creation failed");
1049                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1050                         goto ERROR;
1051                 }
1052
1053                 ret = _media_svc_sql_query(sql, uid);
1054                 SQLITE3_SAFE_FREE(sql);
1055                 if (ret != MS_MEDIA_ERR_NONE) {
1056                         media_svc_error("_media_svc_sql_query failed");
1057                         goto ERROR;
1058                 }
1059
1060                 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1061                 if (sql == NULL) {
1062                         media_svc_error("Query creation failed");
1063                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1064                         goto ERROR;
1065                 }
1066
1067                 ret = _media_svc_sql_query(sql, uid);
1068                 SQLITE3_SAFE_FREE(sql);
1069                 if (ret != MS_MEDIA_ERR_NONE) {
1070                         media_svc_error("_media_svc_sql_query failed");
1071                         goto ERROR;
1072                 }
1073
1074                 /******Upgrade Storage Table******/
1075                 /* remove  "scan_status", "storage_name" column */
1076                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1077                 if (sql == NULL) {
1078                         media_svc_error("Query creation failed");
1079                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1080                         goto ERROR;
1081                 }
1082
1083                 ret = _media_svc_sql_query(sql, uid);
1084                 SQLITE3_SAFE_FREE(sql);
1085                 if (ret != MS_MEDIA_ERR_NONE) {
1086                         media_svc_error("_media_svc_sql_query failed");
1087                         goto ERROR;
1088                 }
1089
1090                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1091                 if (ret != MS_MEDIA_ERR_NONE) {
1092                          media_svc_error("_media_svc_make_table_query failed");
1093                         goto ERROR;
1094                 }
1095
1096                 sql = sqlite3_mprintf("INSERT INTO %q (storage_id, storage_path, storage_type, validity) SELECT storage_uuid, storage_path, storage_type, validity FROM %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1097                 if (sql == NULL) {
1098                         media_svc_error("Query creation failed");
1099                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1100                         goto ERROR;
1101                 }
1102
1103                 ret = _media_svc_sql_query(sql, uid);
1104                 SQLITE3_SAFE_FREE(sql);
1105                 if (ret != MS_MEDIA_ERR_NONE) {
1106                         media_svc_error("_media_svc_sql_query failed");
1107                         goto ERROR;
1108                 }
1109
1110                 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1111                 if (sql == NULL) {
1112                         media_svc_error("Query creation failed");
1113                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1114                         goto ERROR;
1115                 }
1116
1117                 ret = _media_svc_sql_query(sql, uid);
1118                 SQLITE3_SAFE_FREE(sql);
1119                 if (ret != MS_MEDIA_ERR_NONE) {
1120                         media_svc_error("_media_svc_sql_query failed");
1121                         goto ERROR;
1122                 }
1123
1124                 /******Upgrade face Table******/
1125                 /* Change  "face_uuid" to "face_id" (face_uuid is TEXT, face_id is INTEGER) */
1126                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1127                 if (sql == NULL) {
1128                         media_svc_error("Query creation failed");
1129                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1130                         goto ERROR;
1131                 }
1132
1133                 ret = _media_svc_sql_query(sql, uid);
1134                 SQLITE3_SAFE_FREE(sql);
1135                 if (ret != MS_MEDIA_ERR_NONE) {
1136                         media_svc_error("_media_svc_sql_query failed");
1137                         goto ERROR;
1138                 }
1139
1140                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_LIST_FACE, uid);
1141                 if (ret != MS_MEDIA_ERR_NONE) {
1142                          media_svc_error("_media_svc_make_table_query failed");
1143                         goto ERROR;
1144                 }
1145
1146                 sql = sqlite3_mprintf("INSERT INTO %q (media_id, face_rect_x, face_rect_y, face_rect_w, face_rect_h, face_orientation, media_face_tag) SELECT media_uuid, face_rect_x, face_rect_y, face_rect_w, face_rect_h, orientation, face_tag FROM %q;", MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1147                 if (sql == NULL) {
1148                         media_svc_error("Query creation failed");
1149                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1150                         goto ERROR;
1151                 }
1152
1153                 ret = _media_svc_sql_query(sql, uid);
1154                 SQLITE3_SAFE_FREE(sql);
1155                 if (ret != MS_MEDIA_ERR_NONE) {
1156                         media_svc_error("_media_svc_sql_query failed");
1157                         goto ERROR;
1158                 }
1159
1160                 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1161                 if (sql == NULL) {
1162                         media_svc_error("Query creation failed");
1163                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1164                         goto ERROR;
1165                 }
1166
1167                 ret = _media_svc_sql_query(sql, uid);
1168                 SQLITE3_SAFE_FREE(sql);
1169                 if (ret != MS_MEDIA_ERR_NONE) {
1170                         media_svc_error("_media_svc_sql_query failed");
1171                         goto ERROR;
1172                 }
1173
1174                 /******Upgrade face_scan_list Table******/
1175                 /* Drop trigger first */
1176                 sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
1177                         MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
1178                 if (sql == NULL) {
1179                         media_svc_error("Query creation failed");
1180                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1181                         goto ERROR;
1182                 }
1183
1184                 ret = _media_svc_sql_query(sql, uid);
1185                 SQLITE3_SAFE_FREE(sql);
1186                 if (ret != MS_MEDIA_ERR_NONE) {
1187                         media_svc_error("_media_svc_sql_query failed");
1188                         goto ERROR;
1189                 }
1190
1191                 /* remove  "storage_uuid" column */
1192                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1193                 if (sql == NULL) {
1194                         media_svc_error("Query creation failed");
1195                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1196                         goto ERROR;
1197                 }
1198
1199                 ret = _media_svc_sql_query(sql, uid);
1200                 SQLITE3_SAFE_FREE(sql);
1201                 if (ret != MS_MEDIA_ERR_NONE) {
1202                         media_svc_error("_media_svc_sql_query failed");
1203                         goto ERROR;
1204                 }
1205
1206                 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_LIST_FACE_SCAN_LIST, uid);
1207                 if (ret != MS_MEDIA_ERR_NONE) {
1208                          media_svc_error("_media_svc_make_table_query failed");
1209                         goto ERROR;
1210                 }
1211
1212                 sql = sqlite3_mprintf("INSERT INTO %q (media_id, modified_time) SELECT media_uuid, modified_time FROM %q;", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1213                 if (sql == NULL) {
1214                         media_svc_error("Query creation failed");
1215                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1216                         goto ERROR;
1217                 }
1218
1219                 ret = _media_svc_sql_query(sql, uid);
1220                 SQLITE3_SAFE_FREE(sql);
1221                 if (ret != MS_MEDIA_ERR_NONE) {
1222                         media_svc_error("_media_svc_sql_query failed");
1223                         goto ERROR;
1224                 }
1225
1226                 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1227                 if (sql == NULL) {
1228                         media_svc_error("Query creation failed");
1229                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1230                         goto ERROR;
1231                 }
1232
1233                 ret = _media_svc_sql_query(sql, uid);
1234                 SQLITE3_SAFE_FREE(sql);
1235                 if (ret != MS_MEDIA_ERR_NONE) {
1236                         media_svc_error("_media_svc_sql_query failed");
1237                         goto ERROR;
1238                 }
1239         }
1240
1241         /* Upgrade issue tizen 5.0 to 5.5 */
1242         if (cur_version < USER_V8) {
1243                 /*Drop view first*/
1244                 sql = sqlite3_mprintf("DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q",
1245                         MEDIA_SVC_DB_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_TAG, MEDIA_SVC_DB_VIEW_MEDIA);
1246                 if (sql == NULL) {
1247                         media_svc_error("Query creation failed");
1248                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1249                         goto ERROR;
1250                 }
1251
1252                 ret = _media_svc_sql_query(sql, uid);
1253                 SQLITE3_SAFE_FREE(sql);
1254                 if (ret != MS_MEDIA_ERR_NONE) {
1255                         media_svc_error("_media_svc_sql_query failed");
1256                         goto ERROR;
1257                 }
1258                 if (cur_version == USER_V6) {
1259                         /* Drop trigger first */
1260                         sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
1261                                 MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
1262                         if (sql == NULL) {
1263                                 media_svc_error("Query creation failed");
1264                                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1265                                 goto ERROR;
1266                         }
1267
1268                         ret = _media_svc_sql_query(sql, uid);
1269                         SQLITE3_SAFE_FREE(sql);
1270                         if (ret != MS_MEDIA_ERR_NONE) {
1271                                 media_svc_error("_media_svc_sql_query failed");
1272                                 goto ERROR;
1273                         }
1274                 }
1275
1276                 /*playlist */
1277                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN play_order TO playlist_member_order;\
1278                         ALTER TABLE %q RENAME COLUMN name TO playlist_name;\
1279                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
1280                         MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1281                 if (sql == NULL) {
1282                         media_svc_error("Query creation failed");
1283                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1284                         goto ERROR;
1285                 }
1286
1287                 ret = _media_svc_sql_query(sql, uid);
1288                 SQLITE3_SAFE_FREE(sql);
1289                 if (ret != MS_MEDIA_ERR_NONE) {
1290                         media_svc_error("_media_svc_sql_query failed");
1291                         goto ERROR;
1292                 }
1293
1294                 /*tag */
1295                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN name TO tag_name;\
1296                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
1297                         MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP);
1298                 if (sql == NULL) {
1299                         media_svc_error("Query creation failed");
1300                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1301                         goto ERROR;
1302                 }
1303
1304                 ret = _media_svc_sql_query(sql, uid);
1305                 SQLITE3_SAFE_FREE(sql);
1306                 if (ret != MS_MEDIA_ERR_NONE) {
1307                         media_svc_error("_media_svc_sql_query failed");
1308                         goto ERROR;
1309                 }
1310
1311                 /*bookmark */
1312                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN marked_time TO bookmark_marked_time;\
1313                         ALTER TABLE %q RENAME COLUMN name TO bookmark_name;\
1314                         ALTER TABLE %q RENAME COLUMN thumbnail_path TO bookmark_thumbnail_path;\
1315                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
1316                         MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK,
1317                         MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK);
1318                 if (sql == NULL) {
1319                         media_svc_error("Query creation failed");
1320                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1321                         goto ERROR;
1322                 }
1323
1324                 ret = _media_svc_sql_query(sql, uid);
1325                 SQLITE3_SAFE_FREE(sql);
1326                 if (ret != MS_MEDIA_ERR_NONE) {
1327                         media_svc_error("_media_svc_sql_query failed");
1328                         goto ERROR;
1329                 }
1330
1331
1332                 if (cur_version == USER_V7) {
1333                         /*face */
1334                         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN face_id TO media_face_id;\
1335                                 ALTER TABLE %q RENAME COLUMN orientation TO face_orientation;\
1336                                 ALTER TABLE %q RENAME COLUMN face_tag TO media_face_tag;\
1337                                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
1338                                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
1339                                 MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE,
1340                                 MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE);
1341                         if (sql == NULL) {
1342                                 media_svc_error("Query creation failed");
1343                                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1344                                 goto ERROR;
1345                         }
1346
1347                         ret = _media_svc_sql_query(sql, uid);
1348                         SQLITE3_SAFE_FREE(sql);
1349                         if (ret != MS_MEDIA_ERR_NONE) {
1350                                 media_svc_error("_media_svc_sql_query failed");
1351                                 goto ERROR;
1352                         }
1353
1354                         /*folder */
1355                         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN modified_time TO folder_modified_time;\
1356                                 ALTER TABLE %q RENAME COLUMN path TO folder_path;\
1357                                 ALTER TABLE %q RENAME COLUMN name TO folder_name;\
1358                                 ALTER TABLE %q RENAME COLUMN name_pinyin TO folder_name_pinyin;\
1359                                 ALTER TABLE %q RENAME COLUMN storage_type TO folder_storage_type;\
1360                                 ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;",
1361                                 MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER,
1362                                 MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER);
1363                         if (sql == NULL) {
1364                                 media_svc_error("Query creation failed");
1365                                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1366                                 goto ERROR;
1367                         }
1368
1369                         ret = _media_svc_sql_query(sql, uid);
1370                         SQLITE3_SAFE_FREE(sql);
1371                         if (ret != MS_MEDIA_ERR_NONE) {
1372                                 media_svc_error("_media_svc_sql_query failed");
1373                                 goto ERROR;
1374                         }
1375
1376                         /*storage */
1377                         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN storage_uuid TO storage_id;",
1378                                 MEDIA_SVC_DB_TABLE_STORAGE);
1379                         if (sql == NULL) {
1380                                 media_svc_error("Query creation failed");
1381                                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1382                                 goto ERROR;
1383                         }
1384
1385                         ret = _media_svc_sql_query(sql, uid);
1386                         SQLITE3_SAFE_FREE(sql);
1387                         if (ret != MS_MEDIA_ERR_NONE) {
1388                                 media_svc_error("_media_svc_sql_query failed");
1389                                 goto ERROR;
1390                         }
1391
1392                         /*media */
1393                         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN file_name_pinyin TO media_file_name_pinyin;\
1394                                 ALTER TABLE %q RENAME COLUMN title_pinyin TO media_title_pinyin;\
1395                                 ALTER TABLE %q RENAME COLUMN album_pinyin TO media_album_pinyin;\
1396                                 ALTER TABLE %q RENAME COLUMN artist_pinyin TO media_artist_pinyin;\
1397                                 ALTER TABLE %q RENAME COLUMN album_artist_pinyin TO media_album_artist_pinyin;\
1398                                 ALTER TABLE %q RENAME COLUMN genre_pinyin TO media_genre_pinyin;\
1399                                 ALTER TABLE %q RENAME COLUMN composer_pinyin TO media_composer_pinyin;\
1400                                 ALTER TABLE %q RENAME COLUMN copyright_pinyin TO media_copyright_pinyin;\
1401                                 ALTER TABLE %q RENAME COLUMN description_pinyin TO media_description_pinyin;\
1402                                 ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;\
1403                                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
1404                                 ALTER TABLE %q RENAME COLUMN path TO media_path;\
1405                                 ALTER TABLE %q RENAME COLUMN file_name TO media_display_name;\
1406                                 ALTER TABLE %q RENAME COLUMN mime_type TO media_mime_type;\
1407                                 ALTER TABLE %q RENAME COLUMN size TO media_size;\
1408                                 ALTER TABLE %q RENAME COLUMN added_time TO media_added_time;\
1409                                 ALTER TABLE %q RENAME COLUMN modified_time TO media_modified_time;\
1410                                 ALTER TABLE %q RENAME COLUMN thumbnail_path TO media_thumbnail_path;\
1411                                 ALTER TABLE %q RENAME COLUMN title TO media_title;\
1412                                 ALTER TABLE %q RENAME COLUMN album TO media_album;\
1413                                 ALTER TABLE %q RENAME COLUMN artist TO media_artist;\
1414                                 ALTER TABLE %q RENAME COLUMN album_artist TO media_album_artist;\
1415                                 ALTER TABLE %q RENAME COLUMN genre TO media_genre;\
1416                                 ALTER TABLE %q RENAME COLUMN composer TO media_composer;\
1417                                 ALTER TABLE %q RENAME COLUMN year TO media_year;\
1418                                 ALTER TABLE %q RENAME COLUMN recorded_date TO media_recorded_date;\
1419                                 ALTER TABLE %q RENAME COLUMN copyright TO media_copyright;\
1420                                 ALTER TABLE %q RENAME COLUMN track_num TO media_track_num;\
1421                                 ALTER TABLE %q RENAME COLUMN description TO media_description;\
1422                                 ALTER TABLE %q RENAME COLUMN bitrate TO media_bitrate;\
1423                                 ALTER TABLE %q RENAME COLUMN bitpersample TO media_bitpersample;\
1424                                 ALTER TABLE %q RENAME COLUMN samplerate TO media_samplerate;\
1425                                 ALTER TABLE %q RENAME COLUMN channel TO media_channel;\
1426                                 ALTER TABLE %q RENAME COLUMN duration TO media_duration;\
1427                                 ALTER TABLE %q RENAME COLUMN longitude TO media_longitude;\
1428                                 ALTER TABLE %q RENAME COLUMN latitude TO media_latitude;\
1429                                 ALTER TABLE %q RENAME COLUMN altitude TO media_altitude;\
1430                                 ALTER TABLE %q RENAME COLUMN width TO media_width;\
1431                                 ALTER TABLE %q RENAME COLUMN height TO media_height;\
1432                                 ALTER TABLE %q RENAME COLUMN datetaken TO media_datetaken;\
1433                                 ALTER TABLE %q RENAME COLUMN orientation TO media_orientation;\
1434                                 ALTER TABLE %q RENAME COLUMN rating TO media_rating;\
1435                                 ALTER TABLE %q RENAME COLUMN favourite TO media_favourite;\
1436                                 ALTER TABLE %q RENAME COLUMN is_drm TO media_is_drm;\
1437                                 ALTER TABLE %q RENAME COLUMN storage_type TO media_storage_type;\
1438                                 ALTER TABLE %q RENAME COLUMN timeline TO media_timeline;\
1439                                 ALTER TABLE %q RENAME COLUMN is_360 TO media_360;",
1440                                 MEDIA_SVC_DB_TABLE_MEDIA,
1441                                 MEDIA_SVC_DB_TABLE_MEDIA,
1442                                 MEDIA_SVC_DB_TABLE_MEDIA,
1443                                 MEDIA_SVC_DB_TABLE_MEDIA,
1444                                 MEDIA_SVC_DB_TABLE_MEDIA,
1445                                 MEDIA_SVC_DB_TABLE_MEDIA,
1446                                 MEDIA_SVC_DB_TABLE_MEDIA,
1447                                 MEDIA_SVC_DB_TABLE_MEDIA,
1448                                 MEDIA_SVC_DB_TABLE_MEDIA,
1449                                 MEDIA_SVC_DB_TABLE_MEDIA,
1450                                 MEDIA_SVC_DB_TABLE_MEDIA,
1451                                 MEDIA_SVC_DB_TABLE_MEDIA,
1452                                 MEDIA_SVC_DB_TABLE_MEDIA,
1453                                 MEDIA_SVC_DB_TABLE_MEDIA,
1454                                 MEDIA_SVC_DB_TABLE_MEDIA,
1455                                 MEDIA_SVC_DB_TABLE_MEDIA,
1456                                 MEDIA_SVC_DB_TABLE_MEDIA,
1457                                 MEDIA_SVC_DB_TABLE_MEDIA,
1458                                 MEDIA_SVC_DB_TABLE_MEDIA,
1459                                 MEDIA_SVC_DB_TABLE_MEDIA,
1460                                 MEDIA_SVC_DB_TABLE_MEDIA,
1461                                 MEDIA_SVC_DB_TABLE_MEDIA,
1462                                 MEDIA_SVC_DB_TABLE_MEDIA,
1463                                 MEDIA_SVC_DB_TABLE_MEDIA,
1464                                 MEDIA_SVC_DB_TABLE_MEDIA,
1465                                 MEDIA_SVC_DB_TABLE_MEDIA,
1466                                 MEDIA_SVC_DB_TABLE_MEDIA,
1467                                 MEDIA_SVC_DB_TABLE_MEDIA,
1468                                 MEDIA_SVC_DB_TABLE_MEDIA,
1469                                 MEDIA_SVC_DB_TABLE_MEDIA,
1470                                 MEDIA_SVC_DB_TABLE_MEDIA,
1471                                 MEDIA_SVC_DB_TABLE_MEDIA,
1472                                 MEDIA_SVC_DB_TABLE_MEDIA,
1473                                 MEDIA_SVC_DB_TABLE_MEDIA,
1474                                 MEDIA_SVC_DB_TABLE_MEDIA,
1475                                 MEDIA_SVC_DB_TABLE_MEDIA,
1476                                 MEDIA_SVC_DB_TABLE_MEDIA,
1477                                 MEDIA_SVC_DB_TABLE_MEDIA,
1478                                 MEDIA_SVC_DB_TABLE_MEDIA,
1479                                 MEDIA_SVC_DB_TABLE_MEDIA,
1480                                 MEDIA_SVC_DB_TABLE_MEDIA,
1481                                 MEDIA_SVC_DB_TABLE_MEDIA,
1482                                 MEDIA_SVC_DB_TABLE_MEDIA,
1483                                 MEDIA_SVC_DB_TABLE_MEDIA,
1484                                 MEDIA_SVC_DB_TABLE_MEDIA,
1485                                 MEDIA_SVC_DB_TABLE_MEDIA,
1486                                 MEDIA_SVC_DB_TABLE_MEDIA);
1487                         if (sql == NULL) {
1488                                 media_svc_error("Query creation failed");
1489                                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1490                                 goto ERROR;
1491                         }
1492
1493                         ret = _media_svc_sql_query(sql, uid);
1494                         SQLITE3_SAFE_FREE(sql);
1495                         if (ret != MS_MEDIA_ERR_NONE) {
1496                                 media_svc_error("_media_svc_sql_query failed");
1497                                 goto ERROR;
1498                         }
1499                 }
1500         }
1501
1502         if (cur_version == USER_V6) {
1503                 /* Create the removed trigger */
1504                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TRIGGER, "face_cleanup_face_scan_list", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, "media_id", "media_id");
1505                 if (sql == NULL) {
1506                         media_svc_error("Query creation failed");
1507                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1508                         goto ERROR;
1509                 }
1510
1511                 ret = _media_svc_sql_query(sql, uid);
1512                 SQLITE3_SAFE_FREE(sql);
1513                 if (ret != MS_MEDIA_ERR_NONE) {
1514                         media_svc_error("_media_svc_sql_query failed");
1515                         goto ERROR;
1516                 }
1517
1518                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TRIGGER, "face_scan_list_cleanup_media", MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, "media_id", "media_id");
1519                 if (sql == NULL) {
1520                         media_svc_error("Query creation failed");
1521                         ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1522                         goto ERROR;
1523                 }
1524
1525                 ret = _media_svc_sql_query(sql, uid);
1526                 SQLITE3_SAFE_FREE(sql);
1527                 if (ret != MS_MEDIA_ERR_NONE) {
1528                         media_svc_error("_media_svc_sql_query failed");
1529                         goto ERROR;
1530                 }
1531         }
1532
1533         /* Rebuilding view */
1534         ret = __media_svc_rebuild_view_query(db_handle, uid);
1535
1536         /* Update user version */
1537         sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1538         if (sql == NULL) {
1539                 media_svc_error("Query creation failed");
1540                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1541                 goto ERROR;
1542         }
1543
1544         ret = _media_svc_sql_query(sql, uid);
1545         SQLITE3_SAFE_FREE(sql);
1546
1547         _media_svc_destroy_table_query();
1548
1549         media_svc_debug_fleave();
1550
1551         return ret;
1552
1553 ERROR:
1554         _media_svc_destroy_table_query();
1555
1556         return ret;
1557 }
1558
1559 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1560 {
1561         return media_db_request_update_db(sql_str, uid);
1562 }
1563
1564 int _media_svc_sql_query_direct(const char *sql_str, uid_t uid)
1565 {
1566         int ret = MS_MEDIA_ERR_NONE;
1567         sqlite3 *handle = NULL;
1568
1569         ret = media_db_connect(&handle, uid, true);
1570         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1571         ret = __media_svc_query_direct(handle, sql_str, uid);
1572         media_db_disconnect(handle);
1573
1574         return ret;
1575 }
1576
1577 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1578 {
1579         int ret = MS_MEDIA_ERR_NONE;
1580         sqlite3_stmt *sql_stmt = NULL;
1581         char *sql = sqlite3_mprintf("PRAGMA user_version;");
1582
1583         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1584         if (ret != MS_MEDIA_ERR_NONE) {
1585                 media_svc_error("error when get user_version.");
1586                 return ret;
1587         }
1588
1589         *user_version = sqlite3_column_int(sql_stmt, 0);
1590         SQLITE3_FINALIZE(sql_stmt);
1591
1592         return MS_MEDIA_ERR_NONE;
1593 }
1594
1595 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1596 {
1597         int err = -1;
1598
1599         media_svc_retvm_if(sql_str == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "invalid query");
1600
1601         if (handle == NULL) {
1602                 media_svc_error("handle is NULL");
1603                 sqlite3_free((char *)sql_str);
1604                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1605         }
1606
1607         media_svc_sec_debug("Query[%s]", sql_str);
1608
1609         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1610         sqlite3_free((char *)sql_str);
1611
1612         if (err != SQLITE_OK) {
1613                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1614                 if (err == SQLITE_CORRUPT)
1615                         return MS_MEDIA_ERR_DB_CORRUPT;
1616                 else if (err == SQLITE_PERM)
1617                         return MS_MEDIA_ERR_DB_PERMISSION;
1618
1619                 return MS_MEDIA_ERR_DB_INTERNAL;
1620         }
1621
1622         err = sqlite3_step(*stmt);
1623         if (err != SQLITE_ROW) {
1624                 media_svc_debug("No record");
1625                 SQLITE3_FINALIZE(*stmt);
1626                 return MS_MEDIA_ERR_DB_NO_RECORD;
1627         }
1628
1629         return MS_MEDIA_ERR_NONE;
1630 }
1631
1632 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1633 {
1634         int err = -1;
1635
1636         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "handle is NULL");
1637
1638         media_svc_sec_debug("Query[%s]", sql_str);
1639
1640         if (!STRING_VALID(sql_str)) {
1641                 media_svc_error("invalid query");
1642                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1643         }
1644
1645         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1646         sqlite3_free((char *)sql_str);
1647
1648         if (err != SQLITE_OK) {
1649                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1650                 if (err == SQLITE_CORRUPT)
1651                         return MS_MEDIA_ERR_DB_CORRUPT;
1652                 else if (err == SQLITE_PERM)
1653                         return MS_MEDIA_ERR_DB_PERMISSION;
1654
1655                 return MS_MEDIA_ERR_DB_INTERNAL;
1656         }
1657
1658         return MS_MEDIA_ERR_NONE;
1659 }
1660
1661 int _media_svc_sql_begin_trans(uid_t uid)
1662 {
1663         int ret = MS_MEDIA_ERR_NONE;
1664
1665         media_svc_debug("Batch start(Transaction block version)");
1666
1667         ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1668
1669         return ret;
1670 }
1671
1672 int _media_svc_sql_end_trans(uid_t uid)
1673 {
1674         int ret = MS_MEDIA_ERR_NONE;
1675
1676         media_svc_debug("Batch end(Transaction block version)");
1677
1678         ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1679
1680         return ret;
1681 }
1682
1683 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1684 {
1685         int ret = MS_MEDIA_ERR_NONE;
1686         int idx = 0;
1687         int length = g_list_length(*query_list);
1688         char *sql = NULL;
1689         char query_bundle[MEDIA_SVC_QUERY_LEN_MAX] = {0, };
1690         int query_len = 0;
1691         int total_len = 0;
1692
1693         media_svc_debug("query list length : [%d]", length);
1694
1695         memset(query_bundle, 0, sizeof(query_bundle));
1696
1697         for (idx = 0; idx < length; idx++) {
1698                 sql = (char *)g_list_nth_data(*query_list, idx);
1699                 if (STRING_VALID(sql)) {
1700                         query_len = strlen(sql);
1701
1702                         if (query_len >= (sizeof(query_bundle) - 1)) {
1703                                 media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1704                                 SQLITE3_SAFE_FREE(sql);
1705                                 continue;
1706                         }
1707
1708                         if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1709                                 ret = media_db_request_update_db_batch(query_bundle, uid);
1710                                 if (ret != MS_MEDIA_ERR_NONE)
1711                                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1712
1713                                 memset(query_bundle, 0, sizeof(query_bundle));
1714                                 total_len = 0;
1715                                 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1716                                 /*                              Consider inserting the basic information without metadata */
1717                                 /* Refer : SQLITE3 spec In Tizen 3.0 */
1718                                 /* Single query limit size = 1 billion bytes(1GiB) */
1719                                 /* DB limit size = 1 billion bytes(1GiB) */
1720                                 /* column limit = 2000 */
1721                         }
1722
1723                         SAFE_STRLCAT(query_bundle, sql, sizeof(query_bundle));
1724                         total_len += query_len;
1725
1726                         SQLITE3_SAFE_FREE(sql);
1727                 }
1728         }
1729
1730         if (total_len > 0) {
1731                 ret = media_db_request_update_db_batch(query_bundle, uid);
1732                 if (ret != MS_MEDIA_ERR_NONE)
1733                         media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1734
1735                 memset(query_bundle, 0, sizeof(query_bundle));
1736                 total_len = 0;
1737         }
1738
1739         _media_svc_sql_query_release(query_list);
1740
1741         return MS_MEDIA_ERR_NONE;
1742
1743 }
1744
1745 #define MAX_RETRY 9
1746 #define SLEEP_TIME 1000 * 1000
1747 static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid)
1748 {
1749         int ret = MS_MEDIA_ERR_NONE;
1750         char *zErrMsg = NULL;
1751         int retry_count = 0;
1752
1753 EXEC_RETRY:
1754         ret = sqlite3_exec(handle, query, NULL, NULL, &zErrMsg);
1755         if (SQLITE_OK != ret) {
1756                 media_svc_sec_error("Error[%s],Query[%s]", zErrMsg, query);
1757                 SQLITE3_SAFE_FREE(zErrMsg);
1758                 if (ret == SQLITE_BUSY) {
1759                         ret = MS_MEDIA_ERR_DB_BUSY_FAIL;
1760                 } else if (ret == SQLITE_CONSTRAINT) {
1761                         ret = MS_MEDIA_ERR_DB_CONSTRAINT_FAIL;
1762                 } else if (ret == SQLITE_FULL) {
1763                         ret = MS_MEDIA_ERR_DB_FULL_FAIL;
1764                 } else if (ret == SQLITE_LOCKED) {
1765                         if (retry_count < MAX_RETRY) {
1766                                 media_svc_error("Locked retry[%d]", retry_count);
1767                                 retry_count++;
1768                                 usleep(SLEEP_TIME);
1769                                 goto EXEC_RETRY;
1770                         }
1771                         ret = MS_MEDIA_ERR_DB_UPDATE_FAIL;
1772                 } else {
1773                         ret = MS_MEDIA_ERR_DB_UPDATE_FAIL;
1774                 }
1775         }
1776
1777         return ret;
1778 }
1779
1780 int _media_svc_sql_query_list_direct(GList **query_list, uid_t uid)
1781 {
1782         int ret = MS_MEDIA_ERR_NONE;
1783         int idx = 0;
1784         int length = g_list_length(*query_list);
1785         char *sql = NULL;
1786         sqlite3 *handle = NULL;
1787
1788         media_svc_debug("query list length[%d]", length);
1789         if (length == 0)
1790                 goto ZERO_LEN;
1791
1792         ret = media_db_connect(&handle, uid, true);
1793         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1794
1795         for (idx = 0; idx < length; idx++) {
1796                 sql = (char *)g_list_nth_data(*query_list, idx);
1797                 if (STRING_VALID(sql)) {
1798                         ret = __media_svc_query_direct(handle, sql, uid);
1799                         if (ret != MS_MEDIA_ERR_NONE)
1800                                 media_svc_debug("_media_svc_query_direct failed[%s]", sql);
1801
1802                         SQLITE3_SAFE_FREE(sql);
1803                 }
1804         }
1805
1806         media_db_disconnect(handle);
1807
1808 ZERO_LEN:
1809         _media_svc_sql_query_release(query_list);
1810
1811         return MS_MEDIA_ERR_NONE;
1812 }
1813
1814 void _media_svc_sql_query_add(GList **query_list, char **query)
1815 {
1816         *query_list = g_list_append(*query_list, *query);
1817 }
1818
1819 void _media_svc_sql_query_release(GList **query_list)
1820 {
1821         if (*query_list) {
1822                 g_list_free(*query_list);
1823                 *query_list = NULL;
1824         }
1825 }
1826
1827 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1828 {
1829         if (user_version < LATEST_VERSION_NUMBER) {
1830                 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1831                 return __media_svc_db_upgrade(db_handle, user_version, uid);
1832         } else {
1833                 return MS_MEDIA_ERR_NONE;
1834         }
1835 }
1836
1837 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1838 {
1839         int ret = MS_MEDIA_ERR_NONE;
1840
1841         ret = _media_svc_init_table_query(table_id);
1842         if (ret != MS_MEDIA_ERR_NONE) {
1843                 media_svc_error("_media_svc_init_table_query failed");
1844                 goto ERROR;
1845         }
1846
1847         ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1848         if (ret != MS_MEDIA_ERR_NONE) {
1849                 media_svc_error("_media_svc_make_table_query failed");
1850                 goto ERROR;
1851         }
1852
1853         /* Add for trigger */
1854         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1855         if (ret != MS_MEDIA_ERR_NONE) {
1856                 media_svc_error("_media_svc_make_table_query failed");
1857                 goto ERROR;
1858         }
1859
1860         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1861         if (ret != MS_MEDIA_ERR_NONE) {
1862                 media_svc_error("_media_svc_make_table_query failed");
1863                 goto ERROR;
1864         }
1865
1866         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1867         if (ret != MS_MEDIA_ERR_NONE) {
1868                 media_svc_error("_media_svc_make_table_query failed");
1869                 goto ERROR;
1870         }
1871
1872         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1873         if (ret != MS_MEDIA_ERR_NONE) {
1874                 media_svc_error("_media_svc_make_table_query failed");
1875                 goto ERROR;
1876         }
1877
1878         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1879         if (ret != MS_MEDIA_ERR_NONE) {
1880                 media_svc_error("_media_svc_make_table_query failed");
1881                 goto ERROR;
1882         }
1883
1884         _media_svc_destroy_table_query();
1885
1886         return ret;
1887 ERROR:
1888
1889         _media_svc_destroy_table_query();
1890
1891         return ret;
1892 }
1893
1894 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1895 {
1896         int ret = MS_MEDIA_ERR_NONE;
1897         char *sql = NULL;
1898         sqlite3_stmt *sql_stmt = NULL;
1899         int item_cnt = 0;
1900         int idx = 0;
1901         GList *storage_list = NULL;
1902         char view_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
1903         memset(view_query, 0x00, sizeof(view_query));
1904
1905         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);
1906
1907         /*Select list of storage*/
1908         sql = sqlite3_mprintf("SELECT storage_id FROM '%s' WHERE validity=1", MEDIA_SVC_DB_TABLE_STORAGE);
1909         ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1910         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1911
1912         while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1913                 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1914                         storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1915         }
1916         SQLITE3_FINALIZE(sql_stmt);
1917
1918         if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1919                 item_cnt = g_list_length(storage_list);
1920
1921                 for (idx = 0; idx < item_cnt; idx++) {
1922                         int table_cnt = 0;
1923                         char *storage_id = NULL;
1924                         storage_id = g_list_nth_data(storage_list, idx);
1925
1926                         if (STRING_VALID(storage_id)) {
1927                                 /*Select list of storage*/
1928                                 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1929                                 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1930                                 if (ret != MS_MEDIA_ERR_NONE) {
1931                                         SAFE_FREE(storage_id);
1932                                         continue;
1933                                 }
1934
1935                                 table_cnt = sqlite3_column_int(sql_stmt, 0);
1936                                 SQLITE3_FINALIZE(sql_stmt);
1937
1938                                 if (table_cnt > 0) {
1939                                         char append_query[128] = {0, };
1940                                         memset(append_query, 0x00, sizeof(append_query));
1941                                         snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1942                                         SAFE_STRLCAT(view_query, append_query, sizeof(view_query));
1943                                 } else {
1944                                         media_svc_error("media table not exist for storage [%s]", storage_id);
1945                                 }
1946
1947                                 SAFE_FREE(storage_id);
1948                         }
1949                 }
1950                 g_list_free(storage_list);
1951         }
1952
1953         ret = _media_svc_sql_query(view_query, uid);
1954         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1955
1956         return ret;
1957 }