4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 #include <media-util.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"
33 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid);
34 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid);
35 static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid);
38 static GHashTable *table;
39 static GSList *column_list[MEDIA_SVC_DB_LIST_MAX];
41 int __media_svc_add_table_info(const char *name, const char *trigger_name, const char *event_table, const char *action_table, const char *view_name)
43 table_info_s *tbl = NULL;
45 media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
47 if (STRING_VALID(trigger_name)) {
48 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
49 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
52 tbl = malloc(sizeof(table_info_s));
54 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
55 return MS_MEDIA_ERR_OUT_OF_MEMORY;
58 memset(tbl, 0x00, sizeof(table_info_s));
60 if (STRING_VALID(trigger_name)) {
61 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
62 if (tbl->trigger_name == NULL) {
63 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
65 return MS_MEDIA_ERR_OUT_OF_MEMORY;
68 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
69 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
71 tbl->event_table = strndup(event_table, strlen(event_table));
72 tbl->action_table = strndup(action_table, strlen(action_table));
75 if (STRING_VALID(view_name))
76 tbl->view_name = strndup(view_name, strlen(view_name));
78 g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
80 return MS_MEDIA_ERR_NONE;
83 int __media_svc_add_column_info(GSList **slist, const char *name, const char *type, const char *option, int version, const char *index_name, bool is_unique, bool is_trigger, bool is_view)
85 column_info_s *col = NULL;
86 col = malloc(sizeof(column_info_s));
88 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
89 return MS_MEDIA_ERR_OUT_OF_MEMORY;
91 memset(col, 0, sizeof(column_info_s));
93 col->name = strndup(name, strlen(name));
94 col->type = strndup(type, strlen(type));
96 col->has_option = true;
97 col->option = strndup(option, strlen(option));
99 col->has_option = false;
101 col->version = version;
102 if (index_name != NULL) {
103 col->is_index = true;
104 col->index_name = strndup(index_name, strlen(index_name));
106 col->is_index = false;
108 col->is_unique = is_unique;
109 col->is_trigger = is_trigger;
110 col->is_view = is_view;
111 *slist = g_slist_append(*slist, col);
113 return MS_MEDIA_ERR_NONE;
116 static int __create_playlist_view(uid_t uid)
118 int ret = MS_MEDIA_ERR_NONE;
120 column_info_s *col_ptr = NULL;
122 GString *table_query = g_string_new(NULL);
123 media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
125 for (iter = column_list[MEDIA_SVC_DB_LIST_PLAYLIST]; iter; iter = g_slist_next(iter)) {
126 col_ptr = iter->data;
131 if (col_ptr->is_view) {
132 if (table_query->len != 0) {
133 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
134 g_string_append_printf(table_query, ", playlist.%s AS p_thumbnail_path", col_ptr->name);
136 g_string_append_printf(table_query, ", playlist.%s", col_ptr->name);
138 g_string_append_printf(table_query, "playlist.%s", col_ptr->name);
143 for (iter = column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]; iter; iter = g_slist_next(iter)) {
144 col_ptr = iter->data;
149 if (col_ptr->is_view) {
150 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
151 g_string_append_printf(table_query, ", playlist_media_count IS NOT NULL AS playlist_media_count, playlist_map.%s AS pm_id", col_ptr->name);
153 g_string_append_printf(table_query, ", playlist_map.%s", col_ptr->name);
157 for (iter = column_list[MEDIA_SVC_DB_LIST_MEDIA]; iter; iter = g_slist_next(iter)) {
158 col_ptr = iter->data;
163 if (col_ptr->is_view)
164 g_string_append_printf(table_query, ", media.%s", col_ptr->name);
167 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query->str);
168 g_string_free(table_query, TRUE);
169 ret = _media_svc_sql_query(sql, uid);
170 SQLITE3_SAFE_FREE(sql);
175 static int __create_tag_view(uid_t uid)
177 int ret = MS_MEDIA_ERR_NONE;
179 column_info_s *col_ptr = NULL;
181 GString *table_query = g_string_new(NULL);
182 media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
184 for (iter = column_list[MEDIA_SVC_DB_LIST_TAG]; iter; iter = g_slist_next(iter)) {
185 col_ptr = iter->data;
190 if (col_ptr->is_view) {
191 if (table_query->len != 0)
192 g_string_append_printf(table_query, ", tag.%s", col_ptr->name);
194 g_string_append_printf(table_query, "tag.%s", col_ptr->name);
198 for (iter = column_list[MEDIA_SVC_DB_LIST_TAG_MAP]; iter; iter = g_slist_next(iter)) {
199 col_ptr = iter->data;
204 if (col_ptr->is_view) {
205 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
206 g_string_append_printf(table_query, ", tag_media_count IS NOT NULL AS tag_media_count, tag_map.%s AS tm_id", col_ptr->name);
208 g_string_append_printf(table_query, ", tag_map.%s", col_ptr->name);
212 for (iter = column_list[MEDIA_SVC_DB_LIST_MEDIA]; iter; iter = g_slist_next(iter)) {
213 col_ptr = iter->data;
218 if (col_ptr->is_view)
219 g_string_append_printf(table_query, ", media.%s", col_ptr->name);
222 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query->str);
223 g_string_free(table_query, TRUE);
224 ret = _media_svc_sql_query(sql, uid);
225 SQLITE3_SAFE_FREE(sql);
230 static int __drop_views(uid_t uid)
232 int ret = MS_MEDIA_ERR_NONE;
235 sql = sqlite3_mprintf("DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q;DROP VIEW IF EXISTS %q", MEDIA_SVC_DB_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_TAG, MEDIA_SVC_DB_VIEW_MEDIA);
237 ret = _media_svc_sql_query(sql, uid);
238 SQLITE3_SAFE_FREE(sql);
243 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
245 int ret = MS_MEDIA_ERR_NONE;
247 /*create playlist_view */
248 ret = __create_playlist_view(uid);
249 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
252 ret = __create_tag_view(uid);
253 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
255 return MS_MEDIA_ERR_NONE;
258 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
260 int ret = MS_MEDIA_ERR_NONE;
262 table_info_s *tb = NULL;
263 column_info_s *col_ptr = NULL;
265 GString *table_query = g_string_new(NULL);
266 GString *index_query = g_string_new(NULL);
267 GString *trigger_query = g_string_new(NULL);
268 GString *unique_query = g_string_new(NULL);
270 if (!table_query || !index_query || !trigger_query || !unique_query) {
271 media_svc_error("g_string_new failed");
272 ret = MS_MEDIA_ERR_INTERNAL;
276 tb = g_hash_table_lookup(table, table_name);
278 media_svc_debug("lookup fail.. table name [%s] ", table_name);
279 ret = MS_MEDIA_ERR_INTERNAL;
283 for (iter = column_list[list]; iter; iter = g_slist_next(iter)) {
284 col_ptr = iter->data;
289 if (col_ptr->has_option) {
290 if (table_query->len != 0)
291 g_string_append_printf(table_query, ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
293 g_string_append_printf(table_query, "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
295 if (table_query->len != 0)
296 g_string_append_printf(table_query, ", %s %s", col_ptr->name, col_ptr->type);
298 g_string_append_printf(table_query, "%s %s", col_ptr->name, col_ptr->type);
302 if (col_ptr->is_unique) {
303 if (unique_query->len != 0)
304 g_string_append_printf(unique_query, ", %s", col_ptr->name);
306 g_string_append_printf(unique_query, "%s", col_ptr->name);
310 if (col_ptr->is_index)
311 g_string_append_printf(index_query, MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
314 if (col_ptr->is_trigger) {
315 if (STRING_VALID(tb->trigger_name)) {
316 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0)
317 g_string_append_printf(trigger_query, MEDIA_SVC_DB_QUERY_TRIGGER_WITH_COUNT, tb->trigger_name, tb->event_table, tb->action_table, tb->event_table, col_ptr->name, col_ptr->name, col_ptr->name, col_ptr->name);
319 g_string_append_printf(trigger_query, MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
321 media_svc_error("invalid trigger name");
327 if (unique_query->len > 0)
328 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query->str, unique_query->str);
330 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query->str);
332 ret = _media_svc_sql_query(sql, uid);
333 SQLITE3_SAFE_FREE(sql);
334 if (ret != MS_MEDIA_ERR_NONE)
337 if (index_query->len > 0) {
338 ret = _media_svc_sql_query(index_query->str, uid);
339 if (ret != MS_MEDIA_ERR_NONE)
343 if (trigger_query->len > 0) {
344 ret = _media_svc_sql_query(trigger_query->str, uid);
345 if (ret != MS_MEDIA_ERR_NONE)
350 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0)
351 ret = __create_playlist_view(uid);
352 else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_TAG, strlen(MEDIA_SVC_DB_TABLE_TAG)) == 0)
353 ret = __create_tag_view(uid);
357 g_string_free(index_query, TRUE);
359 g_string_free(trigger_query, TRUE);
361 g_string_free(unique_query, TRUE);
363 g_string_free(table_query, TRUE);
368 static int __media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
370 int ret = MS_MEDIA_ERR_NONE;
372 column_info_s *col_ptr = NULL;
374 char temp[1024] = {0, };
376 sqlite3_stmt *sql_stmt = NULL;
378 sql = sqlite3_mprintf("PRAGMA user_version");
379 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
381 if (ret != MS_MEDIA_ERR_NONE) {
382 media_svc_error("error when get user_version. err = [%d]", ret);
385 cur_version = sqlite3_column_int(sql_stmt, 0);
386 SQLITE3_FINALIZE(sql_stmt);
388 for (iter = column_list[list]; iter; iter = g_slist_next(iter)) {
389 col_ptr = iter->data;
394 if (col_ptr->version > cur_version) {
396 memset(temp, 0, sizeof(temp));
397 if (col_ptr->has_option)
398 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
400 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
401 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
402 ret = _media_svc_sql_query(sql, uid);
403 SQLITE3_SAFE_FREE(sql);
404 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
406 if (col_ptr->is_index) {
407 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
408 ret = _media_svc_sql_query(sql, uid);
409 SQLITE3_SAFE_FREE(sql);
410 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
415 return MS_MEDIA_ERR_NONE;
418 static void __media_svc_table_free(gpointer data)
420 table_info_s *tb = (table_info_s *) data;
422 SAFE_FREE(tb->trigger_name);
423 SAFE_FREE(tb->view_name);
424 SAFE_FREE(tb->event_table);
425 SAFE_FREE(tb->action_table);
429 static void __media_svc_column_free(gpointer data)
431 column_info_s *col = (column_info_s *) data;
433 SAFE_FREE(col->name);
434 SAFE_FREE(col->type);
435 SAFE_FREE(col->option);
436 SAFE_FREE(col->index_name);
440 int _media_svc_init_table_query(const char *event_table_name)
442 int ret = MS_MEDIA_ERR_NONE;
444 /*variable initialize.. */
445 table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __media_svc_table_free);
447 /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
448 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, NULL);
449 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
450 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TRIGGER_FOLDER, event_table_name, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
451 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
452 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP, event_table_name, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, NULL);
453 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
454 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP1, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_VIEW_PLAYLIST);
455 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
456 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_TRIGGER_ALBUM, event_table_name, MEDIA_SVC_DB_TABLE_ALBUM, NULL);
457 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
458 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_TRIGGER_TAG_MAP, event_table_name, MEDIA_SVC_DB_TABLE_TAG_MAP, NULL);
459 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
460 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TRIGGER_TAG_MAP1, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_VIEW_TAG);
461 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
462 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TRIGGER_BOOKMARK, event_table_name, MEDIA_SVC_DB_TABLE_BOOKMARK, NULL);
463 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
464 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
465 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
466 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, NULL);
467 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
468 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, NULL);
469 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
471 /*insert column info.. */
473 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, true);
474 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
475 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
476 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
477 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_display_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", false, false, true);
478 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
479 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
480 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
481 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
482 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
483 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
484 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
485 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
486 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
487 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", false, false, true);
488 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
489 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
490 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
491 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
492 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
493 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
494 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
495 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
496 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
497 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
498 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
499 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
500 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
501 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
502 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
503 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
504 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
505 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
506 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
507 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
508 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
509 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
510 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
511 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
512 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
513 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
514 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
515 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
516 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
517 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
518 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
519 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
520 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
521 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
522 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
523 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
524 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
525 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
526 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
527 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
528 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
529 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
530 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
531 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
532 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
533 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
534 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
535 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
536 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
537 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
538 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
539 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
540 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
541 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
542 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
543 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
544 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
545 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
546 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
547 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
548 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
549 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
550 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
551 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
552 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
553 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
554 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
555 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
556 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
557 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
558 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
559 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
560 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
561 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
562 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
563 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
564 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
565 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
566 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
567 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
568 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
569 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
570 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
571 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
572 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
573 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
574 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
575 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
576 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
577 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
578 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
579 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
580 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
581 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
582 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
583 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
584 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
585 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
586 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V2, NULL, false, false, false);
587 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
588 /* color column is added with dcm. (DB v5) */
589 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_360", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V5, NULL, false, false, true);
590 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
593 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, false);
594 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
595 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, false, false);
596 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
597 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
598 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
599 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
600 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
601 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
602 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
603 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, false);
604 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
605 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
606 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, true, false, false);
607 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
608 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V4, NULL, false, false, false);
609 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
612 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
613 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
614 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, false);
615 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
616 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, true, false);
617 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
618 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_member_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, true);
619 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
622 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
623 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
624 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
625 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
626 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
627 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
630 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, false);
631 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
632 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
633 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
634 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
635 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
636 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_art", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
637 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
640 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
641 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
642 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "tag_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, true, false, false);
643 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
644 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
645 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
648 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_id ", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
649 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
650 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
651 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
654 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, false);
655 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
656 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
657 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
658 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_marked_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, true, false, false);
659 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
660 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
661 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
662 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V6, NULL, false, false, false);
663 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
666 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_id", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V3, NULL, false, false, false);
667 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
668 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
669 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
670 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
671 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
672 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V3, NULL, false, false, false);
673 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
676 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V4, NULL, false, true, false);
677 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
678 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V6, NULL, false, false, false);
679 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
682 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_face_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V4, NULL, false, false, false);
683 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
684 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, true, false);
685 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
686 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_x", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, true, false, false);
687 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
688 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_y", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, true, false, false);
689 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
690 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_w", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, true, false, false);
691 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
692 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_h", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, true, false, false);
693 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
694 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
695 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
696 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
697 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
702 void _media_svc_destroy_table_query()
707 g_hash_table_destroy(table);
710 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
711 g_slist_free_full(column_list[i], __media_svc_column_free);
714 static int __alter_table(sqlite3 *db_handle, uid_t uid)
716 int ret = MS_MEDIA_ERR_NONE;
718 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
719 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
721 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
722 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
724 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
725 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
727 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
728 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
730 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
731 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
733 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
734 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
736 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
737 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
739 ret = __media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
740 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __media_svc_upgrade_table_query [%d]", ret);
745 static int __drop_tmp_table(uid_t uid)
747 int ret = MS_MEDIA_ERR_NONE;
750 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
752 ret = _media_svc_sql_query(sql, uid);
753 SQLITE3_SAFE_FREE(sql);
758 static int __alter_and_rename_table(const char *table, uid_t uid)
760 int ret = MS_MEDIA_ERR_NONE;
763 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", table, MEDIA_SVC_DB_TABLE_TMP_TABLE);
765 ret = _media_svc_sql_query(sql, uid);
766 SQLITE3_SAFE_FREE(sql);
771 static int __update_db_from_V6_to_V8(uid_t uid) //tizen 4.0 to 5.5
773 int ret = MS_MEDIA_ERR_NONE;
776 /******Upgrade Media Table******/
777 /* remove user data columns */
778 ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_MEDIA, uid);
779 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
781 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
782 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
784 sql = sqlite3_mprintf("INSERT INTO %q (media_id, media_path, media_display_name, media_type, media_mime_type, media_size, media_added_time, media_modified_time, folder_id, media_thumbnail_path, media_title, album_id, media_album, media_artist, media_album_artist, media_genre, media_composer, media_year, media_recorded_date, media_copyright, media_track_num, media_description, media_bitrate, media_bitpersample, media_samplerate, media_channel, media_duration, media_longitude, media_latitude, media_altitude, exposure_time, fnumber, iso, model, media_width, media_height, media_datetaken, media_orientation, media_rating, media_favourite, media_is_drm, media_storage_type, media_timeline, sync_status, media_file_name_pinyin, media_title_pinyin, media_album_pinyin, media_artist_pinyin, media_album_artist_pinyin, media_genre_pinyin, media_composer_pinyin, media_copyright_pinyin, media_description_pinyin, age_rating_pinyin, keyword_pinyin, storage_uuid, validity, media_360) \
785 SELECT media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, title, album_id, album, artist, album_artist, genre, composer, year, recorded_date, copyright, track_num, description, bitrate, bitpersample, samplerate, channel, duration, longitude, latitude, altitude, exposure_time, fnumber, iso, model, width, height, datetaken, orientation, rating, favourite, is_drm, storage_type, timeline, sync_status, file_name_pinyin, title_pinyin, album_pinyin, artist_pinyin, album_artist_pinyin, genre_pinyin, composer_pinyin, copyright_pinyin, description_pinyin, age_rating_pinyin, keyword_pinyin, storage_uuid, validity, is_360 FROM %q;",
786 MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_TMP_TABLE);
788 ret = _media_svc_sql_query(sql, uid);
789 SQLITE3_SAFE_FREE(sql);
790 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
792 ret = __drop_tmp_table(uid);
793 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
795 /******Upgrade Folder Table******/
796 /* remove "scan_status" column */
797 ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FOLDER, uid);
798 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
800 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
801 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
803 sql = sqlite3_mprintf("INSERT INTO %q (folder_id, folder_path, folder_name, folder_modified_time, folder_name_pinyin, folder_storage_type, storage_uuid, validity) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, validity FROM %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
805 ret = _media_svc_sql_query(sql, uid);
806 SQLITE3_SAFE_FREE(sql);
807 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
809 ret = __drop_tmp_table(uid);
810 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
812 /******Upgrade Storage Table******/
813 /* remove "scan_status", "storage_name" column */
814 ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_STORAGE, uid);
815 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
817 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
818 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
820 sql = sqlite3_mprintf("INSERT INTO %q (storage_id, storage_path, storage_type, validity) SELECT storage_uuid, storage_path, storage_type, validity FROM %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
822 ret = _media_svc_sql_query(sql, uid);
823 SQLITE3_SAFE_FREE(sql);
824 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
826 ret = __drop_tmp_table(uid);
827 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
829 /******Upgrade face Table******/
830 /* Change "face_uuid" to "face_id" (face_uuid is TEXT, face_id is INTEGER) */
831 ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FACE, uid);
832 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
834 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_LIST_FACE, uid);
835 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
837 sql = sqlite3_mprintf("INSERT INTO %q (media_id, face_rect_x, face_rect_y, face_rect_w, face_rect_h, face_orientation, media_face_tag) SELECT media_uuid, face_rect_x, face_rect_y, face_rect_w, face_rect_h, orientation, face_tag FROM %q;", MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
839 ret = _media_svc_sql_query(sql, uid);
840 SQLITE3_SAFE_FREE(sql);
841 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
843 ret = __drop_tmp_table(uid);
844 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
846 /******Upgrade face_scan_list Table******/
847 /* Drop trigger first */
848 sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
849 MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
851 ret = _media_svc_sql_query(sql, uid);
852 SQLITE3_SAFE_FREE(sql);
853 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
855 /* remove "storage_uuid" column */
856 ret = __alter_and_rename_table(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, uid);
857 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __alter_and_rename_table [%d]", ret);
859 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_LIST_FACE_SCAN_LIST, uid);
860 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_make_table_query [%d]", ret);
862 sql = sqlite3_mprintf("INSERT INTO %q (media_id, modified_time) SELECT media_uuid, modified_time FROM %q;", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_TMP_TABLE);
864 ret = _media_svc_sql_query(sql, uid);
865 SQLITE3_SAFE_FREE(sql);
866 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
868 ret = __drop_tmp_table(uid);
869 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to __drop_tmp_table [%d]", ret);
874 static int __update_db_to_latest(int cur_version, uid_t uid) //tizen 5.0(and before) to 5.5
876 int ret = MS_MEDIA_ERR_NONE;
879 if (cur_version == USER_V6) {
880 /* Drop trigger first */
881 sql = sqlite3_mprintf("DROP TRIGGER IF EXISTS %q_%q;DROP TRIGGER IF EXISTS %q_%q;",
882 MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA);
884 ret = _media_svc_sql_query(sql, uid);
885 SQLITE3_SAFE_FREE(sql);
886 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
890 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN play_order TO playlist_member_order;\
891 ALTER TABLE %q RENAME COLUMN name TO playlist_name;\
892 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
893 MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
895 ret = _media_svc_sql_query(sql, uid);
896 SQLITE3_SAFE_FREE(sql);
897 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
900 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN name TO tag_name;\
901 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
902 MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP);
904 ret = _media_svc_sql_query(sql, uid);
905 SQLITE3_SAFE_FREE(sql);
906 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
909 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN marked_time TO bookmark_marked_time;\
910 ALTER TABLE %q RENAME COLUMN name TO bookmark_name;\
911 ALTER TABLE %q RENAME COLUMN thumbnail_path TO bookmark_thumbnail_path;\
912 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
913 MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK,
914 MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TABLE_BOOKMARK);
916 ret = _media_svc_sql_query(sql, uid);
917 SQLITE3_SAFE_FREE(sql);
918 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
920 if (cur_version == USER_V7) {
922 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN face_id TO media_face_id;\
923 ALTER TABLE %q RENAME COLUMN orientation TO face_orientation;\
924 ALTER TABLE %q RENAME COLUMN face_tag TO media_face_tag;\
925 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
926 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;",
927 MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TABLE_FACE,
928 MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE);
930 ret = _media_svc_sql_query(sql, uid);
931 SQLITE3_SAFE_FREE(sql);
932 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
935 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN modified_time TO folder_modified_time;\
936 ALTER TABLE %q RENAME COLUMN path TO folder_path;\
937 ALTER TABLE %q RENAME COLUMN name TO folder_name;\
938 ALTER TABLE %q RENAME COLUMN name_pinyin TO folder_name_pinyin;\
939 ALTER TABLE %q RENAME COLUMN storage_type TO folder_storage_type;\
940 ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;",
941 MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER,
942 MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_FOLDER);
944 ret = _media_svc_sql_query(sql, uid);
945 SQLITE3_SAFE_FREE(sql);
946 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
949 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN storage_uuid TO storage_id;",
950 MEDIA_SVC_DB_TABLE_STORAGE);
952 ret = _media_svc_sql_query(sql, uid);
953 SQLITE3_SAFE_FREE(sql);
954 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
957 sql = sqlite3_mprintf("ALTER TABLE %q RENAME COLUMN file_name_pinyin TO media_file_name_pinyin;\
958 ALTER TABLE %q RENAME COLUMN title_pinyin TO media_title_pinyin;\
959 ALTER TABLE %q RENAME COLUMN album_pinyin TO media_album_pinyin;\
960 ALTER TABLE %q RENAME COLUMN artist_pinyin TO media_artist_pinyin;\
961 ALTER TABLE %q RENAME COLUMN album_artist_pinyin TO media_album_artist_pinyin;\
962 ALTER TABLE %q RENAME COLUMN genre_pinyin TO media_genre_pinyin;\
963 ALTER TABLE %q RENAME COLUMN composer_pinyin TO media_composer_pinyin;\
964 ALTER TABLE %q RENAME COLUMN copyright_pinyin TO media_copyright_pinyin;\
965 ALTER TABLE %q RENAME COLUMN description_pinyin TO media_description_pinyin;\
966 ALTER TABLE %q RENAME COLUMN folder_uuid TO folder_id;\
967 ALTER TABLE %q RENAME COLUMN media_uuid TO media_id;\
968 ALTER TABLE %q RENAME COLUMN path TO media_path;\
969 ALTER TABLE %q RENAME COLUMN file_name TO media_display_name;\
970 ALTER TABLE %q RENAME COLUMN mime_type TO media_mime_type;\
971 ALTER TABLE %q RENAME COLUMN size TO media_size;\
972 ALTER TABLE %q RENAME COLUMN added_time TO media_added_time;\
973 ALTER TABLE %q RENAME COLUMN modified_time TO media_modified_time;\
974 ALTER TABLE %q RENAME COLUMN thumbnail_path TO media_thumbnail_path;\
975 ALTER TABLE %q RENAME COLUMN title TO media_title;\
976 ALTER TABLE %q RENAME COLUMN album TO media_album;\
977 ALTER TABLE %q RENAME COLUMN artist TO media_artist;\
978 ALTER TABLE %q RENAME COLUMN album_artist TO media_album_artist;\
979 ALTER TABLE %q RENAME COLUMN genre TO media_genre;\
980 ALTER TABLE %q RENAME COLUMN composer TO media_composer;\
981 ALTER TABLE %q RENAME COLUMN year TO media_year;\
982 ALTER TABLE %q RENAME COLUMN recorded_date TO media_recorded_date;\
983 ALTER TABLE %q RENAME COLUMN copyright TO media_copyright;\
984 ALTER TABLE %q RENAME COLUMN track_num TO media_track_num;\
985 ALTER TABLE %q RENAME COLUMN description TO media_description;\
986 ALTER TABLE %q RENAME COLUMN bitrate TO media_bitrate;\
987 ALTER TABLE %q RENAME COLUMN bitpersample TO media_bitpersample;\
988 ALTER TABLE %q RENAME COLUMN samplerate TO media_samplerate;\
989 ALTER TABLE %q RENAME COLUMN channel TO media_channel;\
990 ALTER TABLE %q RENAME COLUMN duration TO media_duration;\
991 ALTER TABLE %q RENAME COLUMN longitude TO media_longitude;\
992 ALTER TABLE %q RENAME COLUMN latitude TO media_latitude;\
993 ALTER TABLE %q RENAME COLUMN altitude TO media_altitude;\
994 ALTER TABLE %q RENAME COLUMN width TO media_width;\
995 ALTER TABLE %q RENAME COLUMN height TO media_height;\
996 ALTER TABLE %q RENAME COLUMN datetaken TO media_datetaken;\
997 ALTER TABLE %q RENAME COLUMN orientation TO media_orientation;\
998 ALTER TABLE %q RENAME COLUMN rating TO media_rating;\
999 ALTER TABLE %q RENAME COLUMN favourite TO media_favourite;\
1000 ALTER TABLE %q RENAME COLUMN is_drm TO media_is_drm;\
1001 ALTER TABLE %q RENAME COLUMN storage_type TO media_storage_type;\
1002 ALTER TABLE %q RENAME COLUMN timeline TO media_timeline;\
1003 ALTER TABLE %q RENAME COLUMN is_360 TO media_360;",
1004 MEDIA_SVC_DB_TABLE_MEDIA,
1005 MEDIA_SVC_DB_TABLE_MEDIA,
1006 MEDIA_SVC_DB_TABLE_MEDIA,
1007 MEDIA_SVC_DB_TABLE_MEDIA,
1008 MEDIA_SVC_DB_TABLE_MEDIA,
1009 MEDIA_SVC_DB_TABLE_MEDIA,
1010 MEDIA_SVC_DB_TABLE_MEDIA,
1011 MEDIA_SVC_DB_TABLE_MEDIA,
1012 MEDIA_SVC_DB_TABLE_MEDIA,
1013 MEDIA_SVC_DB_TABLE_MEDIA,
1014 MEDIA_SVC_DB_TABLE_MEDIA,
1015 MEDIA_SVC_DB_TABLE_MEDIA,
1016 MEDIA_SVC_DB_TABLE_MEDIA,
1017 MEDIA_SVC_DB_TABLE_MEDIA,
1018 MEDIA_SVC_DB_TABLE_MEDIA,
1019 MEDIA_SVC_DB_TABLE_MEDIA,
1020 MEDIA_SVC_DB_TABLE_MEDIA,
1021 MEDIA_SVC_DB_TABLE_MEDIA,
1022 MEDIA_SVC_DB_TABLE_MEDIA,
1023 MEDIA_SVC_DB_TABLE_MEDIA,
1024 MEDIA_SVC_DB_TABLE_MEDIA,
1025 MEDIA_SVC_DB_TABLE_MEDIA,
1026 MEDIA_SVC_DB_TABLE_MEDIA,
1027 MEDIA_SVC_DB_TABLE_MEDIA,
1028 MEDIA_SVC_DB_TABLE_MEDIA,
1029 MEDIA_SVC_DB_TABLE_MEDIA,
1030 MEDIA_SVC_DB_TABLE_MEDIA,
1031 MEDIA_SVC_DB_TABLE_MEDIA,
1032 MEDIA_SVC_DB_TABLE_MEDIA,
1033 MEDIA_SVC_DB_TABLE_MEDIA,
1034 MEDIA_SVC_DB_TABLE_MEDIA,
1035 MEDIA_SVC_DB_TABLE_MEDIA,
1036 MEDIA_SVC_DB_TABLE_MEDIA,
1037 MEDIA_SVC_DB_TABLE_MEDIA,
1038 MEDIA_SVC_DB_TABLE_MEDIA,
1039 MEDIA_SVC_DB_TABLE_MEDIA,
1040 MEDIA_SVC_DB_TABLE_MEDIA,
1041 MEDIA_SVC_DB_TABLE_MEDIA,
1042 MEDIA_SVC_DB_TABLE_MEDIA,
1043 MEDIA_SVC_DB_TABLE_MEDIA,
1044 MEDIA_SVC_DB_TABLE_MEDIA,
1045 MEDIA_SVC_DB_TABLE_MEDIA,
1046 MEDIA_SVC_DB_TABLE_MEDIA,
1047 MEDIA_SVC_DB_TABLE_MEDIA,
1048 MEDIA_SVC_DB_TABLE_MEDIA,
1049 MEDIA_SVC_DB_TABLE_MEDIA,
1050 MEDIA_SVC_DB_TABLE_MEDIA);
1052 ret = _media_svc_sql_query(sql, uid);
1053 SQLITE3_SAFE_FREE(sql);
1054 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "fail to _media_svc_sql_query [%d]", ret);
1060 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1062 int ret = MS_MEDIA_ERR_NONE;
1065 media_svc_debug_fenter();
1067 ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1068 if (ret != MS_MEDIA_ERR_NONE) {
1069 media_svc_error("Query initialization failed [%d]", ret);
1073 ret = __alter_table(db_handle, uid);
1074 if (ret != MS_MEDIA_ERR_NONE) {
1075 media_svc_error("fail to __alter_table [%d]", ret);
1079 /*drop media_view, playlist_view, tag_view */
1080 ret = __drop_views(uid);
1081 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1083 /* Upgrade issue tizen 4.0 to 5.5 */
1084 if (cur_version == USER_V6) {
1085 ret = __update_db_from_V6_to_V8(uid);
1086 if (ret != MS_MEDIA_ERR_NONE) {
1087 media_svc_error("fail to __update_db_from_V6_to_V8 [%d]", ret);
1092 /* Upgrade issue tizen 5.0 to 5.5 */
1093 if (cur_version < USER_V8) {
1094 ret = __update_db_to_latest(cur_version, uid);
1095 if (ret != MS_MEDIA_ERR_NONE) {
1096 media_svc_error("fail to __update_db_from_V6_to_V8 [%d]", ret);
1101 if (cur_version == USER_V6) {
1102 /* Create the removed trigger */
1103 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TRIGGER, "face_cleanup_face_scan_list", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, "media_id", "media_id");
1105 ret = _media_svc_sql_query(sql, uid);
1106 SQLITE3_SAFE_FREE(sql);
1107 if (ret != MS_MEDIA_ERR_NONE) {
1108 media_svc_error("_media_svc_sql_query failed");
1112 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TRIGGER, "face_scan_list_cleanup_media", MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, "media_id", "media_id");
1114 ret = _media_svc_sql_query(sql, uid);
1115 SQLITE3_SAFE_FREE(sql);
1116 if (ret != MS_MEDIA_ERR_NONE) {
1117 media_svc_error("_media_svc_sql_query failed");
1122 /* Rebuilding view */
1123 ret = __media_svc_rebuild_view_query(db_handle, uid);
1125 /* Update user version */
1126 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1128 ret = _media_svc_sql_query(sql, uid);
1129 SQLITE3_SAFE_FREE(sql);
1131 _media_svc_destroy_table_query();
1133 media_svc_debug_fleave();
1138 _media_svc_destroy_table_query();
1143 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1145 return media_db_request_update_db(sql_str, uid);
1148 int _media_svc_sql_query_direct(const char *sql_str, uid_t uid)
1150 int ret = MS_MEDIA_ERR_NONE;
1151 sqlite3 *handle = NULL;
1153 ret = media_db_connect(&handle, uid, true);
1154 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1155 ret = __media_svc_query_direct(handle, sql_str, uid);
1156 media_db_disconnect(handle);
1161 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1163 int ret = MS_MEDIA_ERR_NONE;
1164 sqlite3_stmt *sql_stmt = NULL;
1165 char *sql = sqlite3_mprintf("PRAGMA user_version;");
1167 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1168 if (ret != MS_MEDIA_ERR_NONE) {
1169 media_svc_error("error when get user_version.");
1173 *user_version = sqlite3_column_int(sql_stmt, 0);
1174 SQLITE3_FINALIZE(sql_stmt);
1176 return MS_MEDIA_ERR_NONE;
1179 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1183 media_svc_retvm_if(sql_str == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "invalid query");
1185 if (handle == NULL) {
1186 media_svc_error("handle is NULL");
1187 sqlite3_free((char *)sql_str);
1188 return MS_MEDIA_ERR_INVALID_PARAMETER;
1191 media_svc_sec_debug("Query[%s]", sql_str);
1193 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1194 sqlite3_free((char *)sql_str);
1196 if (err != SQLITE_OK) {
1197 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1198 if (err == SQLITE_CORRUPT)
1199 return MS_MEDIA_ERR_DB_CORRUPT;
1201 return MS_MEDIA_ERR_DB_INTERNAL;
1204 err = sqlite3_step(*stmt);
1205 if (err != SQLITE_ROW) {
1206 media_svc_debug("No record");
1207 SQLITE3_FINALIZE(*stmt);
1208 return MS_MEDIA_ERR_DB_NO_RECORD;
1211 return MS_MEDIA_ERR_NONE;
1214 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1218 media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "handle is NULL");
1220 media_svc_sec_debug("Query[%s]", sql_str);
1222 if (!STRING_VALID(sql_str)) {
1223 media_svc_error("invalid query");
1224 return MS_MEDIA_ERR_INVALID_PARAMETER;
1227 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1228 sqlite3_free((char *)sql_str);
1230 if (err != SQLITE_OK) {
1231 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1232 if (err == SQLITE_CORRUPT)
1233 return MS_MEDIA_ERR_DB_CORRUPT;
1235 return MS_MEDIA_ERR_DB_INTERNAL;
1238 return MS_MEDIA_ERR_NONE;
1241 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1243 int ret = MS_MEDIA_ERR_NONE;
1245 int length = g_list_length(*query_list);
1247 char query_bundle[MEDIA_SVC_QUERY_LEN_MAX] = {0, };
1251 media_svc_debug("query list length : [%d]", length);
1253 memset(query_bundle, 0, sizeof(query_bundle));
1255 for (idx = 0; idx < length; idx++) {
1256 sql = (char *)g_list_nth_data(*query_list, idx);
1257 if (STRING_VALID(sql)) {
1258 query_len = strlen(sql);
1260 if (query_len >= (sizeof(query_bundle) - 1)) {
1261 media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1262 SQLITE3_SAFE_FREE(sql);
1266 if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1267 ret = media_db_request_update_db(query_bundle, uid);
1268 if (ret != MS_MEDIA_ERR_NONE)
1269 media_svc_error("media_db_request_update_db failed : %d", ret);
1271 memset(query_bundle, 0, sizeof(query_bundle));
1273 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1274 /* Consider inserting the basic information without metadata */
1275 /* Refer : SQLITE3 spec In Tizen 3.0 */
1276 /* Single query limit size = 1 billion bytes(1GiB) */
1277 /* DB limit size = 1 billion bytes(1GiB) */
1278 /* column limit = 2000 */
1281 SAFE_STRLCAT(query_bundle, sql, sizeof(query_bundle));
1282 total_len += query_len;
1284 SQLITE3_SAFE_FREE(sql);
1288 if (total_len > 0) {
1289 ret = media_db_request_update_db(query_bundle, uid);
1290 if (ret != MS_MEDIA_ERR_NONE)
1291 media_svc_error("media_db_request_update_db failed : %d", ret);
1293 memset(query_bundle, 0, sizeof(query_bundle));
1297 _media_svc_sql_query_release(query_list);
1299 return MS_MEDIA_ERR_NONE;
1304 #define SLEEP_TIME 1000 * 1000
1305 static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid)
1307 int ret = MS_MEDIA_ERR_NONE;
1308 char *zErrMsg = NULL;
1309 int retry_count = 0;
1312 ret = sqlite3_exec(handle, query, NULL, NULL, &zErrMsg);
1313 if (SQLITE_OK != ret) {
1314 media_svc_sec_error("Error[%s],Query[%s]", zErrMsg, query);
1315 SQLITE3_SAFE_FREE(zErrMsg);
1316 if (ret == SQLITE_BUSY) {
1317 ret = MS_MEDIA_ERR_DB_BUSY_FAIL;
1318 } else if (ret == SQLITE_CONSTRAINT) {
1319 ret = MS_MEDIA_ERR_DB_CONSTRAINT_FAIL;
1320 } else if (ret == SQLITE_FULL) {
1321 ret = MS_MEDIA_ERR_DB_FULL_FAIL;
1322 } else if (ret == SQLITE_LOCKED) {
1323 if (retry_count < MAX_RETRY) {
1324 media_svc_error("Locked retry[%d]", retry_count);
1329 ret = MS_MEDIA_ERR_DB_INTERNAL;
1331 ret = MS_MEDIA_ERR_DB_INTERNAL;
1338 int _media_svc_sql_query_list_direct(GList **query_list, uid_t uid)
1340 int ret = MS_MEDIA_ERR_NONE;
1342 int length = g_list_length(*query_list);
1344 sqlite3 *handle = NULL;
1346 media_svc_debug("query list length[%d]", length);
1350 ret = media_db_connect(&handle, uid, true);
1351 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed");
1353 for (idx = 0; idx < length; idx++) {
1354 sql = (char *)g_list_nth_data(*query_list, idx);
1355 if (STRING_VALID(sql)) {
1356 ret = __media_svc_query_direct(handle, sql, uid);
1357 if (ret != MS_MEDIA_ERR_NONE)
1358 media_svc_debug("_media_svc_query_direct failed[%s]", sql);
1360 SQLITE3_SAFE_FREE(sql);
1364 media_db_disconnect(handle);
1367 _media_svc_sql_query_release(query_list);
1369 return MS_MEDIA_ERR_NONE;
1372 void _media_svc_sql_query_add(GList **query_list, char **query)
1374 *query_list = g_list_append(*query_list, *query);
1377 void _media_svc_sql_query_release(GList **query_list)
1380 g_list_free(*query_list);
1385 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1387 if (user_version < LATEST_VERSION_NUMBER) {
1388 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1389 return __media_svc_db_upgrade(db_handle, user_version, uid);
1391 return MS_MEDIA_ERR_NONE;