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, 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_psswd = NULL;
47 struct group *grpinfo = NULL;
48 if (uid == getuid()) {
49 result_psswd = strdup(MEDIA_ROOT_PATH_INTERNAL);
50 grpinfo = getgrnam("users");
51 if (grpinfo == NULL) {
52 media_svc_error("getgrnam(users) returns NULL !");
56 struct passwd *userinfo = getpwuid(uid);
57 if (userinfo == NULL) {
58 media_svc_error("getpwuid(%d) returns NULL !", uid);
61 grpinfo = getgrnam("users");
62 if (grpinfo == NULL) {
63 media_svc_error("getgrnam(users) returns NULL !");
66 /* Compare git_t type and not group name */
67 if (grpinfo->gr_gid != userinfo->pw_gid) {
68 media_svc_error("UID [%d] does not belong to 'users' group!", uid);
71 asprintf(&result_psswd, "%s/%s", userinfo->pw_dir, MEDIA_CONTENT_PATH);
77 int __media_svc_add_table_info(char *name, char *triggerName, char *eventTable, char *actionTable, char *viewName)
79 table_info *tbl = NULL;
80 tbl = malloc(sizeof(table_info));
82 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
83 return MS_MEDIA_ERR_OUT_OF_MEMORY;
85 memset(tbl, 0, sizeof(table_info));
87 if (triggerName != NULL) {
88 tbl->triggerName = strndup(triggerName, strlen(triggerName));
89 tbl->eventTable = strndup(eventTable, strlen(eventTable));
90 tbl->actionTable = strndup(actionTable, strlen(actionTable));
92 if (viewName != NULL) {
93 tbl->viewName = strndup(viewName, strlen(viewName));
95 g_hash_table_insert(table, name, tbl);
97 return MS_MEDIA_ERR_NONE;
100 int __media_svc_add_column_info(GSList **slist, char *name, char *type, char *option, int version, char *indexName, bool isUnique, bool isTrigger, bool isView)
102 column_info *col = NULL;
103 col = malloc(sizeof(column_info));
105 media_svc_error("MS_MEDIA_ERR_OUT_OF_MEMORY");
106 return MS_MEDIA_ERR_OUT_OF_MEMORY;
108 memset(col, 0, sizeof(column_info));
110 col->name = strndup(name, strlen(name));
111 col->type = strndup(type, strlen(type));
112 if (option != NULL) {
113 col->hasOption = true;
114 col->option = strndup(option, strlen(option));
116 col->hasOption = false;
118 col->version = version;
119 if (indexName != NULL) {
121 col->indexName = strndup(indexName, strlen(indexName));
123 col->isIndex = false;
125 col->isUnique = isUnique;
126 col->isTrigger = isTrigger;
127 col->isView = isView;
128 *slist = g_slist_append(*slist, col);
130 return MS_MEDIA_ERR_NONE;
133 static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid)
135 int ret = MS_MEDIA_ERR_NONE;
136 column_info *col_ptr = NULL;
138 char table_query[4096] = {0, };
139 char temp[1024] = {0, };
143 _media_svc_update_media_view(db_handle, uid);
145 /*drop playlist_view, tag_view */
146 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_PLAYLIST);
147 ret = _media_svc_sql_query(db_handle, sql, uid);
149 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
151 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_DROP_VIEW, MEDIA_SVC_DB_VIEW_TAG);
152 ret = _media_svc_sql_query(db_handle, sql, uid);
154 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
156 /*create playlist_view */
157 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
158 for (i = 1; i < len; i++) {
159 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
160 if (col_ptr->isView) {
162 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
163 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
165 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
166 strncat(table_query, temp, strlen(temp));
167 table_len = strlen(table_query);
169 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
170 strncpy(table_query, temp, strlen(temp));
171 table_len = strlen(table_query);
174 memset(temp, 0, sizeof(temp));
176 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
177 for (i = 1; i < len; i++) {
178 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
179 if (col_ptr->isView) {
180 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
181 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
183 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
184 strncat(table_query, temp, strlen(temp));
185 table_len = strlen(table_query);
187 memset(temp, 0, sizeof(temp));
190 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
191 for (i = 1; i < len; i++) {
192 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
193 if (col_ptr->isView) {
194 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
195 strncat(table_query, temp, strlen(temp));
196 table_len = strlen(table_query);
198 memset(temp, 0, sizeof(temp));
200 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, MEDIA_SVC_DB_VIEW_PLAYLIST, table_query);
201 ret = _media_svc_sql_query(db_handle, sql, uid);
203 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
207 memset(table_query, 0, sizeof(table_query));
209 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
210 for (i = 1; i < len; i++) {
211 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
212 if (col_ptr->isView) {
214 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
215 strncat(table_query, temp, strlen(temp));
216 table_len = strlen(table_query);
218 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
219 strncpy(table_query, temp, strlen(temp));
220 table_len = strlen(table_query);
223 memset(temp, 0, sizeof(temp));
225 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
226 for (i = 1; i < len; i++) {
227 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
228 if (col_ptr->isView) {
229 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
230 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
232 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
233 strncat(table_query, temp, strlen(temp));
234 table_len = strlen(table_query);
236 memset(temp, 0, sizeof(temp));
239 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
240 for (i = 1; i < len; i++) {
241 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
242 if (col_ptr->isView) {
243 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
244 strncat(table_query, temp, strlen(temp));
245 table_len = strlen(table_query);
247 memset(temp, 0, sizeof(temp));
249 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, MEDIA_SVC_DB_VIEW_TAG, table_query);
250 ret = _media_svc_sql_query(db_handle, sql, uid);
252 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
254 return MS_MEDIA_ERR_NONE;
257 int _media_svc_make_table_query(sqlite3 *db_handle, const char *table_name, media_svc_table_slist_e list, uid_t uid)
259 int ret = MS_MEDIA_ERR_NONE;
260 table_info *tb = NULL;
261 column_info *col_ptr = NULL;
263 char table_query[4096] = {0, };
264 char index_query[4096] = {0, };
265 char trigger_query[4096] = {0, };
266 char table_query_sub[1024] = {0, };
267 char temp[1024] = {0, };
271 int table_sub_len = 0;
274 sqlite3_stmt *sql_stmt = NULL;
277 tb = g_hash_table_lookup(table, table_name);
278 len = g_slist_length(column_list[list]);
281 media_svc_error("Invalid column");
282 return MS_MEDIA_ERR_INTERNAL;
285 for (i = 1; i < len; i++) {
286 col_ptr = g_slist_nth_data(column_list[list], i);
288 if (col_ptr->hasOption) {
290 snprintf(temp, sizeof(temp), ", %s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
291 strncat(table_query, temp, strlen(temp));
292 table_len = strlen(table_query);
294 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
295 strncpy(table_query, temp, strlen(temp));
296 table_len = strlen(table_query);
300 snprintf(temp, sizeof(temp), ", %s %s", col_ptr->name, col_ptr->type);
301 strncat(table_query, temp, strlen(temp));
302 table_len = strlen(table_query);
304 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
305 strncpy(table_query, temp, strlen(temp));
306 table_len = strlen(table_query);
309 memset(temp, 0, sizeof(temp));
311 if (col_ptr->isUnique) {
312 if (table_sub_len > 0) {
313 snprintf(temp, sizeof(temp), ", %s", col_ptr->name);
314 strncat(table_query_sub, temp, strlen(temp));
315 table_sub_len = strlen(table_query_sub);
317 snprintf(temp, sizeof(temp), "%s", col_ptr->name);
318 strncpy(table_query_sub, temp, strlen(temp));
319 table_sub_len = strlen(table_query_sub);
322 memset(temp, 0, sizeof(temp));
324 if (col_ptr->isIndex) {
326 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
327 strncat(index_query, temp, strlen(temp));
328 index_len = strlen(index_query);
330 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
331 strncpy(index_query, temp, strlen(temp));
332 index_len = strlen(index_query);
335 memset(temp, 0, sizeof(temp));
337 if (col_ptr->isTrigger) {
338 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_ALBUM, strlen(MEDIA_SVC_DB_TABLE_ALBUM)) == 0) {
339 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);
340 strncpy(trigger_query, temp, strlen(temp));
341 trigger_len = strlen(trigger_query);
343 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_TRIGGER, tb->triggerName, tb->eventTable, tb->actionTable, col_ptr->name, col_ptr->name);
344 strncpy(trigger_query, temp, strlen(temp));
345 trigger_len = strlen(trigger_query);
348 memset(temp, 0, sizeof(temp));
352 if (table_sub_len > 0) {
353 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE_WITH_UNIQUE, table_name, table_query, table_query_sub);
354 ret = _media_svc_sql_query(db_handle, sql, uid);
356 memset(table_query, 0, sizeof(table_query));
357 memset(table_query_sub, 0, sizeof(table_query_sub));
358 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
360 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_TABLE, table_name, table_query);
361 ret = _media_svc_sql_query(db_handle, sql, uid);
363 memset(table_query, 0, sizeof(table_query));
364 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
368 ret = _media_svc_sql_query(db_handle, index_query, uid);
369 memset(index_query, 0, sizeof(index_query));
370 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
373 if (trigger_len > 0) {
374 ret = _media_svc_sql_query(db_handle, trigger_query, uid);
375 memset(trigger_query, 0, sizeof(trigger_query));
376 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
381 if (tb != NULL && tb->viewName != NULL) {
382 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_MEDIA, strlen(MEDIA_SVC_DB_TABLE_MEDIA)) == 0) {
383 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_MEDIA, tb->viewName, table_name);
384 ret = _media_svc_sql_query(db_handle, sql, uid);
386 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
388 } else if (strncmp(table_name, MEDIA_SVC_DB_TABLE_PLAYLIST, strlen(MEDIA_SVC_DB_TABLE_PLAYLIST)) == 0) {
389 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
390 for (i = 1; i < len; i++) {
391 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
392 if (col_ptr->isView) {
394 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_THUMBNAIL, strlen(MEDIA_SVC_DB_COLUMN_THUMBNAIL)) == 0)
395 snprintf(temp, sizeof(temp), ", playlist.%s AS p_thumbnail_path", col_ptr->name);
397 snprintf(temp, sizeof(temp), ", playlist.%s", col_ptr->name);
398 strncat(table_query, temp, strlen(temp));
399 table_len = strlen(table_query);
401 snprintf(temp, sizeof(temp), "playlist.%s", col_ptr->name);
402 strncpy(table_query, temp, strlen(temp));
403 table_len = strlen(table_query);
406 memset(temp, 0, sizeof(temp));
408 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
409 for (i = 1; i < len; i++) {
410 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
411 if (col_ptr->isView) {
412 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
413 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, playlist_map.%s AS pm_id", col_ptr->name);
415 snprintf(temp, sizeof(temp), ", playlist_map.%s", col_ptr->name);
416 strncat(table_query, temp, strlen(temp));
417 table_len = strlen(table_query);
419 memset(temp, 0, sizeof(temp));
422 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
423 for (i = 1; i < len; i++) {
424 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
425 if (col_ptr->isView) {
426 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
427 strncat(table_query, temp, strlen(temp));
428 table_len = strlen(table_query);
430 memset(temp, 0, sizeof(temp));
432 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_PLAYLIST, tb->viewName, table_query);
433 ret = _media_svc_sql_query(db_handle, sql, uid);
435 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
438 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
439 for (i = 1; i < len; i++) {
440 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
441 if (col_ptr->isView) {
443 snprintf(temp, sizeof(temp), ", tag.%s", col_ptr->name);
444 strncat(table_query, temp, strlen(temp));
445 table_len = strlen(table_query);
447 snprintf(temp, sizeof(temp), "tag.%s", col_ptr->name);
448 strncpy(table_query, temp, strlen(temp));
449 table_len = strlen(table_query);
452 memset(temp, 0, sizeof(temp));
454 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
455 for (i = 1; i < len; i++) {
456 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
457 if (col_ptr->isView) {
458 if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
459 snprintf(temp, sizeof(temp), ", media_count IS NOT NULL AS media_count, tag_map.%s AS tm_id", col_ptr->name);
461 snprintf(temp, sizeof(temp), ", tag_map.%s", col_ptr->name);
462 strncat(table_query, temp, strlen(temp));
463 table_len = strlen(table_query);
465 memset(temp, 0, sizeof(temp));
468 len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
469 for (i = 1; i < len; i++) {
470 col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
471 if (col_ptr->isView) {
472 snprintf(temp, sizeof(temp), ", media.%s", col_ptr->name);
473 strncat(table_query, temp, strlen(temp));
474 table_len = strlen(table_query);
476 memset(temp, 0, sizeof(temp));
478 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_VIEW_TAG, tb->viewName, table_query);
479 ret = _media_svc_sql_query(db_handle, sql, uid);
481 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
486 if (strncmp(table_name, MEDIA_SVC_DB_TABLE_STORAGE, strlen(MEDIA_SVC_DB_TABLE_STORAGE)) == 0) {
487 sql = sqlite3_mprintf("SELECT COUNT(*) FROM '%s' WHERE storage_uuid='%s'", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_MEDIA);
488 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
489 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
491 storage_cnt = sqlite3_column_int(sql_stmt, 0);
492 SQLITE3_FINALIZE(sql_stmt);
494 if (storage_cnt == 0) {
495 sql = sqlite3_mprintf("INSERT INTO %s VALUES('%s', '%s', '%s', '%s', 0, 0, 1);", MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_MEDIA, _media_svc_get_path(uid), NULL);
496 ret = _media_svc_sql_query(db_handle, sql, uid);
498 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
502 return MS_MEDIA_ERR_NONE;
505 int _media_svc_upgrade_table_query(sqlite3 *db_handle, char *table_name, media_svc_table_slist_e list, uid_t uid)
507 int ret = MS_MEDIA_ERR_NONE;
508 column_info *col_ptr = NULL;
510 char temp[1024] = {0, };
513 sqlite3_stmt *sql_stmt = NULL;
515 len = g_slist_length(column_list[list]);
517 sql = sqlite3_mprintf("PRAGMA user_version");
518 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
520 if (ret != MS_MEDIA_ERR_NONE) {
521 media_svc_error("error when get user_version. err = [%d]", ret);
524 cur_version = sqlite3_column_int(sql_stmt, 0);
525 SQLITE3_FINALIZE(sql_stmt);
527 len = g_slist_length(column_list[list]);
528 for (i = 1; i < len; i++) {
529 col_ptr = g_slist_nth_data(column_list[list], i);
530 if (col_ptr->version > cur_version) {
532 if (col_ptr->hasOption)
533 snprintf(temp, sizeof(temp), "%s %s %s", col_ptr->name, col_ptr->type, col_ptr->option);
535 snprintf(temp, sizeof(temp), "%s %s", col_ptr->name, col_ptr->type);
536 sql = sqlite3_mprintf(MEDIA_SVC_DB_QUERY_ALTER_TABLE, MEDIA_SVC_DB_TABLE_MEDIA, temp);
537 ret = _media_svc_sql_query(db_handle, sql, uid);
539 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
541 if (col_ptr->isIndex) {
542 memset(temp, 0, sizeof(temp));
543 snprintf(temp, sizeof(temp), MEDIA_SVC_DB_QUERY_INDEX, col_ptr->indexName, table_name, col_ptr->name);
544 ret = _media_svc_sql_query(db_handle, temp, uid);
545 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
548 memset(temp, 0, sizeof(temp));
551 return MS_MEDIA_ERR_NONE;
554 int _media_svc_init_table_query()
556 int ret = MS_MEDIA_ERR_NONE;
559 /*variable initialize.. */
560 table = g_hash_table_new(g_str_hash, g_str_equal);
561 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++) {
562 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 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_TRIGGER_FOLDER, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
568 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_TRIGGER_PLAYLIST_MAP, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, NULL);
569 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);
570 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_TRIGGER_ALBUM, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_ALBUM, NULL);
571 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_TRIGGER_TAG_MAP, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_TAG_MAP, NULL);
572 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);
573 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_TRIGGER_BOOKMARK, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_BOOKMARK, NULL);
574 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TRIGGER_STORAGE, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_TABLE_FOLDER, NULL);
575 ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_CUSTOM, MEDIA_SVC_DB_TRIGGER_CUSTOM, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_TABLE_CUSTOM, NULL);
576 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
578 /*insert column info.. */
580 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", 0, NULL, false, false, true);
581 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", 0, NULL, true, false, true);
582 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, "media_file_name_idx", true, false, true);
583 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, 0, "media_media_type_idx", false, false, true);
584 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "mime_type", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
585 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "size", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
586 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "added_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
587 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, "media_modified_time_idx", false, false, true);
588 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, "folder_uuid_idx", false, false, false);
589 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
590 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_title_idx", false, false, true);
591 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_id", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
592 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_album_idx", false, false, true);
593 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_artist_idx", false, false, true);
594 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
595 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_genre_idx", false, false, true);
596 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_composer_idx", false, false, true);
597 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "year", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
598 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "recorded_date", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
599 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
600 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "track_num", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
601 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
602 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitrate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
603 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "bitpersample", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
604 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "samplerate", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
605 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "channel", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
606 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "duration", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
607 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "longitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", 0, NULL, false, false, true);
608 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "latitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", 0, NULL, false, false, true);
609 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "altitude", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", 0, NULL, false, false, true);
610 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "exposure_time", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
611 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "fnumber", MEDIA_SVC_DB_TYPE_DOUBLE, "DEFAULT 0", 0, NULL, false, false, true);
612 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "iso", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
613 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "model", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
614 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "width", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
615 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "height", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
616 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "datetaken", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
617 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "orientation", MEDIA_SVC_DB_TYPE_INT, "DEFAULT -1", 0, NULL, false, false, true);
618 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "burst_id", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
619 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "played_count", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
620 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
621 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "last_played_position", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
622 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "rating", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
623 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "favourite", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
624 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_author_idx", false, false, true);
625 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_provider_idx", false, false, true);
626 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_content_name_idx", false, false, true);
627 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_category_idx", false, false, true);
628 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "media_location_tag_idx", false, false, true);
629 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
630 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
631 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "is_drm", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
632 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, true);
633 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "timeline", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, "media_timeline_idx", false, false, true);
634 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "weather", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
635 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "sync_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, true);
636 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "file_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
637 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "title_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
638 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
639 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
640 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "album_artist_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
641 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "genre_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
642 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "composer_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
643 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "copyright_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
644 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "description_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
645 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "author_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
646 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "provider_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
647 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "content_name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
648 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "category_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
649 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "location_tag_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
650 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "age_rating_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
651 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "keyword_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
652 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, false, false, true);
653 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_MEDIA], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", 0, NULL, false, false, false);
654 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
657 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", 0, NULL, false, false, false);
658 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, false, false);
659 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, false, false);
660 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "modified_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
661 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
662 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_type", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, false);
663 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, false, false);
664 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "folder_order", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
665 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "parent_folder_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
666 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_FOLDER], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", 0, NULL, false, false, false);
667 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
670 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, false, true);
671 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", 0, NULL, false, false, false);
672 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, false, true, false);
673 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], "play_order", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", 0, NULL, false, false, true);
674 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
677 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "playlist_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, true, true);
678 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", 0, NULL, false, false, true);
679 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
680 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_PLAYLIST], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, true);
681 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
684 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, true, false);
685 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, false, false, false);
686 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "artist", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
687 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_ALBUM], "album_art", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
688 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
691 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, false, true);
692 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "tag_id", MEDIA_SVC_DB_TYPE_INT, "NOT NULL", 0, NULL, true, false, false);
693 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG_MAP], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, true, false);
694 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
697 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "tag_id ", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, true, true);
698 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL UNIQUE", 0, NULL, false, false, true);
699 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_TAG], "name_pinyin", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
700 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
703 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "bookmark_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, false, false);
704 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, true, false);
705 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "marked_time", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, true, false, false);
706 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_BOOKMARK], "thumbnail_path", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
707 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
710 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_uuid", MEDIA_SVC_DB_TYPE_TEXT, "PRIMARY KEY", 0, NULL, false, true, false);
711 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, true, false, false);
712 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_path", MEDIA_SVC_DB_TYPE_TEXT, "NOT NULL", 0, NULL, true, false, false);
713 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_account", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, true, false, false);
714 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "storage_type", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
715 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "scan_status", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 0", 0, NULL, false, false, false);
716 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_STORAGE], "validity", MEDIA_SVC_DB_TYPE_INT, "DEFAULT 1", 0, NULL, false, false, false);
717 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
720 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "_id", MEDIA_SVC_DB_TYPE_INT, "PRIMARY KEY AUTOINCREMENT", 0, NULL, false, false, false);
721 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "media_uuid", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, true, false);
722 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "media_type", MEDIA_SVC_DB_TYPE_INT, NULL, 0, NULL, false, false, false);
723 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "author", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
724 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "provider", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, "custom_provider_idx", false, false, false);
725 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "content_name", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
726 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "category", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
727 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "location_tag", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
728 ret = __media_svc_add_column_info(&column_list[MEDIA_SVC_DB_LIST_CUSTOM], "age_rating", MEDIA_SVC_DB_TYPE_TEXT, NULL, 0, NULL, false, false, false);
729 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
734 void _media_svc_destroy_table_query()
738 g_hash_table_remove_all(table);
739 g_hash_table_destroy(table);
741 for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
742 g_slist_free(column_list[i]);
745 static int __media_svc_db_upgrade(sqlite3 *db_handle, uid_t uid)
747 int ret = MS_MEDIA_ERR_NONE;
750 ret = _media_svc_init_table_query();
751 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
753 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
754 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
756 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
757 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
759 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
760 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
762 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
763 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
765 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
766 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
768 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
769 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
771 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
772 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
774 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
775 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
777 ret = _media_svc_upgrade_table_query(db_handle, MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
778 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
780 ret = __media_svc_rebuild_view_query(db_handle, uid);
782 sql = sqlite3_mprintf("PRAGMA user_version=%d;", LATEST_VERSION_NUMBER);
783 media_svc_retv_if(sql == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY);
785 ret = _media_svc_sql_query(db_handle, sql, uid);
787 _media_svc_destroy_table_query();
792 int _media_svc_sql_query(sqlite3 *db_handle, const char *sql_str, uid_t uid)
794 int ret = MS_MEDIA_ERR_NONE;
796 media_svc_sec_debug("[SQL query] : %s", sql_str);
798 ret = media_db_request_update_db(sql_str, uid);
803 int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
807 media_svc_sec_debug("[SQL query] : %s", sql_str);
809 if (!STRING_VALID(sql_str)) {
810 media_svc_error("invalid query");
811 return MS_MEDIA_ERR_INVALID_PARAMETER;
814 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
815 sqlite3_free((char *)sql_str);
817 if (err != SQLITE_OK) {
818 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
819 if (err == SQLITE_CORRUPT) {
820 return MS_MEDIA_ERR_DB_CORRUPT;
821 } else if (err == SQLITE_PERM) {
822 return MS_MEDIA_ERR_DB_PERMISSION;
825 return MS_MEDIA_ERR_DB_INTERNAL;
828 err = sqlite3_step(*stmt);
829 if (err != SQLITE_ROW) {
830 media_svc_sec_debug("Item not found. end of row [%s]", sqlite3_errmsg(handle));
831 SQLITE3_FINALIZE(*stmt);
832 return MS_MEDIA_ERR_DB_NO_RECORD;
835 return MS_MEDIA_ERR_NONE;
838 int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, sqlite3_stmt **stmt)
842 media_svc_sec_debug("[SQL query] : %s", sql_str);
844 if (!STRING_VALID(sql_str)) {
845 media_svc_error("invalid query");
846 return MS_MEDIA_ERR_INVALID_PARAMETER;
849 err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL);
850 sqlite3_free((char *)sql_str);
852 if (err != SQLITE_OK) {
853 media_svc_error("prepare error %d[%s]", err, sqlite3_errmsg(handle));
854 if (err == SQLITE_CORRUPT) {
855 return MS_MEDIA_ERR_DB_CORRUPT;
856 } else if (err == SQLITE_PERM) {
857 return MS_MEDIA_ERR_DB_PERMISSION;
860 return MS_MEDIA_ERR_DB_INTERNAL;
863 return MS_MEDIA_ERR_NONE;
866 int _media_svc_sql_begin_trans(sqlite3 *handle, uid_t uid)
868 int ret = MS_MEDIA_ERR_NONE;
870 media_svc_error("========_media_svc_sql_begin_trans");
872 ret = media_db_request_update_db_batch_start("BEGIN IMMEDIATE;", uid);
877 int _media_svc_sql_end_trans(sqlite3 *handle, uid_t uid)
879 int ret = MS_MEDIA_ERR_NONE;
881 media_svc_error("========_media_svc_sql_end_trans");
883 ret = media_db_request_update_db_batch_end("COMMIT;", uid);
888 int _media_svc_sql_rollback_trans(sqlite3 *handle, uid_t uid)
890 media_svc_error("========_media_svc_sql_rollback_trans");
892 return _media_svc_sql_query(handle, "ROLLBACK;", uid);
895 int _media_svc_sql_query_list(sqlite3 *handle, GList **query_list, uid_t uid)
897 int ret = MS_MEDIA_ERR_NONE;
899 int length = g_list_length(*query_list);
902 media_svc_debug("query list length : [%d]", length);
904 for (idx = 0; idx < length; idx++) {
905 sql = (char *)g_list_nth_data(*query_list, idx);
907 /*ret = _media_svc_sql_query(handle, sql); */
908 ret = media_db_request_update_db_batch(sql, uid);
909 if (ret != MS_MEDIA_ERR_NONE) {
910 media_svc_error("media_db_request_update_db_batch failed : %d", ret);
917 _media_svc_sql_query_release(query_list);
919 return MS_MEDIA_ERR_NONE;
923 void _media_svc_sql_query_add(GList **query_list, char **query)
925 *query_list = g_list_append(*query_list, *query);
928 void _media_svc_sql_query_release(GList **query_list)
931 media_svc_debug("_svc_sql_query_release");
932 g_list_free(*query_list);
937 int _media_svc_check_db_upgrade(sqlite3 *db_handle, uid_t uid)
939 int ret = MS_MEDIA_ERR_NONE;
940 sqlite3_stmt *sql_stmt = NULL;
942 char *sql = sqlite3_mprintf("PRAGMA user_version");
944 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
946 if (ret != MS_MEDIA_ERR_NONE) {
947 media_svc_error("error when get user_version. err = [%d]", ret);
951 cur_version = sqlite3_column_int(sql_stmt, 0);
953 SQLITE3_FINALIZE(sql_stmt);
955 if (cur_version < LATEST_VERSION_NUMBER) {
956 media_svc_error("Current DB is out of date(%d).. So start to upgrade DB(%d)", cur_version, LATEST_VERSION_NUMBER);
957 return __media_svc_db_upgrade(db_handle, uid);
959 return MS_MEDIA_ERR_NONE;
963 int _media_db_check_corrupt(sqlite3 *db_handle)
965 int ret = MS_MEDIA_ERR_NONE;
966 char *sql = sqlite3_mprintf("PRAGMA quick_check(1)");
967 sqlite3_stmt *sql_stmt = NULL;
970 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
971 if (ret != MS_MEDIA_ERR_NONE) {
972 media_svc_error("error when check db. err = [%d]", ret);
976 result = (char *)sqlite3_column_text(sql_stmt, 0);
977 SQLITE3_FINALIZE(sql_stmt);
979 if (result != NULL) {
980 media_svc_debug("result %s", result);
981 if (strcasecmp(result, "OK"))
982 ret = MS_MEDIA_ERR_DB_CORRUPT;
984 media_svc_error("result is NULL");
985 ret = MS_MEDIA_ERR_DB_INTERNAL;
992 int _media_svc_create_media_table_with_id(sqlite3 *db_handle, const char *table_id, uid_t uid)
994 int ret = MS_MEDIA_ERR_NONE;
996 ret = _media_svc_init_table_query();
997 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
999 ret = _media_svc_make_table_query(db_handle, table_id, MEDIA_SVC_DB_LIST_MEDIA, uid);
1000 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1002 _media_svc_destroy_table_query();
1007 int _media_svc_drop_media_table(sqlite3 *handle, const char *storage_id, uid_t uid)
1009 int ret = MS_MEDIA_ERR_NONE;
1011 char *sql = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", storage_id);
1013 ret = _media_svc_sql_query(handle, sql, uid);
1019 int _media_svc_update_media_view(sqlite3 *db_handle, uid_t uid)
1021 int ret = MS_MEDIA_ERR_NONE;
1023 sqlite3_stmt *sql_stmt = NULL;
1026 GList *storage_list = NULL;
1027 char view_query[4096] = {0, };
1028 memset(view_query, 0x00, sizeof(view_query));
1030 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);
1032 /*Select list of storage*/
1033 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);
1034 ret = _media_svc_sql_prepare_to_step_simple(db_handle, sql, &sql_stmt);
1035 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1037 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
1038 if (STRING_VALID((const char *)sqlite3_column_text(sql_stmt, 0))) {
1039 storage_list = g_list_append(storage_list, strdup((char *)sqlite3_column_text(sql_stmt, 0)));
1042 SQLITE3_FINALIZE(sql_stmt);
1044 if ((storage_list != NULL) && (g_list_length(storage_list) > 0)) {
1045 item_cnt = g_list_length(storage_list);
1047 for (idx = 0; idx < item_cnt; idx++) {
1049 char *storage_id = NULL;
1050 storage_id = g_list_nth_data(storage_list, idx);
1052 if (STRING_VALID(storage_id)) {
1053 /*Select list of storage*/
1054 sql = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", storage_id);
1055 ret = _media_svc_sql_prepare_to_step(db_handle, sql, &sql_stmt);
1056 if (ret != MS_MEDIA_ERR_NONE) {
1057 SAFE_FREE(storage_id);
1061 table_cnt = sqlite3_column_int(sql_stmt, 0);
1062 SQLITE3_FINALIZE(sql_stmt);
1064 if (table_cnt > 0) {
1065 char append_query[128] = {0, };
1066 memset(append_query, 0x00, sizeof(append_query));
1067 snprintf(append_query, sizeof(append_query), " UNION SELECT * from '%s'", storage_id);
1068 strncat(view_query, append_query, strlen(append_query));
1070 media_svc_error("media table not exist for storage [%s]", storage_id);
1073 SAFE_FREE(storage_id);
1076 g_list_free(storage_list);
1079 ret = _media_svc_sql_query(db_handle, view_query, uid);
1080 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);