* Rework the sql_exec function to use format arguments, to simplfy the code.
* Don't set the DB version until after the scan completes. This way, if only a partial scan has been done, a full scan will be initiated the next time minidlna is started.
This commit is contained in:
parent
6738b8a722
commit
c8fe23d838
@ -106,7 +106,6 @@ update_if_album_art(const char * path)
|
||||
char * dir;
|
||||
char * match = NULL;
|
||||
char * file = NULL;
|
||||
char * sql;
|
||||
int ncmp = 0;
|
||||
struct album_art_name_s * album_art_name;
|
||||
DIR * dh;
|
||||
@ -161,10 +160,8 @@ update_if_album_art(const char * path)
|
||||
DPRINTF(E_DEBUG, L_METADATA, "New file %s looks like cover art for %s\n", path, dp->d_name);
|
||||
asprintf(&file, "%s/%s", dir, dp->d_name);
|
||||
art_id = find_album_art(file, NULL, 0);
|
||||
sql = sqlite3_mprintf("UPDATE DETAILS set ALBUM_ART = %lld where PATH = '%q'", art_id, file);
|
||||
if( sql_exec(db, sql) != SQLITE_OK )
|
||||
if( sql_exec(db, "UPDATE DETAILS set ALBUM_ART = %lld where PATH = '%q'", art_id, file) != SQLITE_OK )
|
||||
DPRINTF(E_WARN, L_METADATA, "Error setting %s as cover art for %s\n", match, dp->d_name);
|
||||
sqlite3_free(sql);
|
||||
free(file);
|
||||
}
|
||||
}
|
||||
@ -359,9 +356,7 @@ find_album_art(const char * path, const char * image_data, int image_size)
|
||||
}
|
||||
else
|
||||
{
|
||||
sqlite3_free(sql);
|
||||
sql = sqlite3_mprintf("INSERT into ALBUM_ART (PATH) VALUES ('%q')", album_art);
|
||||
if( sql_exec(db, sql) == SQLITE_OK )
|
||||
if( sql_exec(db, "INSERT into ALBUM_ART (PATH) VALUES ('%q')", album_art) == SQLITE_OK )
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
}
|
||||
sqlite3_free_table(result);
|
||||
|
41
inotify.c
41
inotify.c
@ -523,24 +523,16 @@ inotify_remove_file(const char * path)
|
||||
continue;
|
||||
if( children < 2 )
|
||||
{
|
||||
free(sql);
|
||||
asprintf(&sql, "DELETE from DETAILS where ID ="
|
||||
" (SELECT DETAIL_ID from OBJECTS where OBJECT_ID = '%s')", result[i]);
|
||||
sql_exec(db, sql);
|
||||
free(sql);
|
||||
asprintf(&sql, "DELETE from OBJECTS where OBJECT_ID = '%s'", result[i]);
|
||||
sql_exec(db, sql);
|
||||
sql_exec(db, "DELETE from DETAILS where ID ="
|
||||
" (SELECT DETAIL_ID from OBJECTS where OBJECT_ID = '%s')", result[i]);
|
||||
sql_exec(db, "DELETE from OBJECTS where OBJECT_ID = '%s'", result[i]);
|
||||
|
||||
*rindex(result[i], '$') = '\0';
|
||||
if( sql_get_int_field(db, "SELECT count(*) from OBJECTS where PARENT_ID = '%s'", result[i]) == 0 )
|
||||
{
|
||||
free(sql);
|
||||
asprintf(&sql, "DELETE from DETAILS where ID ="
|
||||
" (SELECT DETAIL_ID from OBJECTS where OBJECT_ID = '%s')", result[i]);
|
||||
sql_exec(db, sql);
|
||||
free(sql);
|
||||
asprintf(&sql, "DELETE from OBJECTS where OBJECT_ID = '%s'", result[i]);
|
||||
sql_exec(db, sql);
|
||||
sql_exec(db, "DELETE from DETAILS where ID ="
|
||||
" (SELECT DETAIL_ID from OBJECTS where OBJECT_ID = '%s')", result[i]);
|
||||
sql_exec(db, "DELETE from OBJECTS where OBJECT_ID = '%s'", result[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -548,12 +540,8 @@ inotify_remove_file(const char * path)
|
||||
}
|
||||
free(sql);
|
||||
/* Now delete the actual objects */
|
||||
asprintf(&sql, "DELETE from DETAILS where ID = %lld", detailID);
|
||||
sql_exec(db, sql);
|
||||
free(sql);
|
||||
asprintf(&sql, "DELETE from OBJECTS where DETAIL_ID = %lld", detailID);
|
||||
sql_exec(db, sql);
|
||||
free(sql);
|
||||
sql_exec(db, "DELETE from DETAILS where ID = %lld", detailID);
|
||||
sql_exec(db, "DELETE from OBJECTS where DETAIL_ID = %lld", detailID);
|
||||
}
|
||||
asprintf(&art_cache, "%s/art_cache%s", DB_PATH, path);
|
||||
remove(art_cache);
|
||||
@ -566,7 +554,6 @@ int
|
||||
inotify_remove_directory(int fd, const char * path)
|
||||
{
|
||||
char * sql;
|
||||
char * sql2;
|
||||
char **result;
|
||||
sqlite_int64 detailID = 0;
|
||||
int rows, i, ret = 1;
|
||||
@ -581,12 +568,8 @@ inotify_remove_directory(int fd, const char * path)
|
||||
for( i=1; i <= rows; i++ )
|
||||
{
|
||||
detailID = strtoll(result[i], NULL, 10);
|
||||
asprintf(&sql2, "DELETE from DETAILS where ID = %lld", detailID);
|
||||
sql_exec(db, sql2);
|
||||
free(sql2);
|
||||
asprintf(&sql2, "DELETE from OBJECTS where DETAIL_ID = %lld", detailID);
|
||||
sql_exec(db, sql2);
|
||||
free(sql2);
|
||||
sql_exec(db, "DELETE from DETAILS where ID = %lld", detailID);
|
||||
sql_exec(db, "DELETE from OBJECTS where DETAIL_ID = %lld", detailID);
|
||||
}
|
||||
ret = 0;
|
||||
}
|
||||
@ -594,9 +577,7 @@ inotify_remove_directory(int fd, const char * path)
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
/* Clean up any album art entries in the deleted directory */
|
||||
sql = sqlite3_mprintf("DELETE from ALBUM_ART where PATH glob '%q/*'", path);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "DELETE from ALBUM_ART where PATH glob '%q/*'", path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
104
metadata.c
104
metadata.c
@ -160,12 +160,10 @@ check_for_captions(const char * path, sqlite_int64 detailID)
|
||||
strcat(file, ".srt");
|
||||
if( access(file, R_OK) == 0 )
|
||||
{
|
||||
sql = sqlite3_mprintf("INSERT into CAPTIONS"
|
||||
" (ID, PATH) "
|
||||
"VALUES"
|
||||
" (%lld, %Q)", detailID, file);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into CAPTIONS"
|
||||
" (ID, PATH) "
|
||||
"VALUES"
|
||||
" (%lld, %Q)", detailID, file);
|
||||
}
|
||||
no_source_video:
|
||||
free(file);
|
||||
@ -174,20 +172,18 @@ no_source_video:
|
||||
sqlite_int64
|
||||
GetFolderMetadata(const char * name, const char * path, const char * artist, const char * genre, const char * album_art)
|
||||
{
|
||||
char * sql;
|
||||
int ret;
|
||||
|
||||
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
||||
" (TITLE, PATH, CREATOR, ARTIST, GENRE, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" ('%q', %Q, %Q, %Q, %Q, %lld);",
|
||||
name, path, artist, artist, genre,
|
||||
album_art ? strtoll(album_art, NULL, 10) : 0);
|
||||
if( sql_exec(db, sql) != SQLITE_OK )
|
||||
ret = sql_exec(db, "INSERT into DETAILS"
|
||||
" (TITLE, PATH, CREATOR, ARTIST, GENRE, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" ('%q', %Q, %Q, %Q, %Q, %lld);",
|
||||
name, path, artist, artist, genre,
|
||||
album_art ? strtoll(album_art, NULL, 10) : 0);
|
||||
if( ret != SQLITE_OK )
|
||||
ret = 0;
|
||||
else
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
sqlite3_free(sql);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -199,7 +195,6 @@ GetAudioMetadata(const char * path, char * name)
|
||||
static char lang[6] = { '\0' };
|
||||
struct stat file;
|
||||
sqlite_int64 ret;
|
||||
char *sql;
|
||||
char *title, *artist = NULL, *album = NULL, *band = NULL, *genre = NULL, *comment = NULL, *date = NULL;
|
||||
char *esc_tag;
|
||||
int i, free_flags = 0;
|
||||
@ -356,14 +351,24 @@ GetAudioMetadata(const char * path, char * name)
|
||||
|
||||
album_art = find_album_art(path, song.image, song.image_size);
|
||||
|
||||
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
||||
" (PATH, SIZE, TIMESTAMP, DURATION, CHANNELS, BITRATE, SAMPLERATE, DATE,"
|
||||
" TITLE, CREATOR, ARTIST, ALBUM, GENRE, COMMENT, DISC, TRACK, DLNA_PN, MIME, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" (%Q, %lld, %ld, '%s', %d, %d, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d, %d, %Q, '%s', %lld);",
|
||||
path, file.st_size, file.st_mtime, duration, song.channels, song.bitrate, song.samplerate, date,
|
||||
title, band, artist, album, genre, comment, song.disc, song.track,
|
||||
dlna_pn, song.mime?song.mime:mime, album_art);
|
||||
ret = sql_exec(db, "INSERT into DETAILS"
|
||||
" (PATH, SIZE, TIMESTAMP, DURATION, CHANNELS, BITRATE, SAMPLERATE, DATE,"
|
||||
" TITLE, CREATOR, ARTIST, ALBUM, GENRE, COMMENT, DISC, TRACK, DLNA_PN, MIME, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" (%Q, %lld, %ld, '%s', %d, %d, %d, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %d, %d, %Q, '%s', %lld);",
|
||||
path, file.st_size, file.st_mtime, duration, song.channels, song.bitrate, song.samplerate, date,
|
||||
title, band, artist, album, genre, comment, song.disc, song.track,
|
||||
dlna_pn, song.mime?song.mime:mime, album_art);
|
||||
if( ret != SQLITE_OK )
|
||||
{
|
||||
fprintf(stderr, "Error inserting details for '%s'!\n", path);
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
}
|
||||
|
||||
freetags(&song);
|
||||
if( dlna_pn )
|
||||
free(dlna_pn);
|
||||
@ -382,18 +387,6 @@ GetAudioMetadata(const char * path, char * name)
|
||||
if( free_flags & FLAG_COMMENT )
|
||||
free(comment);
|
||||
|
||||
//DEBUG DPRINTF(E_DEBUG, L_METADATA, "SQL: %s\n", sql);
|
||||
if( sql_exec(db, sql) != SQLITE_OK )
|
||||
{
|
||||
fprintf(stderr, "Error inserting details for '%s'!\n", path);
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -423,7 +416,6 @@ GetImageMetadata(const char * path, char * name)
|
||||
char b[1024];
|
||||
struct stat file;
|
||||
sqlite_int64 ret;
|
||||
char *sql;
|
||||
image * imsrc;
|
||||
metadata_t m;
|
||||
memset(&m, '\0', sizeof(metadata_t));
|
||||
@ -537,13 +529,12 @@ no_exifdata:
|
||||
asprintf(&m.dlna_pn, "JPEG_LRG;%s", dlna_no_conv);
|
||||
asprintf(&m.resolution, "%dx%d", width, height);
|
||||
|
||||
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
||||
" (PATH, TITLE, SIZE, TIMESTAMP, DATE, RESOLUTION, THUMBNAIL, CREATOR, DLNA_PN, MIME) "
|
||||
"VALUES"
|
||||
" (%Q, '%q', %lld, %ld, %Q, %Q, %d, %Q, %Q, %Q);",
|
||||
path, name, file.st_size, file.st_mtime, date, m.resolution, thumb, cam, m.dlna_pn, m.mime);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_METADATA, "SQL: %s\n", sql);
|
||||
if( sql_exec(db, sql) != SQLITE_OK )
|
||||
ret = sql_exec(db, "INSERT into DETAILS"
|
||||
" (PATH, TITLE, SIZE, TIMESTAMP, DATE, RESOLUTION, THUMBNAIL, CREATOR, DLNA_PN, MIME) "
|
||||
"VALUES"
|
||||
" (%Q, '%q', %lld, %ld, %Q, %Q, %d, %Q, %Q, %Q);",
|
||||
path, name, file.st_size, file.st_mtime, date, m.resolution, thumb, cam, m.dlna_pn, m.mime);
|
||||
if( ret != SQLITE_OK )
|
||||
{
|
||||
fprintf(stderr, "Error inserting details for '%s'!\n", path);
|
||||
ret = 0;
|
||||
@ -552,7 +543,6 @@ no_exifdata:
|
||||
{
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
if( m.resolution )
|
||||
free(m.resolution);
|
||||
if( m.dlna_pn )
|
||||
@ -570,7 +560,6 @@ sqlite_int64
|
||||
GetVideoMetadata(const char * path, char * name)
|
||||
{
|
||||
struct stat file;
|
||||
char *sql;
|
||||
int ret, i;
|
||||
struct tm *modtime;
|
||||
char date[20];
|
||||
@ -991,18 +980,16 @@ GetVideoMetadata(const char * path, char * name)
|
||||
#endif
|
||||
album_art = find_album_art(path, NULL, 0);
|
||||
|
||||
sql = sqlite3_mprintf( "INSERT into DETAILS"
|
||||
" (PATH, SIZE, TIMESTAMP, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION,"
|
||||
" CREATOR, TITLE, DLNA_PN, MIME, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" (%Q, %lld, %ld, %Q, %Q, %Q, %Q, %Q, %Q, %Q, '%q', %Q, '%q', %lld);",
|
||||
path, file.st_size, file.st_mtime, m.duration,
|
||||
strlen(date) ? date : NULL,
|
||||
m.channels, m.bitrate, m.frequency, m.resolution,
|
||||
m.artist, name, m.dlna_pn, m.mime,
|
||||
album_art);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_METADATA, "SQL: %s\n", sql);
|
||||
if( sql_exec(db, sql) != SQLITE_OK )
|
||||
ret = sql_exec(db, "INSERT into DETAILS"
|
||||
" (PATH, SIZE, TIMESTAMP, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION,"
|
||||
" CREATOR, TITLE, DLNA_PN, MIME, ALBUM_ART) "
|
||||
"VALUES"
|
||||
" (%Q, %lld, %ld, %Q, %Q, %Q, %Q, %Q, %Q, %Q, '%q', %Q, '%q', %lld);",
|
||||
path, file.st_size, file.st_mtime, m.duration,
|
||||
strlen(date) ? date : NULL,
|
||||
m.channels, m.bitrate, m.frequency, m.resolution,
|
||||
m.artist, name, m.dlna_pn, m.mime, album_art);
|
||||
if( ret != SQLITE_OK )
|
||||
{
|
||||
fprintf(stderr, "Error inserting details for '%s'!\n", path);
|
||||
ret = 0;
|
||||
@ -1012,7 +999,6 @@ GetVideoMetadata(const char * path, char * name)
|
||||
ret = sqlite3_last_insert_rowid(db);
|
||||
check_for_captions(path, ret);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
if( m.dlna_pn )
|
||||
free(m.dlna_pn);
|
||||
if( m.mime )
|
||||
|
@ -649,7 +649,6 @@ main(int argc, char * * argv)
|
||||
struct timeval timeout, timeofday, lastnotifytime = {0, 0}, lastupdatetime = {0, 0};
|
||||
int max_fd = -1;
|
||||
int last_changecnt = 0;
|
||||
char * sql;
|
||||
short int new_db = 0;
|
||||
pid_t scanner_pid = 0;
|
||||
pthread_t inotify_thread = 0;
|
||||
@ -1009,9 +1008,7 @@ shutdown:
|
||||
if( inotify_thread )
|
||||
pthread_join(inotify_thread, NULL);
|
||||
|
||||
asprintf(&sql, "UPDATE SETTINGS set UPDATE_ID = %u", updateID);
|
||||
sql_exec(db, sql);
|
||||
free(sql);
|
||||
sql_exec(db, "UPDATE SETTINGS set UPDATE_ID = %u", updateID);
|
||||
sqlite3_close(db);
|
||||
|
||||
struct media_dir_s * media_path = media_dirs;
|
||||
|
204
scanner.c
204
scanner.c
@ -109,13 +109,11 @@ insert_container(const char * item, const char * rootParent, const char * refID,
|
||||
{
|
||||
detailID = GetFolderMetadata(item, NULL, artist, genre, album_art);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', %Q, %lld, 'container.%s', '%q')",
|
||||
rootParent, parentID, rootParent, refID, detailID, class, item);
|
||||
ret = sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
ret = sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', %Q, %lld, 'container.%s', '%q')",
|
||||
rootParent, parentID, rootParent, refID, detailID, class, item);
|
||||
}
|
||||
sqlite3_free_table(result);
|
||||
|
||||
@ -171,13 +169,11 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
strcpy(last_date.name, date_taken);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached date item: %s/%s/%X\n", last_date.name, last_date.parentID, last_date.objectID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_date.parentID, last_date.objectID, last_date.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_date.parentID, last_date.objectID, last_date.parentID, refID, class, detailID, name);
|
||||
|
||||
if( cam )
|
||||
{
|
||||
@ -208,25 +204,21 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
strcpy(last_camdate.name, date_taken);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached camdate item: %s/%s/%s/%X\n", camera, last_camdate.name, last_camdate.parentID, last_camdate.objectID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_camdate.parentID, last_camdate.objectID, last_camdate.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_camdate.parentID, last_camdate.objectID, last_camdate.parentID, refID, class, detailID, name);
|
||||
/* All Images */
|
||||
if( !last_all_objectID )
|
||||
{
|
||||
last_all_objectID = get_next_available_id("OBJECTS", "3$11");
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('3$11$%llX', '3$11', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('3$11$%llX', '3$11', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
}
|
||||
else if( strstr(class, "audioItem") )
|
||||
{
|
||||
@ -266,13 +258,11 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
last_album.objectID = (int)container;
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached album item: %s/%s/%X\n", last_album.name, last_album.parentID, last_album.objectID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_album.parentID, last_album.objectID, last_album.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_album.parentID, last_album.objectID, last_album.parentID, refID, class, detailID, name);
|
||||
}
|
||||
if( artist )
|
||||
{
|
||||
@ -304,20 +294,16 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
strcpy(last_artistAlbum.name, album?album:"Unknown Album");
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached artist/album item: %s/%s/%X\n", last_artist.name, last_artist.parentID, last_artist.objectID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_artistAlbum.parentID, last_artistAlbum.objectID, last_artistAlbum.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_artistAlbumAll.parentID, last_artistAlbumAll.objectID, last_artistAlbumAll.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_artistAlbum.parentID, last_artistAlbum.objectID, last_artistAlbum.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_artistAlbumAll.parentID, last_artistAlbumAll.objectID, last_artistAlbumAll.parentID, refID, class, detailID, name);
|
||||
}
|
||||
if( genre )
|
||||
{
|
||||
@ -348,33 +334,27 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
strcpy(last_genreArtist.name, artist?artist:"Unknown Artist");
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached genre/artist item: %s/%s/%X\n", last_genreArtist.name, last_genreArtist.parentID, last_genreArtist.objectID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_genreArtist.parentID, last_genreArtist.objectID, last_genreArtist.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_genreArtistAll.parentID, last_genreArtistAll.objectID, last_genreArtistAll.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_genreArtist.parentID, last_genreArtist.objectID, last_genreArtist.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%X', '%s', '%s', '%s', %lu, %Q)",
|
||||
last_genreArtistAll.parentID, last_genreArtistAll.objectID, last_genreArtistAll.parentID, refID, class, detailID, name);
|
||||
}
|
||||
/* All Music */
|
||||
if( !last_all_objectID )
|
||||
{
|
||||
last_all_objectID = get_next_available_id("OBJECTS", "1$4");
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('1$4$%llX', '1$4', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('1$4$%llX', '1$4', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
}
|
||||
else if( strstr(class, "videoItem") )
|
||||
{
|
||||
@ -385,13 +365,11 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
{
|
||||
last_all_objectID = get_next_available_id("OBJECTS", "2$8");
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('2$8$%llX', '2$8', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('2$8$%llX', '2$8', '%s', '%s', %lu, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@ -406,7 +384,7 @@ int
|
||||
insert_directory(const char * name, const char * path, const char * base, const char * parentID, int objectID)
|
||||
{
|
||||
char * sql;
|
||||
int ret, rows, found = 0;
|
||||
int rows, found = 0;
|
||||
sqlite_int64 detailID = 0;
|
||||
char * refID = NULL;
|
||||
char class[] = "container.storageFolder";
|
||||
@ -442,13 +420,11 @@ insert_directory(const char * name, const char * path, const char * base, const
|
||||
}
|
||||
sqlite3_free_table(result);
|
||||
sqlite3_free(sql);
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s', %Q, '%lld', '%s', '%q')",
|
||||
id_buf, parent_buf, refID, detailID, class, rindex(dir, '/')+1);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s', %Q, '%lld', '%s', '%q')",
|
||||
id_buf, parent_buf, refID, detailID, class, rindex(dir, '/')+1);
|
||||
if( rindex(id_buf, '$') )
|
||||
*rindex(id_buf, '$') = '\0';
|
||||
if( rindex(parent_buf, '$') )
|
||||
@ -465,14 +441,11 @@ insert_directory(const char * name, const char * path, const char * base, const
|
||||
}
|
||||
|
||||
detailID = GetFolderMetadata(name, path, NULL, NULL, NULL);
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', %Q, '%lld', '%s', '%q')",
|
||||
base, parentID, objectID, base, parentID, refID, detailID, class, name);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "SQL: %s\n", sql);
|
||||
ret = sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', %Q, '%lld', '%s', '%q')",
|
||||
base, parentID, objectID, base, parentID, refID, detailID, class, name);
|
||||
if( refID )
|
||||
free(refID);
|
||||
|
||||
@ -482,7 +455,6 @@ insert_directory(const char * name, const char * path, const char * base, const
|
||||
int
|
||||
insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
{
|
||||
char *sql;
|
||||
char class[32];
|
||||
char objectID[64];
|
||||
unsigned long int detailID = 0;
|
||||
@ -523,14 +495,11 @@ insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
|
||||
sprintf(objectID, "%s%s$%X", BROWSEDIR_ID, parentID, object);
|
||||
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s%s', '%s', %lu, '%q')",
|
||||
objectID, BROWSEDIR_ID, parentID, class, detailID, name);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "SQL: %s\n", sql);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s%s', '%s', %lu, '%q')",
|
||||
objectID, BROWSEDIR_ID, parentID, class, detailID, name);
|
||||
|
||||
if( *parentID )
|
||||
{
|
||||
@ -545,15 +514,11 @@ insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
insert_directory(name, path, base, typedir_parentID, typedir_objectID);
|
||||
free(typedir_parentID);
|
||||
}
|
||||
sql = sqlite3_mprintf( "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', '%s', '%s', %lu, '%q')",
|
||||
base, parentID, object, base, parentID, objectID, class, detailID, name);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "SQL: %s\n", sql);
|
||||
sql_exec(db, sql);
|
||||
sqlite3_free(sql);
|
||||
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', '%s', '%s', %lu, '%q')",
|
||||
base, parentID, object, base, parentID, objectID, class, detailID, name);
|
||||
|
||||
insert_containers(name, path, objectID, class, detailID);
|
||||
return 0;
|
||||
@ -563,7 +528,6 @@ int
|
||||
CreateDatabase(void)
|
||||
{
|
||||
int ret, i;
|
||||
char sql_buf[512];
|
||||
const char * containers[] = { "0","-1", "root",
|
||||
"1", "0", "Music",
|
||||
"1$4", "1", "All Music",
|
||||
@ -587,10 +551,6 @@ CreateDatabase(void)
|
||||
sql_exec(db, "pragma synchronous = OFF;");
|
||||
sql_exec(db, "pragma default_cache_size = 8192;");
|
||||
|
||||
//JM: Set up a db version number, so we know if we need to rebuild due to a new structure.
|
||||
sprintf(sql_buf, "pragma user_version = %d;", DB_VERSION);
|
||||
sql_exec(db, sql_buf);
|
||||
|
||||
ret = sql_exec(db, "CREATE TABLE OBJECTS ( "
|
||||
"ID INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||
"OBJECT_ID TEXT UNIQUE NOT NULL, "
|
||||
@ -651,11 +611,10 @@ CreateDatabase(void)
|
||||
goto sql_failed;
|
||||
for( i=0; containers[i]; i=i+3 )
|
||||
{
|
||||
sprintf(sql_buf, "INSERT into OBJECTS (OBJECT_ID, PARENT_ID, DETAIL_ID, CLASS, NAME)"
|
||||
" values "
|
||||
"('%s', '%s', %lld, 'container.storageFolder', '%s')",
|
||||
containers[i], containers[i+1], GetFolderMetadata(containers[i+2], NULL, NULL, NULL, NULL), containers[i+2]);
|
||||
ret = sql_exec(db, sql_buf);
|
||||
ret = sql_exec(db, "INSERT into OBJECTS (OBJECT_ID, PARENT_ID, DETAIL_ID, CLASS, NAME)"
|
||||
" values "
|
||||
"('%s', '%s', %lld, 'container.storageFolder', '%s')",
|
||||
containers[i], containers[i+1], GetFolderMetadata(containers[i+2], NULL, NULL, NULL, NULL), containers[i+2]);
|
||||
if( ret != SQLITE_OK )
|
||||
goto sql_failed;
|
||||
}
|
||||
@ -841,4 +800,7 @@ start_scanner()
|
||||
* This index is very useful for large libraries used with an XBox360 (or any
|
||||
* client that uses UPnPSearch on large containers). */
|
||||
sql_exec(db, "create INDEX IDX_SEARCH_OPT ON OBJECTS(OBJECT_ID, CLASS, DETAIL_ID);");
|
||||
|
||||
//JM: Set up a db version number, so we know if we need to rebuild due to a new structure.
|
||||
sql_exec(db, "pragma user_version = %d;", DB_VERSION);
|
||||
}
|
||||
|
10
sql.c
10
sql.c
@ -21,12 +21,17 @@
|
||||
#include "log.h"
|
||||
|
||||
int
|
||||
sql_exec(sqlite3 * db, const char * sql)
|
||||
sql_exec(sqlite3 *db, const char *fmt, ...)
|
||||
{
|
||||
int ret;
|
||||
char *errMsg = NULL;
|
||||
char *sql;
|
||||
va_list ap;
|
||||
//DPRINTF(E_DEBUG, L_DB_SQL, "SQL: %s\n", sql);
|
||||
|
||||
va_start(ap, fmt);
|
||||
|
||||
sql = sqlite3_vmprintf(fmt, ap);
|
||||
ret = sqlite3_exec(db, sql, 0, 0, &errMsg);
|
||||
if( ret != SQLITE_OK )
|
||||
{
|
||||
@ -34,6 +39,8 @@ sql_exec(sqlite3 * db, const char * sql)
|
||||
if (errMsg)
|
||||
sqlite3_free(errMsg);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -51,6 +58,7 @@ sql_get_table(sqlite3 *db, const char *sql, char ***pazResult, int *pnRow, int *
|
||||
if (errMsg)
|
||||
sqlite3_free(errMsg);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user