diff --git a/albumart.c b/albumart.c index 5869197..c4cc5c9 100644 --- a/albumart.c +++ b/albumart.c @@ -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); diff --git a/inotify.c b/inotify.c index 5443eaa..59242b4 100644 --- a/inotify.c +++ b/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; } diff --git a/metadata.c b/metadata.c index 8360171..57ae539 100644 --- a/metadata.c +++ b/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 ) diff --git a/minidlna.c b/minidlna.c index 7cbc182..162ae40 100644 --- a/minidlna.c +++ b/minidlna.c @@ -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; diff --git a/scanner.c b/scanner.c index 5c1e0d4..0257510 100644 --- a/scanner.c +++ b/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); } diff --git a/sql.c b/sql.c index e15b86e..5fef4cf 100644 --- a/sql.c +++ b/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; } diff --git a/sql.h b/sql.h index e067eb7..9373e2b 100644 --- a/sql.h +++ b/sql.h @@ -13,7 +13,7 @@ #include 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);