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)
46 char *result_passwd = NULL;
47 struct group *grpinfo = NULL;
48 if (uid == getuid()) {
49 grpinfo = getgrnam("users");
50 if (grpinfo == NULL) {
51 media_svc_error("getgrnam(users) returns NULL !");
54 result_passwd = g_strdup(MEDIA_ROOT_PATH_INTERNAL);
56 char passwd_str[MEDIA_SVC_PATHNAME_SIZE] = {0, };
57 struct passwd *userinfo = getpwuid(uid);
58 if (userinfo == NULL) {
59 media_svc_error("getpwuid(%d) returns NULL !", uid);
62 grpinfo = getgrnam("users");
63 if (grpinfo == NULL) {
64 media_svc_error("getgrnam(users) returns NULL !");
67 /* Compare git_t type and not group name */
68 if (grpinfo->gr_gid != userinfo->pw_gid) {
69 media_svc_error("UID [%d] does not belong to 'users' group!", uid);
72 snprintf(passwd_str, sizeof(passwd_str), "%s/%s", userinfo->pw_dir, MEDIA_CONTENT_PATH);
73 result_passwd = g_strdup(passwd_str);
79 int __media_svc_add_table_info(const char *name, const char *trigger_name, const char *event_table, const char *action_table, const char *view_name)
81 table_info_s *tbl = NULL;
83 media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
85 if (STRING_VALID(trigger_name)) {
86 media_svc_retvm_if(!STRING_VALID(event_table), MS_MEDIA_ERR_INVALID_PARAMETER, "event_table is NULL");
87 media_svc_retvm_if(!STRING_VALID(action_table), MS_MEDIA_ERR_INVALID_PARAMETER, "action_table is NULL");
90 tbl = malloc(sizeof(table_info_s));
92 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
93 return MS_MEDIA_ERR_OUT_OF_MEMORY;
96 memset(tbl, 0x00, sizeof(table_info_s));
98 if (STRING_VALID(trigger_name)) {
99 tbl->trigger_name = malloc(MEDIA_SVC_PATHNAME_SIZE);
100 if (tbl->trigger_name == NULL) {
101 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
103 return MS_MEDIA_ERR_OUT_OF_MEMORY;
106 memset(tbl->trigger_name, 0x00, MEDIA_SVC_PATHNAME_SIZE);
107 snprintf(tbl->trigger_name, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", trigger_name, event_table);
109 tbl->event_table = strndup(event_table, strlen(event_table));
110 tbl->action_table = strndup(action_table, strlen(action_table));
113 if (STRING_VALID(view_name))
114 tbl->view_name = strndup(view_name, strlen(view_name));
116 g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
118 return MS_MEDIA_ERR_NONE;
121 int __media_svc_add_column_info(GSList **slist, const char *name, const char *type, const char *option, int version, const char *index_name, bool is_unique, bool is_trigger, bool is_view)
123 column_info_s *col = NULL;
124 col = malloc(sizeof(column_info_s));
126 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
127 return MS_MEDIA_ERR_OUT_OF_MEMORY;
129 memset(col, 0, sizeof(column_info_s));
131 col->name = strndup(name, strlen(name));
132 col->type = strndup(type, strlen(type));
133 if (option != NULL) {
134 col->has_option = true;
135 col->option = strndup(option, strlen(option));
137 col->has_option = false;
139 col->version = version;
140 if (index_name != NULL) {
141 col->is_index = true;
142 col->index_name = strndup(index_name, strlen(index_name));
144 col->is_index = false;
146 col->is_unique = is_unique;
147 col->is_trigger = is_trigger;
148 col->is_view = is_view;
149 *slist = g_slist_append(*slist, col);
151 return MS_MEDIA_ERR_NONE;
154 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
156 int ret = MS_MEDIA_ERR_NONE;
157 column_info_s *col_ptr = NULL;
159 char table_query[4096] = {0, };
160 char temp[1024] = {0, };
164 _media_svc_update_media_view(db_handle, uid);
166 /*drop playlist_view, tag_view */
167 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
168 ret = _media_svc_sql_query(sql, uid);
170 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
172 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
173 ret = _media_svc_sql_query(sql, uid);
175 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
177 /*create playlist_view */
178 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
179 for (i = 1; i < len; i++) {
180 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
181 if (col_ptr->is_view) {
183 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
184 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
186 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
187 strncat(table_query, temp, strlen(temp));
189 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
190 strncpy(table_query, temp, strlen(temp));
194 memset(temp, 0, sizeof(temp));
196 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
197 for (i = 1; i < len; i++) {
198 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
199 if (col_ptr->is_view) {
200 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
201 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
203 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
204 strncat(table_query, temp, strlen(temp));
206 memset(temp, 0, sizeof(temp));
209 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
210 for (i = 1; i < len; i++) {
211 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
212 if (col_ptr->is_view) {
213 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
214 strncat(table_query, temp, strlen(temp));
216 memset(temp, 0, sizeof(temp));
218 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
219 ret = _media_svc_sql_query(sql, uid);
221 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
225 memset(table_query, 0, sizeof(table_query));
227 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
228 for (i = 1; i < len; i++) {
229 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
230 if (col_ptr->is_view) {
232 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
233 strncat(table_query, temp, strlen(temp));
235 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
236 strncpy(table_query, temp, strlen(temp));
240 memset(temp, 0, sizeof(temp));
242 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
243 for (i = 1; i < len; i++) {
244 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
245 if (col_ptr->is_view) {
246 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
247 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
249 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
250 strncat(table_query, temp, strlen(temp));
252 memset(temp, 0, sizeof(temp));
255 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
256 for (i = 1; i < len; i++) {
257 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
258 if (col_ptr->is_view) {
259 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
260 strncat(table_query, temp, strlen(temp));
262 memset(temp, 0, sizeof(temp));
264 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
265 ret = _media_svc_sql_query(sql, uid);
267 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
269 return MS_MEDIA_ERR_NONE;
272 int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e list, uid_t uid)
274 int ret = MS_MEDIA_ERR_NONE;
275 table_info_s *tb = NULL;
276 column_info_s *col_ptr = NULL;
278 char table_query[4096] = {0, };
279 char index_query[4096] = {0, };
280 char trigger_query[4096] = {0, };
281 char table_query_sub[1024] = {0, };
282 char temp[1024] = {0 ,};
286 int table_sub_len = 0;
290 tb = g_hash_table_lookup(table, table_name);
292 media_svc_debug("lookup fail.. table name [%s] ", table_name);
293 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
296 len = g_slist_length(column_list[list]);
299 media_svc_error("Invalid column");
300 return MS_MEDIA_ERR_INTERNAL;
303 for (i = 1; i < len; i++) {
304 col_ptr = g_slist_nth_data(column_list[list], i);
306 if (col_ptr->has_option) {
308 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
309 strncat(table_query, temp, strlen(temp));
311 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
312 strncpy(table_query, temp, strlen(temp));
317 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
318 strncat(table_query, temp, strlen(temp));
320 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
321 strncpy(table_query, temp, strlen(temp));
325 memset(temp, 0, sizeof(temp));
328 if (col_ptr->is_unique) {
329 if (table_sub_len > 0) {
330 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
331 strncat(table_query_sub, temp, strlen(temp));
332 table_sub_len = strlen(table_query_sub);
334 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
335 strncpy(table_query_sub, temp, strlen(temp));
336 table_sub_len = strlen(table_query_sub);
339 memset(temp, 0, sizeof(temp));
342 if (col_ptr->is_index) {
344 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
345 strncat(index_query, temp, strlen(temp));
346 index_len = strlen(index_query);
348 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
349 strncpy(index_query, temp, strlen(temp));
350 index_len = strlen(index_query);
353 memset(temp, 0, sizeof(temp));
356 if (col_ptr->is_trigger) {
357 if (STRING_VALID(tb->trigger_name)) {
358 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0) {
359 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER_WITH_COUNT, tb->trigger_name, tb->event_table, tb->action_table, tb->event_table, col_ptr->name, col_ptr->name, col_ptr->name, col_ptr->name);
360 strncpy(trigger_query, temp, strlen(temp));
361 trigger_len = strlen(trigger_query);
363 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->trigger_name, tb->event_table, tb->action_table, col_ptr->name, col_ptr->name);
364 strncpy(trigger_query, temp, strlen(temp));
365 trigger_len = strlen(trigger_query);
368 media_svc_error("invalid trigger name");
371 memset(temp, 0, sizeof(temp));
375 if (table_sub_len > 0) {
376 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
377 ret = _media_svc_sql_query(sql, uid);
379 memset(table_query, 0, sizeof(table_query));
380 memset(table_query_sub, 0, sizeof(table_query_sub));
381 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
383 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
384 ret = _media_svc_sql_query(sql, uid);
386 memset(table_query, 0, sizeof(table_query));
387 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
391 ret = _media_svc_sql_query(index_query, uid);
392 memset(index_query, 0, sizeof(index_query));
393 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
396 if (trigger_len > 0) {
397 ret = _media_svc_sql_query(trigger_query, uid);
398 memset(trigger_query, 0, sizeof(trigger_query));
399 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
404 if (tb != NULL && tb->view_name != NULL) {
405 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
406 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->view_name, table_name);
407 ret = _media_svc_sql_query(sql, uid);
409 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
411 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
412 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
413 for (i = 1; i < len; i++) {
414 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
415 if (col_ptr->is_view) {
417 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
418 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
420 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
421 strncat(table_query, temp, strlen(temp));
423 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
424 strncpy(table_query, temp, strlen(temp));
428 memset(temp, 0, sizeof(temp));
430 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
431 for (i = 1; i < len; i++) {
432 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
433 if (col_ptr->is_view) {
434 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
435 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
437 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
438 strncat(table_query, temp, strlen(temp));
440 memset(temp, 0, sizeof(temp));
443 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
444 for (i = 1; i < len; i++) {
445 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
446 if (col_ptr->is_view) {
447 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
448 strncat(table_query, temp, strlen(temp));
450 memset(temp, 0, sizeof(temp));
452 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->view_name, table_query);
453 ret = _media_svc_sql_query(sql, uid);
455 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
458 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
459 for (i = 1; i < len; i++) {
460 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
461 if (col_ptr->is_view) {
463 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
464 strncat(table_query, temp, strlen(temp));
466 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
467 strncpy(table_query, temp, strlen(temp));
471 memset(temp, 0, sizeof(temp));
473 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
474 for (i = 1; i < len; i++) {
475 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
476 if (col_ptr->is_view) {
477 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
478 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
480 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
481 strncat(table_query, temp, strlen(temp));
483 memset(temp, 0, sizeof(temp));
486 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
487 for (i = 1; i < len; i++) {
488 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
489 if (col_ptr->is_view) {
490 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
491 strncat(table_query, temp, strlen(temp));
493 memset(temp, 0, sizeof(temp));
495 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->view_name, table_query);
496 ret = _media_svc_sql_query(sql, uid);
498 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
503 return MS_MEDIA_ERR_NONE;
506 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
508 int ret = MS_MEDIA_ERR_NONE;
509 column_info_s *col_ptr = NULL;
511 char temp[1024] = {0, };
514 sqlite3_stmt *sql_stmt = NULL;
516 len = g_slist_length(column_list[list]);
518 sql = sqlite3_mprintf("PRAGMA user_version");
519 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
521 if (ret != MS_MEDIA_ERR_NONE) {
522 media_svc_error("error when get user_version. err = [%d]", ret);
525 cur_version = sqlite3_column_int(sql_stmt, 0);
526 SQLITE3_FINALIZE(sql_stmt);
528 len = g_slist_length(column_list[list]);
529 for (i = 1; i < len; i++) {
530 col_ptr = g_slist_nth_data(column_list[list], i);
531 if (col_ptr->version > cur_version) {
533 if (col_ptr->has_option)
534 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
536 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
537 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
538 ret = _media_svc_sql_query(sql, uid);
540 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
542 if (col_ptr->is_index) {
543 memset(temp, 0, sizeof(temp));
544 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->index_name, table_name, col_ptr->name);
545 ret = _media_svc_sql_query(temp, uid);
546 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
549 memset(temp, 0, sizeof(temp));
552 return MS_MEDIA_ERR_NONE;
555 int _media_svc_init_table_query(const char *event_table_name)
557 int ret = MS_MEDIA_ERR_NONE;
560 /*variable initialize.. */
561 table = g_hash_table_new(g_str_hash, g_str_equal);
562 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
563 column_list[i] = g_slist_alloc();
565 /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
566 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
567 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
568 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TRIGGER_FOLDER, event_table_name, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
569 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
570 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP, event_table_name, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, NULL);
571 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
572 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP1, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_VIEW_PLAYLIST);
573 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
574 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_TRIGGER_ALBUM, event_table_name, MEDIA_SVC_DB_TABLE_ALBUM, NULL);
575 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
576 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_TRIGGER_TAG_MAP, event_table_name, MEDIA_SVC_DB_TABLE_TAG_MAP, NULL);
577 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
578 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TRIGGER_TAG_MAP1, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_VIEW_TAG);
579 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
580 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TRIGGER_BOOKMARK, event_table_name, MEDIA_SVC_DB_TABLE_BOOKMARK, NULL);
581 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
582 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
583 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
584 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TRIGGER_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, NULL);
585 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
586 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_TRIGGER_FACE, MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_TABLE_FACE, NULL);
587 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
589 /*insert column info.. */
591 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, true);
592 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
593 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, true, false, true);
594 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
595 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "media_file_name_idx", true, false, true);
596 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
597 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
598 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
599 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
600 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
601 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
602 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
603 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
604 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
605 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_modified_time_idx", false, false, true);
606 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
607 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, "folder_uuid_idx", false, false, false);
608 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
609 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
610 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
611 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_title_idx", false, false, true);
612 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
613 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
614 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
615 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_album_idx", false, false, true);
616 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
617 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_artist_idx", false, false, true);
618 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
619 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
620 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
621 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_genre_idx", false, false, true);
622 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
623 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_composer_idx", false, false, true);
624 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
625 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "year", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
626 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
627 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
628 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
629 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
630 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
631 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
632 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
633 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
634 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
635 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
636 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
637 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, true);
638 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
639 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
640 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
641 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
642 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
643 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
644 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
645 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
646 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
647 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
648 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
649 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V2, NULL, false, false, true);
650 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
651 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
652 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
653 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", USER_V4, NULL, false, false, true);
654 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
655 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V4, NULL, false, false, true);
656 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
657 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
658 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
659 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
660 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
661 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
662 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
663 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
664 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
665 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", USER_V2, NULL, false, false, true);
666 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
667 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "burst_id", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
668 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
669 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
670 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
671 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
672 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
673 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
674 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
675 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
676 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
677 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
678 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
679 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_author_idx", false, false, true);
680 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
681 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_provider_idx", false, false, true);
682 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
683 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_content_name_idx", false, false, true);
684 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
685 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
686 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
687 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_location_tag_idx", false, false, true);
688 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
689 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
690 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
691 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
692 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
693 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
694 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
695 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, true);
696 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
697 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, "media_timeline_idx", false, false, true);
698 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
699 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "weather", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
700 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
701 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, true);
702 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
703 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
704 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
705 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
706 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
707 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
708 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
709 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
710 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
711 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
712 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
713 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
714 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
715 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
716 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
717 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
718 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
719 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
720 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
721 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
722 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
723 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
724 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
725 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
726 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
727 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
728 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
729 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
730 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
731 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
732 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
733 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
734 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
735 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
736 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, true);
737 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
738 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V2, NULL, false, false, false);
739 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
740 /* color column is added with dcm. */
741 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_r", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, false);
742 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
743 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_g", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, false);
744 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
745 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "color_b", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, false);
746 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
749 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", USER_V2, NULL, false, false, false);
750 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
751 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, false, false);
752 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
753 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, false, false);
754 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
755 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, false, false, false);
756 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
757 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
758 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
759 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, USER_V2, NULL, false, false, false);
760 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
761 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
762 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, true, false, false);
763 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
764 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_order", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
765 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
766 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "parent_folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V4, NULL, false, false, false);
767 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
768 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V4, NULL, false, false, false);
769 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
770 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V4, NULL, false, false, false);
771 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
774 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
775 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
776 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, false);
777 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
778 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, true, false);
779 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
780 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "play_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, false, false, true);
781 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
784 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
785 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
786 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
787 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
788 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
789 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
790 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, true);
791 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
794 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, false);
795 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
796 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, false, false, false);
797 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
798 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
799 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
800 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_art", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
801 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
804 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
805 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
806 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "tag_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", USER_V2, NULL, true, false, false);
807 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
808 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
809 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
812 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_id ", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, true, true);
813 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
814 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", USER_V2, NULL, false, false, true);
815 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
816 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
817 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
820 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, false);
821 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
822 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V2, NULL, true, true, false);
823 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
824 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "marked_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V2, NULL, true, false, false);
825 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
826 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
827 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
830 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, true, false, false);
831 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
832 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, true, false, false);
833 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
834 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", USER_V3, NULL, false, false, false);
835 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
836 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_account", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V3, NULL, false, false, false);
837 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
838 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
839 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
840 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", USER_V3, NULL, false, false, false);
841 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
842 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", USER_V3, NULL, false, false, false);
843 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
846 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, true, false);
847 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
848 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE_SCAN_LIST], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, false, false, false);
849 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
852 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", 0, NULL, true, false, false);
853 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
854 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, false, true, false);
855 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
856 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_x", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
857 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
858 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_y", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
859 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
860 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_w", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
861 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
862 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_rect_h", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
863 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
864 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
865 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
866 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FACE], "face_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
867 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
871 void __media_svc_table_free(table_info_s *tb)
873 SAFE_FREE(tb->trigger_name);
874 SAFE_FREE(tb->view_name);
875 SAFE_FREE(tb->event_table);
876 SAFE_FREE(tb->action_table);
880 void __media_svc_column_free(column_info_s *col)
882 SAFE_FREE(col->name);
883 SAFE_FREE(col->type);
884 SAFE_FREE(col->option);
885 SAFE_FREE(col->index_name);
889 void _media_svc_destroy_table_query()
892 table_info_s *tb = NULL;
893 column_info_s *col_ptr = NULL;
897 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
898 __media_svc_table_free(tb);
899 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
901 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
902 __media_svc_table_free(tb);
903 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
905 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
906 __media_svc_table_free(tb);
907 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
909 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
910 __media_svc_table_free(tb);
911 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
913 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
914 __media_svc_table_free(tb);
915 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
917 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
918 __media_svc_table_free(tb);
919 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
921 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
922 __media_svc_table_free(tb);
923 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
925 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
926 __media_svc_table_free(tb);
927 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
929 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
930 __media_svc_table_free(tb);
931 g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
933 g_hash_table_destroy(table);
936 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
938 for (i = 1; i < len; i++) {
939 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
940 __media_svc_column_free(col_ptr);
943 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
945 for (i = 1; i < len; i++) {
946 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
947 __media_svc_column_free(col_ptr);
950 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
952 for (i = 1; i < len; i++) {
953 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
954 __media_svc_column_free(col_ptr);
957 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
959 for (i = 1; i < len; i++) {
960 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
961 __media_svc_column_free(col_ptr);
964 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
966 for (i = 1; i < len; i++) {
967 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
968 __media_svc_column_free(col_ptr);
971 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
973 for (i = 1; i < len; i++) {
974 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
975 __media_svc_column_free(col_ptr);
978 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
980 for (i = 1; i < len; i++) {
981 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
982 __media_svc_column_free(col_ptr);
985 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
987 for (i = 1; i < len; i++) {
988 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
989 __media_svc_column_free(col_ptr);
992 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
994 for (i = 1; i < len; i++) {
995 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
996 __media_svc_column_free(col_ptr);
999 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
1000 g_slist_free(column_list[i]);
1004 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
1006 int ret = MS_MEDIA_ERR_NONE;
1009 ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
1010 if (ret != MS_MEDIA_ERR_NONE) {
1011 media_svc_error("Query initialization failed");
1015 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
1016 if (ret != MS_MEDIA_ERR_NONE) {
1017 media_svc_error("_media_svc_upgrade_table_query failed");
1021 /* Upgrade issue in folder table */
1022 if (cur_version < USER_V4) {
1023 /* Create tmp table */
1024 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
1026 media_svc_error("_media_svc_upgrade_table_query failed");
1027 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1031 ret = _media_svc_sql_query(sql, uid);
1032 if (ret != MS_MEDIA_ERR_NONE)
1033 media_svc_error("Error when create backup folder table");
1034 SQLITE3_SAFE_FREE(sql);
1036 /* Drop original table */
1037 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
1039 media_svc_error("_media_svc_upgrade_table_query failed");
1040 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1044 ret = _media_svc_sql_query(sql, uid);
1045 if (ret != MS_MEDIA_ERR_NONE)
1046 media_svc_error("Error when drop table");
1047 SQLITE3_SAFE_FREE(sql);
1049 /* Create new table */
1050 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1051 if (ret != MS_MEDIA_ERR_NONE) {
1052 media_svc_error("_media_svc_make_table_query failed");
1056 /* Insert into new table */
1057 sql = sqlite3_mprintf("INSERT INTO '%q'(folder_uuid, path, name, modified_time, name_pinyin, storage_type) SELECT folder_uuid, path, name, modified_time, name_pinyin, storage_type FROM '%q';", MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TABLE_TMP_TABLE);
1059 media_svc_error("Query creation failed");
1060 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1064 ret = _media_svc_sql_query(sql, uid);
1065 if (ret != MS_MEDIA_ERR_NONE)
1066 media_svc_error("Error when backup folder table");
1067 SQLITE3_SAFE_FREE(sql);
1070 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
1072 media_svc_error("Query creation failed");
1073 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1077 ret = _media_svc_sql_query(sql, uid);
1078 if (ret != MS_MEDIA_ERR_NONE)
1079 media_svc_error("Error when drop backup folder table");
1080 SQLITE3_SAFE_FREE(sql);
1083 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1084 if (ret != MS_MEDIA_ERR_NONE) {
1085 media_svc_error("_media_svc_upgrade_table_query failed");
1090 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1091 if (ret != MS_MEDIA_ERR_NONE) {
1092 media_svc_error("_media_svc_upgrade_table_query failed");
1096 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
1097 if (ret != MS_MEDIA_ERR_NONE) {
1098 media_svc_error("_media_svc_upgrade_table_query failed");
1102 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1103 if (ret != MS_MEDIA_ERR_NONE) {
1104 media_svc_error("_media_svc_upgrade_table_query failed");
1108 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1109 if (ret != MS_MEDIA_ERR_NONE) {
1110 media_svc_error("_media_svc_upgrade_table_query failed");
1114 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
1115 if (ret != MS_MEDIA_ERR_NONE) {
1116 media_svc_error("_media_svc_upgrade_table_query failed");
1120 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1121 if (ret != MS_MEDIA_ERR_NONE) {
1122 media_svc_error("_media_svc_upgrade_table_query failed");
1126 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
1127 if (ret != MS_MEDIA_ERR_NONE) {
1128 media_svc_error("_media_svc_upgrade_table_query failed");
1132 if (cur_version < USER_V4) {
1133 /* Need to default value in storage_uuid */
1134 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_MEDIA, "media");
1136 media_svc_error("Query creation failed");
1137 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1141 ret = _media_svc_sql_query(sql, uid);
1142 SQLITE3_SAFE_FREE(sql);
1144 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';", MEDIA_SVC_DB_TABLE_FOLDER, "media");
1146 media_svc_error("Query creation failed");
1147 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1151 ret = _media_svc_sql_query(sql, uid);
1152 SQLITE3_SAFE_FREE(sql);
1155 ret = __media_svc_rebuild_view_query(db_handle, uid);
1157 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
1159 media_svc_error("Query creation failed");
1160 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
1164 ret = _media_svc_sql_query(sql, uid);
1165 SQLITE3_SAFE_FREE(sql);
1167 _media_svc_destroy_table_query();
1172 _media_svc_destroy_table_query();
1177 int _media_svc_sql_query(const char *sql_str, uid_t uid)
1179 int ret = MS_MEDIA_ERR_NONE;
1181 media_svc_sec_debug("[SQL query] : %s", sql_str);
1183 ret = media_db_request_update_db(sql_str, uid);
1188 int _media_svc_get_user_version(sqlite3 *db_handle, int *user_version)
1190 int ret = MS_MEDIA_ERR_NONE;
1191 sqlite3_stmt *sql_stmt = NULL;
1192 char *sql = sqlite3_mprintf("PRAGMA user_version;");
1194 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1195 if (ret != MS_MEDIA_ERR_NONE) {
1196 media_svc_error("error when get user_version.");
1200 *user_version = sqlite3_column_int(sql_stmt, 0);
1201 SQLITE3_FINALIZE(sql_stmt);
1203 return MS_MEDIA_ERR_NONE;
1206 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1210 media_svc_sec_debug("[SQL query] : %s", sql_str);
1212 if (!STRING_VALID(sql_str)) {
1213 media_svc_error("invalid query");
1214 return MS_MEDIA_ERR_INVALID_PARAMETER;
1217 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1218 sqlite3_free((char *)sql_str);
1220 if (err != SQLITE_OK) {
1221 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1222 if (err == SQLITE_CORRUPT)
1223 return MS_MEDIA_ERR_DB_CORRUPT;
1224 else if (err == SQLITE_PERM)
1225 return MS_MEDIA_ERR_DB_PERMISSION;
1227 return MS_MEDIA_ERR_DB_INTERNAL;
1230 err = sqlite3_step(*stmt);
1231 if (err != SQLITE_ROW) {
1232 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1233 SQLITE3_FINALIZE(*stmt);
1234 return MS_MEDIA_ERR_DB_NO_RECORD;
1237 return MS_MEDIA_ERR_NONE;
1240 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1244 media_svc_sec_debug("[SQL query] : %s", sql_str);
1246 if (!STRING_VALID(sql_str)) {
1247 media_svc_error("invalid query");
1248 return MS_MEDIA_ERR_INVALID_PARAMETER;
1251 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1252 sqlite3_free((char *)sql_str);
1254 if (err != SQLITE_OK) {
1255 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1256 if (err == SQLITE_CORRUPT)
1257 return MS_MEDIA_ERR_DB_CORRUPT;
1258 else if (err == SQLITE_PERM)
1259 return MS_MEDIA_ERR_DB_PERMISSION;
1261 return MS_MEDIA_ERR_DB_INTERNAL;
1264 return MS_MEDIA_ERR_NONE;
1267 int _media_svc_sql_begin_trans(uid_t uid)
1269 int ret = MS_MEDIA_ERR_NONE;
1271 media_svc_error("========_media_svc_sql_begin_trans");
1273 ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1278 int _media_svc_sql_end_trans(uid_t uid)
1280 int ret = MS_MEDIA_ERR_NONE;
1282 media_svc_error("========_media_svc_sql_end_trans");
1284 ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1289 int _media_svc_sql_rollback_trans(uid_t uid)
1291 media_svc_error("========_media_svc_sql_rollback_trans");
1293 return _media_svc_sql_query("ROLLBACK;", uid);
1296 int _media_svc_sql_query_list(GList **query_list, uid_t uid)
1298 int ret = MS_MEDIA_ERR_NONE;
1300 int length = g_list_length(*query_list);
1302 char query_bundle[8000] = {0, };
1306 media_svc_debug("query list length : [%d]", length);
1308 for (idx = 0; idx < length; idx++) {
1309 sql = (char *)g_list_nth_data(*query_list, idx);
1311 query_len = strlen(sql);
1312 if ((total_len + query_len) >= (sizeof(query_bundle) - 1)) {
1313 ret = media_db_request_update_db_batch(query_bundle, uid);
1314 if (ret != MS_MEDIA_ERR_NONE)
1315 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1316 memset(query_bundle, 0, sizeof(query_bundle));
1318 strncpy(query_bundle, sql, query_len);
1319 total_len = query_len;
1321 strncat(query_bundle, sql, query_len);
1322 total_len += query_len;
1330 if (total_len > 0) {
1331 ret = media_db_request_update_db_batch(query_bundle, uid);
1332 if (ret != MS_MEDIA_ERR_NONE)
1333 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1335 memset(query_bundle, 0, sizeof(query_bundle));
1339 _media_svc_sql_query_release(query_list);
1341 return MS_MEDIA_ERR_NONE;
1345 void _media_svc_sql_query_add(GList **query_list, char **query)
1347 *query_list = g_list_append(*query_list, *query);
1350 void _media_svc_sql_query_release(GList **query_list)
1353 media_svc_debug("_svc_sql_query_release");
1354 g_list_free(*query_list);
1359 int _media_svc_check_db_upgrade(sqlite3 *db_handle, int user_version, uid_t uid)
1361 if (user_version < LATEST_VERSION_NUMBER) {
1362 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", user_version, LATEST_VERSION_NUMBER);
1363 return __media_svc_db_upgrade(db_handle, user_version, uid);
1365 return MS_MEDIA_ERR_NONE;
1369 int _media_db_check_corrupt(sqlite3 *db_handle)
1371 int ret = MS_MEDIA_ERR_NONE;
1372 char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
1373 sqlite3_stmt *sql_stmt = NULL;
1374 char *result = NULL;
1376 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1377 if (ret != MS_MEDIA_ERR_NONE) {
1378 media_svc_error("error when check db. err = [%d]", ret);
1382 result = (char *)sqlite3_column_text(sql_stmt, 0);
1383 SQLITE3_FINALIZE(sql_stmt);
1385 if (result != NULL) {
1386 media_svc_debug("result %s", result);
1387 if (strcasecmp(result, "OK"))
1388 ret = MS_MEDIA_ERR_DB_CORRUPT;
1390 media_svc_error("result is NULL");
1391 ret = MS_MEDIA_ERR_DB_INTERNAL;
1398 int _media_svc_create_media_table_with_id(const char *table_id, uid_t uid)
1400 int ret = MS_MEDIA_ERR_NONE;
1402 ret = _media_svc_init_table_query(table_id);
1403 if (ret != MS_MEDIA_ERR_NONE) {
1404 media_svc_error("_media_svc_init_table_query failed");
1408 ret = _media_svc_make_table_query(table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1409 if (ret != MS_MEDIA_ERR_NONE) {
1410 media_svc_error("_media_svc_make_table_query failed");
1414 /* Add for trigger */
1415 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1416 if (ret != MS_MEDIA_ERR_NONE) {
1417 media_svc_error("_media_svc_make_table_query failed");
1421 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1422 if (ret != MS_MEDIA_ERR_NONE) {
1423 media_svc_error("_media_svc_make_table_query failed");
1427 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1428 if (ret != MS_MEDIA_ERR_NONE) {
1429 media_svc_error("_media_svc_make_table_query failed");
1433 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1434 if (ret != MS_MEDIA_ERR_NONE) {
1435 media_svc_error("_media_svc_make_table_query failed");
1439 ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1440 if (ret != MS_MEDIA_ERR_NONE) {
1441 media_svc_error("_media_svc_make_table_query failed");
1445 _media_svc_destroy_table_query();
1450 _media_svc_destroy_table_query();
1455 int _media_svc_drop_media_table(const char *storage_id, uid_t uid)
1457 int ret = MS_MEDIA_ERR_NONE;
1459 char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1461 ret = _media_svc_sql_query(sql, uid);
1467 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1469 int ret = MS_MEDIA_ERR_NONE;
1471 sqlite3_stmt *sql_stmt = NULL;
1474 GList *storage_list = NULL;
1475 char view_query[4096] = {0, };
1476 memset(view_query, 0x00, sizeof(view_query));
1478 snprintf(view_query, sizeof(view_query), "DROP VIEW IF EXISTS %s; CREATE VIEW IF NOT EXISTS %s AS SELECT * from %s ", MEDIA_SVC_DB_VIEW_MEDIA, MEDIA_SVC_DB_VIEW_MEDIA, MEDIA_SVC_DB_TABLE_MEDIA);
1480 /*Select list of storage*/
1481 sql = sqlite3_mprintf("SELECT storage_uuid FROM '%s' WHERE validity=1 AND storage_uuid != '%s'", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_MEDIA);
1482 ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1483 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1485 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1486 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0)))
1487 storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1489 SQLITE3_FINALIZE(sql_stmt);
1491 if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1492 item_cnt = g_list_length(storage_list);
1494 for (idx = 0; idx < item_cnt; idx++) {
1496 char *storage_id = NULL;
1497 storage_id = g_list_nth_data(storage_list, idx);
1499 if (STRING_VALID(storage_id)) {
1500 /*Select list of storage*/
1501 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1502 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1503 if (ret != MS_MEDIA_ERR_NONE) {
1504 SAFE_FREE(storage_id);
1508 table_cnt = sqlite3_column_int(sql_stmt, 0);
1509 SQLITE3_FINALIZE(sql_stmt);
1511 if (table_cnt > 0) {
1512 char append_query[128] = {0, };
1513 memset(append_query, 0x00, sizeof(append_query));
1514 snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1515 strncat(view_query, append_query, strlen(append_query));
1517 media_svc_error("media table not exist for storage [%s]", storage_id);
1520 SAFE_FREE(storage_id);
1523 g_list_free(storage_list);
1526 ret = _media_svc_sql_query(view_query, uid);
1527 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);