From de8f406239da2035d78e50f81cb3ee5cd3d6765c Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Sat, 11 Nov 2017 10:14:45 +0100 Subject: [PATCH] Optimize formatting of string lists for SQL queries --- src/library/crate/cratestorage.cpp | 35 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/library/crate/cratestorage.cpp b/src/library/crate/cratestorage.cpp index 379da6c6d152..b4c876060b57 100644 --- a/src/library/crate/cratestorage.cpp +++ b/src/library/crate/cratestorage.cpp @@ -81,6 +81,26 @@ class CrateQueryBinder { FwdSqlQuery& m_query; }; +const QChar kSqlListSeparator(','); + +// It is not possible to bind multiple values as a list to a query. +// The list of track ids has to be transformed into a single list +// string before it can be used in an SQL query. +QString joinSqlStringList(const QList& trackIds) { + QString joinedTrackIds; + // Reserve memory up front to prevent reallocation. Here we + // assume that all track ids fit into 6 decimal digits and + // add 1 character for the list separator. + joinedTrackIds.reserve((6 + 1) * trackIds.size()); + for (const auto trackId: trackIds) { + if (!joinedTrackIds.isEmpty()) { + joinedTrackIds += kSqlListSeparator; + } + joinedTrackIds += trackId.toString(); + } + return joinedTrackIds; +} + } // anonymous namespace @@ -469,18 +489,6 @@ CrateTrackSelectResult CrateStorage::selectTrackCratesSorted(TrackId trackId) co } CrateSummarySelectResult CrateStorage::selectCratesWithTrackCount(const QList& trackIds) const { - - // unfortunatelly we can't bind a QList to a SqlQuery therefor we have to construct a String first - // see: https://stackoverflow.com/questions/3220357/qt-how-to-bind-a-qlist-to-a-qsqlquery-with-a-where-in-clause - // Using bindValue did not work, only constructing the SQL string befor. - // As TrackId is a int, we are safe here - QStringList idstrings; - foreach(TrackId id, trackIds) { - idstrings << id.toString(); - } - QString numberlist = idstrings.join(","); - QString ids = QString("%1").arg(numberlist); - FwdSqlQuery query(m_database, QString( "SELECT *, (" " SELECT COUNT(*) FROM %1 WHERE %2.%3 = %1.%4 and %1.%5 in (%9)" @@ -493,14 +501,13 @@ CrateSummarySelectResult CrateStorage::selectCratesWithTrackCount(const QList