* 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:
Justin Maggard 2009-11-04 01:38:14 +00:00
parent 6738b8a722
commit c8fe23d838
7 changed files with 152 additions and 223 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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 )

View File

@ -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
View File

@ -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
View File

@ -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;
}

2
sql.h
View File

@ -13,7 +13,7 @@
#include <sqlite3.h>
int
sql_exec(sqlite3 * db, const char * sql);
sql_exec(sqlite3 *db, const char *fmt, ...);
int
sql_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn);