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