diff --git a/src/database/mixxxdb.cpp b/src/database/mixxxdb.cpp index 6dcd79a0a52c..e3a2e70cc7e4 100644 --- a/src/database/mixxxdb.cpp +++ b/src/database/mixxxdb.cpp @@ -17,16 +17,46 @@ namespace { const mixxx::Logger kLogger("MixxxDb"); +const QString kType = QStringLiteral("QSQLITE"); + +const QString kConnectOptions = QStringLiteral("QSQLITE_OPEN_URI"); + +const QString kUriPrefix = QStringLiteral("file://"); + +const QString kDefaultFileName = QStringLiteral("mixxxdb.sqlite"); + +const QString kUserName = QStringLiteral("mixxx"); + +const QString kPassword = QStringLiteral("mixxx"); + // The connection parameters for the main Mixxx DB mixxx::DbConnection::Params dbConnectionParams( const UserSettingsPointer& pConfig, bool inMemoryConnection) { mixxx::DbConnection::Params params; - params.type = "QSQLITE"; - params.hostName = "localhost"; - params.filePath = inMemoryConnection ? QString(":memory:") : QDir(pConfig->getSettingsPath()).filePath("mixxxdb.sqlite"); - params.userName = "mixxx"; - params.password = "mixxx"; + params.type = kType; + params.connectOptions = kConnectOptions; + params.filePath = kUriPrefix; + const QString absFilePath = + QDir(pConfig->getSettingsPath()).absoluteFilePath(kDefaultFileName); + // On Windows absFilePath starts with a drive letter instead of + // the leading '/' as required. + // https://www.sqlite.org/c3ref/open.html#urifilenameexamples + if (!absFilePath.startsWith(QChar('/'))) { + params.filePath += QChar('/'); + } + params.filePath += absFilePath; + // Allow multiple connections to the same in-memory database by + // using a named connection. This is needed to make the database + // connection pool work correctly even during tests. + // + // See also: + // https://www.sqlite.org/inmemorydb.html + if (inMemoryConnection) { + params.filePath += QStringLiteral("?mode=memory&cache=shared"); + } + params.userName = kUserName; + params.password = kPassword; return params; } diff --git a/src/util/db/dbconnection.cpp b/src/util/db/dbconnection.cpp index e60534ce598d..aa53067a471f 100644 --- a/src/util/db/dbconnection.cpp +++ b/src/util/db/dbconnection.cpp @@ -31,6 +31,7 @@ QSqlDatabase createDatabase( QSqlDatabase database = QSqlDatabase::addDatabase(params.type, connectionName); + database.setConnectOptions(params.connectOptions); database.setHostName(params.hostName); database.setDatabaseName(params.filePath); database.setUserName(params.userName); diff --git a/src/util/db/dbconnection.h b/src/util/db/dbconnection.h index aef106bed540..76b6af892875 100644 --- a/src/util/db/dbconnection.h +++ b/src/util/db/dbconnection.h @@ -26,6 +26,7 @@ class DbConnection final { struct Params { QString type; + QString connectOptions; QString hostName; QString filePath; QString userName;