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.
25 #include <media-util.h>
29 #include "media-svc-env.h"
30 #include "media-svc-debug.h"
31 #include "media-svc-util.h"
32 #include "media-svc-db-utils.h"
33 #include "media-util-err.h"
34 #include "media-util-db.h"
35 #include "media-svc-media.h"
37 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid);
38 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid);
41 static GHashTable *table;
42 static GSList *column_list[MEDIA_SVC_DB_LIST_MAX];
44 char *_media_svc_get_path(uid_t uid)
47 char *result_passwd = NULL;
48 struct group *grpinfo = NULL;
49 if (uid == getuid()) {
50 grpinfo = getgrnam("users");
51 if (grpinfo == NULL) {
52 media_svc_error("getgrnam(users) returns NULL !");
55 len = strlen(MEDIA_ROOT_PATH_INTERNAL);
57 result_passwd = strndup(MEDIA_ROOT_PATH_INTERNAL, len);
59 char passwd_str[MEDIA_SVC_PATHNAME_SIZE] = {0, };
60 struct passwd *userinfo = getpwuid(uid);
61 if (userinfo == NULL) {
62 media_svc_error("getpwuid(%d) returns NULL !", uid);
65 grpinfo = getgrnam("users");
66 if (grpinfo == NULL) {
67 media_svc_error("getgrnam(users) returns NULL !");
70 /* Compare git_t type and not group name */
71 if (grpinfo->gr_gid != userinfo->pw_gid) {
72 media_svc_error("UID [%d] does not belong to 'users' group!", uid);
75 len = snprintf(passwd_str, sizeof(passwd_str), "%s/%s", userinfo->pw_dir, MEDIA_CONTENT_PATH);
77 result_passwd = strndup(passwd_str, len);
83 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)
85 table_info_s *tbl = NULL;
87 media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
89 if (STRING_VALID(trigger_name)) {
90 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
91 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
94 tbl = malloc(sizeof(table_info_s));
96 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
97 return MS_MEDIA_ERR_OUT_OF_MEMORY;
100 memset(tbl, 0x00, sizeof(table_info_s));
102 if (STRING_VALID(trigger_name)) {
103 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
104 if (tbl->trigger_name == NULL) {
105 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
107 return MS_MEDIA_ERR_OUT_OF_MEMORY;
110 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
111 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
113 tbl->event_table = strndup(event_table, strlen(event_table));
114 tbl->action_table = strndup(action_table, strlen(action_table));
117 if (STRING_VALID(view_name))
118 tbl->view_name = strndup(view_name, strlen(view_name));
120 g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
122 return MS_MEDIA_ERR_NONE;
125 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)
127 column_info_s *col = NULL;
128 col = malloc(sizeof(column_info_s));
130 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
131 return MS_MEDIA_ERR_OUT_OF_MEMORY;
133 memset(col, 0, sizeof(column_info_s));
135 col->name = strndup(name, strlen(name));
136 col->type = strndup(type, strlen(type));
137 if (option != NULL) {
138 col->has_option = true;
139 col->option = strndup(option, strlen(option));
141 col->has_option = false;
143 col->version = version;
144 if (index_name != NULL) {
145 col->is_index = true;
146 col->index_name = strndup(index_name, strlen(index_name));
148 col->is_index = false;
150 col->is_unique = is_unique;
151 col->is_trigger = is_trigger;
152 col->is_view = is_view;
153 *slist = g_slist_append(*slist, col);
155 return MS_MEDIA_ERR_NONE;
158 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
160 int ret = MS_MEDIA_ERR_NONE;
161 column_info_s *col_ptr = NULL;
163 char table_query[4096] = {0, };
164 char temp[1024] = {0, };
168 _media_svc_update_media_view(db_handle, uid);
170 /*drop playlist_view, tag_view */
171 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
172 ret = _media_svc_sql_query(sql, uid);
174 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
176 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
177 ret = _media_svc_sql_query(sql, uid);
179 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
181 /*create playlist_view */
182 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
183 for (i = 1; i < len; i++) {
184 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
185 if (col_ptr->is_view) {
187 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
188 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
190 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
191 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
193 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
194 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
198 memset(temp, 0, sizeof(temp));
200 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
201 for (i = 1; i < len; i++) {
202 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
203 if (col_ptr->is_view) {
204 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
205 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
207 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
208 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
210 memset(temp, 0, sizeof(temp));
213 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
214 for (i = 1; i < len; i++) {
215 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
216 if (col_ptr->is_view) {
217 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
218 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
220 memset(temp, 0, sizeof(temp));
222 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
223 ret = _media_svc_sql_query(sql, uid);
225 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
229 memset(table_query, 0, sizeof(table_query));
231 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
232 for (i = 1; i < len; i++) {
233 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
234 if (col_ptr->is_view) {
236 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
237 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
239 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
240 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
244 memset(temp, 0, sizeof(temp));
246 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
247 for (i = 1; i < len; i++) {
248 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
249 if (col_ptr->is_view) {
250 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
251 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
253 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
254 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
256 memset(temp, 0, sizeof(temp));
259 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
260 for (i = 1; i < len; i++) {
261 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
262 if (col_ptr->is_view) {
263 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
264 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
266 memset(temp, 0, sizeof(temp));
268 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
269 ret = _media_svc_sql_query(sql, uid);
271 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
273 return MS_MEDIA_ERR_NONE;
276 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
278 int ret = MS_MEDIA_ERR_NONE;
279 table_info_s *tb = NULL;
280 column_info_s *col_ptr = NULL;
282 char table_query[4096] = {0, };
283 char index_query[4096] = {0, };
284 char trigger_query[4096] = {0, };
285 char table_query_sub[1024] = {0, };
286 char temp[1024] = {0 ,};
290 int table_sub_len = 0;
294 tb = g_hash_table_lookup(table, table_name);
296 media_svc_debug("lookup fail.. table name [%s] ", table_name);
297 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
300 len = g_slist_length(column_list[list]);
303 media_svc_error("Invalid column");
304 return MS_MEDIA_ERR_INTERNAL;
307 for (i = 1; i < len; i++) {
308 col_ptr = g_slist_nth_data(column_list[list], i);
310 if (col_ptr->has_option) {
312 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
313 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
315 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
316 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
321 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
322 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
324 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
325 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
329 memset(temp, 0, sizeof(temp));
332 if (col_ptr->is_unique) {
333 if (table_sub_len > 0) {
334 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
335 SAFE_STRLCAT(table_query_sub, temp, sizeof(table_query_sub));
336 table_sub_len = strlen(table_query_sub);
338 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
339 SAFE_STRLCPY(table_query_sub, temp, sizeof(table_query_sub));
340 table_sub_len = strlen(table_query_sub);
343 memset(temp, 0, sizeof(temp));
346 if (col_ptr->is_index) {
348 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
349 SAFE_STRLCAT(index_query, temp, sizeof(index_query));
350 index_len = strlen(index_query);
352 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
353 SAFE_STRLCPY(index_query, temp, sizeof(index_query));
354 index_len = strlen(index_query);
357 memset(temp, 0, sizeof(temp));
360 if (col_ptr->is_trigger) {
361 if (STRING_VALID(tb->trigger_name)) {
362 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0) {
363 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);
364 SAFE_STRLCPY(trigger_query, temp, sizeof(trigger_query));
365 trigger_len = strlen(trigger_query);
367 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
368 SAFE_STRLCPY(trigger_query, temp, sizeof(trigger_query));
369 trigger_len = strlen(trigger_query);
372 media_svc_error("invalid trigger name");
375 memset(temp, 0, sizeof(temp));
379 if (table_sub_len > 0) {
380 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
381 ret = _media_svc_sql_query(sql, uid);
383 memset(table_query, 0, sizeof(table_query));
384 memset(table_query_sub, 0, sizeof(table_query_sub));
385 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
387 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
388 ret = _media_svc_sql_query(sql, uid);
390 memset(table_query, 0, sizeof(table_query));
391 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
395 ret = _media_svc_sql_query(index_query, uid);
396 memset(index_query, 0, sizeof(index_query));
397 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
400 if (trigger_len > 0) {
401 ret = _media_svc_sql_query(trigger_query, uid);
402 memset(trigger_query, 0, sizeof(trigger_query));
403 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
408 if (tb != NULL && tb->view_name != NULL) {
409 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
410 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->view_name, table_name);
411 ret = _media_svc_sql_query(sql, uid);
413 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
415 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
416 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
417 for (i = 1; i < len; i++) {
418 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
419 if (col_ptr->is_view) {
421 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
422 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
424 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
425 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
427 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
428 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
432 memset(temp, 0, sizeof(temp));
434 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
435 for (i = 1; i < len; i++) {
436 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
437 if (col_ptr->is_view) {
438 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
439 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
441 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
442 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
444 memset(temp, 0, sizeof(temp));
447 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
448 for (i = 1; i < len; i++) {
449 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
450 if (col_ptr->is_view) {
451 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
452 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
454 memset(temp, 0, sizeof(temp));
456 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->view_name, table_query);
457 ret = _media_svc_sql_query(sql, uid);
459 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
462 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
463 for (i = 1; i < len; i++) {
464 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
465 if (col_ptr->is_view) {
467 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
468 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
470 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
471 SAFE_STRLCPY(table_query, temp, sizeof(table_query));
475 memset(temp, 0, sizeof(temp));
477 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
478 for (i = 1; i < len; i++) {
479 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
480 if (col_ptr->is_view) {
481 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
482 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
484 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
485 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
487 memset(temp, 0, sizeof(temp));
490 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
491 for (i = 1; i < len; i++) {
492 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
493 if (col_ptr->is_view) {
494 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
495 SAFE_STRLCAT(table_query, temp, sizeof(table_query));
497 memset(temp, 0, sizeof(temp));
499 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->view_name, table_query);
500 ret = _media_svc_sql_query(sql, uid);
502 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
507 return MS_MEDIA_ERR_NONE;
510 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
512 int ret = MS_MEDIA_ERR_NONE;
513 column_info_s *col_ptr = NULL;
515 char temp[1024] = {0, };
518 sqlite3_stmt *sql_stmt = NULL;
520 len = g_slist_length(column_list[list]);
522 sql = sqlite3_mprintf("PRAGMA user_version");
523 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
525 if (ret != MS_MEDIA_ERR_NONE) {
526 media_svc_error("error when get user_version. err = [%d]", ret);
529 cur_version = sqlite3_column_int(sql_stmt, 0);
530 SQLITE3_FINALIZE(sql_stmt);
532 len = g_slist_length(column_list[list]);
533 for (i = 1; i < len; i++) {
534 col_ptr = g_slist_nth_data(column_list[list], i);
535 if (col_ptr->version > cur_version) {
537 if (col_ptr->has_option)
538 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
540 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
541 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
542 ret = _media_svc_sql_query(sql, uid);
544 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
546 if (col_ptr->is_index) {
547 memset(temp, 0, sizeof(temp));
548 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
549 ret = _media_svc_sql_query(temp, uid);
550 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
553 memset(temp, 0, sizeof(temp));
556 return MS_MEDIA_ERR_NONE;
559 int _media_svc_init_table_query(const char *event_table_name)
561 int ret = MS_MEDIA_ERR_NONE;
564 /*variable initialize.. */
565 table = g_hash_table_new(g_str_hash, g_str_equal);
566 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
567 column_list[i] = g_slist_alloc();
569 /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
570 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
571 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
572 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);
573 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
574 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);
575 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
576 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);
577 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
578 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);
579 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
580 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);
581 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
582 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);
583 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
584 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);
585 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
586 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
587 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
588 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);
589 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
590 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);
591 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
592 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_UHD, MEDIA_SVC_DB_TRIGGER_UHD, event_table_name, MEDIA_SVC_DB_TABLE_UHD, NULL);
593 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
594 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PVR, MEDIA_SVC_DB_TRIGGER_PVR, event_table_name, MEDIA_SVC_DB_TABLE_PVR, NULL);
595 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
597 /*insert column info.. */
599 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);
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], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, true, 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], "file_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", true, 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], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
606 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
607 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
608 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
609 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "size", 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], "added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
612 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
613 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", 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], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
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], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, 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], "title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_title_idx", false, false, true);
620 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
621 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 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", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_album_idx", false, false, true);
624 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
625 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_artist_idx", false, false, true);
626 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
627 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
628 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
629 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_genre_idx", false, false, true);
630 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
631 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_composer_idx", false, false, true);
632 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
633 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
634 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
635 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
636 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
637 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
638 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
639 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
640 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
641 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
642 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
643 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
644 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
645 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
646 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
647 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
648 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
649 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
650 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
651 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
652 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
653 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
654 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
655 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
656 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
657 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
658 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
659 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
660 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
661 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
662 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
663 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
664 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
665 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
666 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
667 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
668 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
669 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
670 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
671 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
672 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
673 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
674 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
675 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "burst_id", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
676 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
677 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
678 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
679 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
680 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
681 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
682 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
683 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
684 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
685 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
686 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
687 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_author_idx", false, false, true);
688 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
689 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_provider_idx", false, false, true);
690 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
691 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_content_name_idx", false, false, true);
692 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
693 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
694 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
695 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_location_tag_idx", false, false, true);
696 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
697 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
698 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
699 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
700 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
701 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
702 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
703 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
704 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
705 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
706 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
707 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "weather", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
708 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
709 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
710 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
711 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
712 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
713 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
714 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
715 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
716 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
717 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
718 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
719 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
720 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
721 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
722 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
723 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
724 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
725 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
726 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
727 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
728 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
729 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
730 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
731 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
732 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
733 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
734 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
735 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
736 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
737 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
738 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
739 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);
740 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
741 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);
742 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
743 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
744 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);
745 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
746 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);
747 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
748 /* color column is added with dcm. (DB v5) */
749 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_r", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
750 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
751 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_g", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
752 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
753 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_b", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V5, NULL, false, false, false);
754 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
755 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_360", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V5, NULL, false, false, true);
756 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
759 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);
760 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
761 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);
762 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
763 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);
764 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
765 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);
766 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
767 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);
768 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
769 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);
770 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
771 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
772 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);
773 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
774 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_order", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
775 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
776 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "parent_folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
777 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
778 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);
779 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
780 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
781 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
784 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);
785 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
786 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, false);
787 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
788 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, true, false);
789 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
790 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "play_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, true);
791 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
794 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);
795 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
796 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);
797 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
798 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);
799 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
800 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);
801 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
804 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);
805 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
806 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);
807 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
808 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);
809 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
810 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);
811 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
814 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);
815 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
816 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "tag_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, true, false, false);
817 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
818 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);
819 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
822 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);
823 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
824 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);
825 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
826 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);
827 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
830 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);
831 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
832 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);
833 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
834 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);
835 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
836 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);
837 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
840 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, true, false, false);
841 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
842 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, true, false, false);
843 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
844 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);
845 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
846 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_account", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, false, false, false);
847 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
848 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);
849 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
850 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
851 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
852 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);
853 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
856 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, true, true, false);
857 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
858 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
859 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
862 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V3, NULL, true, false, false);
863 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
864 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, true, false);
865 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
866 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_x", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
867 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
868 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_y", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
869 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
870 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_w", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
871 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
872 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_h", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
873 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
874 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
875 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
876 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, false, false, false);
877 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
880 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V4, NULL, true, true, false);
881 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
882 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "uhd_storage_id_idx", true, false, false);
883 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
884 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, false, false, false);
885 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
886 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
887 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
888 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "content_id", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, false, false, false);
889 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
890 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "content_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
891 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
892 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "file_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
893 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
894 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
895 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
896 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "release_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
897 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
898 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
899 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
900 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
901 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
902 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "sub_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, false);
903 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
904 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_UHD], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
905 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
908 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V4, NULL, false, true, false);
909 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
910 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, "pvr_storage_id_idx", true, false, false);
911 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
912 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V4, NULL, true, false, false);
913 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
914 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
915 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
916 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
917 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
918 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "timezone", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
919 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
920 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ptc", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
921 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
922 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "major", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
923 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
924 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "minor", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
925 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
926 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
927 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
928 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
929 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
930 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "channel_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
931 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
932 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
933 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
934 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_num", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
935 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
936 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_crid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
937 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
938 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "guidance", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
939 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
940 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "synopsis", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
941 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
942 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
943 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
944 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "language", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
945 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
946 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "embargo_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
947 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
948 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "expiry_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
949 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
950 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "start_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
951 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
952 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_start_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
953 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
954 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_end_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
955 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
956 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "program_date", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
957 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
958 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "parental_rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
959 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
960 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "timer_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
961 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
962 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "series_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
963 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
964 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "hd", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
965 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
966 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "subtitle", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
967 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
968 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ttx", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
969 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
970 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "ad", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
971 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
972 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "hard_of_hearing_radio", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
973 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
974 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "data_service", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
975 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
976 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "content_lock", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
977 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
978 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "content_watch", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
979 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
980 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "has_audio_only", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
981 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
982 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "is_local_record", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
983 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
984 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "resolution", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
985 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
986 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "aspectratio", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
987 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
988 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "modified_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
989 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
990 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "sports_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
991 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
992 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "guidance_length", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
993 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
994 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "tvmode", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
995 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
996 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "play_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
997 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
998 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "private_data", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
999 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1000 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "highlight", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
1001 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1002 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PVR], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
1003 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1007 void __media_svc_table_free(table_info_s *tb)
1009 SAFE_FREE(tb->trigger_name);
1010 SAFE_FREE(tb->view_name);
1011 SAFE_FREE(tb->event_table);
1012 SAFE_FREE(tb->action_table);
1016 void __media_svc_column_free(column_info_s *col)
1018 SAFE_FREE(col->name);
1019 SAFE_FREE(col->type);
1020 SAFE_FREE(col->option);
1021 SAFE_FREE(col->index_name);
1025 void _media_svc_destroy_table_query()
1028 table_info_s *tb = NULL;
1029 column_info_s *col_ptr = NULL;
1033 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
1034 __media_svc_table_free(tb);
1035 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
1037 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
1038 __media_svc_table_free(tb);
1039 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
1041 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1042 __media_svc_table_free(tb);
1043 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
1045 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1046 __media_svc_table_free(tb);
1047 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
1049 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
1050 __media_svc_table_free(tb);
1051 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
1053 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
1054 __media_svc_table_free(tb);
1055 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
1057 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1058 __media_svc_table_free(tb);
1059 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
1061 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1062 __media_svc_table_free(tb);
1063 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
1065 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
1066 __media_svc_table_free(tb);
1067 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
1069 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_UHD);
1070 __media_svc_table_free(tb);
1071 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_UHD);
1073 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PVR);
1074 __media_svc_table_free(tb);
1075 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PVR);
1077 g_hash_table_destroy(table);
1080 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
1082 for (i = 1; i < len; i++) {
1083 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
1084 __media_svc_column_free(col_ptr);
1087 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
1089 for (i = 1; i < len; i++) {
1090 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
1091 __media_svc_column_free(col_ptr);
1094 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
1096 for (i = 1; i < len; i++) {
1097 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
1098 __media_svc_column_free(col_ptr);
1101 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
1103 for (i = 1; i < len; i++) {
1104 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
1105 __media_svc_column_free(col_ptr);
1108 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
1110 for (i = 1; i < len; i++) {
1111 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
1112 __media_svc_column_free(col_ptr);
1115 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
1117 for (i = 1; i < len; i++) {
1118 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
1119 __media_svc_column_free(col_ptr);
1122 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
1124 for (i = 1; i < len; i++) {
1125 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
1126 __media_svc_column_free(col_ptr);
1129 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
1131 for (i = 1; i < len; i++) {
1132 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
1133 __media_svc_column_free(col_ptr);
1136 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
1138 for (i = 1; i < len; i++) {
1139 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
1140 __media_svc_column_free(col_ptr);
1143 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
1144 g_slist_free(column_list[i]);
1148 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1150 int ret = MS_MEDIA_ERR_NONE;
1153 ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1154 if (ret != MS_MEDIA_ERR_NONE) {
1155 media_svc_error("Query initialization failed");
1159 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
1160 if (ret != MS_MEDIA_ERR_NONE) {
1161 media_svc_error("_media_svc_upgrade_table_query failed");
1165 /* Upgrade issue in folder table */
1166 if (cur_version < USER_V4) {
1167 /* Create tmp table */
1168 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
1170 media_svc_error("_media_svc_upgrade_table_query failed");
1171 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1175 ret = _media_svc_sql_query(sql, uid);
1176 if (ret != MS_MEDIA_ERR_NONE)
1177 media_svc_error("Error when create backup folder table");
1178 SQLITE3_SAFE_FREE(sql);
1180 /* Drop original table */
1181 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
1183 media_svc_error("_media_svc_upgrade_table_query failed");
1184 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1188 ret = _media_svc_sql_query(sql, uid);
1189 if (ret != MS_MEDIA_ERR_NONE)
1190 media_svc_error("Error when drop table");
1191 SQLITE3_SAFE_FREE(sql);
1193 /* Create new table */
1194 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1195 if (ret != MS_MEDIA_ERR_NONE) {
1196 media_svc_error("_media_svc_make_table_query failed");
1200 /* Insert into new table */
1201 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);
1203 media_svc_error("Query creation failed");
1204 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1208 ret = _media_svc_sql_query(sql, uid);
1209 if (ret != MS_MEDIA_ERR_NONE)
1210 media_svc_error("Error when backup folder table");
1211 SQLITE3_SAFE_FREE(sql);
1214 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1216 media_svc_error("Query creation failed");
1217 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1221 ret = _media_svc_sql_query(sql, uid);
1222 if (ret != MS_MEDIA_ERR_NONE)
1223 media_svc_error("Error when drop backup folder table");
1224 SQLITE3_SAFE_FREE(sql);
1227 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1228 if (ret != MS_MEDIA_ERR_NONE) {
1229 media_svc_error("_media_svc_upgrade_table_query failed");
1234 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1235 if (ret != MS_MEDIA_ERR_NONE) {
1236 media_svc_error("_media_svc_upgrade_table_query failed");
1240 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
1241 if (ret != MS_MEDIA_ERR_NONE) {
1242 media_svc_error("_media_svc_upgrade_table_query failed");
1246 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1247 if (ret != MS_MEDIA_ERR_NONE) {
1248 media_svc_error("_media_svc_upgrade_table_query failed");
1252 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1253 if (ret != MS_MEDIA_ERR_NONE) {
1254 media_svc_error("_media_svc_upgrade_table_query failed");
1258 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
1259 if (ret != MS_MEDIA_ERR_NONE) {
1260 media_svc_error("_media_svc_upgrade_table_query failed");
1264 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1265 if (ret != MS_MEDIA_ERR_NONE) {
1266 media_svc_error("_media_svc_upgrade_table_query failed");
1270 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1271 if (ret != MS_MEDIA_ERR_NONE) {
1272 media_svc_error("_media_svc_upgrade_table_query failed");
1276 if (cur_version < USER_V4) {
1277 /* Need to default value in storage_uuid */
1278 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_MEDIA, "media");
1280 media_svc_error("Query creation failed");
1281 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1285 ret = _media_svc_sql_query(sql, uid);
1286 SQLITE3_SAFE_FREE(sql);
1288 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_FOLDER, "media");
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);
1299 ret = __media_svc_rebuild_view_query(db_handle, uid);
1301 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1303 media_svc_error("Query creation failed");
1304 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1308 ret = _media_svc_sql_query(sql, uid);
1309 SQLITE3_SAFE_FREE(sql);
1311 _media_svc_destroy_table_query();
1316 _media_svc_destroy_table_query();
1321 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1323 int ret = MS_MEDIA_ERR_NONE;
1325 media_svc_sec_debug("[SQL query] : %s", sql_str);
1327 ret = media_db_request_update_db(sql_str, uid);
1332 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1334 int ret = MS_MEDIA_ERR_NONE;
1335 sqlite3_stmt *sql_stmt = NULL;
1336 char *sql = sqlite3_mprintf("PRAGMA user_version;");
1338 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1339 if (ret != MS_MEDIA_ERR_NONE) {
1340 media_svc_error("error when get user_version.");
1344 *user_version = sqlite3_column_int(sql_stmt, 0);
1345 SQLITE3_FINALIZE(sql_stmt);
1347 return MS_MEDIA_ERR_NONE;
1350 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1354 media_svc_sec_debug("[SQL query] : %s", sql_str);
1356 if (!STRING_VALID(sql_str)) {
1357 media_svc_error("invalid query");
1358 return MS_MEDIA_ERR_INVALID_PARAMETER;
1361 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1362 sqlite3_free((char *)sql_str);
1364 if (err != SQLITE_OK) {
1365 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1366 if (err == SQLITE_CORRUPT)
1367 return MS_MEDIA_ERR_DB_CORRUPT;
1368 else if (err == SQLITE_PERM)
1369 return MS_MEDIA_ERR_DB_PERMISSION;
1371 return MS_MEDIA_ERR_DB_INTERNAL;
1374 err = sqlite3_step(*stmt);
1375 if (err != SQLITE_ROW) {
1376 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1377 SQLITE3_FINALIZE(*stmt);
1378 return MS_MEDIA_ERR_DB_NO_RECORD;
1381 return MS_MEDIA_ERR_NONE;
1384 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1388 media_svc_sec_debug("[SQL query] : %s", sql_str);
1390 if (!STRING_VALID(sql_str)) {
1391 media_svc_error("invalid query");
1392 return MS_MEDIA_ERR_INVALID_PARAMETER;
1395 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1396 sqlite3_free((char *)sql_str);
1398 if (err != SQLITE_OK) {
1399 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1400 if (err == SQLITE_CORRUPT)
1401 return MS_MEDIA_ERR_DB_CORRUPT;
1402 else if (err == SQLITE_PERM)
1403 return MS_MEDIA_ERR_DB_PERMISSION;
1405 return MS_MEDIA_ERR_DB_INTERNAL;
1408 return MS_MEDIA_ERR_NONE;
1411 int _media_svc_sql_begin_trans(uid_t uid)
1413 int ret = MS_MEDIA_ERR_NONE;
1415 media_svc_error("========_media_svc_sql_begin_trans");
1417 ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1422 int _media_svc_sql_end_trans(uid_t uid)
1424 int ret = MS_MEDIA_ERR_NONE;
1426 media_svc_error("========_media_svc_sql_end_trans");
1428 ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1433 int _media_svc_sql_rollback_trans(uid_t uid)
1435 media_svc_error("========_media_svc_sql_rollback_trans");
1437 return _media_svc_sql_query("ROLLBACK;", uid);
1440 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1442 int ret = MS_MEDIA_ERR_NONE;
1444 int length = g_list_length(*query_list);
1446 char query_bundle[SQLITE3_QUERY_MAX_LEN] = {0, };
1450 media_svc_debug("query list length : [%d]", length);
1452 for (idx = 0; idx < length; idx++) {
1453 sql = (char *)g_list_nth_data(*query_list, idx);
1455 query_len = strlen(sql);
1456 if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1457 ret = media_db_request_update_db_batch(query_bundle, uid);
1458 if (ret != MS_MEDIA_ERR_NONE)
1459 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1460 memset(query_bundle, 0, sizeof(query_bundle));
1462 /* NEED TO CHECK : If a single query size is over 8K, drop it. */
1463 /* Consider inserting the basic information without metadata */
1464 /* Refer : SQLITE3 spec In Tizen 3.0 */
1465 /* Single query limit size = 1 billion bytes(1GiB) */
1466 /* DB limit size = 1 billion bytes(1GiB) */
1467 /* column limit = 2000 */
1468 if (query_len >= SQLITE3_QUERY_MAX_LEN) {
1469 media_svc_error("NEED TO CHECK FILE : A single query size exceeds 8k [%d]", query_len);
1471 SAFE_STRLCPY(query_bundle, sql, sizeof(query_bundle));
1472 total_len = query_len;
1475 SAFE_STRLCAT(query_bundle, sql, sizeof(query_bundle));
1476 total_len += query_len;
1484 if (total_len > 0) {
1485 ret = media_db_request_update_db_batch(query_bundle, uid);
1486 if (ret != MS_MEDIA_ERR_NONE)
1487 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1489 memset(query_bundle, 0, sizeof(query_bundle));
1493 _media_svc_sql_query_release(query_list);
1495 return MS_MEDIA_ERR_NONE;
1499 void _media_svc_sql_query_add(GList **query_list, char **query)
1501 *query_list = g_list_append(*query_list, *query);
1504 void _media_svc_sql_query_release(GList **query_list)
1507 media_svc_debug("_svc_sql_query_release");
1508 g_list_free(*query_list);
1513 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1515 if (user_version < LATEST_VERSION_NUMBER) {
1516 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1517 return __media_svc_db_upgrade(db_handle, user_version, uid);
1519 return MS_MEDIA_ERR_NONE;
1523 int _media_db_check_corrupt(sqlite3 *db_handle)
1525 int ret = MS_MEDIA_ERR_NONE;
1526 char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
1527 sqlite3_stmt *sql_stmt = NULL;
1528 char *result = NULL;
1530 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1531 if (ret != MS_MEDIA_ERR_NONE) {
1532 media_svc_error("error when check db. err = [%d]", ret);
1536 result = (char *)sqlite3_column_text(sql_stmt, 0);
1537 SQLITE3_FINALIZE(sql_stmt);
1539 if (result != NULL) {
1540 media_svc_debug("result %s", result);
1541 if (strcasecmp(result, "OK"))
1542 ret = MS_MEDIA_ERR_DB_CORRUPT;
1544 media_svc_error("result is NULL");
1545 ret = MS_MEDIA_ERR_DB_INTERNAL;
1552 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1554 int ret = MS_MEDIA_ERR_NONE;
1556 ret = _media_svc_init_table_query(table_id);
1557 if (ret != MS_MEDIA_ERR_NONE) {
1558 media_svc_error("_media_svc_init_table_query failed");
1562 ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1563 if (ret != MS_MEDIA_ERR_NONE) {
1564 media_svc_error("_media_svc_make_table_query failed");
1568 /* Add for trigger */
1569 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1570 if (ret != MS_MEDIA_ERR_NONE) {
1571 media_svc_error("_media_svc_make_table_query failed");
1575 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1576 if (ret != MS_MEDIA_ERR_NONE) {
1577 media_svc_error("_media_svc_make_table_query failed");
1581 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1582 if (ret != MS_MEDIA_ERR_NONE) {
1583 media_svc_error("_media_svc_make_table_query failed");
1587 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1588 if (ret != MS_MEDIA_ERR_NONE) {
1589 media_svc_error("_media_svc_make_table_query failed");
1593 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1594 if (ret != MS_MEDIA_ERR_NONE) {
1595 media_svc_error("_media_svc_make_table_query failed");
1599 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_UHD, MEDIA_SVC_DB_LIST_UHD, uid);
1600 if (ret != MS_MEDIA_ERR_NONE) {
1601 media_svc_error("_media_svc_make_table_query failed");
1605 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PVR, MEDIA_SVC_DB_LIST_PVR, uid);
1606 if (ret != MS_MEDIA_ERR_NONE) {
1607 media_svc_error("_media_svc_make_table_query failed");
1611 _media_svc_destroy_table_query();
1616 _media_svc_destroy_table_query();
1621 int _media_svc_drop_media_table(const char *storage_id, uid_t uid)
1623 int ret = MS_MEDIA_ERR_NONE;
1625 char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1627 ret = _media_svc_sql_query(sql, uid);
1633 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1635 int ret = MS_MEDIA_ERR_NONE;
1637 sqlite3_stmt *sql_stmt = NULL;
1640 GList *storage_list = NULL;
1641 char view_query[4096] = {0, };
1642 memset(view_query, 0x00, sizeof(view_query));
1644 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);
1646 /*Select list of storage*/
1647 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);
1648 ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1649 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1651 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1652 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1653 storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1655 SQLITE3_FINALIZE(sql_stmt);
1657 if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1658 item_cnt = g_list_length(storage_list);
1660 for (idx = 0; idx < item_cnt; idx++) {
1662 char *storage_id = NULL;
1663 storage_id = g_list_nth_data(storage_list, idx);
1665 if (STRING_VALID(storage_id)) {
1666 /*Select list of storage*/
1667 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1668 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1669 if (ret != MS_MEDIA_ERR_NONE) {
1670 SAFE_FREE(storage_id);
1674 table_cnt = sqlite3_column_int(sql_stmt, 0);
1675 SQLITE3_FINALIZE(sql_stmt);
1677 if (table_cnt > 0) {
1678 char append_query[128] = {0, };
1679 memset(append_query, 0x00, sizeof(append_query));
1680 snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1681 SAFE_STRLCAT(view_query, append_query, sizeof(view_query));
1683 media_svc_error("media table not exist for storage [%s]", storage_id);
1686 SAFE_FREE(storage_id);
1689 g_list_free(storage_list);
1692 ret = _media_svc_sql_query(view_query, uid);
1693 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);