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);
37 static GHashTable *table;
38 static GSList *column_list[MEDIA_SVC_DB_LIST_MAX];
40 int __media_svc_add_table_info(const char *name, const char *trigger_name, const char *event_table, const char *action_table, const char *view_name)
42 table_info_s *tbl = NULL;
44 media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
46 if (STRING_VALID(trigger_name)) {
47 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
48 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
51 tbl = malloc(sizeof(table_info_s));
53 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
54 return MS_MEDIA_ERR_OUT_OF_MEMORY;
57 memset(tbl, 0x00, sizeof(table_info_s));
59 if (STRING_VALID(trigger_name)) {
60 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
61 if (tbl->trigger_name == NULL) {
62 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
64 return MS_MEDIA_ERR_OUT_OF_MEMORY;
67 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
68 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
70 tbl->event_table = strndup(event_table, strlen(event_table));
71 tbl->action_table = strndup(action_table, strlen(action_table));
74 if (STRING_VALID(view_name))
75 tbl->view_name = strndup(view_name, strlen(view_name));
77 g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
79 return MS_MEDIA_ERR_NONE;
82 int __media_svc_add_column_info(GSList **slist, const char *name, const char *type, const char *option, int version, const char *index_name, bool is_unique, bool is_trigger, bool is_view)
84 column_info_s *col = NULL;
85 col = malloc(sizeof(column_info_s));
87 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
88 return MS_MEDIA_ERR_OUT_OF_MEMORY;
90 memset(col, 0, sizeof(column_info_s));
92 col->name = strndup(name, strlen(name));
93 col->type = strndup(type, strlen(type));
95 col->has_option = true;
96 col->option = strndup(option, strlen(option));
98 col->has_option = false;
100 col->version = version;
101 if (index_name != NULL) {
102 col->is_index = true;
103 col->index_name = strndup(index_name, strlen(index_name));
105 col->is_index = false;
107 col->is_unique = is_unique;
108 col->is_trigger = is_trigger;
109 col->is_view = is_view;
110 *slist = g_slist_append(*slist, col);
112 return MS_MEDIA_ERR_NONE;
115 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
117 int ret = MS_MEDIA_ERR_NONE;
118 column_info_s *col_ptr = NULL;
120 char table_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
121 char temp[1024] = {0, };
125 _media_svc_update_media_view(db_handle, uid);
127 /*drop playlist_view, tag_view */
128 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
129 ret = _media_svc_sql_query(sql, uid);
130 SQLITE3_SAFE_FREE(sql);
131 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
133 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
134 ret = _media_svc_sql_query(sql, uid);
135 SQLITE3_SAFE_FREE(sql);
136 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
138 /*create playlist_view */
139 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
140 for (i = 1; i < len; i++) {
141 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
142 if (col_ptr->is_view) {
144 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
145 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
147 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
149 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
152 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
154 memset(temp, 0, sizeof(temp));
156 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
157 for (i = 1; i < len; i++) {
158 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
159 if (col_ptr->is_view) {
160 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
161 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
163 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
164 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
166 memset(temp, 0, sizeof(temp));
169 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
170 for (i = 1; i < len; i++) {
171 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
172 if (col_ptr->is_view) {
173 snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
174 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
176 memset(temp, 0, sizeof(temp));
178 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
179 ret = _media_svc_sql_query(sql, uid);
180 SQLITE3_SAFE_FREE(sql);
181 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
185 memset(table_query, 0, sizeof(table_query));
187 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
188 for (i = 1; i < len; i++) {
189 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
190 if (col_ptr->is_view) {
192 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
194 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
197 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
199 memset(temp, 0, sizeof(temp));
201 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
202 for (i = 1; i < len; i++) {
203 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
204 if (col_ptr->is_view) {
205 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
206 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
208 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
209 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
211 memset(temp, 0, sizeof(temp));
214 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
215 for (i = 1; i < len; i++) {
216 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
217 if (col_ptr->is_view) {
218 snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
219 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
221 memset(temp, 0, sizeof(temp));
223 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
224 ret = _media_svc_sql_query(sql, uid);
225 SQLITE3_SAFE_FREE(sql);
226 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
228 return MS_MEDIA_ERR_NONE;
231 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
233 int ret = MS_MEDIA_ERR_NONE;
234 table_info_s *tb = NULL;
235 column_info_s *col_ptr = NULL;
237 char table_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
238 char index_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
239 char trigger_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
240 char table_query_sub[1024] = {0, };
241 char temp[1024] = {0 ,};
243 bool sub_flag = false;
247 tb = g_hash_table_lookup(table, table_name);
249 media_svc_debug("lookup fail.. table name [%s] ", table_name);
250 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
253 len = g_slist_length(column_list[list]);
256 media_svc_error("Invalid column");
257 return MS_MEDIA_ERR_INTERNAL;
260 for (i = 1; i < len; i++) {
261 col_ptr = g_slist_nth_data(column_list[list], i);
263 if (col_ptr->has_option) {
265 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
267 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
270 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
273 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
275 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
278 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
280 memset(temp, 0, sizeof(temp));
283 if (col_ptr->is_unique) {
284 if (sub_flag == true) {
285 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
287 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
290 SAFE_STRLCAT(table_query_sub, temp, sizeof(table_query_sub));
292 memset(temp, 0, sizeof(temp));
295 if (col_ptr->is_index) {
296 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
297 SAFE_STRLCAT(index_query, temp, sizeof(index_query));
299 memset(temp, 0, sizeof(temp));
302 if (col_ptr->is_trigger) {
303 if (STRING_VALID(tb->trigger_name)) {
304 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0)
305 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER_WITH_COUNT, tb->trigger_name, tb->event_table, tb->action_table, tb->event_table, col_ptr->name, col_ptr->name, col_ptr->name, col_ptr->name);
307 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
309 SAFE_STRLCAT(trigger_query, temp, sizeof(trigger_query));
311 media_svc_error("invalid trigger name");
314 memset(temp, 0, sizeof(temp));
318 if (sub_flag == true) {
319 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
320 ret = _media_svc_sql_query(sql, uid);
321 SQLITE3_SAFE_FREE(sql);
322 memset(table_query, 0, sizeof(table_query));
323 memset(table_query_sub, 0, sizeof(table_query_sub));
324 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
326 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
327 ret = _media_svc_sql_query(sql, uid);
328 SQLITE3_SAFE_FREE(sql);
329 memset(table_query, 0, sizeof(table_query));
330 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
333 if (STRING_VALID(index_query)) {
334 ret = _media_svc_sql_query(index_query, uid);
335 memset(index_query, 0, sizeof(index_query));
336 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
339 if (STRING_VALID(trigger_query)) {
340 ret = _media_svc_sql_query(trigger_query, uid);
341 memset(trigger_query, 0, sizeof(trigger_query));
342 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
347 if (tb != NULL && tb->view_name != NULL) {
348 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
349 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->view_name, table_name);
350 ret = _media_svc_sql_query(sql, uid);
351 SQLITE3_SAFE_FREE(sql);
352 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
354 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
355 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
356 for (i = 1; i < len; i++) {
357 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
358 if (col_ptr->is_view) {
360 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
361 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
363 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
365 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
368 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
370 memset(temp, 0, sizeof(temp));
372 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
373 for (i = 1; i < len; i++) {
374 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
375 if (col_ptr->is_view) {
376 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
377 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
379 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
380 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
382 memset(temp, 0, sizeof(temp));
385 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
386 for (i = 1; i < len; i++) {
387 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
388 if (col_ptr->is_view) {
389 snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
390 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
392 memset(temp, 0, sizeof(temp));
394 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->view_name, table_query);
395 ret = _media_svc_sql_query(sql, uid);
396 SQLITE3_SAFE_FREE(sql);
397 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
400 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
401 for (i = 1; i < len; i++) {
402 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
403 if (col_ptr->is_view) {
405 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
407 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
410 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
412 memset(temp, 0, sizeof(temp));
414 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
415 for (i = 1; i < len; i++) {
416 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
417 if (col_ptr->is_view) {
418 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
419 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
421 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
422 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
424 memset(temp, 0, sizeof(temp));
427 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
428 for (i = 1; i < len; i++) {
429 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
430 if (col_ptr->is_view) {
431 snprintf(temp, sizeof(temp), ", media_view.%s", col_ptr->name);
432 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
434 memset(temp, 0, sizeof(temp));
436 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->view_name, table_query);
437 ret = _media_svc_sql_query(sql, uid);
438 SQLITE3_SAFE_FREE(sql);
439 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
443 return MS_MEDIA_ERR_NONE;
446 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
448 int ret = MS_MEDIA_ERR_NONE;
449 column_info_s *col_ptr = NULL;
451 char temp[1024] = {0, };
454 sqlite3_stmt *sql_stmt = NULL;
456 len = g_slist_length(column_list[list]);
458 sql = sqlite3_mprintf("PRAGMA user_version");
459 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
461 if (ret != MS_MEDIA_ERR_NONE) {
462 media_svc_error("error when get user_version. err = [%d]", ret);
465 cur_version = sqlite3_column_int(sql_stmt, 0);
466 SQLITE3_FINALIZE(sql_stmt);
468 len = g_slist_length(column_list[list]);
469 for (i = 1; i < len; i++) {
470 col_ptr = g_slist_nth_data(column_list[list], i);
471 if (col_ptr->version > cur_version) {
473 if (col_ptr->has_option)
474 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
476 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
477 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
478 ret = _media_svc_sql_query(sql, uid);
479 SQLITE3_SAFE_FREE(sql);
480 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
482 if (col_ptr->is_index) {
483 memset(temp, 0, sizeof(temp));
484 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
485 ret = _media_svc_sql_query(temp, uid);
486 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
489 memset(temp, 0, sizeof(temp));
492 return MS_MEDIA_ERR_NONE;
495 int _media_svc_init_table_query(const char *event_table_name)
497 int ret = MS_MEDIA_ERR_NONE;
500 /*variable initialize.. */
501 table = g_hash_table_new(g_str_hash, g_str_equal);
502 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
503 column_list[i] = g_slist_alloc();
505 /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
506 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
507 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
508 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TRIGGER_FOLDER, event_table_name, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
509 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
510 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP, event_table_name, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, NULL);
511 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
512 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP1, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_VIEW_PLAYLIST);
513 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
514 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_TRIGGER_ALBUM, event_table_name, MEDIA_SVC_DB_TABLE_ALBUM, NULL);
515 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
516 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_TRIGGER_TAG_MAP, event_table_name, MEDIA_SVC_DB_TABLE_TAG_MAP, NULL);
517 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
518 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TRIGGER_TAG_MAP1, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_VIEW_TAG);
519 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
520 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TRIGGER_BOOKMARK, event_table_name, MEDIA_SVC_DB_TABLE_BOOKMARK, NULL);
521 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
522 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
523 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
524 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, NULL);
525 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
526 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, NULL);
527 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
529 /*insert column info.. */
531 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, true);
532 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
533 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
534 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
535 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", false, false, true);
536 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
537 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
538 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
539 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
540 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
541 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
542 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
543 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
544 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
545 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", false, false, true);
546 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
547 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
548 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
549 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
550 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
551 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
552 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
553 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
554 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
555 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
556 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
557 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
558 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
559 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
560 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
561 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
562 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
563 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
564 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
565 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
566 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
567 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
568 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
569 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
570 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
571 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
572 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
573 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
574 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
575 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
576 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
577 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
578 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
579 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
580 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
581 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
582 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
583 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
584 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
585 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
586 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
587 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
588 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
589 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
590 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
591 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
592 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
593 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
594 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
595 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
596 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
597 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
598 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
599 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
600 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
601 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
602 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
603 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
604 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
605 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
606 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
607 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
608 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
609 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
610 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
611 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
612 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
613 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
614 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
615 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_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], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
618 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
619 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
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], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
640 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
641 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
642 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);
643 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
644 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);
645 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
646 /* color column is added with dcm. (DB v5) */
647 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_360", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V5, NULL, false, false, true);
648 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
651 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);
652 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
653 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);
654 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
655 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
656 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
657 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);
658 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
659 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);
660 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
661 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);
662 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
663 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
664 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);
665 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
666 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);
667 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
670 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);
671 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
672 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);
673 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
674 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);
675 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
676 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);
677 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
680 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);
681 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
682 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);
683 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
684 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);
685 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
686 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);
687 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
690 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);
691 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
692 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);
693 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
694 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);
695 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
696 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);
697 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
700 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);
701 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
702 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);
703 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
704 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);
705 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
708 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);
709 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
710 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);
711 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
712 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);
713 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
716 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);
717 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
718 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);
719 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
720 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);
721 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
722 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);
723 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
724 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V6, NULL, false, false, false);
725 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
728 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V3, NULL, false, false, false);
729 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
730 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);
731 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
732 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);
733 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
734 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);
735 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
738 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V4, NULL, false, true, false);
739 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
740 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);
741 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
744 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V4, NULL, false, false, false);
745 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
746 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, true, false);
747 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
748 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);
749 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
750 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);
751 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
752 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);
753 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
754 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);
755 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
756 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
757 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
758 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
759 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
763 void __media_svc_table_free(table_info_s *tb)
765 SAFE_FREE(tb->trigger_name);
766 SAFE_FREE(tb->view_name);
767 SAFE_FREE(tb->event_table);
768 SAFE_FREE(tb->action_table);
772 void __media_svc_column_free(column_info_s *col)
774 SAFE_FREE(col->name);
775 SAFE_FREE(col->type);
776 SAFE_FREE(col->option);
777 SAFE_FREE(col->index_name);
781 void _media_svc_destroy_table_query()
784 table_info_s *tb = NULL;
785 column_info_s *col_ptr = NULL;
789 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
790 __media_svc_table_free(tb);
791 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
793 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
794 __media_svc_table_free(tb);
795 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
797 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
798 __media_svc_table_free(tb);
799 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
801 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
802 __media_svc_table_free(tb);
803 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
805 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
806 __media_svc_table_free(tb);
807 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
809 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
810 __media_svc_table_free(tb);
811 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
813 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
814 __media_svc_table_free(tb);
815 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
817 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
818 __media_svc_table_free(tb);
819 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
821 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
822 __media_svc_table_free(tb);
823 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
825 g_hash_table_destroy(table);
828 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
830 for (i = 1; i < len; i++) {
831 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
832 __media_svc_column_free(col_ptr);
835 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
837 for (i = 1; i < len; i++) {
838 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
839 __media_svc_column_free(col_ptr);
842 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
844 for (i = 1; i < len; i++) {
845 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
846 __media_svc_column_free(col_ptr);
849 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
851 for (i = 1; i < len; i++) {
852 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
853 __media_svc_column_free(col_ptr);
856 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
858 for (i = 1; i < len; i++) {
859 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
860 __media_svc_column_free(col_ptr);
863 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
865 for (i = 1; i < len; i++) {
866 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
867 __media_svc_column_free(col_ptr);
870 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
872 for (i = 1; i < len; i++) {
873 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
874 __media_svc_column_free(col_ptr);
877 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
879 for (i = 1; i < len; i++) {
880 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
881 __media_svc_column_free(col_ptr);
884 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
886 for (i = 1; i < len; i++) {
887 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
888 __media_svc_column_free(col_ptr);
891 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
892 g_slist_free(column_list[i]);
896 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
898 int ret = MS_MEDIA_ERR_NONE;
901 media_svc_debug_fenter();
903 ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
904 if (ret != MS_MEDIA_ERR_NONE) {
905 media_svc_error("Query initialization failed");
909 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
910 if (ret != MS_MEDIA_ERR_NONE) {
911 media_svc_error("_media_svc_upgrade_table_query failed");
915 /* Upgrade issue in folder table tizen 2.3(unique:path, name, storage_type) to 2.4(unique:path, name, storage_uuid) */
916 if (cur_version < USER_V4) {
917 /* Create tmp table */
918 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
920 media_svc_error("_media_svc_upgrade_table_query failed");
921 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
925 ret = _media_svc_sql_query(sql, uid);
926 if (ret != MS_MEDIA_ERR_NONE)
927 media_svc_error("Error when create backup folder table");
928 SQLITE3_SAFE_FREE(sql);
930 /* Drop original table */
931 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
933 media_svc_error("_media_svc_upgrade_table_query failed");
934 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
938 ret = _media_svc_sql_query(sql, uid);
939 if (ret != MS_MEDIA_ERR_NONE)
940 media_svc_error("Error when drop table");
941 SQLITE3_SAFE_FREE(sql);
943 /* Create new table */
944 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
945 if (ret != MS_MEDIA_ERR_NONE) {
946 media_svc_error("_media_svc_make_table_query failed");
950 /* Insert into new table */
951 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);
953 media_svc_error("Query creation failed");
954 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
958 ret = _media_svc_sql_query(sql, uid);
959 if (ret != MS_MEDIA_ERR_NONE)
960 media_svc_error("Error when backup folder table");
961 SQLITE3_SAFE_FREE(sql);
964 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
966 media_svc_error("Query creation failed");
967 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
971 ret = _media_svc_sql_query(sql, uid);
972 if (ret != MS_MEDIA_ERR_NONE)
973 media_svc_error("Error when drop backup folder table");
974 SQLITE3_SAFE_FREE(sql);
977 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
978 if (ret != MS_MEDIA_ERR_NONE) {
979 media_svc_error("_media_svc_upgrade_table_query failed");
984 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
985 if (ret != MS_MEDIA_ERR_NONE) {
986 media_svc_error("_media_svc_upgrade_table_query failed");
990 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
991 if (ret != MS_MEDIA_ERR_NONE) {
992 media_svc_error("_media_svc_upgrade_table_query failed");
996 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
997 if (ret != MS_MEDIA_ERR_NONE) {
998 media_svc_error("_media_svc_upgrade_table_query failed");
1002 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1003 if (ret != MS_MEDIA_ERR_NONE) {
1004 media_svc_error("_media_svc_upgrade_table_query failed");
1008 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
1009 if (ret != MS_MEDIA_ERR_NONE) {
1010 media_svc_error("_media_svc_upgrade_table_query failed");
1014 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1015 if (ret != MS_MEDIA_ERR_NONE) {
1016 media_svc_error("_media_svc_upgrade_table_query failed");
1020 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1021 if (ret != MS_MEDIA_ERR_NONE) {
1022 media_svc_error("_media_svc_upgrade_table_query failed");
1026 if (cur_version < USER_V4) {
1027 /* Need to default value in storage_uuid */
1028 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_MEDIA, "media");
1030 media_svc_error("Query creation failed");
1031 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1035 ret = _media_svc_sql_query(sql, uid);
1036 SQLITE3_SAFE_FREE(sql);
1038 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_FOLDER, "media");
1040 media_svc_error("Query creation failed");
1041 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1045 ret = _media_svc_sql_query(sql, uid);
1046 SQLITE3_SAFE_FREE(sql);
1049 /* Upgrade issue tizen 3.0 to 4.0 */
1050 if (cur_version < USER_V6) {
1051 /******Upgrade Storage Table******/
1052 /* remove "storage_account" column */
1053 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1055 media_svc_error("Query creation failed");
1056 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1060 ret = _media_svc_sql_query(sql, uid);
1061 SQLITE3_SAFE_FREE(sql);
1062 if (ret != MS_MEDIA_ERR_NONE) {
1063 media_svc_error("_media_svc_sql_query failed");
1067 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1068 if (ret != MS_MEDIA_ERR_NONE) {
1069 media_svc_error("_media_svc_make_table_query failed");
1073 sql = sqlite3_mprintf("INSERT INTO %q (storage_uuid, storage_name, storage_path, storage_type, scan_status, validity) SELECT storage_uuid, storage_name, storage_path, storage_type, scan_status, validity FROM %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1075 media_svc_error("Query creation failed");
1076 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1080 ret = _media_svc_sql_query(sql, uid);
1081 SQLITE3_SAFE_FREE(sql);
1082 if (ret != MS_MEDIA_ERR_NONE) {
1083 media_svc_error("_media_svc_sql_query failed");
1087 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1089 media_svc_error("Query creation failed");
1090 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1094 ret = _media_svc_sql_query(sql, uid);
1095 SQLITE3_SAFE_FREE(sql);
1096 if (ret != MS_MEDIA_ERR_NONE) {
1097 media_svc_error("_media_svc_sql_query failed");
1101 /******Upgrade Folder Table******/
1102 /* remove "parent_folder_uuid" column */
1103 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1105 media_svc_error("Query creation failed");
1106 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1110 ret = _media_svc_sql_query(sql, uid);
1111 SQLITE3_SAFE_FREE(sql);
1112 if (ret != MS_MEDIA_ERR_NONE) {
1113 media_svc_error("_media_svc_sql_query failed");
1117 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1118 if (ret != MS_MEDIA_ERR_NONE) {
1119 media_svc_error("_media_svc_make_table_query failed");
1123 sql = sqlite3_mprintf("INSERT INTO %q (folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, folder_order, validity, scan_status) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, folder_order, validity, scan_status FROM %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1125 media_svc_error("Query creation failed");
1126 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1130 ret = _media_svc_sql_query(sql, uid);
1131 SQLITE3_SAFE_FREE(sql);
1132 if (ret != MS_MEDIA_ERR_NONE) {
1133 media_svc_error("_media_svc_sql_query failed");
1137 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1139 media_svc_error("Query creation failed");
1140 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1144 ret = _media_svc_sql_query(sql, uid);
1145 SQLITE3_SAFE_FREE(sql);
1146 if (ret != MS_MEDIA_ERR_NONE) {
1147 media_svc_error("_media_svc_sql_query failed");
1151 /******Upgrade Face Table******/
1152 sql = sqlite3_mprintf("DROP TABLE %q; DROP TABLE %q; ", MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE);
1154 media_svc_error("Query creation failed");
1155 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1159 ret = _media_svc_sql_query(sql, uid);
1160 SQLITE3_SAFE_FREE(sql);
1161 if (ret != MS_MEDIA_ERR_NONE) {
1162 media_svc_error("_media_svc_sql_query failed");
1166 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_LIST_FACE_SCAN_LIST, uid);
1167 if (ret != MS_MEDIA_ERR_NONE) {
1168 media_svc_error("_media_svc_make_table_query failed");
1172 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_LIST_FACE, uid);
1173 if (ret != MS_MEDIA_ERR_NONE) {
1174 media_svc_error("_media_svc_make_table_query failed");
1180 /* Upgrade issue tizen 4.0 to 5.0 */
1181 if (cur_version < USER_V7) {
1182 /******Upgrade Folder Table******/
1183 /* remove "scan_status" column */
1184 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1186 media_svc_error("Query creation failed");
1187 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1191 ret = _media_svc_sql_query(sql, uid);
1192 SQLITE3_SAFE_FREE(sql);
1193 if (ret != MS_MEDIA_ERR_NONE) {
1194 media_svc_error("_media_svc_sql_query failed");
1198 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1199 if (ret != MS_MEDIA_ERR_NONE) {
1200 media_svc_error("_media_svc_make_table_query failed");
1204 sql = sqlite3_mprintf("INSERT INTO %q (folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, folder_order, validity) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type, storage_uuid, folder_order, validity FROM %q;", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1206 media_svc_error("Query creation failed");
1207 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1211 ret = _media_svc_sql_query(sql, uid);
1212 SQLITE3_SAFE_FREE(sql);
1213 if (ret != MS_MEDIA_ERR_NONE) {
1214 media_svc_error("_media_svc_sql_query failed");
1218 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1220 media_svc_error("Query creation failed");
1221 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1225 ret = _media_svc_sql_query(sql, uid);
1226 SQLITE3_SAFE_FREE(sql);
1227 if (ret != MS_MEDIA_ERR_NONE) {
1228 media_svc_error("_media_svc_sql_query failed");
1233 /******Upgrade Storage Table******/
1234 /* remove "scan_status", "storage_name" column */
1235 sql = sqlite3_mprintf("ALTER TABLE %q RENAME TO %q;", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1237 media_svc_error("Query creation failed");
1238 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1242 ret = _media_svc_sql_query(sql, uid);
1243 SQLITE3_SAFE_FREE(sql);
1244 if (ret != MS_MEDIA_ERR_NONE) {
1245 media_svc_error("_media_svc_sql_query failed");
1249 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1250 if (ret != MS_MEDIA_ERR_NONE) {
1251 media_svc_error("_media_svc_make_table_query failed");
1255 sql = sqlite3_mprintf("INSERT INTO %q (storage_uuid, 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);
1257 media_svc_error("Query creation failed");
1258 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1262 ret = _media_svc_sql_query(sql, uid);
1263 SQLITE3_SAFE_FREE(sql);
1264 if (ret != MS_MEDIA_ERR_NONE) {
1265 media_svc_error("_media_svc_sql_query failed");
1269 sql = sqlite3_mprintf("DROP TABLE %q;", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1271 media_svc_error("Query creation failed");
1272 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1276 ret = _media_svc_sql_query(sql, uid);
1277 SQLITE3_SAFE_FREE(sql);
1278 if (ret != MS_MEDIA_ERR_NONE) {
1279 media_svc_error("_media_svc_sql_query failed");
1284 /* Rebuilding view */
1285 ret = __media_svc_rebuild_view_query(db_handle, uid);
1287 /* Update user version */
1288 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1290 media_svc_error("Query creation failed");
1291 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1295 ret = _media_svc_sql_query(sql, uid);
1296 SQLITE3_SAFE_FREE(sql);
1298 _media_svc_destroy_table_query();
1300 media_svc_debug_fleave();
1305 _media_svc_destroy_table_query();
1310 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1312 int ret = MS_MEDIA_ERR_NONE;
1314 media_svc_sec_debug("[SQL query] : %s", sql_str);
1316 ret = media_db_request_update_db(sql_str, uid);
1321 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1323 int ret = MS_MEDIA_ERR_NONE;
1324 sqlite3_stmt *sql_stmt = NULL;
1325 char *sql = sqlite3_mprintf("PRAGMA user_version;");
1327 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1328 if (ret != MS_MEDIA_ERR_NONE) {
1329 media_svc_error("error when get user_version.");
1333 *user_version = sqlite3_column_int(sql_stmt, 0);
1334 SQLITE3_FINALIZE(sql_stmt);
1336 return MS_MEDIA_ERR_NONE;
1339 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1343 media_svc_retvm_if(sql_str == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "invalid query");
1345 if (handle == NULL) {
1346 media_svc_error("handle is NULL");
1347 sqlite3_free((char *)sql_str);
1348 return MS_MEDIA_ERR_INVALID_PARAMETER;
1351 media_svc_sec_debug("[SQL query] : %s", sql_str);
1353 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1354 sqlite3_free((char *)sql_str);
1356 if (err != SQLITE_OK) {
1357 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1358 if (err == SQLITE_CORRUPT)
1359 return MS_MEDIA_ERR_DB_CORRUPT;
1360 else if (err == SQLITE_PERM)
1361 return MS_MEDIA_ERR_DB_PERMISSION;
1363 return MS_MEDIA_ERR_DB_INTERNAL;
1366 err = sqlite3_step(*stmt);
1367 if (err != SQLITE_ROW) {
1368 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1369 SQLITE3_FINALIZE(*stmt);
1370 return MS_MEDIA_ERR_DB_NO_RECORD;
1373 return MS_MEDIA_ERR_NONE;
1376 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1380 media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "handle is NULL");
1382 media_svc_sec_debug("[SQL query] : %s", sql_str);
1384 if (!STRING_VALID(sql_str)) {
1385 media_svc_error("invalid query");
1386 return MS_MEDIA_ERR_INVALID_PARAMETER;
1389 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1390 sqlite3_free((char *)sql_str);
1392 if (err != SQLITE_OK) {
1393 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1394 if (err == SQLITE_CORRUPT)
1395 return MS_MEDIA_ERR_DB_CORRUPT;
1396 else if (err == SQLITE_PERM)
1397 return MS_MEDIA_ERR_DB_PERMISSION;
1399 return MS_MEDIA_ERR_DB_INTERNAL;
1402 return MS_MEDIA_ERR_NONE;
1405 int _media_svc_sql_begin_trans(uid_t uid)
1407 int ret = MS_MEDIA_ERR_NONE;
1409 media_svc_debug("Batch start(Transaction block version)");
1411 ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1416 int _media_svc_sql_end_trans(uid_t uid)
1418 int ret = MS_MEDIA_ERR_NONE;
1420 media_svc_debug("Batch end(Transaction block version)");
1422 ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1427 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1429 int ret = MS_MEDIA_ERR_NONE;
1431 int length = g_list_length(*query_list);
1433 char query_bundle[MEDIA_SVC_QUERY_LEN_MAX] = {0, };
1437 media_svc_debug("query list length : [%d]", length);
1439 memset(query_bundle, 0, sizeof(query_bundle));
1441 for (idx = 0; idx < length; idx++) {
1442 sql = (char *)g_list_nth_data(*query_list, idx);
1443 if (STRING_VALID(sql)) {
1444 query_len = strlen(sql);
1446 if (query_len >= (sizeof(query_bundle) - 1)) {
1447 media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1448 SQLITE3_SAFE_FREE(sql);
1452 if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1453 ret = media_db_request_update_db_batch(query_bundle, uid);
1454 if (ret != MS_MEDIA_ERR_NONE)
1455 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1457 memset(query_bundle, 0, sizeof(query_bundle));
1459 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1460 /* Consider inserting the basic information without metadata */
1461 /* Refer : SQLITE3 spec In Tizen 3.0 */
1462 /* Single query limit size = 1 billion bytes(1GiB) */
1463 /* DB limit size = 1 billion bytes(1GiB) */
1464 /* column limit = 2000 */
1467 SAFE_STRLCAT(query_bundle, sql, sizeof(query_bundle));
1468 total_len += query_len;
1470 SQLITE3_SAFE_FREE(sql);
1474 if (total_len > 0) {
1475 ret = media_db_request_update_db_batch(query_bundle, uid);
1476 if (ret != MS_MEDIA_ERR_NONE)
1477 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1479 memset(query_bundle, 0, sizeof(query_bundle));
1483 _media_svc_sql_query_release(query_list);
1485 return MS_MEDIA_ERR_NONE;
1489 void _media_svc_sql_query_add(GList **query_list, char **query)
1491 *query_list = g_list_append(*query_list, *query);
1494 void _media_svc_sql_query_release(GList **query_list)
1497 media_svc_debug("_svc_sql_query_release");
1498 g_list_free(*query_list);
1503 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1505 if (user_version < LATEST_VERSION_NUMBER) {
1506 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1507 return __media_svc_db_upgrade(db_handle, user_version, uid);
1509 return MS_MEDIA_ERR_NONE;
1513 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1515 int ret = MS_MEDIA_ERR_NONE;
1517 ret = _media_svc_init_table_query(table_id);
1518 if (ret != MS_MEDIA_ERR_NONE) {
1519 media_svc_error("_media_svc_init_table_query failed");
1523 ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1524 if (ret != MS_MEDIA_ERR_NONE) {
1525 media_svc_error("_media_svc_make_table_query failed");
1529 /* Add for trigger */
1530 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1531 if (ret != MS_MEDIA_ERR_NONE) {
1532 media_svc_error("_media_svc_make_table_query failed");
1536 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1537 if (ret != MS_MEDIA_ERR_NONE) {
1538 media_svc_error("_media_svc_make_table_query failed");
1542 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1543 if (ret != MS_MEDIA_ERR_NONE) {
1544 media_svc_error("_media_svc_make_table_query failed");
1548 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1549 if (ret != MS_MEDIA_ERR_NONE) {
1550 media_svc_error("_media_svc_make_table_query failed");
1554 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1555 if (ret != MS_MEDIA_ERR_NONE) {
1556 media_svc_error("_media_svc_make_table_query failed");
1560 _media_svc_destroy_table_query();
1565 _media_svc_destroy_table_query();
1570 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1572 int ret = MS_MEDIA_ERR_NONE;
1574 sqlite3_stmt *sql_stmt = NULL;
1577 GList *storage_list = NULL;
1578 char view_query[MEDIA_SVC_QUERY_LEN_NORMAL] = {0, };
1579 memset(view_query, 0x00, sizeof(view_query));
1581 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);
1583 /*Select list of storage*/
1584 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);
1585 ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1586 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1588 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1589 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1590 storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1592 SQLITE3_FINALIZE(sql_stmt);
1594 if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1595 item_cnt = g_list_length(storage_list);
1597 for (idx = 0; idx < item_cnt; idx++) {
1599 char *storage_id = NULL;
1600 storage_id = g_list_nth_data(storage_list, idx);
1602 if (STRING_VALID(storage_id)) {
1603 /*Select list of storage*/
1604 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1605 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1606 if (ret != MS_MEDIA_ERR_NONE) {
1607 SAFE_FREE(storage_id);
1611 table_cnt = sqlite3_column_int(sql_stmt, 0);
1612 SQLITE3_FINALIZE(sql_stmt);
1614 if (table_cnt > 0) {
1615 char append_query[128] = {0, };
1616 memset(append_query, 0x00, sizeof(append_query));
1617 snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1618 SAFE_STRLCAT(view_query, append_query, sizeof(view_query));
1620 media_svc_error("media table not exist for storage [%s]", storage_id);
1623 SAFE_FREE(storage_id);
1626 g_list_free(storage_list);
1629 ret = _media_svc_sql_query(view_query, uid);
1630 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);