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.
24 #include <sys/types.h>
25 #include <media-util-err.h>
26 #include "media-svc-media.h"
27 #include "media-svc-media-folder.h"
28 #include "media-svc-debug.h"
29 #include "media-svc-util.h"
30 #include "media-svc-db-utils.h"
31 #include "media-svc-noti.h"
33 #define MEDIA_SVC_MAX_COMMIT_SIZE 200
35 static __thread GList *g_media_svc_item_validity_query_list = NULL;
36 static __thread GList *g_media_svc_insert_item_query_list = NULL;
37 __thread GList *g_media_svc_move_item_query_list = NULL;
38 static __thread GList *g_media_svc_update_item_query_list = NULL;
39 static __thread GList *g_media_svc_update_list = NULL;
41 static int __media_svc_get_invalid_records_with_thumbnail(sqlite3 *handle, media_svc_storage_type_e storage_type, GArray **thumb_path)
43 int ret = MS_MEDIA_ERR_NONE;
44 sqlite3_stmt *sql_stmt = NULL;
45 char *sql = sqlite3_mprintf("SELECT thumbnail_path FROM '%q' WHERE validity=0 AND storage_type=%d AND thumbnail_path IS NOT NULL", MEDIA_SVC_DB_TABLE_MEDIA, storage_type);
47 media_svc_debug("[SQL query] : %s", sql);
49 ret = _media_svc_sql_prepare_to_step_simple(handle, sql, &sql_stmt);
50 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Query failed. err[%d]", ret);
52 while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
54 path = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0));
55 g_array_append_val(*thumb_path, path);
58 SQLITE3_FINALIZE(sql_stmt);
60 return MS_MEDIA_ERR_NONE;
63 int _media_svc_count_record_with_path(sqlite3 *handle, const char *storage_id, const char *path, int *count)
65 int ret = MS_MEDIA_ERR_NONE;
66 sqlite3_stmt *sql_stmt = NULL;
68 char *sql = sqlite3_mprintf("SELECT count(*) FROM '%q' WHERE path='%q'", storage_id, path);
70 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
72 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
74 *count = sqlite3_column_int(sql_stmt, 0);
76 SQLITE3_FINALIZE(sql_stmt);
78 return MS_MEDIA_ERR_NONE;
81 int _media_svc_insert_item_with_data(sqlite3 *handle, const char *storage_id, media_svc_content_info_s *content_info, int is_burst, bool stack_query, uid_t uid)
83 int ret = MS_MEDIA_ERR_NONE;
84 char *burst_id = NULL;
86 const char *db_fields = "media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, \
87 title, album_id, album, artist, album_artist, genre, composer, year, recorded_date, copyright, track_num, description, category, keyword, location_tag, \
88 content_name, age_rating, author, provider, last_played_time, played_count, favourite, bitrate, bitpersample, samplerate, channel, duration, \
89 longitude, latitude, altitude, exposure_time, fnumber, iso, model, width, height, datetaken, orientation, rating, is_drm, storage_type, burst_id, timeline, weather, sync_status, \
90 file_name_pinyin, title_pinyin, album_pinyin, artist_pinyin, album_artist_pinyin, genre_pinyin, composer_pinyin, copyright_pinyin, description_pinyin, storage_uuid, is_360";
92 const char *db_fields_basic = "media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, \
93 album_id, last_played_time, played_count, favourite, is_drm, storage_type, burst_id, timeline, sync_status, file_name_pinyin, storage_uuid, is_360";
95 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
96 /* This code will be removed when sqlite3_mprintf works clearly */
97 char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
98 SQLITE3_SAFE_FREE(test_sql);
101 int burst_id_int = 0;
102 ret = _media_svc_get_burst_id(handle, storage_id, &burst_id_int);
103 if (ret != MS_MEDIA_ERR_NONE)
106 if (burst_id_int > 0) {
107 media_svc_debug("Burst id : %d", burst_id_int);
108 burst_id = sqlite3_mprintf("%d", burst_id_int);
111 /* Get thumbnail for burst shot */
112 char thumb_path[MEDIA_SVC_PATHNAME_SIZE + 1] = {0, };
114 ret = _media_svc_create_thumbnail(content_info->path, thumb_path, sizeof(thumb_path), content_info->media_type, uid);
115 if (ret == MS_MEDIA_ERR_NONE)
116 content_info->thumbnail_path = g_strdup(thumb_path);
119 /*Update Pinyin If Support Pinyin*/
120 if (_media_svc_check_pinyin_support()) {
121 if (STRING_VALID(content_info->file_name))
122 _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
123 if (STRING_VALID(content_info->media_meta.title))
124 _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
125 if (STRING_VALID(content_info->media_meta.album))
126 _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
127 if (STRING_VALID(content_info->media_meta.artist))
128 _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
129 if (STRING_VALID(content_info->media_meta.album_artist))
130 _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
131 if (STRING_VALID(content_info->media_meta.genre))
132 _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
133 if (STRING_VALID(content_info->media_meta.composer))
134 _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
135 if (STRING_VALID(content_info->media_meta.copyright))
136 _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
137 if (STRING_VALID(content_info->media_meta.description))
138 _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
141 char *sql = sqlite3_mprintf("INSERT INTO '%q' (%q) VALUES (%Q, %Q, %Q, %d, %Q, %lld, %d, %d, %Q, \
142 %Q, %Q, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d, %d, %d, \
143 %d, %d, %d, %d, %d, %.6f, %.6f, %.6f, %Q, %.6f, %d, %Q, %d, %d, %Q, %d, \
144 %d, %d, %d, %Q, %d, %Q, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d);",
145 content_info->storage_uuid, db_fields,
146 content_info->media_uuid,
148 content_info->file_name,
149 content_info->media_type,
150 content_info->mime_type,
152 content_info->added_time,
153 content_info->modified_time,
154 content_info->folder_uuid, /* 1st line */
155 content_info->thumbnail_path,
156 content_info->media_meta.title,
157 content_info->album_id,
158 content_info->media_meta.album,
159 content_info->media_meta.artist,
160 content_info->media_meta.album_artist,
161 content_info->media_meta.genre,
162 content_info->media_meta.composer,
163 content_info->media_meta.year,
164 content_info->media_meta.recorded_date,
165 content_info->media_meta.copyright,
166 content_info->media_meta.track_num,
167 content_info->media_meta.description,
168 content_info->media_meta.category,
169 content_info->media_meta.keyword,
170 content_info->media_meta.location_tag,
171 content_info->media_meta.content_name,
172 content_info->media_meta.age_rating,
173 content_info->media_meta.author,
174 content_info->media_meta.provider,
175 content_info->last_played_time,
176 content_info->played_count,
177 content_info->favourate, /* 2nd line */
178 content_info->media_meta.bitrate,
179 content_info->media_meta.bitpersample,
180 content_info->media_meta.samplerate,
181 content_info->media_meta.channel,
182 content_info->media_meta.duration,
183 content_info->media_meta.longitude,
184 content_info->media_meta.latitude,
185 content_info->media_meta.altitude,
186 content_info->media_meta.exposure_time,
187 content_info->media_meta.fnumber,
188 content_info->media_meta.iso,
189 content_info->media_meta.model,
190 content_info->media_meta.width,
191 content_info->media_meta.height,
192 content_info->media_meta.datetaken,
193 content_info->media_meta.orientation, /* 3rd line */
194 content_info->media_meta.rating,
195 content_info->is_drm,
196 content_info->storage_type,
198 content_info->timeline,
199 content_info->media_meta.weather,
200 content_info->sync_status,
201 content_info->file_name_pinyin,
202 content_info->media_meta.title_pinyin,
203 content_info->media_meta.album_pinyin,
204 content_info->media_meta.artist_pinyin,
205 content_info->media_meta.album_artist_pinyin,
206 content_info->media_meta.genre_pinyin,
207 content_info->media_meta.composer_pinyin,
208 content_info->media_meta.copyright_pinyin,
209 content_info->media_meta.description_pinyin,
210 content_info->storage_uuid,
211 content_info->media_meta.is_360 /* 4th line */
214 /* Check query length */
215 if (sql != NULL && strlen(sql) >= (MEDIA_SVC_QUERY_LEN_MAX - 1)) {
216 media_svc_debug("Query length is over %d byte.. So, remake query using only basic information..", MEDIA_SVC_QUERY_LEN_MAX - 1);
217 SQLITE3_SAFE_FREE(sql);
219 sql = sqlite3_mprintf("INSERT INTO '%q' (%q) VALUES (%Q, %Q, %Q, %d, %Q, %lld, %d, %d, %Q, %Q, %d, %d, %d, %d, %d, %d, %Q, %d, %d, %Q, %Q, %d);",
220 content_info->storage_uuid, db_fields_basic,
221 content_info->media_uuid,
223 content_info->file_name,
224 content_info->media_type,
225 content_info->mime_type,
227 content_info->added_time,
228 content_info->modified_time,
229 content_info->folder_uuid,
230 content_info->thumbnail_path,
231 content_info->album_id,
232 content_info->last_played_time,
233 content_info->played_count,
234 content_info->favourate,
235 content_info->is_drm,
236 content_info->storage_type,
238 content_info->timeline,
239 content_info->sync_status,
240 content_info->file_name_pinyin,
241 content_info->storage_uuid,
242 content_info->media_meta.is_360 /* 1st line */
246 SQLITE3_SAFE_FREE(burst_id);
249 ret = _media_svc_sql_query(sql, uid);
250 SQLITE3_SAFE_FREE(sql);
251 if (ret != MS_MEDIA_ERR_NONE) {
252 media_svc_error("failed to insert item");
256 media_svc_debug("query : %s", sql);
257 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
260 return MS_MEDIA_ERR_NONE;
263 int _media_svc_update_meta_with_data(media_svc_content_info_s *content_info)
265 int ret = MS_MEDIA_ERR_NONE;
267 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
268 /* This code will be removed when sqlite3_mprintf works clearly */
269 char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
270 SQLITE3_SAFE_FREE(test_sql);
272 /*Update Pinyin If Support Pinyin*/
273 if (_media_svc_check_pinyin_support()) {
274 if (STRING_VALID(content_info->file_name))
275 _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
276 if (STRING_VALID(content_info->media_meta.title))
277 _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
278 if (STRING_VALID(content_info->media_meta.album))
279 _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
280 if (STRING_VALID(content_info->media_meta.artist))
281 _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
282 if (STRING_VALID(content_info->media_meta.album_artist))
283 _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
284 if (STRING_VALID(content_info->media_meta.genre))
285 _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
286 if (STRING_VALID(content_info->media_meta.composer))
287 _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
288 if (STRING_VALID(content_info->media_meta.copyright))
289 _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
290 if (STRING_VALID(content_info->media_meta.description))
291 _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
294 char *sql = sqlite3_mprintf("UPDATE '%q' SET title=%Q, album=%Q, artist=%Q, album_artist=%Q, genre=%Q, composer=%Q, copyright=%Q, description=%Q, \
295 file_name_pinyin=%Q, title_pinyin=%Q, album_pinyin=%Q, artist_pinyin=%Q, album_artist_pinyin=%Q, genre_pinyin=%Q, composer_pinyin=%Q, copyright_pinyin=%Q, description_pinyin=%Q \
297 MEDIA_SVC_DB_TABLE_MEDIA,
298 content_info->media_meta.title,
299 content_info->media_meta.album,
300 content_info->media_meta.artist,
301 content_info->media_meta.album_artist,
302 content_info->media_meta.genre,
303 content_info->media_meta.composer,
304 content_info->media_meta.copyright,
305 content_info->media_meta.description,
306 content_info->file_name_pinyin,
307 content_info->media_meta.title_pinyin,
308 content_info->media_meta.album_pinyin,
309 content_info->media_meta.artist_pinyin,
310 content_info->media_meta.album_artist_pinyin,
311 content_info->media_meta.genre_pinyin,
312 content_info->media_meta.composer_pinyin,
313 content_info->media_meta.copyright_pinyin,
314 content_info->media_meta.description_pinyin,
319 media_svc_debug("query : %s", sql);
320 _media_svc_sql_query_add(&g_media_svc_update_item_query_list, &sql);
322 media_svc_error("sqlite3_mprintf failed");
323 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
329 int _media_svc_update_item_with_data(const char *storage_id, media_svc_content_info_s *content_info, uid_t uid)
331 int ret = MS_MEDIA_ERR_NONE;
333 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
334 /* This code will be removed when sqlite3_mprintf works clearly */
335 char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
336 SQLITE3_SAFE_FREE(test_sql);
338 /*Update Pinyin If Support Pinyin*/
339 if (_media_svc_check_pinyin_support()) {
340 if (STRING_VALID(content_info->file_name))
341 _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
342 if (STRING_VALID(content_info->media_meta.title))
343 _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
344 if (STRING_VALID(content_info->media_meta.album))
345 _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
346 if (STRING_VALID(content_info->media_meta.artist))
347 _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
348 if (STRING_VALID(content_info->media_meta.album_artist))
349 _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
350 if (STRING_VALID(content_info->media_meta.genre))
351 _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
352 if (STRING_VALID(content_info->media_meta.composer))
353 _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
354 if (STRING_VALID(content_info->media_meta.copyright))
355 _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
356 if (STRING_VALID(content_info->media_meta.description))
357 _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
360 char *sql = sqlite3_mprintf("UPDATE '%q' SET size=%lld, modified_time=%d, thumbnail_path=%Q, title=%Q, album_id=%d, album=%Q, artist=%Q, album_artist=%Q, genre=%Q, \
361 composer=%Q, year=%Q, recorded_date=%Q, copyright=%Q, track_num=%Q, description=%Q, bitrate=%d, bitpersample=%d, samplerate=%d, channel=%d, duration=%d, \
362 longitude=%f, latitude=%f, altitude=%f, exposure_time=%Q, fnumber=%f, iso=%d, model=%Q, width=%d, height=%d, datetaken=%Q, orientation=%d WHERE path=%Q;",
365 content_info->modified_time,
366 content_info->thumbnail_path,
367 content_info->media_meta.title,
368 content_info->album_id,
369 content_info->media_meta.album,
370 content_info->media_meta.artist,
371 content_info->media_meta.album_artist,
372 content_info->media_meta.genre,
373 content_info->media_meta.composer,
374 content_info->media_meta.year,
375 content_info->media_meta.recorded_date,
376 content_info->media_meta.copyright,
377 content_info->media_meta.track_num,
378 content_info->media_meta.description,
379 content_info->media_meta.bitrate,
380 content_info->media_meta.bitpersample,
381 content_info->media_meta.samplerate,
382 content_info->media_meta.channel,
383 content_info->media_meta.duration,
384 content_info->media_meta.longitude,
385 content_info->media_meta.latitude,
386 content_info->media_meta.altitude,
387 content_info->media_meta.exposure_time,
388 content_info->media_meta.fnumber,
389 content_info->media_meta.iso,
390 content_info->media_meta.model,
391 content_info->media_meta.width,
392 content_info->media_meta.height,
393 content_info->media_meta.datetaken,
394 content_info->media_meta.orientation,
398 ret = _media_svc_sql_query(sql, uid);
399 SQLITE3_SAFE_FREE(sql);
403 int _media_svc_get_thumbnail_path_by_path(sqlite3 *handle, const char *path, char *thumbnail_path)
405 int ret = MS_MEDIA_ERR_NONE;
406 sqlite3_stmt *sql_stmt = NULL;
408 char *sql = sqlite3_mprintf("SELECT thumbnail_path FROM '%q' WHERE path='%q'", MEDIA_SVC_DB_TABLE_MEDIA, path);
410 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
412 if (ret != MS_MEDIA_ERR_NONE) {
413 if (ret == MS_MEDIA_ERR_DB_NO_RECORD)
414 media_svc_debug("there is no thumbnail.");
416 media_svc_error("error when _media_svc_get_thumbnail_path_by_path. err = [%d]", ret);
421 SAFE_STRLCPY(thumbnail_path, (const char *)sqlite3_column_text(sql_stmt, 0), MEDIA_SVC_PATHNAME_SIZE);
423 SQLITE3_FINALIZE(sql_stmt);
425 return MS_MEDIA_ERR_NONE;
428 int _media_svc_get_media_type_by_path(sqlite3 *handle, const char *storage_id, const char *path, int *media_type)
430 int ret = MS_MEDIA_ERR_NONE;
431 sqlite3_stmt *sql_stmt = NULL;
433 char *sql = sqlite3_mprintf("SELECT media_type FROM '%q' WHERE path='%q'", storage_id, path);
435 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
437 if (ret != MS_MEDIA_ERR_NONE) {
438 media_svc_error("error when _media_svc_get_media_type_by_path. err = [%d]", ret);
442 *media_type = sqlite3_column_int(sql_stmt, 0);
444 SQLITE3_FINALIZE(sql_stmt);
446 return MS_MEDIA_ERR_NONE;
449 int _media_svc_delete_item_by_path(const char *storage_id, const char *path, bool stack_query, uid_t uid)
451 int ret = MS_MEDIA_ERR_NONE;
452 char *sql = sqlite3_mprintf("DELETE FROM '%q' WHERE path='%q';", storage_id, path);
455 ret = _media_svc_sql_query(sql, uid);
456 SQLITE3_SAFE_FREE(sql);
457 if (ret != MS_MEDIA_ERR_NONE) {
458 media_svc_error("failed to delete item");
462 media_svc_debug("query : %s", sql);
463 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
469 int _media_svc_truncate_table(const char *storage_id, media_svc_storage_type_e storage_type, uid_t uid)
471 int ret = MS_MEDIA_ERR_NONE;
473 char *sql = sqlite3_mprintf("DELETE FROM '%q' where storage_type=%d;", storage_id, storage_type);
475 ret = _media_svc_sql_query(sql, uid);
476 SQLITE3_SAFE_FREE(sql);
481 int _media_svc_delete_invalid_items(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type, uid_t uid)
483 int ret = MS_MEDIA_ERR_NONE;
484 GArray *thumb_list = NULL;
486 thumb_list = g_array_new(FALSE, FALSE, sizeof(char*));
488 /*If external USB, no need this process */
489 if (storage_type != MEDIA_SVC_STORAGE_EXTERNAL_USB) {
490 ret = __media_svc_get_invalid_records_with_thumbnail(handle, storage_type, &thumb_list);
491 if (ret != MS_MEDIA_ERR_NONE) {
492 media_svc_error("error when get thumbnail record");
493 g_array_free(thumb_list, false);
499 char *sql = sqlite3_mprintf("DELETE FROM '%q' WHERE validity = 0 AND storage_type = %d;", storage_id, storage_type);
501 ret = _media_svc_sql_query(sql, uid);
502 SQLITE3_SAFE_FREE(sql);
503 if (ret != MS_MEDIA_ERR_NONE) {
504 while (thumb_list->len != 0) {
505 char *thumb_path = NULL;
506 thumb_path = g_array_index(thumb_list , char*, 0);
507 g_array_remove_index(thumb_list, 0);
508 SAFE_FREE(thumb_path);
510 g_array_free(thumb_list, false);
515 /*Delete thumbnails*/
516 while (thumb_list->len != 0) {
517 char *thumb_path = NULL;
518 thumb_path = g_array_index(thumb_list , char*, 0);
519 g_array_remove_index(thumb_list, 0);
521 ret = _media_svc_remove_file(thumb_path);
522 if (ret != MS_MEDIA_ERR_NONE)
523 media_svc_error("fail to remove thumbnail file.");
525 SAFE_FREE(thumb_path);
528 g_array_free(thumb_list, false);
531 return MS_MEDIA_ERR_NONE;
534 int _media_svc_update_item_validity(const char *storage_id, const char *path, int validity, bool stack_query, uid_t uid)
536 int ret = MS_MEDIA_ERR_NONE;
538 char *sql = sqlite3_mprintf("UPDATE '%q' SET validity=%d WHERE path= '%q';", storage_id, validity, path);
541 ret = _media_svc_sql_query(sql, uid);
542 SQLITE3_SAFE_FREE(sql);
544 _media_svc_sql_query_add(&g_media_svc_item_validity_query_list, &sql);
550 int _media_svc_update_thumbnail_path(const char *path, const char *thumb_path, uid_t uid)
552 int ret = MS_MEDIA_ERR_NONE;
554 char *sql = sqlite3_mprintf("UPDATE '%q' SET thumbnail_path=%Q WHERE path= %Q;", MEDIA_SVC_DB_TABLE_MEDIA, thumb_path, path);
556 ret = _media_svc_sql_query(sql, uid);
557 SQLITE3_SAFE_FREE(sql);
562 int _media_svc_update_storage_item_validity(const char *storage_id, media_svc_storage_type_e storage_type, int validity, uid_t uid)
564 int ret = MS_MEDIA_ERR_NONE;
566 char *sql = sqlite3_mprintf("UPDATE '%q' SET validity=%d WHERE storage_type=%d;", storage_id, validity, storage_type);
568 ret = _media_svc_sql_query(sql, uid);
569 SQLITE3_SAFE_FREE(sql);
574 int _media_svc_update_folder_item_validity(sqlite3 *handle, const char *storage_id, const char *folder_path, int validity, uid_t uid)
576 int ret = MS_MEDIA_ERR_NONE;
578 char folder_uuid[MEDIA_SVC_UUID_SIZE + 1] = {0, };
579 sqlite3_stmt *sql_stmt = NULL;
582 sql = sqlite3_mprintf("SELECT folder_uuid FROM '%q' WHERE path='%q' AND storage_uuid='%q'", MEDIA_SVC_DB_TABLE_FOLDER, folder_path, storage_id);
584 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
585 if (ret != MS_MEDIA_ERR_NONE) {
586 if (ret == MS_MEDIA_ERR_DB_NO_RECORD)
587 media_svc_debug("folder not exist");
589 media_svc_error("error when get folder_id. err = [%d]", ret);
594 SAFE_STRLCPY(folder_uuid, (const char *)sqlite3_column_text(sql_stmt, 0), MEDIA_SVC_UUID_SIZE + 1);
595 SQLITE3_FINALIZE(sql_stmt);
597 /*Update folder item validity*/
598 sql = sqlite3_mprintf("UPDATE '%q' SET validity=%d WHERE folder_uuid='%q';", storage_id, validity, folder_uuid);
600 ret = _media_svc_sql_query(sql, uid);
601 SQLITE3_SAFE_FREE(sql);
606 int _media_svc_update_recursive_folder_item_validity(const char *storage_id, const char *folder_path, int validity, uid_t uid)
608 int ret = MS_MEDIA_ERR_NONE;
610 /*Update folder item validity*/
611 char *sql = sqlite3_mprintf("UPDATE '%q' SET validity=%d WHERE (storage_type = 0 OR storage_type = 1) AND path LIKE '%q/%%';", storage_id, validity, folder_path);
613 ret = _media_svc_sql_query(sql, uid);
614 SQLITE3_SAFE_FREE(sql);
619 int _media_svc_update_item_by_path(const char *src_path, media_svc_storage_type_e dest_storage, const char *dest_path,
620 const char *file_name, int modified_time, const char *folder_uuid, const char *thumb_path, bool stack_query, uid_t uid)
622 /* update path, filename, modified_time, folder_uuid, thumbnail_path, */
623 /* played_count, last_played_time, last_played_position, favourite, storaget_type*/
625 int ret = MS_MEDIA_ERR_NONE;
628 if (thumb_path != NULL) {
629 sql = sqlite3_mprintf("UPDATE '%q' SET path=%Q, file_name=%Q, modified_time=%d, folder_uuid=%Q, thumbnail_path=%Q, storage_type=%d, \
630 played_count=0, last_played_time=0, last_played_position=0 WHERE path=%Q;",
631 MEDIA_SVC_DB_TABLE_MEDIA, dest_path, file_name, modified_time, folder_uuid, thumb_path, dest_storage, src_path);
633 sql = sqlite3_mprintf("UPDATE '%q' SET path=%Q, file_name=%Q, modified_time=%d, folder_uuid=%Q, storage_type=%d, \
634 played_count=0, last_played_time=0, last_played_position=0 WHERE path=%Q;",
635 MEDIA_SVC_DB_TABLE_MEDIA, dest_path, file_name, modified_time, folder_uuid, dest_storage, src_path);
639 ret = _media_svc_sql_query(sql, uid);
640 SQLITE3_SAFE_FREE(sql);
642 _media_svc_sql_query_add(&g_media_svc_move_item_query_list, &sql);
648 int _media_svc_list_query_do(media_svc_query_type_e query_type, uid_t uid)
650 int ret = MS_MEDIA_ERR_NONE;
652 /* For multiples of 200, empty requests are possible */
653 if (query_type == MEDIA_SVC_QUERY_UPDATE_COMMON) {
654 if (g_media_svc_update_list == NULL || g_list_length(g_media_svc_update_list) == 0)
655 return MS_MEDIA_ERR_NONE;
658 ret = _media_svc_sql_begin_trans(uid);
659 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
661 if (query_type == MEDIA_SVC_QUERY_SET_ITEM_VALIDITY)
662 ret = _media_svc_sql_query_list(&g_media_svc_item_validity_query_list, uid);
663 else if (query_type == MEDIA_SVC_QUERY_MOVE_ITEM)
664 ret = _media_svc_sql_query_list(&g_media_svc_move_item_query_list, uid);
665 else if (query_type == MEDIA_SVC_QUERY_INSERT_ITEM)
666 ret = _media_svc_sql_query_list(&g_media_svc_insert_item_query_list, uid);
667 else if (query_type == MEDIA_SVC_QUERY_UPDATE_ITEM)
668 ret = _media_svc_sql_query_list(&g_media_svc_update_item_query_list, uid);
669 else if (query_type == MEDIA_SVC_QUERY_INSERT_FOLDER)
670 ret = _media_svc_sql_query_list(_media_svc_get_folder_list_ptr(), uid);
671 else if (query_type == MEDIA_SVC_QUERY_UPDATE_COMMON)
672 ret = _media_svc_sql_query_list(&g_media_svc_update_list, uid);
674 ret = MS_MEDIA_ERR_INVALID_PARAMETER;
676 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Failed to request queries");
678 ret = _media_svc_sql_end_trans(uid);
679 media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Failed to batch insert");
681 return MS_MEDIA_ERR_NONE;
684 int _media_svc_append_query_list(const char *query, uid_t uid)
686 int ret = MS_MEDIA_ERR_NONE;
688 g_media_svc_update_list = g_list_append(g_media_svc_update_list, (gpointer)query);
690 if (g_list_length(g_media_svc_update_list) >= MEDIA_SVC_MAX_COMMIT_SIZE)
691 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_UPDATE_COMMON, uid);
696 int _media_svc_get_burst_id(sqlite3 *handle, const char *storage_id, int *id)
698 int ret = MS_MEDIA_ERR_NONE;
700 sqlite3_stmt *sql_stmt = NULL;
701 char *sql = sqlite3_mprintf("SELECT max(CAST(burst_id AS INTEGER)) FROM '%q'", storage_id);
703 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
705 if (ret != MS_MEDIA_ERR_NONE) {
706 media_svc_error("error when _media_svc_get_burst_id. err = [%d]", ret);
710 cur_id = sqlite3_column_int(sql_stmt, 0);
712 SQLITE3_FINALIZE(sql_stmt);
714 return MS_MEDIA_ERR_NONE;
717 int _media_svc_get_noti_info(sqlite3 *handle, const char *storage_id, const char *path, int update_item, media_svc_noti_item **item)
719 int ret = MS_MEDIA_ERR_NONE;
720 sqlite3_stmt *sql_stmt = NULL;
722 int is_root_dir = FALSE;
725 media_svc_error("invalid parameter");
726 return MS_MEDIA_ERR_INVALID_PARAMETER;
729 if (update_item == MS_MEDIA_ITEM_FILE)
730 sql = sqlite3_mprintf("SELECT media_uuid, media_type, mime_type FROM '%q' WHERE path=%Q", storage_id, path);
731 else if (update_item == MS_MEDIA_ITEM_DIRECTORY)
732 sql = sqlite3_mprintf("SELECT folder_uuid FROM '%q' WHERE path=%Q AND storage_uuid='%q'", MEDIA_SVC_DB_TABLE_FOLDER, path, storage_id);
734 media_svc_error("_media_svc_get_noti_info failed : update item");
735 return MS_MEDIA_ERR_INVALID_PARAMETER;
738 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
740 if (ret != MS_MEDIA_ERR_NONE) {
741 if (ret == MS_MEDIA_ERR_DB_NO_RECORD && update_item == MS_MEDIA_ITEM_DIRECTORY) {
742 media_svc_debug("This is root directory of media");
746 media_svc_error("error when _media_svc_get_noti_info. err = [%d]", ret);
751 *item = calloc(1, sizeof(media_svc_noti_item));
753 media_svc_error("_media_svc_get_noti_info failed : calloc");
754 return MS_MEDIA_ERR_OUT_OF_MEMORY;
757 if (update_item == MS_MEDIA_ITEM_FILE) {
758 (*item)->media_uuid = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0));
759 (*item)->media_type = sqlite3_column_int(sql_stmt, 1);
760 (*item)->mime_type = g_strdup((const char *)sqlite3_column_text(sql_stmt, 2));
761 } else if (update_item == MS_MEDIA_ITEM_DIRECTORY) {
763 (*item)->media_uuid = NULL;
765 (*item)->media_uuid = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0));
768 SQLITE3_FINALIZE(sql_stmt);
770 return MS_MEDIA_ERR_NONE;
773 int _media_svc_get_fileinfo_by_path(sqlite3 *handle, const char *storage_id, const char *path, time_t *modified_time, unsigned long long *size)
775 int ret = MS_MEDIA_ERR_NONE;
776 sqlite3_stmt *sql_stmt = NULL;
777 char *sql = sqlite3_mprintf("SELECT modified_time, size FROM '%q' WHERE path='%q'", storage_id, path);
779 ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
781 if (ret != MS_MEDIA_ERR_NONE) {
782 media_svc_error("error when _media_svc_get_fileinfo_by_path. err = [%d]", ret);
786 *modified_time = (int)sqlite3_column_int(sql_stmt, 0);
787 *size = (unsigned long long)sqlite3_column_int64(sql_stmt, 1);
789 SQLITE3_FINALIZE(sql_stmt);
791 return MS_MEDIA_ERR_NONE;
794 int _media_svc_change_validity_item_batch(const char *storage_id, const char *path, int des_validity, int src_validity, uid_t uid)
796 int ret = MS_MEDIA_ERR_NONE;
798 char *sql = sqlite3_mprintf("UPDATE '%q' SET validity=%d WHERE validity=%d AND path LIKE '%q%%'", storage_id, des_validity, src_validity, path);
800 ret = _media_svc_sql_query(sql, uid);
801 SQLITE3_SAFE_FREE(sql);
806 int _media_svc_insert_item_pass1(sqlite3 *handle, const char *storage_id, media_svc_content_info_s *content_info, int is_burst, bool stack_query, uid_t uid)
808 int ret = MS_MEDIA_ERR_NONE;
810 char * db_fields = (char *)"media_uuid, folder_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, is_drm, storage_type, timeline, storage_uuid";
812 char *sql = sqlite3_mprintf("INSERT INTO '%q' (%q) VALUES (%Q, %Q, %Q, %Q, %d, %Q, %lld, %d, %d, %d, %d, %d, %Q);",
813 storage_id, db_fields,
814 content_info->media_uuid,
815 content_info->folder_uuid,
817 content_info->file_name,
818 content_info->media_type,
819 content_info->mime_type,
821 content_info->added_time,
822 content_info->modified_time,
823 content_info->is_drm,
824 content_info->storage_type,
825 content_info->timeline,
829 media_svc_debug("MAKE PASS 1 QUERY END");
832 ret = _media_svc_sql_query(sql, uid);
833 SQLITE3_SAFE_FREE(sql);
834 if (ret != MS_MEDIA_ERR_NONE) {
835 media_svc_error("failed to insert item");
839 media_svc_debug("query : %s", sql);
840 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
842 media_svc_debug("END");
843 return MS_MEDIA_ERR_NONE;