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 sprintf(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 *triggerName, const char *eventTable, const char *actionTable, const char *viewName)
81 table_info *tbl = NULL;
83 media_svc_retvm_if(!STRING_VALID(name), MS_MEDIA_ERR_INVALID_PARAMETER, "name is NULL");
85 if (STRING_VALID(triggerName)) {
86 media_svc_retvm_if(!STRING_VALID(eventTable), MS_MEDIA_ERR_INVALID_PARAMETER, "eventTable is NULL");
87 media_svc_retvm_if(!STRING_VALID(actionTable), MS_MEDIA_ERR_INVALID_PARAMETER, "actionTable is NULL");
90 tbl = malloc(sizeof(table_info));
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));
98 if (STRING_VALID(triggerName)) {
99 tbl->triggerName = malloc(MEDIA_SVC_PATHNAME_SIZE);
100 if (tbl->triggerName == NULL) {
101 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
103 return MS_MEDIA_ERR_OUT_OF_MEMORY;
106 memset(tbl->triggerName, 0x00, MEDIA_SVC_PATHNAME_SIZE);
107 snprintf(tbl->triggerName, MEDIA_SVC_PATHNAME_SIZE, "%s_%s", triggerName, eventTable);
109 tbl->eventTable = strndup(eventTable, strlen(eventTable));
110 tbl->actionTable = strndup(actionTable, strlen(actionTable));
113 if (STRING_VALID(viewName)) {
114 tbl->viewName = strndup(viewName, strlen(viewName));
117 g_hash_table_insert(table, (gpointer)name, (gpointer)tbl);
119 return MS_MEDIA_ERR_NONE;
122 int __media_svc_add_column_info(GSList **slist, const char *name, const char *type, const char *option, int version, const char *indexName, bool isUnique, bool isTrigger, bool isView)
124 column_info *col = NULL;
125 col = malloc(sizeof(column_info));
127 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
128 return MS_MEDIA_ERR_OUT_OF_MEMORY;
130 memset(col, 0, sizeof(column_info));
132 col->name = strndup(name, strlen(name));
133 col->type = strndup(type, strlen(type));
134 if (option != NULL) {
135 col->hasOption = true;
136 col->option = strndup(option, strlen(option));
138 col->hasOption = false;
140 col->version = version;
141 if (indexName != NULL) {
143 col->indexName = strndup(indexName, strlen(indexName));
145 col->isIndex = false;
147 col->isUnique = isUnique;
148 col->isTrigger = isTrigger;
149 col->isView = isView;
150 *slist = g_slist_append(*slist, col);
152 return MS_MEDIA_ERR_NONE;
155 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
157 int ret = MS_MEDIA_ERR_NONE;
158 column_info *col_ptr = NULL;
160 char table_query[4096] = {0, };
161 char temp[1024] = {0, };
165 _media_svc_update_media_view(db_handle, uid);
167 /*drop playlist_view, tag_view */
168 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
169 ret = _media_svc_sql_query(db_handle, sql, uid);
171 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
173 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
174 ret = _media_svc_sql_query(db_handle, sql, uid);
176 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
178 /*create playlist_view */
179 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
180 for (i = 1; i < len; i++) {
181 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
182 if (col_ptr->isView) {
184 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
185 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
187 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
188 strncat(table_query, temp, strlen(temp));
190 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
191 strncpy(table_query, temp, strlen(temp));
195 memset(temp, 0, sizeof(temp));
197 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
198 for (i = 1; i < len; i++) {
199 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
200 if (col_ptr->isView) {
201 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
202 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
204 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
205 strncat(table_query, temp, strlen(temp));
207 memset(temp, 0, sizeof(temp));
210 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
211 for (i = 1; i < len; i++) {
212 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
213 if (col_ptr->isView) {
214 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
215 strncat(table_query, temp, strlen(temp));
217 memset(temp, 0, sizeof(temp));
219 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
220 ret = _media_svc_sql_query(db_handle, sql, uid);
222 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
226 memset(table_query, 0, sizeof(table_query));
228 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
229 for (i = 1; i < len; i++) {
230 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
231 if (col_ptr->isView) {
233 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
234 strncat(table_query, temp, strlen(temp));
236 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
237 strncpy(table_query, temp, strlen(temp));
241 memset(temp, 0, sizeof(temp));
243 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
244 for (i = 1; i < len; i++) {
245 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
246 if (col_ptr->isView) {
247 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
248 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
250 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
251 strncat(table_query, temp, strlen(temp));
253 memset(temp, 0, sizeof(temp));
256 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
257 for (i = 1; i < len; i++) {
258 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
259 if (col_ptr->isView) {
260 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
261 strncat(table_query, temp, strlen(temp));
263 memset(temp, 0, sizeof(temp));
265 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
266 ret = _media_svc_sql_query(db_handle, sql, uid);
268 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
270 return MS_MEDIA_ERR_NONE;
273 int _media_svc_make_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
275 int ret = MS_MEDIA_ERR_NONE;
276 table_info *tb = NULL;
277 column_info *col_ptr = NULL;
279 char table_query[4096] = {0, };
280 char index_query[4096] = {0, };
281 char trigger_query[4096] = {0, };
282 char table_query_sub[1024] = {0, };
283 char temp[1024] = {0 ,};
287 int table_sub_len = 0;
291 tb = g_hash_table_lookup(table, table_name);
293 media_svc_debug("lookup fail.. table name [%s] ", table_name);
294 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
297 len = g_slist_length(column_list[list]);
300 media_svc_error("Invalid column");
301 return MS_MEDIA_ERR_INTERNAL;
304 for (i = 1; i < len; i++) {
305 col_ptr = g_slist_nth_data(column_list[list], i);
307 if (col_ptr->hasOption) {
309 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
310 strncat(table_query, temp, strlen(temp));
312 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
313 strncpy(table_query, temp, strlen(temp));
318 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
319 strncat(table_query, temp, strlen(temp));
321 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
322 strncpy(table_query, temp, strlen(temp));
326 memset(temp, 0, sizeof(temp));
329 if (col_ptr->isUnique) {
330 if (table_sub_len > 0) {
331 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
332 strncat(table_query_sub, temp, strlen(temp));
333 table_sub_len = strlen(table_query_sub);
335 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
336 strncpy(table_query_sub, temp, strlen(temp));
337 table_sub_len = strlen(table_query_sub);
340 memset(temp, 0, sizeof(temp));
343 if (col_ptr->isIndex) {
345 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
346 strncat(index_query, temp, strlen(temp));
347 index_len = strlen(index_query);
349 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
350 strncpy(index_query, temp, strlen(temp));
351 index_len = strlen(index_query);
354 memset(temp, 0, sizeof(temp));
357 if (col_ptr->isTrigger) {
358 if (STRING_VALID(tb->triggerName)) {
359 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0) {
360 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER_WITH_COUNT, tb->triggerName, tb->eventTable, tb->actionTable, tb->eventTable, col_ptr->name, col_ptr->name, col_ptr->name, col_ptr->name);
361 strncpy(trigger_query, temp, strlen(temp));
362 trigger_len = strlen(trigger_query);
364 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->triggerName, tb->eventTable, tb->actionTable, col_ptr->name, col_ptr->name);
365 strncpy(trigger_query, temp, strlen(temp));
366 trigger_len = strlen(trigger_query);
369 media_svc_error("invalid trigger name");
372 memset(temp, 0, sizeof(temp));
376 if (table_sub_len > 0) {
377 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
378 ret = _media_svc_sql_query(db_handle, sql, uid);
380 memset(table_query, 0, sizeof(table_query));
381 memset(table_query_sub, 0, sizeof(table_query_sub));
382 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
384 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
385 ret = _media_svc_sql_query(db_handle, sql, uid);
387 memset(table_query, 0, sizeof(table_query));
388 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
392 ret = _media_svc_sql_query(db_handle, index_query, uid);
393 memset(index_query, 0, sizeof(index_query));
394 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
397 if (trigger_len > 0) {
398 ret = _media_svc_sql_query(db_handle, trigger_query, uid);
399 memset(trigger_query, 0, sizeof(trigger_query));
400 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
405 if (tb != NULL && tb->viewName != NULL) {
406 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
407 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->viewName, table_name);
408 ret = _media_svc_sql_query(db_handle, sql, uid);
410 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
412 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
413 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
414 for (i = 1; i < len; i++) {
415 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
416 if (col_ptr->isView) {
418 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
419 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
421 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
422 strncat(table_query, temp, strlen(temp));
424 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
425 strncpy(table_query, temp, strlen(temp));
429 memset(temp, 0, sizeof(temp));
431 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
432 for (i = 1; i < len; i++) {
433 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
434 if (col_ptr->isView) {
435 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
436 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
438 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
439 strncat(table_query, temp, strlen(temp));
441 memset(temp, 0, sizeof(temp));
444 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
445 for (i = 1; i < len; i++) {
446 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
447 if (col_ptr->isView) {
448 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
449 strncat(table_query, temp, strlen(temp));
451 memset(temp, 0, sizeof(temp));
453 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->viewName, table_query);
454 ret = _media_svc_sql_query(db_handle, sql, uid);
456 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
459 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
460 for (i = 1; i < len; i++) {
461 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
462 if (col_ptr->isView) {
464 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
465 strncat(table_query, temp, strlen(temp));
467 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
468 strncpy(table_query, temp, strlen(temp));
472 memset(temp, 0, sizeof(temp));
474 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
475 for (i = 1; i < len; i++) {
476 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
477 if (col_ptr->isView) {
478 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
479 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
481 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
482 strncat(table_query, temp, strlen(temp));
484 memset(temp, 0, sizeof(temp));
487 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
488 for (i = 1; i < len; i++) {
489 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
490 if (col_ptr->isView) {
491 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
492 strncat(table_query, temp, strlen(temp));
494 memset(temp, 0, sizeof(temp));
496 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->viewName, table_query);
497 ret = _media_svc_sql_query(db_handle, sql, uid);
499 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
504 return MS_MEDIA_ERR_NONE;
507 int _media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
509 int ret = MS_MEDIA_ERR_NONE;
510 column_info *col_ptr = NULL;
512 char temp[1024] = {0, };
515 sqlite3_stmt *sql_stmt = NULL;
517 len = g_slist_length(column_list[list]);
519 sql = sqlite3_mprintf("PRAGMA user_version");
520 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
522 if (ret != MS_MEDIA_ERR_NONE) {
523 media_svc_error("error when get user_version. err = [%d]", ret);
526 cur_version = sqlite3_column_int(sql_stmt, 0);
527 SQLITE3_FINALIZE(sql_stmt);
529 len = g_slist_length(column_list[list]);
530 for (i = 1; i < len; i++) {
531 col_ptr = g_slist_nth_data(column_list[list], i);
532 if (col_ptr->version > cur_version) {
534 if (col_ptr->hasOption)
535 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
537 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
538 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, table_name, temp);
539 ret = _media_svc_sql_query(db_handle, sql, uid);
541 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
543 if (col_ptr->isIndex) {
544 memset(temp, 0, sizeof(temp));
545 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
546 ret = _media_svc_sql_query(db_handle, temp, uid);
547 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
550 memset(temp, 0, sizeof(temp));
553 return MS_MEDIA_ERR_NONE;
556 int _media_svc_init_table_query(const char *event_table_name)
558 int ret = MS_MEDIA_ERR_NONE;
561 /*variable initialize.. */
562 table = g_hash_table_new(g_str_hash, g_str_equal);
563 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++) {
564 column_list[i] = g_slist_alloc();
567 /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
568 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, MEDIA_SVC_DB_VIEW_MEDIA);
569 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);
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 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);
572 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);
573 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);
574 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);
575 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);
576 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, NULL, NULL, NULL, NULL);
577 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);
578 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);
579 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
581 /*insert column info.. */
583 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);
584 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);
585 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);
586 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);
587 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);
588 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);
589 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);
590 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);
591 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);
592 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);
593 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);
594 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);
595 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);
596 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);
597 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);
598 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);
599 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);
600 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);
601 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);
602 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);
603 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);
604 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);
605 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);
606 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);
607 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);
608 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);
609 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);
610 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);
611 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);
612 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);
613 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);
614 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);
615 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);
616 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);
617 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);
618 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);
619 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);
620 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);
621 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);
622 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);
623 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);
624 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);
625 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);
626 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);
627 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);
628 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);
629 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);
630 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, "media_category_idx", false, false, true);
631 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);
632 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);
633 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);
634 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);
635 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);
636 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);
637 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);
638 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);
639 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);
640 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);
641 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);
642 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);
643 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);
644 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);
645 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);
646 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);
647 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);
648 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);
649 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);
650 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);
651 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);
652 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);
653 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);
654 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);
655 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
656 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);
657 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);
658 /* color column is added with dcm. */
659 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);
660 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);
661 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);
662 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
665 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);
666 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);
667 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);
668 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);
669 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);
670 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);
671 /* storage_uuid column is added in DB v4. When doing DB upgrade to v4, if storage_uuid is NOT NULL, alter table failed. */
672 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);
673 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);
674 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);
675 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);
676 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
679 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);
680 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);
681 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);
682 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);
683 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
686 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);
687 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);
688 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);
689 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);
690 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
693 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);
694 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);
695 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);
696 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_art", MEDIA_SVC_DB_TYPE_TEXT, NULL, USER_V2, NULL, false, false, false);
697 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
700 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", USER_V2, NULL, false, false, true);
701 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);
702 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);
703 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
706 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);
707 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);
708 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);
709 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
712 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);
713 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);
714 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);
715 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);
716 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
719 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);
720 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);
721 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);
722 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);
723 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);
724 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);
725 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);
726 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
729 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);
730 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);
731 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
734 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);
735 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);
736 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);
737 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);
738 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);
739 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);
740 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);
741 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);
742 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
746 void __media_svc_table_free(table_info *tb) {
747 SAFE_FREE(tb->triggerName);
748 SAFE_FREE(tb->viewName);
749 SAFE_FREE(tb->eventTable);
750 SAFE_FREE(tb->actionTable);
754 void __media_svc_column_free(column_info *col) {
755 SAFE_FREE(col->name);
756 SAFE_FREE(col->type);
757 SAFE_FREE(col->option);
758 SAFE_FREE(col->indexName);
762 void _media_svc_destroy_table_query()
765 table_info *tb = NULL;
766 column_info *col_ptr = NULL;
770 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
771 __media_svc_table_free(tb);
772 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_MEDIA);
774 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
775 __media_svc_table_free(tb);
776 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_FOLDER);
778 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
779 __media_svc_table_free(tb);
780 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_PLAYLIST);
782 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
783 __media_svc_table_free(tb);
784 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
786 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
787 __media_svc_table_free(tb);
788 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_ALBUM);
790 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
791 __media_svc_table_free(tb);
792 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_TAG);
794 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
795 __media_svc_table_free(tb);
796 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_TAG_MAP);
798 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
799 __media_svc_table_free(tb);
800 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_BOOKMARK);
802 tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
803 __media_svc_table_free(tb);
804 g_hash_table_remove (table, MEDIA_SVC_DB_TABLE_STORAGE);
806 g_hash_table_destroy(table);
809 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
811 for(i=1; i<len; i++) {
812 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
813 __media_svc_column_free(col_ptr);
816 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
818 for(i=1; i<len; i++) {
819 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
820 __media_svc_column_free(col_ptr);
823 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
825 for(i=1; i<len; i++) {
826 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
827 __media_svc_column_free(col_ptr);
830 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
832 for(i=1; i<len; i++) {
833 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
834 __media_svc_column_free(col_ptr);
837 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
839 for(i=1; i<len; i++) {
840 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
841 __media_svc_column_free(col_ptr);
844 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
846 for(i=1; i<len; i++) {
847 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
848 __media_svc_column_free(col_ptr);
851 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
853 for(i=1; i<len; i++) {
854 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
855 __media_svc_column_free(col_ptr);
858 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
860 for(i=1; i<len; i++) {
861 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
862 __media_svc_column_free(col_ptr);
865 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
867 for(i=1; i<len; i++) {
868 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
869 __media_svc_column_free(col_ptr);
872 for(i=0; i<MEDIA_SVC_DB_LIST_MAX; i++) {
873 g_slist_free(column_list[i]);
877 static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid)
879 int ret = MS_MEDIA_ERR_NONE;
882 ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
883 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
885 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
886 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
888 /* Upgrade issue in folder table */
889 if (cur_version < USER_V4) {
890 /* Create tmp table */
891 sql = sqlite3_mprintf("CREATE TABLE '%q' AS SELECT * FROM '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE, MEDIA_SVC_DB_TABLE_FOLDER);
892 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
894 ret = _media_svc_sql_query(db_handle, sql, uid);
895 if (ret != MS_MEDIA_ERR_NONE) {
896 media_svc_error("Error when create backup folder table");
900 /* Drop original table */
901 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_FOLDER);
902 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
904 ret = _media_svc_sql_query(db_handle, sql, uid);
905 if (ret != MS_MEDIA_ERR_NONE) {
906 media_svc_error("Error when drop table");
910 /* Create new table */
911 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
912 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
914 /* Insert into new table */
915 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);
916 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
918 ret = _media_svc_sql_query(db_handle, sql, uid);
919 if (ret != MS_MEDIA_ERR_NONE) {
920 media_svc_error("Error when backup folder table");
925 sql = sqlite3_mprintf("DROP TABLE '%q';", MEDIA_SVC_DB_TABLE_TMP_TABLE);
926 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
928 ret = _media_svc_sql_query(db_handle, sql, uid);
929 if (ret != MS_MEDIA_ERR_NONE) {
930 media_svc_error("Error when drop backup folder table");
935 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER , MEDIA_SVC_DB_LIST_FOLDER, uid);
936 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
939 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
940 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
942 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
943 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
945 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
946 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
948 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
949 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
951 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
952 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
954 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
955 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
957 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
958 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
960 if (cur_version < USER_V4) {
961 /* Need to default value in storage_uuid */
962 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';",MEDIA_SVC_DB_TABLE_MEDIA, "media");
963 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
965 ret = _media_svc_sql_query(db_handle, sql, uid);
968 sql = sqlite3_mprintf("UPDATE %q SET storage_uuid = '%q';",MEDIA_SVC_DB_TABLE_FOLDER, "media");
969 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
971 ret = _media_svc_sql_query(db_handle, sql, uid);
975 ret = __media_svc_rebuild_view_query(db_handle, uid);
977 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
978 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
980 ret = _media_svc_sql_query(db_handle, sql, uid);
983 _media_svc_destroy_table_query();
988 int _media_svc_sql_query(sqlite3 *db_handle, const char *sql_str, uid_t uid)
990 int ret = MS_MEDIA_ERR_NONE;
992 media_svc_sec_debug("[SQL query] : %s", sql_str);
994 ret = media_db_request_update_db(sql_str, uid);
999 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1003 media_svc_sec_debug("[SQL query] : %s", sql_str);
1005 if (!STRING_VALID(sql_str)) {
1006 media_svc_error("invalid query");
1007 return MS_MEDIA_ERR_INVALID_PARAMETER;
1010 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1011 sqlite3_free((char *)sql_str);
1013 if (err != SQLITE_OK) {
1014 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1015 if (err == SQLITE_CORRUPT) {
1016 return MS_MEDIA_ERR_DB_CORRUPT;
1017 } else if (err == SQLITE_PERM) {
1018 return MS_MEDIA_ERR_DB_PERMISSION;
1021 return MS_MEDIA_ERR_DB_INTERNAL;
1024 err = sqlite3_step(*stmt);
1025 if (err != SQLITE_ROW) {
1026 media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle));
1027 SQLITE3_FINALIZE(*stmt);
1028 return MS_MEDIA_ERR_DB_NO_RECORD;
1031 return MS_MEDIA_ERR_NONE;
1034 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
1038 media_svc_sec_debug("[SQL query] : %s", sql_str);
1040 if (!STRING_VALID(sql_str)) {
1041 media_svc_error("invalid query");
1042 return MS_MEDIA_ERR_INVALID_PARAMETER;
1045 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
1046 sqlite3_free((char *)sql_str);
1048 if (err != SQLITE_OK) {
1049 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
1050 if (err == SQLITE_CORRUPT) {
1051 return MS_MEDIA_ERR_DB_CORRUPT;
1052 } else if (err == SQLITE_PERM) {
1053 return MS_MEDIA_ERR_DB_PERMISSION;
1056 return MS_MEDIA_ERR_DB_INTERNAL;
1059 return MS_MEDIA_ERR_NONE;
1062 int _media_svc_sql_begin_trans(sqlite3 *handle, uid_t uid)
1064 int ret = MS_MEDIA_ERR_NONE;
1066 media_svc_error("========_media_svc_sql_begin_trans");
1068 ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
1073 int _media_svc_sql_end_trans(sqlite3 *handle, uid_t uid)
1075 int ret = MS_MEDIA_ERR_NONE;
1077 media_svc_error("========_media_svc_sql_end_trans");
1079 ret = media_db_request_update_db_batch_end("COMMIT;", uid);
1084 int _media_svc_sql_rollback_trans(sqlite3 *handle, uid_t uid)
1086 media_svc_error("========_media_svc_sql_rollback_trans");
1088 return _media_svc_sql_query(handle, "ROLLBACK;", uid);
1091 int _media_svc_sql_query_list(sqlite3 *handle, GList **query_list, uid_t uid)
1093 int ret = MS_MEDIA_ERR_NONE;
1095 int length = g_list_length(*query_list);
1098 media_svc_debug("query list length : [%d]", length);
1100 for (idx = 0; idx < length; idx++) {
1101 sql = (char *)g_list_nth_data(*query_list, idx);
1103 /*ret = _media_svc_sql_query(handle, sql); */
1104 ret = media_db_request_update_db_batch(sql, uid);
1105 if (ret != MS_MEDIA_ERR_NONE) {
1106 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
1113 _media_svc_sql_query_release(query_list);
1115 return MS_MEDIA_ERR_NONE;
1119 void _media_svc_sql_query_add(GList **query_list, char **query)
1121 *query_list = g_list_append(*query_list, *query);
1124 void _media_svc_sql_query_release(GList **query_list)
1127 media_svc_debug("_svc_sql_query_release");
1128 g_list_free(*query_list);
1133 int _media_svc_check_db_upgrade(sqlite3 *db_handle, bool *need_full_scan, uid_t uid)
1135 int ret = MS_MEDIA_ERR_NONE;
1136 sqlite3_stmt *sql_stmt = NULL;
1138 char *sql = sqlite3_mprintf("PRAGMA user_version");
1140 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1142 if (ret != MS_MEDIA_ERR_NONE) {
1143 media_svc_error("error when get user_version. err = [%d]", ret);
1147 cur_version = sqlite3_column_int(sql_stmt, 0);
1149 SQLITE3_FINALIZE(sql_stmt);
1151 if (cur_version < LATEST_VERSION_NUMBER) {
1152 if (cur_version < USER_V4) {
1153 *need_full_scan = true;
1155 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", cur_version, LATEST_VERSION_NUMBER);
1156 return __media_svc_db_upgrade(db_handle, cur_version, uid);
1158 return MS_MEDIA_ERR_NONE;
1162 int _media_db_check_corrupt(sqlite3 *db_handle)
1164 int ret = MS_MEDIA_ERR_NONE;
1165 char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
1166 sqlite3_stmt *sql_stmt = NULL;
1167 char *result = NULL;
1169 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1170 if (ret != MS_MEDIA_ERR_NONE) {
1171 media_svc_error("error when check db. err = [%d]", ret);
1175 result = (char *)sqlite3_column_text(sql_stmt, 0);
1176 SQLITE3_FINALIZE(sql_stmt);
1178 if (result != NULL) {
1179 media_svc_debug("result %s", result);
1180 if (strcasecmp(result, "OK"))
1181 ret = MS_MEDIA_ERR_DB_CORRUPT;
1183 media_svc_error("result is NULL");
1184 ret = MS_MEDIA_ERR_DB_INTERNAL;
1191 int _media_svc_create_media_table_with_id(sqlite3 *db_handle, const char *table_id, uid_t uid)
1193 int ret = MS_MEDIA_ERR_NONE;
1195 ret = _media_svc_init_table_query(table_id);
1196 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1198 ret = _media_svc_make_table_query(db_handle, table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1199 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1201 /* Add for trigger */
1202 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
1203 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1205 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
1206 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1208 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
1209 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1211 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
1212 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1214 ret = _media_svc_make_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
1215 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1217 _media_svc_destroy_table_query();
1222 int _media_svc_drop_media_table(sqlite3 *handle, const char *storage_id, uid_t uid)
1224 int ret = MS_MEDIA_ERR_NONE;
1226 char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1228 ret = _media_svc_sql_query(handle, sql, uid);
1234 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1236 int ret = MS_MEDIA_ERR_NONE;
1238 sqlite3_stmt *sql_stmt = NULL;
1241 GList *storage_list = NULL;
1242 char view_query[4096] = {0, };
1243 memset(view_query, 0x00, sizeof(view_query));
1245 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);
1247 /*Select list of storage*/
1248 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);
1249 ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1250 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1252 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1253 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0))) {
1254 storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1257 SQLITE3_FINALIZE(sql_stmt);
1259 if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1260 item_cnt = g_list_length(storage_list);
1262 for (idx = 0; idx < item_cnt; idx++) {
1264 char *storage_id = NULL;
1265 storage_id = g_list_nth_data(storage_list, idx);
1267 if (STRING_VALID(storage_id)) {
1268 /*Select list of storage*/
1269 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1270 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1271 if (ret != MS_MEDIA_ERR_NONE) {
1272 SAFE_FREE(storage_id);
1276 table_cnt = sqlite3_column_int(sql_stmt, 0);
1277 SQLITE3_FINALIZE(sql_stmt);
1279 if (table_cnt > 0) {
1280 char append_query[128] = {0, };
1281 memset(append_query, 0x00, sizeof(append_query));
1282 snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1283 strncat(view_query, append_query, strlen(append_query));
1285 media_svc_error("media table not exist for storage [%s]", storage_id);
1288 SAFE_FREE(storage_id);
1291 g_list_free(storage_list);
1294 ret = _media_svc_sql_query(db_handle, view_query, uid);
1295 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);