Try to fix some crashes and asserts related to in-memory databases and correct QtSQL threading.
This commit is contained in:
parent
f211810af4
commit
a8e86b0f26
@ -16,7 +16,7 @@ DatabaseFactory::DatabaseFactory(QObject* parent)
|
|||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
m_activeDatabaseDriver(UsedDriver::SQLITE),
|
m_activeDatabaseDriver(UsedDriver::SQLITE),
|
||||||
m_mysqlDatabaseInitialized(false),
|
m_mysqlDatabaseInitialized(false),
|
||||||
m_sqliteFileBasedDatabaseinitialized(false),
|
m_sqliteFileBasedDatabaseInitialized(false),
|
||||||
m_sqliteInMemoryDatabaseInitialized(false) {
|
m_sqliteInMemoryDatabaseInitialized(false) {
|
||||||
setObjectName(QSL("DatabaseFactory"));
|
setObjectName(QSL("DatabaseFactory"));
|
||||||
determineDriver();
|
determineDriver();
|
||||||
@ -186,7 +186,8 @@ void DatabaseFactory::sqliteAssemblyDatabaseFilePath() {
|
|||||||
QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
|
QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
|
||||||
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER);
|
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER);
|
||||||
|
|
||||||
database.setDatabaseName(QSL(":memory:"));
|
database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE"));
|
||||||
|
database.setDatabaseName(QSL("file::memory:"));
|
||||||
|
|
||||||
if (!database.open()) {
|
if (!database.open()) {
|
||||||
qFatal("In-memory SQLite database was NOT opened. Delivered error message: '%s'", qPrintable(database.lastError().text()));
|
qFatal("In-memory SQLite database was NOT opened. Delivered error message: '%s'", qPrintable(database.lastError().text()));
|
||||||
@ -370,7 +371,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString& c
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Everything is initialized now.
|
// Everything is initialized now.
|
||||||
m_sqliteFileBasedDatabaseinitialized = true;
|
m_sqliteFileBasedDatabaseInitialized = true;
|
||||||
return database;
|
return database;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,8 +518,8 @@ QString DatabaseFactory::obtainBeginTransactionSql() const {
|
|||||||
void DatabaseFactory::sqliteSaveMemoryDatabase() {
|
void DatabaseFactory::sqliteSaveMemoryDatabase() {
|
||||||
qDebug("Saving in-memory working database back to persistent file-based storage.");
|
qDebug("Saving in-memory working database back to persistent file-based storage.");
|
||||||
|
|
||||||
QSqlDatabase database = sqliteConnection(objectName(), DesiredType::StrictlyInMemory);
|
QSqlDatabase database = sqliteConnection(QSL("SaveFromMemory"), DesiredType::StrictlyInMemory);
|
||||||
QSqlDatabase file_database = sqliteConnection(objectName(), DesiredType::StrictlyFileBased);
|
QSqlDatabase file_database = sqliteConnection(QSL("SaveToFile"), DesiredType::StrictlyFileBased);
|
||||||
QSqlQuery copy_contents(database);
|
QSqlQuery copy_contents(database);
|
||||||
|
|
||||||
// Attach database.
|
// Attach database.
|
||||||
@ -717,9 +718,20 @@ QSqlDatabase DatabaseFactory::sqliteConnection(const QString& connection_name, D
|
|||||||
return sqliteInitializeInMemoryDatabase();
|
return sqliteInitializeInMemoryDatabase();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
QSqlDatabase database = QSqlDatabase::database();
|
QSqlDatabase database;
|
||||||
|
|
||||||
database.setDatabaseName(QSL(":memory:"));
|
if (QSqlDatabase::contains(connection_name)) {
|
||||||
|
qDebug("SQLite connection '%s' is already active.", qPrintable(connection_name));
|
||||||
|
|
||||||
|
// This database connection was added previously, no need to
|
||||||
|
// setup its properties.
|
||||||
|
database = QSqlDatabase::database(connection_name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER, connection_name);
|
||||||
|
database.setConnectOptions(QSL("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE"));
|
||||||
|
database.setDatabaseName(QSL("file::memory:"));
|
||||||
|
}
|
||||||
|
|
||||||
if (!database.isOpen() && !database.open()) {
|
if (!database.isOpen() && !database.open()) {
|
||||||
qFatal("In-memory SQLite database was NOT opened. Delivered error message: '%s'.",
|
qFatal("In-memory SQLite database was NOT opened. Delivered error message: '%s'.",
|
||||||
@ -734,7 +746,7 @@ QSqlDatabase DatabaseFactory::sqliteConnection(const QString& connection_name, D
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// We request file-based database.
|
// We request file-based database.
|
||||||
if (!m_sqliteFileBasedDatabaseinitialized) {
|
if (!m_sqliteFileBasedDatabaseInitialized) {
|
||||||
// File-based database is not yet initialised.
|
// File-based database is not yet initialised.
|
||||||
return sqliteInitializeFileBasedDatabase(connection_name);
|
return sqliteInitializeFileBasedDatabase(connection_name);
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ class DatabaseFactory : public QObject {
|
|||||||
QString m_sqliteDatabaseFilePath;
|
QString m_sqliteDatabaseFilePath;
|
||||||
|
|
||||||
// Is database file initialized?
|
// Is database file initialized?
|
||||||
bool m_sqliteFileBasedDatabaseinitialized;
|
bool m_sqliteFileBasedDatabaseInitialized;
|
||||||
bool m_sqliteInMemoryDatabaseInitialized;
|
bool m_sqliteInMemoryDatabaseInitialized;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user