Change the traversal method
[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 __create_playlist_view(uid_t uid)
117 {
118         int ret = MS_MEDIA_ERR_NONE;
119         GSList *iter = NULL;
120         column_info_s *col_ptr = NULL;
121         char *sql = NULL;
122         GString *table_query = g_string_new(NULL);
123         media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
124
125         for (iter = column_list[MEDIA_SVC_DB_LIST_PLAYLIST]; iter; iter = g_slist_next(iter)) {
126                 col_ptr = iter->data;
127
128                 if (!col_ptr)
129                         continue;
130
131                 if (col_ptr->is_view) {
132                         if (table_query->len != 0) {
133                                 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
134                                         g_string_append_printf(table_query, ", playlist.%s AS p_thumbnail_path", col_ptr->name);
135                                 else
136                                         g_string_append_printf(table_query, ", playlist.%s", col_ptr->name);
137                         } else {
138                                 g_string_append_printf(table_query, "playlist.%s", col_ptr->name);
139                         }
140                 }
141         }
142
143         for (iter = column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]; iter; iter = g_slist_next(iter)) {
144                 col_ptr = iter->data;
145
146                 if (!col_ptr)
147                         continue;
148
149                 if (col_ptr->is_view) {
150                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
151                                 g_string_append_printf(table_query, ", playlist_media_count IS NOT NULL AS playlist_media_count, playlist_map.%s AS pm_id", col_ptr->name);
152                         else
153                                 g_string_append_printf(table_query, ", playlist_map.%s", col_ptr->name);
154                 }
155         }
156
157         for (iter = column_list[MEDIA_SVC_DB_LIST_MEDIA]; iter; iter = g_slist_next(iter)) {
158                 col_ptr = iter->data;
159
160                 if (!col_ptr)
161                         continue;
162
163                 if (col_ptr->is_view)
164                         g_string_append_printf(table_query, ", media.%s", col_ptr->name);
165         }
166
167         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query->str);
168         g_string_free(table_query, TRUE);
169         ret = _media_svc_sql_query(sql, uid);
170         SQLITE3_SAFE_FREE(sql);
171
172         return ret;
173 }
174
175 static int __create_tag_view(uid_t uid)
176 {
177         int ret = MS_MEDIA_ERR_NONE;
178         GSList *iter = NULL;
179         column_info_s *col_ptr = NULL;
180         char *sql = NULL;
181         GString *table_query = g_string_new(NULL);
182         media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
183
184         for (iter = column_list[MEDIA_SVC_DB_LIST_TAG]; iter; iter = g_slist_next(iter)) {
185                 col_ptr = iter->data;
186
187                 if (!col_ptr)
188                         continue;
189
190                 if (col_ptr->is_view) {
191                         if (table_query->len != 0)
192                                 g_string_append_printf(table_query, ", tag.%s", col_ptr->name);
193                         else
194                                 g_string_append_printf(table_query, "tag.%s", col_ptr->name);
195                 }
196         }
197
198         for (iter = column_list[MEDIA_SVC_DB_LIST_TAG_MAP]; iter; iter = g_slist_next(iter)) {
199                 col_ptr = iter->data;
200
201                 if (!col_ptr)
202                         continue;
203
204                 if (col_ptr->is_view) {
205                         if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
206                                 g_string_append_printf(table_query, ", tag_media_count IS NOT NULL AS tag_media_count, tag_map.%s AS tm_id", col_ptr->name);
207                         else
208                                 g_string_append_printf(table_query, ", tag_map.%s", col_ptr->name);
209                 }
210         }
211
212         for (iter = column_list[MEDIA_SVC_DB_LIST_MEDIA]; iter; iter = g_slist_next(iter)) {
213                 col_ptr = iter->data;
214
215                 if (!col_ptr)
216                         continue;
217
218                 if (col_ptr->is_view)
219                         g_string_append_printf(table_query, ", media.%s", col_ptr->name);
220         }
221
222         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query->str);
223         g_string_free(table_query, TRUE);
224         ret = _media_svc_sql_query(sql, uid);
225         SQLITE3_SAFE_FREE(sql);
226
227         return ret;
228 }
229
230 static int __drop_views(uid_t uid)
231 {
232         int ret = MS_MEDIA_ERR_NONE;
233         char *sql = NULL;
234
235         sql = sqlite3_mprintf("DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q",   MEDIA_SVC_DB_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_TAG, MEDIA_SVC_DB_VIEW_MEDIA);
236
237         ret = _media_svc_sql_query(sql, uid);
238         SQLITE3_SAFE_FREE(sql);
239
240         return ret;
241 }
242
243 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
244 {
245         int ret = MS_MEDIA_ERR_NONE;
246
247         /*create playlist_view */
248         ret = __create_playlist_view(uid);
249         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
250
251         /*create tag_view */
252         ret = __create_tag_view(uid);
253         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
254
255         return MS_MEDIA_ERR_NONE;
256 }
257
258 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
259 {
260         int ret = MS_MEDIA_ERR_NONE;
261         GSList *iter = NULL;
262         table_info_s *tb = NULL;
263         column_info_s *col_ptr = NULL;
264         char *sql = NULL;
265         GString *table_query = g_string_new(NULL);
266         GString *index_query = g_string_new(NULL);
267         GString *trigger_query = g_string_new(NULL);
268         GString *unique_query = g_string_new(NULL);
269
270         if (!table_query || !index_query || !trigger_query || !unique_query) {
271                 media_svc_error("g_string_new failed");
272                 ret = MS_MEDIA_ERR_INTERNAL;
273                 goto ERROR;
274         }
275
276         tb = g_hash_table_lookup(table, table_name);
277         if (tb == NULL) {
278                 media_svc_debug("lookup fail.. table name [%s] ", table_name);
279                 ret = MS_MEDIA_ERR_INTERNAL;
280                 goto ERROR;
281         }
282
283         for (iter = column_list[list]; iter; iter = g_slist_next(iter)) {
284                 col_ptr = iter->data;
285                 if (!col_ptr)
286                         continue;
287
288                 /*create table */
289                 if (col_ptr->has_option) {
290                         if (table_query->len != 0)
291                                 g_string_append_printf(table_query, ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
292                         else
293                                 g_string_append_printf(table_query, "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
294                 } else {
295                         if (table_query->len != 0)
296                                 g_string_append_printf(table_query, ", %s %s", col_ptr->name, col_ptr->type);
297                         else
298                                 g_string_append_printf(table_query, "%s %s", col_ptr->name, col_ptr->type);
299                 }
300
301                 /*unique */
302                 if (col_ptr->is_unique) {
303                         if (unique_query->len != 0)
304                                 g_string_append_printf(unique_query, ", %s", col_ptr->name);
305                         else
306                                 g_string_append_printf(unique_query, "%s", col_ptr->name);
307                 }
308
309                 /*create index */
310                 if (col_ptr->is_index)
311                         g_string_append_printf(index_query, MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
312
313                 /*create trigger */
314                 if (col_ptr->is_trigger) {
315                         if (STRING_VALID(tb->trigger_name)) {
316                                 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0)
317                                         g_string_append_printf(trigger_query, 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);
318                                 else
319                                         g_string_append_printf(trigger_query, MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
320                         } else {
321                                 media_svc_error("invalid trigger name");
322                         }
323                 }
324         }
325
326         /*send queries */
327         if (unique_query->len > 0)
328                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query->str, unique_query->str);
329         else
330                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query->str);
331
332         ret = _media_svc_sql_query(sql, uid);
333         SQLITE3_SAFE_FREE(sql);
334         if (ret != MS_MEDIA_ERR_NONE)
335                 goto ERROR;
336
337         if (index_query->len > 0) {
338                 ret = _media_svc_sql_query(index_query->str, uid);
339                 if (ret != MS_MEDIA_ERR_NONE)
340                         goto ERROR;
341         }
342
343         if (trigger_query->len > 0) {
344                 ret = _media_svc_sql_query(trigger_query->str, uid);
345                 if (ret != MS_MEDIA_ERR_NONE)
346                         goto ERROR;
347         }
348
349         /*create view */
350         if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0)
351                 ret = __create_playlist_view(uid);
352         else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_TAG, strlen(MEDIA_SVC_DB_TABLE_TAG)) == 0)
353                 ret = __create_tag_view(uid);
354
355 ERROR:
356         if (index_query)
357                 g_string_free(index_query, TRUE);
358         if (trigger_query)
359                 g_string_free(trigger_query, TRUE);
360         if (unique_query)
361                 g_string_free(unique_query, TRUE);
362         if (table_query)
363                 g_string_free(table_query, TRUE);
364
365         return ret;
366 }
367
368 static int __media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
369 {
370         int ret = MS_MEDIA_ERR_NONE;
371         GSList *iter = NULL;
372         column_info_s *col_ptr = NULL;
373         char *sql = NULL;
374         char temp[1024] = {0, };
375         int cur_version = 0;
376         sqlite3_stmt *sql_stmt = NULL;
377
378         sql = sqlite3_mprintf("PRAGMA user_version");
379         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
380
381         if (ret != MS_MEDIA_ERR_NONE) {
382                 media_svc_error("error when get user_version. err = [%d]", ret);
383                 return ret;
384         }
385         cur_version = sqlite3_column_int(sql_stmt, 0);
386         SQLITE3_FINALIZE(sql_stmt);
387
388         for (iter = column_list[list]; iter; iter = g_slist_next(iter)) {
389                 col_ptr = iter->data;
390
391                 if (!col_ptr)
392                         continue;
393
394                 if (col_ptr->version > cur_version) {
395                         /*alter table */
396                         memset(temp, 0, sizeof(temp));
397                         if (col_ptr->has_option)
398                                 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
399                         else
400                                 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
401                         sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
402                         ret = _media_svc_sql_query(sql, uid);
403                         SQLITE3_SAFE_FREE(sql);
404                         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
405                         /*create index */
406                         if (col_ptr->is_index) {
407                                 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
408                                 ret = _media_svc_sql_query(sql, uid);
409                                 SQLITE3_SAFE_FREE(sql);
410                                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
411                         }
412                 }
413         }
414
415         return MS_MEDIA_ERR_NONE;
416 }
417
418 static void __media_svc_table_free(gpointer data)
419 {
420         table_info_s *tb = (table_info_s *) data;
421
422         SAFE_FREE(tb->trigger_name);
423         SAFE_FREE(tb->view_name);
424         SAFE_FREE(tb->event_table);
425         SAFE_FREE(tb->action_table);
426         SAFE_FREE(tb);
427 }
428
429 static void __media_svc_column_free(gpointer data)
430 {
431         column_info_s *col = (column_info_s *) data;
432
433         SAFE_FREE(col->name);
434         SAFE_FREE(col->type);
435         SAFE_FREE(col->option);
436         SAFE_FREE(col->index_name);
437         SAFE_FREE(col);
438 }
439
440 int _media_svc_init_table_query(const char *event_table_name)
441 {
442         int ret = MS_MEDIA_ERR_NONE;
443
444         /*variable initialize.. */
445         table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __media_svc_table_free);
446
447         /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
448         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, NULL);
449         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
450         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);
451         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
452         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);
453         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
454         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);
455         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
456         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);
457         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
458         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);
459         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
460         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);
461         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
462         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);
463         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
464         ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
465         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
466         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);
467         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
468         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);
469         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
470
471         /*insert column info.. */
472         /*media*/
473         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);
474         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
475         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);
476         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
477         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);
478         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
479         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);
480         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
481         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);
482         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
483         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);
484         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
485         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);
486         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
487         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);
488         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
489         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);
490         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
491         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);
492         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
493         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);
494         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
495         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);
496         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
497         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);
498         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
499         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);
500         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
501         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);
502         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
503         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);
504         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
505         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);
506         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
507         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);
508         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
509         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);
510         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
511         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);
512         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
513         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);
514         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
515         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);
516         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
517         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);
518         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
519         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);
520         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
521         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);
522         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
523         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);
524         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
525         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);
526         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
527         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);
528         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
529         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);
530         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
531         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);
532         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
533         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);
534         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
535         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);
536         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
537         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);
538         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
539         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
540         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
541         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
542         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
543         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
544         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
545         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
546         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
547         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
548         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
549         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
550         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
551         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
552         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
553         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
554         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
555         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
556         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
557         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
558         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
559         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
560         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
561         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
562         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
563         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
564         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
565         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
566         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
567         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
568         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
569         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
570         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
571         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
572         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
573         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
574         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
575         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
576         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
577         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
578         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
579         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
580         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
581         ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
582         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
583         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
584         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);
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], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V2, NULL, false, false, false);
587         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
588         /* color column is added with dcm. (DB v5) */
589         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);
590         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
591
592         /*folder*/
593         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);
594         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
595         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);
596         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
597         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);
598         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
599         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);
600         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
601         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);
602         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
603         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);
604         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
605         /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
606         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);
607         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
608         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);
609         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
610
611         /*playlist_map*/
612         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);
613         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
614         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);
615         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
616         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);
617         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
618         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);
619         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
620
621         /*playlist*/
622         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);
623         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
624         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);
625         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
626         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);
627         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
628
629         /*album*/
630         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);
631         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
632         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);
633         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
634         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);
635         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
636         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);
637         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
638
639         /*tag_map*/
640         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);
641         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
642         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);
643         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
644         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);
645         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
646
647         /*tag*/
648         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);
649         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
650         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);
651         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
652
653         /*bookmark*/
654         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);
655         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
656         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);
657         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
658         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);
659         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
660         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);
661         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
662         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);
663         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
664
665         /*storage*/
666         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);
667         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
668         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);
669         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
670         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);
671         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
672         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);
673         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
674
675         /*face scan list*/
676         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);
677         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
678         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);
679         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
680
681         /*face*/
682         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);
683         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
684         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);
685         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
686         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);
687         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
688         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);
689         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
690         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);
691         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
692         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);
693         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
694         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);
695         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
696         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);
697         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
698
699         return ret;
700 }
701
702 void _media_svc_destroy_table_query()
703 {
704         int i = 0;
705
706         /* Table Free */
707         g_hash_table_destroy(table);
708
709         /* Column Free */
710         for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
711                 g_slist_free_full(column_list[i], __media_svc_column_free);
712 }
713
714 static int __alter_table(sqlite3 *db_handle, uid_t uid)
715 {
716         int ret = MS_MEDIA_ERR_NONE;
717
718         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
719         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
720
721         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
722         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
723
724         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
725         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
726
727         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
728         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
729
730         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
731         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
732
733         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
734         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
735
736         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
737         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
738
739         ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
740         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
741
742         return ret;
743 }
744
745 static int __drop_tmp_table(uid_t uid)
746 {
747         int ret = MS_MEDIA_ERR_NONE;
748         char *sql = NULL;
749
750         sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
751
752         ret = _media_svc_sql_query(sql, uid);
753         SQLITE3_SAFE_FREE(sql);
754
755         return ret;
756 }
757
758 static int __alter_and_rename_table(const char *table, uid_t uid)
759 {
760         int ret = MS_MEDIA_ERR_NONE;
761         char *sql = NULL;
762
763         sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", table, MEDIA_SVC_DB_TABLE_TMP_TABLE);
764
765         ret = _media_svc_sql_query(sql, uid);
766         SQLITE3_SAFE_FREE(sql);
767
768         return ret;
769 }
770
771 static int __update_db_from_V6_to_V8(uid_t uid) //tizen 4.0 to 5.5
772 {
773         int ret = MS_MEDIA_ERR_NONE;
774         char *sql = NULL;
775
776         /******Upgrade Media Table******/
777         /* remove user data columns */
778         ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_MEDIA, uid);
779         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
780
781         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
782         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
783
784         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) \
785                 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;",
786                 MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_TMP_TABLE);
787
788         ret = _media_svc_sql_query(sql, uid);
789         SQLITE3_SAFE_FREE(sql);
790         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
791
792         ret = __drop_tmp_table(uid);
793         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
794
795         /******Upgrade Folder Table******/
796         /* remove  "scan_status" column */
797         ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FOLDER, uid);
798         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
799
800         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
801         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
802
803         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);
804
805         ret = _media_svc_sql_query(sql, uid);
806         SQLITE3_SAFE_FREE(sql);
807         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
808
809         ret = __drop_tmp_table(uid);
810         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
811
812         /******Upgrade Storage Table******/
813         /* remove  "scan_status", "storage_name" column */
814         ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_STORAGE, uid);
815         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
816
817         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
818         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
819
820         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);
821
822         ret = _media_svc_sql_query(sql, uid);
823         SQLITE3_SAFE_FREE(sql);
824         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
825
826         ret = __drop_tmp_table(uid);
827         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
828
829         /******Upgrade face Table******/
830         /* Change  "face_uuid" to "face_id" (face_uuid is TEXT, face_id is INTEGER) */
831         ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FACE, uid);
832         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
833
834         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_LIST_FACE, uid);
835         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
836
837         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);
838
839         ret = _media_svc_sql_query(sql, uid);
840         SQLITE3_SAFE_FREE(sql);
841         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
842
843         ret = __drop_tmp_table(uid);
844         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
845
846         /******Upgrade face_scan_list Table******/
847         /* Drop trigger first */
848         sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
849                 MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
850
851         ret = _media_svc_sql_query(sql, uid);
852         SQLITE3_SAFE_FREE(sql);
853         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
854
855         /* remove  "storage_uuid" column */
856         ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, uid);
857         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
858
859         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_LIST_FACE_SCAN_LIST, uid);
860         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
861
862         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);
863
864         ret = _media_svc_sql_query(sql, uid);
865         SQLITE3_SAFE_FREE(sql);
866         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
867
868         ret = __drop_tmp_table(uid);
869         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
870
871         return ret;
872 }
873
874 static int __update_db_to_latest(int cur_version, uid_t uid)    //tizen 5.0(and before) to 5.5
875 {
876         int ret = MS_MEDIA_ERR_NONE;
877         char *sql = NULL;
878
879         if (cur_version == USER_V6) {
880                 /* Drop trigger first */
881                 sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
882                         MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
883
884                 ret = _media_svc_sql_query(sql, uid);
885                 SQLITE3_SAFE_FREE(sql);
886                 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
887         }
888
889         /*playlist */
890         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN play_order TO playlist_member_order;\
891                 ALTER TABLE %q RENAME COLUMN name TO playlist_name;\
892                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
893                 MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
894
895         ret = _media_svc_sql_query(sql, uid);
896         SQLITE3_SAFE_FREE(sql);
897         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
898
899         /*tag */
900         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN name TO tag_name;\
901                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
902                 MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP);
903
904         ret = _media_svc_sql_query(sql, uid);
905         SQLITE3_SAFE_FREE(sql);
906         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
907
908         /*bookmark */
909         sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN marked_time TO bookmark_marked_time;\
910                 ALTER TABLE %q RENAME COLUMN name TO bookmark_name;\
911                 ALTER TABLE %q RENAME COLUMN thumbnail_path TO bookmark_thumbnail_path;\
912                 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
913                 MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK,
914                 MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK);
915
916         ret = _media_svc_sql_query(sql, uid);
917         SQLITE3_SAFE_FREE(sql);
918         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
919
920         if (cur_version == USER_V7) {
921                 /*face */
922                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN face_id TO media_face_id;\
923                         ALTER TABLE %q RENAME COLUMN orientation TO face_orientation;\
924                         ALTER TABLE %q RENAME COLUMN face_tag TO media_face_tag;\
925                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
926                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
927                         MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE,
928                         MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE);
929
930                 ret = _media_svc_sql_query(sql, uid);
931                 SQLITE3_SAFE_FREE(sql);
932                 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
933
934                 /*folder */
935                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN modified_time TO folder_modified_time;\
936                         ALTER TABLE %q RENAME COLUMN path TO folder_path;\
937                         ALTER TABLE %q RENAME COLUMN name TO folder_name;\
938                         ALTER TABLE %q RENAME COLUMN name_pinyin TO folder_name_pinyin;\
939                         ALTER TABLE %q RENAME COLUMN storage_type TO folder_storage_type;\
940                         ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;",
941                         MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER,
942                         MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER);
943
944                 ret = _media_svc_sql_query(sql, uid);
945                 SQLITE3_SAFE_FREE(sql);
946                 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
947
948                 /*storage */
949                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN storage_uuid TO storage_id;",
950                         MEDIA_SVC_DB_TABLE_STORAGE);
951
952                 ret = _media_svc_sql_query(sql, uid);
953                 SQLITE3_SAFE_FREE(sql);
954                 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
955
956                 /*media */
957                 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN file_name_pinyin TO media_file_name_pinyin;\
958                         ALTER TABLE %q RENAME COLUMN title_pinyin TO media_title_pinyin;\
959                         ALTER TABLE %q RENAME COLUMN album_pinyin TO media_album_pinyin;\
960                         ALTER TABLE %q RENAME COLUMN artist_pinyin TO media_artist_pinyin;\
961                         ALTER TABLE %q RENAME COLUMN album_artist_pinyin TO media_album_artist_pinyin;\
962                         ALTER TABLE %q RENAME COLUMN genre_pinyin TO media_genre_pinyin;\
963                         ALTER TABLE %q RENAME COLUMN composer_pinyin TO media_composer_pinyin;\
964                         ALTER TABLE %q RENAME COLUMN copyright_pinyin TO media_copyright_pinyin;\
965                         ALTER TABLE %q RENAME COLUMN description_pinyin TO media_description_pinyin;\
966                         ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;\
967                         ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
968                         ALTER TABLE %q RENAME COLUMN path TO media_path;\
969                         ALTER TABLE %q RENAME COLUMN file_name TO media_display_name;\
970                         ALTER TABLE %q RENAME COLUMN mime_type TO media_mime_type;\
971                         ALTER TABLE %q RENAME COLUMN size TO media_size;\
972                         ALTER TABLE %q RENAME COLUMN added_time TO media_added_time;\
973                         ALTER TABLE %q RENAME COLUMN modified_time TO media_modified_time;\
974                         ALTER TABLE %q RENAME COLUMN thumbnail_path TO media_thumbnail_path;\
975                         ALTER TABLE %q RENAME COLUMN title TO media_title;\
976                         ALTER TABLE %q RENAME COLUMN album TO media_album;\
977                         ALTER TABLE %q RENAME COLUMN artist TO media_artist;\
978                         ALTER TABLE %q RENAME COLUMN album_artist TO media_album_artist;\
979                         ALTER TABLE %q RENAME COLUMN genre TO media_genre;\
980                         ALTER TABLE %q RENAME COLUMN composer TO media_composer;\
981                         ALTER TABLE %q RENAME COLUMN year TO media_year;\
982                         ALTER TABLE %q RENAME COLUMN recorded_date TO media_recorded_date;\
983                         ALTER TABLE %q RENAME COLUMN copyright TO media_copyright;\
984                         ALTER TABLE %q RENAME COLUMN track_num TO media_track_num;\
985                         ALTER TABLE %q RENAME COLUMN description TO media_description;\
986                         ALTER TABLE %q RENAME COLUMN bitrate TO media_bitrate;\
987                         ALTER TABLE %q RENAME COLUMN bitpersample TO media_bitpersample;\
988                         ALTER TABLE %q RENAME COLUMN samplerate TO media_samplerate;\
989                         ALTER TABLE %q RENAME COLUMN channel TO media_channel;\
990                         ALTER TABLE %q RENAME COLUMN duration TO media_duration;\
991                         ALTER TABLE %q RENAME COLUMN longitude TO media_longitude;\
992                         ALTER TABLE %q RENAME COLUMN latitude TO media_latitude;\
993                         ALTER TABLE %q RENAME COLUMN altitude TO media_altitude;\
994                         ALTER TABLE %q RENAME COLUMN width TO media_width;\
995                         ALTER TABLE %q RENAME COLUMN height TO media_height;\
996                         ALTER TABLE %q RENAME COLUMN datetaken TO media_datetaken;\
997                         ALTER TABLE %q RENAME COLUMN orientation TO media_orientation;\
998                         ALTER TABLE %q RENAME COLUMN rating TO media_rating;\
999                         ALTER TABLE %q RENAME COLUMN favourite TO media_favourite;\
1000                         ALTER TABLE %q RENAME COLUMN is_drm TO media_is_drm;\
1001                         ALTER TABLE %q RENAME COLUMN storage_type TO media_storage_type;\
1002                         ALTER TABLE %q RENAME COLUMN timeline TO media_timeline;\
1003                         ALTER TABLE %q RENAME COLUMN is_360 TO media_360;",
1004                         MEDIA_SVC_DB_TABLE_MEDIA,
1005                         MEDIA_SVC_DB_TABLE_MEDIA,
1006                         MEDIA_SVC_DB_TABLE_MEDIA,
1007                         MEDIA_SVC_DB_TABLE_MEDIA,
1008                         MEDIA_SVC_DB_TABLE_MEDIA,
1009                         MEDIA_SVC_DB_TABLE_MEDIA,
1010                         MEDIA_SVC_DB_TABLE_MEDIA,
1011                         MEDIA_SVC_DB_TABLE_MEDIA,
1012                         MEDIA_SVC_DB_TABLE_MEDIA,
1013                         MEDIA_SVC_DB_TABLE_MEDIA,
1014                         MEDIA_SVC_DB_TABLE_MEDIA,
1015                         MEDIA_SVC_DB_TABLE_MEDIA,
1016                         MEDIA_SVC_DB_TABLE_MEDIA,
1017                         MEDIA_SVC_DB_TABLE_MEDIA,
1018                         MEDIA_SVC_DB_TABLE_MEDIA,
1019                         MEDIA_SVC_DB_TABLE_MEDIA,
1020                         MEDIA_SVC_DB_TABLE_MEDIA,
1021                         MEDIA_SVC_DB_TABLE_MEDIA,
1022                         MEDIA_SVC_DB_TABLE_MEDIA,
1023                         MEDIA_SVC_DB_TABLE_MEDIA,
1024                         MEDIA_SVC_DB_TABLE_MEDIA,
1025                         MEDIA_SVC_DB_TABLE_MEDIA,
1026                         MEDIA_SVC_DB_TABLE_MEDIA,
1027                         MEDIA_SVC_DB_TABLE_MEDIA,
1028                         MEDIA_SVC_DB_TABLE_MEDIA,
1029                         MEDIA_SVC_DB_TABLE_MEDIA,
1030                         MEDIA_SVC_DB_TABLE_MEDIA,
1031                         MEDIA_SVC_DB_TABLE_MEDIA,
1032                         MEDIA_SVC_DB_TABLE_MEDIA,
1033                         MEDIA_SVC_DB_TABLE_MEDIA,
1034                         MEDIA_SVC_DB_TABLE_MEDIA,
1035                         MEDIA_SVC_DB_TABLE_MEDIA,
1036                         MEDIA_SVC_DB_TABLE_MEDIA,
1037                         MEDIA_SVC_DB_TABLE_MEDIA,
1038                         MEDIA_SVC_DB_TABLE_MEDIA,
1039                         MEDIA_SVC_DB_TABLE_MEDIA,
1040                         MEDIA_SVC_DB_TABLE_MEDIA,
1041                         MEDIA_SVC_DB_TABLE_MEDIA,
1042                         MEDIA_SVC_DB_TABLE_MEDIA,
1043                         MEDIA_SVC_DB_TABLE_MEDIA,
1044                         MEDIA_SVC_DB_TABLE_MEDIA,
1045                         MEDIA_SVC_DB_TABLE_MEDIA,
1046                         MEDIA_SVC_DB_TABLE_MEDIA,
1047                         MEDIA_SVC_DB_TABLE_MEDIA,
1048                         MEDIA_SVC_DB_TABLE_MEDIA,
1049                         MEDIA_SVC_DB_TABLE_MEDIA,
1050                         MEDIA_SVC_DB_TABLE_MEDIA);
1051
1052                 ret = _media_svc_sql_query(sql, uid);
1053                 SQLITE3_SAFE_FREE(sql);
1054                 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
1055         }
1056
1057         return ret;
1058 }
1059
1060 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1061 {
1062         int ret = MS_MEDIA_ERR_NONE;
1063         char *sql = NULL;
1064
1065         media_svc_debug_fenter();
1066
1067         ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1068         if (ret != MS_MEDIA_ERR_NONE) {
1069                  media_svc_error("Query initialization failed [%d]", ret);
1070                 goto ERROR;
1071         }
1072
1073         ret = __alter_table(db_handle, uid);
1074         if (ret != MS_MEDIA_ERR_NONE) {
1075                  media_svc_error("fail to __alter_table [%d]", ret);
1076                 goto ERROR;
1077         }
1078
1079         /*drop media_view, playlist_view, tag_view */
1080         ret = __drop_views(uid);
1081         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1082
1083         /* Upgrade issue tizen 4.0 to 5.5 */
1084         if (cur_version == USER_V6) {
1085                 ret = __update_db_from_V6_to_V8(uid);
1086                 if (ret != MS_MEDIA_ERR_NONE) {
1087                          media_svc_error("fail to __update_db_from_V6_to_V8 [%d]", ret);
1088                         goto ERROR;
1089                 }
1090         }
1091
1092         /* Upgrade issue tizen 5.0 to 5.5 */
1093         if (cur_version < USER_V8) {
1094                 ret = __update_db_to_latest(cur_version, uid);
1095                 if (ret != MS_MEDIA_ERR_NONE) {
1096                          media_svc_error("fail to __update_db_from_V6_to_V8 [%d]", ret);
1097                         goto ERROR;
1098                 }
1099         }
1100
1101         if (cur_version == USER_V6) {
1102                 /* Create the removed trigger */
1103                 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");
1104
1105                 ret = _media_svc_sql_query(sql, uid);
1106                 SQLITE3_SAFE_FREE(sql);
1107                 if (ret != MS_MEDIA_ERR_NONE) {
1108                         media_svc_error("_media_svc_sql_query failed");
1109                         goto ERROR;
1110                 }
1111
1112                 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");
1113
1114                 ret = _media_svc_sql_query(sql, uid);
1115                 SQLITE3_SAFE_FREE(sql);
1116                 if (ret != MS_MEDIA_ERR_NONE) {
1117                         media_svc_error("_media_svc_sql_query failed");
1118                         goto ERROR;
1119                 }
1120         }
1121
1122         /* Rebuilding view */
1123         ret = __media_svc_rebuild_view_query(db_handle, uid);
1124
1125         /* Update user version */
1126         sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1127
1128         ret = _media_svc_sql_query(sql, uid);
1129         SQLITE3_SAFE_FREE(sql);
1130
1131         _media_svc_destroy_table_query();
1132
1133         media_svc_debug_fleave();
1134
1135         return ret;
1136
1137 ERROR:
1138         _media_svc_destroy_table_query();
1139
1140         return ret;
1141 }
1142
1143 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1144 {
1145         return media_db_request_update_db(sql_str, uid);
1146 }
1147
1148 int _media_svc_sql_query_direct(const char *sql_str, uid_t uid)
1149 {
1150         int ret = MS_MEDIA_ERR_NONE;
1151         sqlite3 *handle = NULL;
1152
1153         ret = media_db_connect(&handle, uid, true);
1154         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1155         ret = __media_svc_query_direct(handle, sql_str, uid);
1156         media_db_disconnect(handle);
1157
1158         return ret;
1159 }
1160
1161 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1162 {
1163         int ret = MS_MEDIA_ERR_NONE;
1164         sqlite3_stmt *sql_stmt = NULL;
1165         char *sql = sqlite3_mprintf("PRAGMA user_version;");
1166
1167         ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1168         if (ret != MS_MEDIA_ERR_NONE) {
1169                 media_svc_error("error when get user_version.");
1170                 return ret;
1171         }
1172
1173         *user_version = sqlite3_column_int(sql_stmt, 0);
1174         SQLITE3_FINALIZE(sql_stmt);
1175
1176         return MS_MEDIA_ERR_NONE;
1177 }
1178
1179 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1180 {
1181         int err = -1;
1182
1183         media_svc_retvm_if(sql_str == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "invalid query");
1184
1185         if (handle == NULL) {
1186                 media_svc_error("handle is NULL");
1187                 sqlite3_free((char *)sql_str);
1188                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1189         }
1190
1191         media_svc_sec_debug("Query[%s]", sql_str);
1192
1193         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1194         sqlite3_free((char *)sql_str);
1195
1196         if (err != SQLITE_OK) {
1197                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1198                 if (err == SQLITE_CORRUPT)
1199                         return MS_MEDIA_ERR_DB_CORRUPT;
1200
1201                 return MS_MEDIA_ERR_DB_INTERNAL;
1202         }
1203
1204         err = sqlite3_step(*stmt);
1205         if (err != SQLITE_ROW) {
1206                 media_svc_debug("No record");
1207                 SQLITE3_FINALIZE(*stmt);
1208                 return MS_MEDIA_ERR_DB_NO_RECORD;
1209         }
1210
1211         return MS_MEDIA_ERR_NONE;
1212 }
1213
1214 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1215 {
1216         int err = -1;
1217
1218         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "handle is NULL");
1219
1220         media_svc_sec_debug("Query[%s]", sql_str);
1221
1222         if (!STRING_VALID(sql_str)) {
1223                 media_svc_error("invalid query");
1224                 return MS_MEDIA_ERR_INVALID_PARAMETER;
1225         }
1226
1227         err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1228         sqlite3_free((char *)sql_str);
1229
1230         if (err != SQLITE_OK) {
1231                 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1232                 if (err == SQLITE_CORRUPT)
1233                         return MS_MEDIA_ERR_DB_CORRUPT;
1234
1235                 return MS_MEDIA_ERR_DB_INTERNAL;
1236         }
1237
1238         return MS_MEDIA_ERR_NONE;
1239 }
1240
1241 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1242 {
1243         int ret = MS_MEDIA_ERR_NONE;
1244         int idx = 0;
1245         int length = g_list_length(*query_list);
1246         char *sql = NULL;
1247         char query_bundle[MEDIA_SVC_QUERY_LEN_MAX] = {0, };
1248         int query_len = 0;
1249         int total_len = 0;
1250
1251         media_svc_debug("query list length : [%d]", length);
1252
1253         memset(query_bundle, 0, sizeof(query_bundle));
1254
1255         for (idx = 0; idx < length; idx++) {
1256                 sql = (char *)g_list_nth_data(*query_list, idx);
1257                 if (STRING_VALID(sql)) {
1258                         query_len = strlen(sql);
1259
1260                         if (query_len >= (sizeof(query_bundle) - 1)) {
1261                                 media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1262                                 SQLITE3_SAFE_FREE(sql);
1263                                 continue;
1264                         }
1265
1266                         if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1267                                 ret = media_db_request_update_db(query_bundle, uid);
1268                                 if (ret != MS_MEDIA_ERR_NONE)
1269                                         media_svc_error("media_db_request_update_db failed : %d", ret);
1270
1271                                 memset(query_bundle, 0, sizeof(query_bundle));
1272                                 total_len = 0;
1273                                 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1274                                 /*                              Consider inserting the basic information without metadata */
1275                                 /* Refer : SQLITE3 spec In Tizen 3.0 */
1276                                 /* Single query limit size = 1 billion bytes(1GiB) */
1277                                 /* DB limit size = 1 billion bytes(1GiB) */
1278                                 /* column limit = 2000 */
1279                         }
1280
1281                         SAFE_STRLCAT(query_bundle, sql, sizeof(query_bundle));
1282                         total_len += query_len;
1283
1284                         SQLITE3_SAFE_FREE(sql);
1285                 }
1286         }
1287
1288         if (total_len > 0) {
1289                 ret = media_db_request_update_db(query_bundle, uid);
1290                 if (ret != MS_MEDIA_ERR_NONE)
1291                         media_svc_error("media_db_request_update_db failed : %d", ret);
1292
1293                 memset(query_bundle, 0, sizeof(query_bundle));
1294                 total_len = 0;
1295         }
1296
1297         _media_svc_sql_query_release(query_list);
1298
1299         return MS_MEDIA_ERR_NONE;
1300
1301 }
1302
1303 #define MAX_RETRY 9
1304 #define SLEEP_TIME 1000 * 1000
1305 static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid)
1306 {
1307         int ret = MS_MEDIA_ERR_NONE;
1308         char *zErrMsg = NULL;
1309         int retry_count = 0;
1310
1311 EXEC_RETRY:
1312         ret = sqlite3_exec(handle, query, NULL, NULL, &zErrMsg);
1313         if (SQLITE_OK != ret) {
1314                 media_svc_sec_error("Error[%s],Query[%s]", zErrMsg, query);
1315                 SQLITE3_SAFE_FREE(zErrMsg);
1316                 if (ret == SQLITE_BUSY) {
1317                         ret = MS_MEDIA_ERR_DB_BUSY_FAIL;
1318                 } else if (ret == SQLITE_CONSTRAINT) {
1319                         ret = MS_MEDIA_ERR_DB_CONSTRAINT_FAIL;
1320                 } else if (ret == SQLITE_FULL) {
1321                         ret = MS_MEDIA_ERR_DB_FULL_FAIL;
1322                 } else if (ret == SQLITE_LOCKED) {
1323                         if (retry_count < MAX_RETRY) {
1324                                 media_svc_error("Locked retry[%d]", retry_count);
1325                                 retry_count++;
1326                                 usleep(SLEEP_TIME);
1327                                 goto EXEC_RETRY;
1328                         }
1329                         ret = MS_MEDIA_ERR_DB_INTERNAL;
1330                 } else {
1331                         ret = MS_MEDIA_ERR_DB_INTERNAL;
1332                 }
1333         }
1334
1335         return ret;
1336 }
1337
1338 int _media_svc_sql_query_list_direct(GList **query_list, uid_t uid)
1339 {
1340         int ret = MS_MEDIA_ERR_NONE;
1341         int idx = 0;
1342         int length = g_list_length(*query_list);
1343         char *sql = NULL;
1344         sqlite3 *handle = NULL;
1345
1346         media_svc_debug("query list length[%d]", length);
1347         if (length == 0)
1348                 goto ZERO_LEN;
1349
1350         ret = media_db_connect(&handle, uid, true);
1351         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1352
1353         for (idx = 0; idx < length; idx++) {
1354                 sql = (char *)g_list_nth_data(*query_list, idx);
1355                 if (STRING_VALID(sql)) {
1356                         ret = __media_svc_query_direct(handle, sql, uid);
1357                         if (ret != MS_MEDIA_ERR_NONE)
1358                                 media_svc_debug("_media_svc_query_direct failed[%s]", sql);
1359
1360                         SQLITE3_SAFE_FREE(sql);
1361                 }
1362         }
1363
1364         media_db_disconnect(handle);
1365
1366 ZERO_LEN:
1367         _media_svc_sql_query_release(query_list);
1368
1369         return MS_MEDIA_ERR_NONE;
1370 }
1371
1372 void _media_svc_sql_query_add(GList **query_list, char **query)
1373 {
1374         *query_list = g_list_append(*query_list, *query);
1375 }
1376
1377 void _media_svc_sql_query_release(GList **query_list)
1378 {
1379         if (*query_list) {
1380                 g_list_free(*query_list);
1381                 *query_list = NULL;
1382         }
1383 }
1384
1385 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1386 {
1387         if (user_version < LATEST_VERSION_NUMBER) {
1388                 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1389                 return __media_svc_db_upgrade(db_handle, user_version, uid);
1390         } else {
1391                 return MS_MEDIA_ERR_NONE;
1392         }
1393 }