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