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