diff --git a/Slim/Music/VirtualLibraries.pm b/Slim/Music/VirtualLibraries.pm index 19250113b..82b0122be 100644 --- a/Slim/Music/VirtualLibraries.pm +++ b/Slim/Music/VirtualLibraries.pm @@ -179,15 +179,17 @@ sub registerLibrary { $args->{sql} = shift @{$args->{sql}}; } + my $insertCmd = Slim::Utils::OSDetect->getOS()->sqlHelperClass()->insertOrIgnoreCommand(); + if ( $args->{sql} !~ /SELECT .*\%s/si ) { main::INFOLOG && $log->info("Missing library ID placeholder: " . $args->{sql}); - $args->{sql} = "INSERT OR IGNORE INTO library_track (library, track) SELECT '%s', id FROM (" . $args->{sql} . ")"; + $args->{sql} = "$insertCmd INTO library_track (library, track) SELECT '%s', id FROM (" . $args->{sql} . ")"; main::DEBUGLOG && $log->debug("Using: " . $args->{sql}); } if ( $args->{sql} !~ /INSERT/i ) { main::INFOLOG && $log->info("Missing INSERT statement in SQL: " . $args->{sql}); - $args->{sql} = 'INSERT OR IGNORE INTO library_track (library, track) ' . $args->{sql}; + $args->{sql} = "$insertCmd INTO library_track (library, track) " . $args->{sql}; main::DEBUGLOG && $log->debug("Using: " . $args->{sql}); } } @@ -327,8 +329,10 @@ sub rebuild { $delete_sth = $dbh->prepare_cached('DELETE FROM library_album WHERE library = ?'); $delete_sth->execute($id); + my $insertCmd = Slim::Utils::OSDetect->getOS()->sqlHelperClass()->insertOrIgnoreCommand(); + my $albums_sth = $dbh->prepare_cached(qq{ - INSERT OR IGNORE INTO library_album (library, album) + $insertCmd INTO library_album (library, album) SELECT ?, tracks.album FROM library_track, tracks WHERE library_track.library = ? AND tracks.id = library_track.track @@ -340,7 +344,7 @@ sub rebuild { $delete_sth->execute($id); my $contributors_sth = $dbh->prepare_cached(qq{ - INSERT OR IGNORE INTO library_contributor (library, contributor) + $insertCmd INTO library_contributor (library, contributor) SELECT DISTINCT ?, contributor_track.contributor FROM contributor_track WHERE contributor_track.track IN ( @@ -355,7 +359,7 @@ sub rebuild { $delete_sth->execute($id); my $genres_sth = $dbh->prepare_cached(qq{ - INSERT OR IGNORE INTO library_genre (library, genre) + $insertCmd INTO library_genre (library, genre) SELECT DISTINCT ?, genre_track.genre FROM genre_track, library_track WHERE library_track.library = ? AND library_track.track = genre_track.track diff --git a/Slim/Plugin/ExtendedBrowseModes/Libraries.pm b/Slim/Plugin/ExtendedBrowseModes/Libraries.pm index 473d587d9..cfd372d5f 100644 --- a/Slim/Plugin/ExtendedBrowseModes/Libraries.pm +++ b/Slim/Plugin/ExtendedBrowseModes/Libraries.pm @@ -21,12 +21,14 @@ sub initLibraries { my ($class) = @_; if ( $prefs->get('enableLosslessPreferred') ) { + my $insertCmd = Slim::Utils::OSDetect->getOS()->sqlHelperClass()->insertOrIgnoreCommand(); + Slim::Music::VirtualLibraries->registerLibrary({ id => 'losslessPreferred', name => string('PLUGIN_EXTENDED_BROWSEMODES_LOSSLESS_PREFERRED'), string => 'PLUGIN_EXTENDED_BROWSEMODES_LOSSLESS_PREFERRED', sql => qq{ - INSERT OR IGNORE INTO library_track (library, track) + $insertCmd INTO library_track (library, track) SELECT '%s', tracks.id FROM tracks, albums WHERE albums.id = tracks.album diff --git a/Slim/Plugin/LibraryDemo/Plugin.pm b/Slim/Plugin/LibraryDemo/Plugin.pm index a78294949..cc7caee68 100644 --- a/Slim/Plugin/LibraryDemo/Plugin.pm +++ b/Slim/Plugin/LibraryDemo/Plugin.pm @@ -16,6 +16,8 @@ use Slim::Utils::Log; sub initPlugin { my $class = shift; + my $insertCmd = Slim::Utils::OSDetect->getOS()->sqlHelperClass()->insertOrIgnoreCommand(); + # Define some virtual libraries. # - id: the library's ID. Use something specific to your plugin to prevent dupes. # - name: the user facing name, shown in menus and settings @@ -27,7 +29,7 @@ sub initPlugin { name => 'Longish tracks only', # %s is being replaced with the library's ID sql => qq{ - INSERT OR IGNORE INTO library_track (library, track) + $insertCmd INTO library_track (library, track) SELECT '%s', tracks.id FROM tracks WHERE tracks.secs > 600 @@ -36,7 +38,7 @@ sub initPlugin { id => 'demoFLACOnly', name => 'FLAC files only', sql => qq{ - INSERT OR IGNORE INTO library_track (library, track) + $insertCmd INTO library_track (library, track) SELECT '%s', tracks.id FROM tracks WHERE tracks.content_type = 'flc' @@ -45,7 +47,7 @@ sub initPlugin { id => 'neverHeard', name => "Tracks you've never listened to", sql => qq{ - INSERT OR IGNORE INTO library_track (library, track) + $insertCmd INTO library_track (library, track) SELECT '%s', tracks.id FROM tracks_persistent JOIN tracks ON tracks.urlmd5 = tracks_persistent.urlmd5 @@ -63,8 +65,8 @@ sub initPlugin { # 30 days ago my $threshold = time() - 30 * 86400; - $dbh->do( sprintf(q{ - INSERT OR IGNORE INTO library_track (library, track) + $dbh->do( sprintf(qq{ + $insertCmd INTO library_track (library, track) SELECT '%s', tracks.id FROM tracks_persistent JOIN tracks ON tracks.urlmd5 = tracks_persistent.urlmd5 @@ -83,7 +85,7 @@ sub initPlugin { my $dbh = Slim::Schema->dbh; $dbh->do( qq{ - INSERT OR IGNORE INTO library_track (library, track) + $insertCmd INTO library_track (library, track) SELECT '$id', tracks.id FROM tracks JOIN albums ON tracks.album = albums.id diff --git a/Slim/Utils/MySQLHelper.pm b/Slim/Utils/MySQLHelper.pm index ff533a664..cb920a018 100644 --- a/Slim/Utils/MySQLHelper.pm +++ b/Slim/Utils/MySQLHelper.pm @@ -346,6 +346,14 @@ sub collate { return "COLLATE $collation "; } +=head2 insertOrIgnoreCommand() + +Returns the SQL engine's specific "replace or ignore" command + +=cut + +sub insertOrIgnoreCommand { 'INSERT REPLACE' } + =head2 randomFunction() Returns RAND(), MySQL-specific random function diff --git a/Slim/Utils/SQLiteHelper.pm b/Slim/Utils/SQLiteHelper.pm index fad906ce3..d2df8ea6d 100644 --- a/Slim/Utils/SQLiteHelper.pm +++ b/Slim/Utils/SQLiteHelper.pm @@ -215,6 +215,14 @@ sub collate { return 'COLLATE perllocale '; } +=head2 insertOrIgnoreCommand() + +Returns the SQL engine's specific "replace or ignore" command + +=cut + +sub insertOrIgnoreCommand { 'INSERT OR REPLACE' } + =head2 randomFunction() Returns RANDOM(), SQLite-specific random function