Remove Unused function
[platform/core/multimedia/libmedia-service.git] / src / common / media-svc-media.c
1 /*
2  * libmedia-service
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <string.h>
23 #include <unistd.h>
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"
32
33 #define MEDIA_SVC_MAX_COMMIT_SIZE 200
34
35 typedef struct {
36         char thumbnail_path[MEDIA_SVC_PATHNAME_SIZE];
37 } media_svc_thumbnailpath_s;
38
39 static __thread GList *g_media_svc_item_validity_query_list = NULL;
40 static __thread GList *g_media_svc_insert_item_query_list = NULL;
41 __thread GList *g_media_svc_move_item_query_list = NULL;
42 static __thread GList *g_media_svc_update_item_query_list = NULL;
43 static __thread GList *g_media_svc_update_list = NULL;
44 static __thread int g_media_svc_update_list_count = 0;
45
46 static int __media_svc_count_invalid_records_with_thumbnail(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type, int *count);
47 static int __media_svc_get_invalid_records_with_thumbnail(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type, int count, media_svc_thumbnailpath_s *thumb_path);
48 static int __media_svc_count_invalid_folder_records_with_thumbnail(sqlite3 *handle, const char *storage_id, const char *folder_path, const char *folder_uuid, bool is_recursive, int *count);
49 static int __media_svc_get_invalid_folder_records_with_thumbnail(sqlite3 *handle, const char *storage_id, const char *folder_path, const char *folder_uuid, bool is_recursive, int count, media_svc_thumbnailpath_s *thumb_path);
50
51 static int __media_svc_count_invalid_records_with_thumbnail(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type, int *count)
52 {
53         int ret = MS_MEDIA_ERR_NONE;
54         sqlite3_stmt *sql_stmt = NULL;
55         char *sql = sqlite3_mprintf("SELECT count(*) FROM '%s' WHERE validity=0 AND storage_type=%d AND thumbnail_path IS NOT NULL",
56                                         storage_id, storage_type);
57
58         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
59
60         if (ret != MS_MEDIA_ERR_NONE) {
61                 media_svc_error("error when __media_svc_count_invalid_records_with_thumbnail. err = [%d]", ret);
62                 return ret;
63         }
64
65         *count = sqlite3_column_int(sql_stmt, 0);
66
67         SQLITE3_FINALIZE(sql_stmt);
68
69         return MS_MEDIA_ERR_NONE;
70
71 }
72
73 static int __media_svc_get_invalid_records_with_thumbnail(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type,
74                                                         int count, media_svc_thumbnailpath_s * thumb_path)
75 {
76         int ret = MS_MEDIA_ERR_NONE;
77         sqlite3_stmt *sql_stmt = NULL;
78         int idx = 0;
79
80         char *sql = sqlite3_mprintf("SELECT thumbnail_path from (select thumbnail_path, validity from '%s' WHERE storage_type=%d AND thumbnail_path IS NOT NULL GROUP BY thumbnail_path HAVING count() = 1) WHERE validity=0",
81                                         MEDIA_SVC_DB_TABLE_MEDIA, storage_type);
82
83         media_svc_debug("[SQL query] : %s", sql);
84
85         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
86         if (ret != MS_MEDIA_ERR_NONE) {
87                 media_svc_error("error when __media_svc_get_invalid_records_with_thumbnail. err = [%d]", ret);
88                 return ret;
89         }
90
91         while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
92                 SAFE_STRLCPY(thumb_path[idx].thumbnail_path, (const char *)sqlite3_column_text(sql_stmt, 0), sizeof(thumb_path[idx]));
93                 idx++;
94         }
95
96         SQLITE3_FINALIZE(sql_stmt);
97
98         return MS_MEDIA_ERR_NONE;
99 }
100
101 static int __media_svc_count_invalid_folder_records_with_thumbnail(sqlite3 *handle, const char *storage_id, const char *folder_path, const char *folder_uuid, bool is_recursive, int *count)
102 {
103         int ret = MS_MEDIA_ERR_NONE;
104         sqlite3_stmt *sql_stmt = NULL;
105         char *sql = NULL;
106
107         if (is_recursive)
108                 sql = sqlite3_mprintf("SELECT count(*) FROM '%s' WHERE validity=0 AND path LIKE '%q/%%' AND thumbnail_path IS NOT NULL", storage_id, folder_path);
109         else
110                 sql = sqlite3_mprintf("SELECT count(*) FROM '%s' WHERE validity=0 AND folder_uuid = '%q' AND thumbnail_path IS NOT NULL", storage_id, folder_uuid);
111
112         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
113
114         if (ret != MS_MEDIA_ERR_NONE) {
115                 media_svc_error("error when __media_svc_count_invalid_folder_records_with_thumbnail. err = [%d]", ret);
116                 return ret;
117         }
118
119         *count = sqlite3_column_int(sql_stmt, 0);
120
121         SQLITE3_FINALIZE(sql_stmt);
122
123         return MS_MEDIA_ERR_NONE;
124
125 }
126
127 static int __media_svc_get_invalid_folder_records_with_thumbnail(sqlite3 *handle, const char *storage_id, const char *folder_path, const char *folder_uuid, bool is_recursive,
128                                                         int count, media_svc_thumbnailpath_s * thumb_path)
129 {
130         int ret = MS_MEDIA_ERR_NONE;
131         sqlite3_stmt *sql_stmt = NULL;
132         int idx = 0;
133         char *sql = NULL;
134
135         if (is_recursive)
136                 sql = sqlite3_mprintf("SELECT thumbnail_path from (select thumbnail_path, validity from '%s' WHERE path LIKE '%q/%%' AND thumbnail_path IS NOT NULL GROUP BY thumbnail_path HAVING count() = 1) WHERE validity=0", storage_id, folder_path);
137         else
138                 sql = sqlite3_mprintf("SELECT thumbnail_path from (select thumbnail_path, validity from '%s' WHERE folder_uuid = '%q' AND thumbnail_path IS NOT NULL GROUP BY thumbnail_path HAVING count() = 1) WHERE validity=0", storage_id, folder_uuid);
139
140         media_svc_debug("[SQL query] : %s", sql);
141
142         ret = _media_svc_sql_prepare_to_step_simple(handle, sql, &sql_stmt);
143         if (ret != MS_MEDIA_ERR_NONE) {
144                 media_svc_error("error when __media_svc_get_invalid_folder_records_with_thumbnail. err = [%d]", ret);
145                 return ret;
146         }
147
148         while (sqlite3_step(sql_stmt) == SQLITE_ROW) {
149                 SAFE_STRLCPY(thumb_path[idx].thumbnail_path, (const char *)sqlite3_column_text(sql_stmt, 0), sizeof(thumb_path[idx]));
150                 idx++;
151         }
152
153         SQLITE3_FINALIZE(sql_stmt);
154
155         return MS_MEDIA_ERR_NONE;
156 }
157
158 int _media_svc_count_record_with_path(sqlite3 *handle, const char *storage_id, const char *path, int *count)
159 {
160         int ret = MS_MEDIA_ERR_NONE;
161         sqlite3_stmt *sql_stmt = NULL;
162
163         char *sql = sqlite3_mprintf("SELECT count(*) FROM '%s' WHERE path='%q'", storage_id, path);
164
165         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
166
167         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
168
169         *count = sqlite3_column_int(sql_stmt, 0);
170
171         SQLITE3_FINALIZE(sql_stmt);
172
173         return MS_MEDIA_ERR_NONE;
174 }
175
176 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)
177 {
178         int ret = MS_MEDIA_ERR_NONE;
179         char *burst_id = NULL;
180
181         const char *db_fields = "media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, \
182                 title, album_id, album, artist, album_artist, genre, composer, year, recorded_date, copyright, track_num, description, category, keyword, location_tag, \
183                 content_name, age_rating, author, provider, last_played_time, played_count, favourite, bitrate, bitpersample, samplerate, channel, duration, \
184                 longitude, latitude, altitude, exposure_time, fnumber, iso, model, width, height, datetaken, orientation, rating, is_drm, storage_type, burst_id, timeline, weather, sync_status, \
185                 file_name_pinyin, title_pinyin, album_pinyin, artist_pinyin, album_artist_pinyin, genre_pinyin, composer_pinyin, copyright_pinyin, description_pinyin, storage_uuid, is_360";
186
187         const char *db_fields_basic = "media_uuid, path, file_name, media_type, mime_type, size, added_time, modified_time, folder_uuid, thumbnail_path, \
188                 album_id, last_played_time, played_count, favourite, is_drm, storage_type, burst_id, timeline, sync_status, file_name_pinyin, storage_uuid, is_360";
189
190         /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
191         /* This code will be removed when sqlite3_mprintf works clearly */
192         char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
193         SQLITE3_SAFE_FREE(test_sql);
194
195         if (is_burst) {
196                 int burst_id_int = 0;
197                 ret = _media_svc_get_burst_id(handle, storage_id, &burst_id_int);
198                 if (ret != MS_MEDIA_ERR_NONE)
199                         burst_id = NULL;
200
201                 if (burst_id_int > 0) {
202                         media_svc_debug("Burst id : %d", burst_id_int);
203                         burst_id = sqlite3_mprintf("%d", burst_id_int);
204                 }
205
206                 /* Get thumbnail for burst shot */
207                 char thumb_path[MEDIA_SVC_PATHNAME_SIZE + 1] = {0, };
208
209                 ret = _media_svc_request_thumbnail(content_info->path, thumb_path, sizeof(thumb_path), uid);
210                 if (ret == MS_MEDIA_ERR_NONE)
211                         content_info->thumbnail_path = g_strdup(thumb_path);
212         }
213
214         /*Update Pinyin If Support Pinyin*/
215         if (_media_svc_check_pinyin_support()) {
216                 if (STRING_VALID(content_info->file_name))
217                         _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
218                 if (STRING_VALID(content_info->media_meta.title))
219                         _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
220                 if (STRING_VALID(content_info->media_meta.album))
221                         _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
222                 if (STRING_VALID(content_info->media_meta.artist))
223                         _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
224                 if (STRING_VALID(content_info->media_meta.album_artist))
225                         _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
226                 if (STRING_VALID(content_info->media_meta.genre))
227                         _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
228                 if (STRING_VALID(content_info->media_meta.composer))
229                         _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
230                 if (STRING_VALID(content_info->media_meta.copyright))
231                         _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
232                 if (STRING_VALID(content_info->media_meta.description))
233                         _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
234         }
235
236         char *sql = sqlite3_mprintf("INSERT INTO '%s' (%s) VALUES (%Q, %Q, %Q, %d, %Q, %lld, %d, %d, %Q, \
237                 %Q, %Q, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d, %d, %d, \
238                 %d, %d, %d, %d, %d, %.6f, %.6f, %.6f, %Q, %.6f, %d, %Q, %d, %d, %Q, %d, \
239                 %d, %d, %d, %Q, %d, %Q, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d);",
240                                 content_info->storage_uuid, db_fields,
241                                 content_info->media_uuid,
242                                 content_info->path,
243                                 content_info->file_name,
244                                 content_info->media_type,
245                                 content_info->mime_type,
246                                 content_info->size,
247                                 content_info->added_time,
248                                 content_info->modified_time,
249                                 content_info->folder_uuid,                      /* 1st line */
250                                 content_info->thumbnail_path,
251                                 content_info->media_meta.title,
252                                 content_info->album_id,
253                                 content_info->media_meta.album,
254                                 content_info->media_meta.artist,
255                                 content_info->media_meta.album_artist,
256                                 content_info->media_meta.genre,
257                                 content_info->media_meta.composer,
258                                 content_info->media_meta.year,
259                                 content_info->media_meta.recorded_date,
260                                 content_info->media_meta.copyright,
261                                 content_info->media_meta.track_num,
262                                 content_info->media_meta.description,
263                                 content_info->media_meta.category,
264                                 content_info->media_meta.keyword,
265                                 content_info->media_meta.location_tag,
266                                 content_info->media_meta.content_name,
267                                 content_info->media_meta.age_rating,
268                                 content_info->media_meta.author,
269                                 content_info->media_meta.provider,
270                                 content_info->last_played_time,
271                                 content_info->played_count,
272                                 content_info->favourate,                /* 2nd line */
273                                 content_info->media_meta.bitrate,
274                                 content_info->media_meta.bitpersample,
275                                 content_info->media_meta.samplerate,
276                                 content_info->media_meta.channel,
277                                 content_info->media_meta.duration,
278                                 content_info->media_meta.longitude,
279                                 content_info->media_meta.latitude,
280                                 content_info->media_meta.altitude,
281                                 content_info->media_meta.exposure_time,
282                                 content_info->media_meta.fnumber,
283                                 content_info->media_meta.iso,
284                                 content_info->media_meta.model,
285                                 content_info->media_meta.width,
286                                 content_info->media_meta.height,
287                                 content_info->media_meta.datetaken,
288                                 content_info->media_meta.orientation,           /* 3rd line */
289                                 content_info->media_meta.rating,
290                                 content_info->is_drm,
291                                 content_info->storage_type,
292                                 burst_id,
293                                 content_info->timeline,
294                                 content_info->media_meta.weather,
295                                 content_info->sync_status,
296                                 content_info->file_name_pinyin,
297                                 content_info->media_meta.title_pinyin,
298                                 content_info->media_meta.album_pinyin,
299                                 content_info->media_meta.artist_pinyin,
300                                 content_info->media_meta.album_artist_pinyin,
301                                 content_info->media_meta.genre_pinyin,
302                                 content_info->media_meta.composer_pinyin,
303                                 content_info->media_meta.copyright_pinyin,
304                                 content_info->media_meta.description_pinyin,
305                                 content_info->storage_uuid,
306                                 content_info->media_meta.is_360         /* 4th line */
307                         );
308
309         /* Check query length */
310         if (sql != NULL && strlen(sql) >= (MEDIA_SVC_QUERY_LEN_MAX - 1)) {
311                 media_svc_debug("Query length is over %d byte.. So, remake query using only basic information..", MEDIA_SVC_QUERY_LEN_MAX - 1);
312                 SQLITE3_SAFE_FREE(sql);
313
314                 sql = sqlite3_mprintf("INSERT INTO '%s' (%s) VALUES (%Q, %Q, %Q, %d, %Q, %lld, %d, %d, %Q, %Q, %d, %d, %d, %d, %d, %d, %Q, %d, %d, %Q, %Q, %d);",
315                                                 content_info->storage_uuid, db_fields_basic,
316                                                 content_info->media_uuid,
317                                                 content_info->path,
318                                                 content_info->file_name,
319                                                 content_info->media_type,
320                                                 content_info->mime_type,
321                                                 content_info->size,
322                                                 content_info->added_time,
323                                                 content_info->modified_time,
324                                                 content_info->folder_uuid,
325                                                 content_info->thumbnail_path,
326                                                 content_info->album_id,
327                                                 content_info->last_played_time,
328                                                 content_info->played_count,
329                                                 content_info->favourate,
330                                                 content_info->is_drm,
331                                                 content_info->storage_type,
332                                                 burst_id,
333                                                 content_info->timeline,
334                                                 content_info->sync_status,
335                                                 content_info->file_name_pinyin,
336                                                 content_info->storage_uuid,
337                                                 content_info->media_meta.is_360         /* 1st line */
338                                                 );
339         }
340
341         SQLITE3_SAFE_FREE(burst_id);
342
343         if (!stack_query) {
344                 ret = _media_svc_sql_query(sql, uid);
345                 SQLITE3_SAFE_FREE(sql);
346                 if (ret != MS_MEDIA_ERR_NONE) {
347                         media_svc_error("failed to insert item");
348                         return ret;
349                 }
350         } else {
351                 media_svc_debug("query : %s", sql);
352                 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
353         }
354
355         return MS_MEDIA_ERR_NONE;
356 }
357
358 int _media_svc_update_meta_with_data(media_svc_content_info_s *content_info)
359 {
360         int ret = MS_MEDIA_ERR_NONE;
361
362         /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
363         /* This code will be removed when sqlite3_mprintf works clearly */
364         char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
365         SQLITE3_SAFE_FREE(test_sql);
366
367         /*Update Pinyin If Support Pinyin*/
368         if (_media_svc_check_pinyin_support()) {
369                 if (STRING_VALID(content_info->file_name))
370                         _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
371                 if (STRING_VALID(content_info->media_meta.title))
372                         _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
373                 if (STRING_VALID(content_info->media_meta.album))
374                         _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
375                 if (STRING_VALID(content_info->media_meta.artist))
376                         _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
377                 if (STRING_VALID(content_info->media_meta.album_artist))
378                         _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
379                 if (STRING_VALID(content_info->media_meta.genre))
380                         _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
381                 if (STRING_VALID(content_info->media_meta.composer))
382                         _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
383                 if (STRING_VALID(content_info->media_meta.copyright))
384                         _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
385                 if (STRING_VALID(content_info->media_meta.description))
386                         _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
387         }
388
389         char *sql = sqlite3_mprintf("UPDATE %s SET title=%Q, album=%Q, artist=%Q, album_artist=%Q, genre=%Q, composer=%Q, copyright=%Q, description=%Q, \
390                 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 \
391                 WHERE path=%Q;",
392                                 MEDIA_SVC_DB_TABLE_MEDIA,
393                                 content_info->media_meta.title,
394                                 content_info->media_meta.album,
395                                 content_info->media_meta.artist,
396                                 content_info->media_meta.album_artist,
397                                 content_info->media_meta.genre,
398                                 content_info->media_meta.composer,
399                                 content_info->media_meta.copyright,
400                                 content_info->media_meta.description,
401                                 content_info->file_name_pinyin,
402                                 content_info->media_meta.title_pinyin,
403                                 content_info->media_meta.album_pinyin,
404                                 content_info->media_meta.artist_pinyin,
405                                 content_info->media_meta.album_artist_pinyin,
406                                 content_info->media_meta.genre_pinyin,
407                                 content_info->media_meta.composer_pinyin,
408                                 content_info->media_meta.copyright_pinyin,
409                                 content_info->media_meta.description_pinyin,
410                                 content_info->path
411                                 );
412
413         if (sql != NULL) {
414                 media_svc_debug("query : %s", sql);
415                 _media_svc_sql_query_add(&g_media_svc_update_item_query_list, &sql);
416         } else {
417                 media_svc_error("sqlite3_mprintf failed");
418                 ret = MS_MEDIA_ERR_OUT_OF_MEMORY;
419         }
420
421         return ret;
422 }
423
424 int _media_svc_update_item_with_data(const char *storage_id, media_svc_content_info_s *content_info, uid_t uid)
425 {
426         int ret = MS_MEDIA_ERR_NONE;
427
428         /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
429         /* This code will be removed when sqlite3_mprintf works clearly */
430         char *test_sql = sqlite3_mprintf("%f, %f, %f", content_info->media_meta.longitude, content_info->media_meta.latitude, content_info->media_meta.altitude);
431         SQLITE3_SAFE_FREE(test_sql);
432
433         /*Update Pinyin If Support Pinyin*/
434         if (_media_svc_check_pinyin_support()) {
435                 if (STRING_VALID(content_info->file_name))
436                         _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
437                 if (STRING_VALID(content_info->media_meta.title))
438                         _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
439                 if (STRING_VALID(content_info->media_meta.album))
440                         _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
441                 if (STRING_VALID(content_info->media_meta.artist))
442                         _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
443                 if (STRING_VALID(content_info->media_meta.album_artist))
444                         _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
445                 if (STRING_VALID(content_info->media_meta.genre))
446                         _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
447                 if (STRING_VALID(content_info->media_meta.composer))
448                         _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
449                 if (STRING_VALID(content_info->media_meta.copyright))
450                         _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
451                 if (STRING_VALID(content_info->media_meta.description))
452                         _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
453         }
454
455         char *sql = sqlite3_mprintf("UPDATE '%s' SET size=%lld, modified_time=%d, thumbnail_path=%Q, title=%Q, album_id=%d, album=%Q, artist=%Q, album_artist=%Q, genre=%Q, \
456                 composer=%Q, year=%Q, recorded_date=%Q, copyright=%Q, track_num=%Q, description=%Q, bitrate=%d, bitpersample=%d, samplerate=%d, channel=%d, duration=%d, \
457                 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;",
458                                 storage_id,
459                                 content_info->size,
460                                 content_info->modified_time,
461                                 content_info->thumbnail_path,
462                                 content_info->media_meta.title,
463                                 content_info->album_id,
464                                 content_info->media_meta.album,
465                                 content_info->media_meta.artist,
466                                 content_info->media_meta.album_artist,
467                                 content_info->media_meta.genre,
468                                 content_info->media_meta.composer,
469                                 content_info->media_meta.year,
470                                 content_info->media_meta.recorded_date,
471                                 content_info->media_meta.copyright,
472                                 content_info->media_meta.track_num,
473                                 content_info->media_meta.description,
474                                 content_info->media_meta.bitrate,
475                                 content_info->media_meta.bitpersample,
476                                 content_info->media_meta.samplerate,
477                                 content_info->media_meta.channel,
478                                 content_info->media_meta.duration,
479                                 content_info->media_meta.longitude,
480                                 content_info->media_meta.latitude,
481                                 content_info->media_meta.altitude,
482                                 content_info->media_meta.exposure_time,
483                                 content_info->media_meta.fnumber,
484                                 content_info->media_meta.iso,
485                                 content_info->media_meta.model,
486                                 content_info->media_meta.width,
487                                 content_info->media_meta.height,
488                                 content_info->media_meta.datetaken,
489                                 content_info->media_meta.orientation,
490                                 content_info->path
491                                 );
492
493         ret = _media_svc_sql_query(sql, uid);
494         SQLITE3_SAFE_FREE(sql);
495
496         return ret;
497 }
498 int _media_svc_get_thumbnail_path_by_path(sqlite3 *handle, const char *storage_id, const char *path, char *thumbnail_path)
499 {
500         int ret = MS_MEDIA_ERR_NONE;
501         sqlite3_stmt *sql_stmt = NULL;
502
503         char *sql = sqlite3_mprintf("SELECT thumbnail_path FROM '%s' WHERE path='%q'", storage_id, path);
504
505         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
506
507         if (ret != MS_MEDIA_ERR_NONE) {
508                 if (ret == MS_MEDIA_ERR_DB_NO_RECORD)
509                         media_svc_debug("there is no thumbnail.");
510                 else
511                         media_svc_error("error when _media_svc_get_thumbnail_path_by_path. err = [%d]", ret);
512
513                 return ret;
514         }
515
516         SAFE_STRLCPY(thumbnail_path, (const char *)sqlite3_column_text(sql_stmt, 0), MEDIA_SVC_PATHNAME_SIZE);
517
518         SQLITE3_FINALIZE(sql_stmt);
519
520         return MS_MEDIA_ERR_NONE;
521 }
522
523 int _media_svc_get_media_type_by_path(sqlite3 *handle, const char *storage_id, const char *path, int *media_type)
524 {
525         int ret = MS_MEDIA_ERR_NONE;
526         sqlite3_stmt *sql_stmt = NULL;
527
528         char *sql = sqlite3_mprintf("SELECT media_type FROM '%s' WHERE path='%q'", storage_id, path);
529
530         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
531
532         if (ret != MS_MEDIA_ERR_NONE) {
533                 media_svc_error("error when _media_svc_get_media_type_by_path. err = [%d]", ret);
534                 return ret;
535         }
536
537         *media_type = sqlite3_column_int(sql_stmt, 0);
538
539         SQLITE3_FINALIZE(sql_stmt);
540
541         return MS_MEDIA_ERR_NONE;
542 }
543
544 int _media_svc_delete_item_by_path(const char *storage_id, const char *path, bool stack_query, uid_t uid)
545 {
546         int ret = MS_MEDIA_ERR_NONE;
547         char *sql = sqlite3_mprintf("DELETE FROM '%s' WHERE path='%q';", storage_id, path);
548
549         if (!stack_query) {
550                 ret = _media_svc_sql_query(sql, uid);
551                 SQLITE3_SAFE_FREE(sql);
552                 if (ret != MS_MEDIA_ERR_NONE) {
553                         media_svc_error("failed to delete item");
554                         return ret;
555                 }
556         } else {
557                 media_svc_debug("query : %s", sql);
558                 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
559         }
560
561         return ret;
562 }
563
564 int _media_svc_truncate_table(const char *storage_id, media_svc_storage_type_e storage_type, uid_t uid)
565 {
566         int ret = MS_MEDIA_ERR_NONE;
567
568         char *sql = sqlite3_mprintf("DELETE FROM '%s' where storage_type=%d;", storage_id, storage_type);
569
570         ret = _media_svc_sql_query(sql, uid);
571         SQLITE3_SAFE_FREE(sql);
572
573         return ret;
574 }
575
576 int _media_svc_delete_invalid_items(sqlite3 *handle, const char *storage_id, media_svc_storage_type_e storage_type, uid_t uid)
577 {
578         int idx = 0;
579         media_svc_thumbnailpath_s *thumbpath_record = NULL;
580         int invalid_count = 0;
581         int ret = MS_MEDIA_ERR_NONE;
582
583         ret = __media_svc_count_invalid_records_with_thumbnail(handle, storage_id, storage_type, &invalid_count);
584         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
585
586         media_svc_debug("invalid count: %d", invalid_count);
587
588         if (invalid_count > 0) {
589                 thumbpath_record = (media_svc_thumbnailpath_s *)calloc(invalid_count, sizeof(media_svc_thumbnailpath_s));
590                 if (thumbpath_record == NULL) {
591                         media_svc_error("fail to memory allocation");
592                         return MS_MEDIA_ERR_OUT_OF_MEMORY;
593                 }
594
595                 ret = __media_svc_get_invalid_records_with_thumbnail(handle, storage_id, storage_type, invalid_count, thumbpath_record);
596                 if (ret != MS_MEDIA_ERR_NONE) {
597                         media_svc_error("error when get thumbnail record");
598                         SAFE_FREE(thumbpath_record);
599                         return ret;
600                 }
601         } else {
602                 media_svc_debug("There is no item with thumbnail");
603         }
604
605         char *sql = sqlite3_mprintf("DELETE FROM '%s' WHERE validity = 0;", storage_id);
606
607         ret = _media_svc_sql_query(sql, uid);
608         SQLITE3_SAFE_FREE(sql);
609         if (ret != MS_MEDIA_ERR_NONE) {
610                 SAFE_FREE(thumbpath_record);
611                 return ret;
612         }
613
614         /*Delete thumbnails*/
615         for (idx = 0; idx < invalid_count; idx++) {
616                 if (STRING_VALID(thumbpath_record[idx].thumbnail_path)) {
617                         ret = _media_svc_remove_file(thumbpath_record[idx].thumbnail_path);
618                         if (ret != MS_MEDIA_ERR_NONE)
619                                 media_svc_error("fail to remove thumbnail file.");
620                 }
621         }
622
623         SAFE_FREE(thumbpath_record);
624
625         return MS_MEDIA_ERR_NONE;
626 }
627
628 int _media_svc_delete_invalid_folder_items(sqlite3 *handle, const char *storage_id, const char *folder_path, bool is_recursive, uid_t uid)
629 {
630         int idx = 0;
631         media_svc_thumbnailpath_s *thumbpath_record = NULL;
632         int invalid_count = 0;
633         int ret = MS_MEDIA_ERR_NONE;
634         char folder_uuid[MEDIA_SVC_UUID_SIZE+1] = {0,};
635         char *sql = NULL;
636
637         /*get folder uuid from DB*/
638         ret = _media_svc_get_folder_id_by_foldername(handle, storage_id, folder_path, folder_uuid, uid);
639         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
640
641         ret = __media_svc_count_invalid_folder_records_with_thumbnail(handle, storage_id, folder_path, folder_uuid, is_recursive, &invalid_count);
642         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
643
644         media_svc_debug("invalid count: %d", invalid_count);
645
646         if (invalid_count > 0) {
647                 thumbpath_record = (media_svc_thumbnailpath_s *)calloc(invalid_count, sizeof(media_svc_thumbnailpath_s));
648                 if (thumbpath_record == NULL) {
649                         media_svc_error("fail to memory allocation");
650                         return MS_MEDIA_ERR_OUT_OF_MEMORY;
651                 }
652
653                 ret = __media_svc_get_invalid_folder_records_with_thumbnail(handle, storage_id, folder_path, folder_uuid, is_recursive, invalid_count, thumbpath_record);
654                 if (ret != MS_MEDIA_ERR_NONE) {
655                         media_svc_error("error when get thumbnail record");
656                         SAFE_FREE(thumbpath_record);
657                         return ret;
658                 }
659         } else {
660                 media_svc_debug("There is no item with thumbnail");
661         }
662
663         if (is_recursive)
664                 sql = sqlite3_mprintf("DELETE FROM '%s' WHERE validity = 0 AND path LIKE '%q/%%';", storage_id, folder_path);
665         else
666                 sql = sqlite3_mprintf("DELETE FROM '%s' WHERE validity = 0 AND folder_uuid='%q';", storage_id, folder_uuid);
667
668         ret = _media_svc_sql_query(sql, uid);
669         SQLITE3_SAFE_FREE(sql);
670         if (ret != MS_MEDIA_ERR_NONE) {
671                 SAFE_FREE(thumbpath_record);
672                 return ret;
673         }
674
675         /*Delete thumbnails*/
676         if (thumbpath_record != NULL)    {
677                 for (idx = 0; idx < invalid_count; idx++) {
678                         if (STRING_VALID(thumbpath_record[idx].thumbnail_path)) {
679                                 ret = _media_svc_remove_file(thumbpath_record[idx].thumbnail_path);
680                                 if (ret != MS_MEDIA_ERR_NONE)
681                                         media_svc_error("fail to remove thumbnail file.");
682                         }
683                 }
684
685                 SAFE_FREE(thumbpath_record);
686         }
687
688         return MS_MEDIA_ERR_NONE;
689 }
690
691 int _media_svc_update_item_validity(const char *storage_id, const char *path, int validity, bool stack_query, uid_t uid)
692 {
693         int ret = MS_MEDIA_ERR_NONE;
694
695         char *sql = sqlite3_mprintf("UPDATE '%s' SET validity=%d WHERE path= '%q';", storage_id, validity, path);
696
697         if (!stack_query) {
698                 ret = _media_svc_sql_query(sql, uid);
699                 SQLITE3_SAFE_FREE(sql);
700         } else {
701                 _media_svc_sql_query_add(&g_media_svc_item_validity_query_list, &sql);
702         }
703
704         return ret;
705 }
706
707 int _media_svc_update_thumbnail_path(const char *storage_id, const char *path, const char *thumb_path, uid_t uid)
708 {
709         int ret = MS_MEDIA_ERR_NONE;
710
711         char *sql = sqlite3_mprintf("UPDATE '%s' SET thumbnail_path=%Q WHERE path= %Q;", storage_id, thumb_path, path);
712
713         ret = _media_svc_sql_query(sql, uid);
714         SQLITE3_SAFE_FREE(sql);
715
716         return ret;
717 }
718
719 int _media_svc_update_storage_item_validity(const char *storage_id, media_svc_storage_type_e storage_type, int validity, uid_t uid)
720 {
721         int ret = MS_MEDIA_ERR_NONE;
722
723         char *sql = sqlite3_mprintf("UPDATE '%s' SET validity=%d WHERE storage_type=%d;", storage_id, validity, storage_type);
724
725         ret = _media_svc_sql_query(sql, uid);
726         SQLITE3_SAFE_FREE(sql);
727
728         return ret;
729 }
730
731 int _media_svc_update_folder_item_validity(sqlite3 *handle, const char *storage_id, const char *folder_path, int validity, uid_t uid)
732 {
733         int ret = MS_MEDIA_ERR_NONE;
734         char *sql = NULL;
735         char folder_uuid[MEDIA_SVC_UUID_SIZE + 1] = {0, };
736         sqlite3_stmt *sql_stmt = NULL;
737
738         /*Get folder ID*/
739         sql = sqlite3_mprintf("SELECT folder_uuid FROM '%s' WHERE path='%q' AND storage_uuid='%q'", MEDIA_SVC_DB_TABLE_FOLDER, folder_path, storage_id);
740
741         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
742         if (ret != MS_MEDIA_ERR_NONE) {
743                 if (ret == MS_MEDIA_ERR_DB_NO_RECORD)
744                         media_svc_debug("folder not exist");
745                 else
746                         media_svc_error("error when get folder_id. err = [%d]", ret);
747
748                 return ret;
749         }
750
751         SAFE_STRLCPY(folder_uuid, (const char *)sqlite3_column_text(sql_stmt, 0), MEDIA_SVC_UUID_SIZE + 1);
752         SQLITE3_FINALIZE(sql_stmt);
753
754         /*Update folder item validity*/
755         sql = sqlite3_mprintf("UPDATE '%s' SET validity=%d WHERE folder_uuid='%q';", storage_id, validity, folder_uuid);
756
757         ret = _media_svc_sql_query(sql, uid);
758         SQLITE3_SAFE_FREE(sql);
759
760         return ret;
761 }
762
763 int _media_svc_update_recursive_folder_item_validity(const char *storage_id, const char *folder_path, int validity, uid_t uid)
764 {
765         int ret = MS_MEDIA_ERR_NONE;
766
767         /*Update folder item validity*/
768         char *sql = sqlite3_mprintf("UPDATE '%s' SET validity=%d WHERE (storage_type = 0 OR storage_type = 1) AND path LIKE '%q/%%';", storage_id, validity, folder_path);
769
770         ret = _media_svc_sql_query(sql, uid);
771         SQLITE3_SAFE_FREE(sql);
772
773         return ret;
774 }
775
776 int _media_svc_update_item_by_path(const char *storage_id, const char *src_path, media_svc_storage_type_e dest_storage, const char *dest_path,
777                                 const char *file_name, int modified_time, const char *folder_uuid, const char *thumb_path, bool stack_query, uid_t uid)
778 {
779         /* update path, filename, modified_time, folder_uuid, thumbnail_path, */
780         /* played_count, last_played_time, last_played_position, favourite, storaget_type*/
781
782         int ret = MS_MEDIA_ERR_NONE;
783         char *sql = NULL;
784
785         if (thumb_path != NULL) {
786                 sql = sqlite3_mprintf("UPDATE '%s' SET path=%Q, file_name=%Q, modified_time=%d, folder_uuid=%Q, thumbnail_path=%Q, storage_type=%d, \
787                                         played_count=0, last_played_time=0, last_played_position=0 WHERE path=%Q;",
788                                         storage_id, dest_path, file_name, modified_time, folder_uuid, thumb_path, dest_storage, src_path);
789         } else {
790                 sql = sqlite3_mprintf("UPDATE '%s' SET path=%Q, file_name=%Q, modified_time=%d, folder_uuid=%Q, storage_type=%d, \
791                                         played_count=0, last_played_time=0, last_played_position=0 WHERE path=%Q;",
792                                         storage_id, dest_path, file_name, modified_time, folder_uuid, dest_storage, src_path);
793         }
794
795         if (!stack_query) {
796                 ret = _media_svc_sql_query(sql, uid);
797                 SQLITE3_SAFE_FREE(sql);
798         } else {
799                 _media_svc_sql_query_add(&g_media_svc_move_item_query_list, &sql);
800         }
801
802         return ret;
803 }
804
805 int _media_svc_list_query_do(media_svc_query_type_e query_type, uid_t uid)
806 {
807         int ret = MS_MEDIA_ERR_NONE;
808
809         ret = _media_svc_sql_begin_trans(uid);
810         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
811
812         if (query_type == MEDIA_SVC_QUERY_SET_ITEM_VALIDITY)
813                 ret = _media_svc_sql_query_list(&g_media_svc_item_validity_query_list, uid);
814         else if (query_type == MEDIA_SVC_QUERY_MOVE_ITEM)
815                 ret = _media_svc_sql_query_list(&g_media_svc_move_item_query_list, uid);
816         else if (query_type == MEDIA_SVC_QUERY_INSERT_ITEM)
817                 ret = _media_svc_sql_query_list(&g_media_svc_insert_item_query_list, uid);
818         else if (query_type == MEDIA_SVC_QUERY_UPDATE_ITEM)
819                 ret = _media_svc_sql_query_list(&g_media_svc_update_item_query_list, uid);
820         else if (query_type == MEDIA_SVC_QUERY_INSERT_FOLDER)
821                 ret = _media_svc_sql_query_list(_media_svc_get_folder_list_ptr(), uid);
822         else if (query_type == MEDIA_SVC_QUERY_UPDATE_COMMON)
823                 ret = _media_svc_sql_query_list(&g_media_svc_update_list, uid);
824         else
825                 ret = MS_MEDIA_ERR_INVALID_PARAMETER;
826
827         if (ret != MS_MEDIA_ERR_NONE) {
828                 media_svc_error("_media_svc_list_query_do failed. start rollback");
829                 _media_svc_sql_rollback_trans(uid);
830                 return ret;
831         }
832
833         ret = _media_svc_sql_end_trans(uid);
834         if (ret != MS_MEDIA_ERR_NONE) {
835                 media_svc_error("mb_svc_sqlite3_commit_trans failed.. Now start to rollback");
836                 _media_svc_sql_rollback_trans(uid);
837                 return ret;
838         }
839
840         return MS_MEDIA_ERR_NONE;
841 }
842
843 int _media_svc_append_query_list(const char *query, uid_t uid)
844 {
845         int ret = MS_MEDIA_ERR_NONE;
846
847         g_media_svc_update_list = g_list_append(g_media_svc_update_list, (gpointer)query);
848
849         g_media_svc_update_list_count++;
850
851         if (g_media_svc_update_list_count >= MEDIA_SVC_MAX_COMMIT_SIZE) {
852                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_UPDATE_COMMON, uid);
853                 g_media_svc_update_list_count = 0;
854         }
855
856         return ret;
857 }
858
859 int _media_svc_get_burst_id(sqlite3 *handle, const char *storage_id, int *id)
860 {
861         int ret = MS_MEDIA_ERR_NONE;
862         int cur_id = -1;
863         sqlite3_stmt *sql_stmt = NULL;
864         char *sql = sqlite3_mprintf("SELECT max(CAST(burst_id AS INTEGER)) FROM '%s'", storage_id);
865
866         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
867
868         if (ret != MS_MEDIA_ERR_NONE) {
869                 media_svc_error("error when _media_svc_get_burst_id. err = [%d]", ret);
870                 return ret;
871         }
872
873         cur_id = sqlite3_column_int(sql_stmt, 0);
874         *id = ++cur_id;
875         SQLITE3_FINALIZE(sql_stmt);
876
877         return MS_MEDIA_ERR_NONE;
878 }
879
880 int _media_svc_get_noti_info(sqlite3 *handle, const char *storage_id, const char *path, int update_item, media_svc_noti_item **item)
881 {
882         int ret = MS_MEDIA_ERR_NONE;
883         sqlite3_stmt *sql_stmt = NULL;
884         char *sql = NULL;
885         int is_root_dir = FALSE;
886
887         if (item == NULL) {
888                 media_svc_error("invalid parameter");
889                 return MS_MEDIA_ERR_INVALID_PARAMETER;
890         }
891
892         if (update_item == MS_MEDIA_ITEM_FILE)
893                 sql = sqlite3_mprintf("SELECT media_uuid, media_type, mime_type FROM '%s' WHERE path=%Q", storage_id, path);
894         else if (update_item == MS_MEDIA_ITEM_DIRECTORY)
895                 sql = sqlite3_mprintf("SELECT folder_uuid FROM '%s' WHERE path=%Q AND storage_uuid='%s'", MEDIA_SVC_DB_TABLE_FOLDER, path, storage_id);
896         else {
897                 media_svc_error("_media_svc_get_noti_info failed : update item");
898                 return MS_MEDIA_ERR_INVALID_PARAMETER;
899         }
900
901         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
902
903         if (ret != MS_MEDIA_ERR_NONE) {
904                 if (ret == MS_MEDIA_ERR_DB_NO_RECORD && update_item == MS_MEDIA_ITEM_DIRECTORY) {
905                         media_svc_debug("This is root directory of media");
906                         sql_stmt = NULL;
907                         is_root_dir = TRUE;
908                 } else {
909                         media_svc_error("error when _media_svc_get_noti_info. err = [%d]", ret);
910                         return ret;
911                 }
912         }
913
914         *item = calloc(1, sizeof(media_svc_noti_item));
915         if (*item == NULL) {
916                 media_svc_error("_media_svc_get_noti_info failed : calloc");
917                 return MS_MEDIA_ERR_OUT_OF_MEMORY;
918         }
919
920         if (update_item == MS_MEDIA_ITEM_FILE) {
921                 (*item)->media_uuid = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0));
922                 (*item)->media_type = sqlite3_column_int(sql_stmt, 1);
923                 (*item)->mime_type = g_strdup((const char *)sqlite3_column_text(sql_stmt, 2));
924         } else if (update_item == MS_MEDIA_ITEM_DIRECTORY) {
925                 if (is_root_dir)
926                         (*item)->media_uuid = NULL;
927                 else
928                         (*item)->media_uuid = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0));
929         }
930
931         SQLITE3_FINALIZE(sql_stmt);
932
933         return MS_MEDIA_ERR_NONE;
934 }
935
936 int _media_svc_count_invalid_folder_items(sqlite3 *handle, const char *storage_id, const char *folder_path, int *count)
937 {
938         int ret = MS_MEDIA_ERR_NONE;
939         sqlite3_stmt *sql_stmt = NULL;
940
941         char *sql = sqlite3_mprintf("SELECT count(*) FROM '%s' WHERE validity=0 AND path LIKE '%q/%%'", storage_id, folder_path);
942
943         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
944
945         if (ret != MS_MEDIA_ERR_NONE) {
946                 media_svc_error("error when _media_svc_count_invalid_folder_items. err = [%d]", ret);
947                 return ret;
948         }
949
950         *count = sqlite3_column_int(sql_stmt, 0);
951
952         SQLITE3_FINALIZE(sql_stmt);
953
954         return MS_MEDIA_ERR_NONE;
955 }
956
957 int _media_svc_get_fileinfo_by_path(sqlite3 *handle, const char *storage_id, const char *path, time_t *modified_time, unsigned long long *size)
958 {
959         int ret = MS_MEDIA_ERR_NONE;
960         sqlite3_stmt *sql_stmt = NULL;
961         char *sql = sqlite3_mprintf("SELECT modified_time, size FROM '%s' WHERE path='%q'", storage_id, path);
962
963         ret = _media_svc_sql_prepare_to_step(handle, sql, &sql_stmt);
964
965         if (ret != MS_MEDIA_ERR_NONE) {
966                 media_svc_error("error when _media_svc_get_fileinfo_by_path. err = [%d]", ret);
967                 return ret;
968         }
969
970         *modified_time = (int)sqlite3_column_int(sql_stmt, 0);
971         *size = (unsigned long long)sqlite3_column_int64(sql_stmt, 1);
972
973         SQLITE3_FINALIZE(sql_stmt);
974
975         return MS_MEDIA_ERR_NONE;
976 }
977
978 int _media_svc_change_validity_item_batch(const char *storage_id, const char *path, int des_validity, int src_validity, uid_t uid)
979 {
980         int ret = MS_MEDIA_ERR_NONE;
981
982         char *sql = sqlite3_mprintf("UPDATE '%s' SET validity=%d WHERE validity=%d AND path LIKE '%q%%'", storage_id, des_validity, src_validity, path);
983
984         ret = _media_svc_sql_query(sql, uid);
985         SQLITE3_SAFE_FREE(sql);
986
987         return ret;
988 }
989
990 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)
991 {
992         int ret = MS_MEDIA_ERR_NONE;
993         char *burst_id = NULL;
994
995         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, burst_id, storage_uuid";
996
997         char *sql = sqlite3_mprintf("INSERT INTO '%s' (%s) VALUES (%Q, %Q, %Q, %Q, %d, %Q, %lld, %d, %d, %d, %d, %d, %Q, %Q);",
998                 storage_id, db_fields,
999                 content_info->media_uuid,
1000                 content_info->folder_uuid,
1001                 content_info->path,
1002                 content_info->file_name,
1003                 content_info->media_type,
1004                 content_info->mime_type,
1005                 content_info->size,
1006                 content_info->added_time,
1007                 content_info->modified_time,
1008                 content_info->is_drm,
1009                 content_info->storage_type,
1010                 content_info->timeline,
1011                 burst_id,
1012                 storage_id
1013                 );
1014 #if 0
1015                 SQLITE3_SAFE_FREE(burst_id);
1016 #endif
1017         media_svc_debug("MAKE PASS 1 QUERY END");
1018
1019         if (!stack_query) {
1020                 ret = _media_svc_sql_query(sql, uid);
1021                 SQLITE3_SAFE_FREE(sql);
1022                 if (ret != MS_MEDIA_ERR_NONE) {
1023                         media_svc_error("failed to insert item");
1024                         return ret;
1025                 }
1026         } else {
1027                 media_svc_debug("query : %s", sql);
1028                 _media_svc_sql_query_add(&g_media_svc_insert_item_query_list, &sql);
1029         }
1030         media_svc_debug("END");
1031         return MS_MEDIA_ERR_NONE;
1032 }
1033
1034 int _media_svc_insert_item_pass2(const char *storage_id, media_svc_content_info_s *content_info, int is_burst, bool stack_query, uid_t uid)
1035 {
1036         int ret = MS_MEDIA_ERR_NONE;
1037
1038         media_svc_debug_fenter();
1039
1040         /*Update Pinyin If Support Pinyin*/
1041         if (_media_svc_check_pinyin_support()) {
1042                 if (STRING_VALID(content_info->file_name))
1043                         _media_svc_get_pinyin_str(content_info->file_name, &content_info->file_name_pinyin);
1044                 if (STRING_VALID(content_info->media_meta.title))
1045                         _media_svc_get_pinyin_str(content_info->media_meta.title, &content_info->media_meta.title_pinyin);
1046                 if (STRING_VALID(content_info->media_meta.album))
1047                         _media_svc_get_pinyin_str(content_info->media_meta.album, &content_info->media_meta.album_pinyin);
1048                 if (STRING_VALID(content_info->media_meta.artist))
1049                         _media_svc_get_pinyin_str(content_info->media_meta.artist, &content_info->media_meta.artist_pinyin);
1050                 if (STRING_VALID(content_info->media_meta.album_artist))
1051                         _media_svc_get_pinyin_str(content_info->media_meta.album_artist, &content_info->media_meta.album_artist_pinyin);
1052                 if (STRING_VALID(content_info->media_meta.genre))
1053                         _media_svc_get_pinyin_str(content_info->media_meta.genre, &content_info->media_meta.genre_pinyin);
1054                 if (STRING_VALID(content_info->media_meta.composer))
1055                         _media_svc_get_pinyin_str(content_info->media_meta.composer, &content_info->media_meta.composer_pinyin);
1056                 if (STRING_VALID(content_info->media_meta.copyright))
1057                         _media_svc_get_pinyin_str(content_info->media_meta.copyright, &content_info->media_meta.copyright_pinyin);
1058                 if (STRING_VALID(content_info->media_meta.description))
1059                         _media_svc_get_pinyin_str(content_info->media_meta.description, &content_info->media_meta.description_pinyin);
1060         }
1061
1062         char *sql = sqlite3_mprintf("UPDATE '%s' SET \
1063                 thumbnail_path=%Q, title=%Q, album_id=%d, album=%Q, artist=%Q, album_artist=%Q, genre=%Q, composer=%Q, year=%Q, \
1064                 recorded_date=%Q, copyright=%Q, track_num=%Q, description=%Q, bitrate=%d, bitpersample=%d, samplerate=%d, channel=%d, \
1065                 duration=%d, longitude=%.6f, latitude=%.6f, altitude=%.6f, width=%d, height=%d, datetaken=%Q, orientation=%d, exposure_time=%Q,\
1066                 fnumber=%.6f, iso=%d, model=%Q, rating=%d, weather=%Q, file_name_pinyin=%Q, title_pinyin=%Q, album_pinyin=%Q, \
1067                 artist_pinyin=%Q, album_artist_pinyin=%Q, genre_pinyin=%Q, composer_pinyin=%Q, copyright_pinyin=%Q, description_pinyin=%Q, is_360=%d WHERE path=%Q;",
1068                 storage_id,
1069                 /* content_info->folder_uuid, */
1070                 content_info->thumbnail_path,
1071                 content_info->media_meta.title,
1072                 content_info->album_id,
1073                 content_info->media_meta.album,
1074                 content_info->media_meta.artist,
1075                 content_info->media_meta.album_artist,
1076                 content_info->media_meta.genre,
1077                 content_info->media_meta.composer,
1078                 content_info->media_meta.year,
1079                 content_info->media_meta.recorded_date,
1080                 content_info->media_meta.copyright,
1081                 content_info->media_meta.track_num,
1082                 content_info->media_meta.description,
1083                 content_info->media_meta.bitrate,
1084                 content_info->media_meta.bitpersample,
1085                 content_info->media_meta.samplerate,
1086                 content_info->media_meta.channel,
1087                 content_info->media_meta.duration,
1088                 content_info->media_meta.longitude,
1089                 content_info->media_meta.latitude,
1090                 content_info->media_meta.altitude,
1091                 content_info->media_meta.width,
1092                 content_info->media_meta.height,
1093                 content_info->media_meta.datetaken,
1094                 content_info->media_meta.orientation,
1095                 content_info->media_meta.exposure_time,
1096                 content_info->media_meta.fnumber,
1097                 content_info->media_meta.iso,
1098                 content_info->media_meta.model,
1099                 content_info->media_meta.rating,
1100                 content_info->media_meta.weather,
1101                 content_info->file_name_pinyin,
1102                 content_info->media_meta.title_pinyin,
1103                 content_info->media_meta.album_pinyin,
1104                 content_info->media_meta.artist_pinyin,
1105                 content_info->media_meta.album_artist_pinyin,
1106                 content_info->media_meta.genre_pinyin,
1107                 content_info->media_meta.composer_pinyin,
1108                 content_info->media_meta.copyright_pinyin,
1109                 content_info->media_meta.description_pinyin,
1110                 content_info->media_meta.is_360,
1111                 content_info->path
1112                 );
1113
1114         if (!stack_query) {
1115                 ret = _media_svc_sql_query(sql, uid);
1116                 SQLITE3_SAFE_FREE(sql);
1117                 if (ret != MS_MEDIA_ERR_NONE) {
1118
1119                         media_svc_error("failed to insert item");
1120                         return ret;
1121                 }
1122         } else {
1123                 /*media_svc_debug("query : %s", sql);*/
1124                 _media_svc_sql_query_add(&g_media_svc_update_item_query_list, &sql);
1125         }
1126
1127         media_svc_debug_fleave();
1128
1129         return MS_MEDIA_ERR_NONE;
1130 }