Browse Source

QSqlDatabase::addDatabase not thread safe with plugin

Although the method is marked as thread safe in the docs, if you use a
database plugin it ends up not being thread safe.
QGC4.4
Don Gagne 11 years ago
parent
commit
b9113c56eb
  1. 14
      libs/opmapcontrol/src/core/pureimagecache.cpp

14
libs/opmapcontrol/src/core/pureimagecache.cpp

@ -29,6 +29,8 @@
#include <QSettings> #include <QSettings>
//#define DEBUG_PUREIMAGECACHE //#define DEBUG_PUREIMAGECACHE
namespace core { namespace core {
static QMutex addDatabaseMutex; // QSqlDatabase::addDatabase is not thread safe when loadingn plugins
qlonglong PureImageCache::ConnCounter=0; qlonglong PureImageCache::ConnCounter=0;
PureImageCache::PureImageCache() PureImageCache::PureImageCache()
@ -90,7 +92,9 @@ namespace core {
return false; return false;
} }
} }
addDatabaseMutex.lock();
QSqlDatabase db(QSqlDatabase::addDatabase("QSQLITE",QLatin1String("CreateConn"))); QSqlDatabase db(QSqlDatabase::addDatabase("QSQLITE",QLatin1String("CreateConn")));
addDatabaseMutex.unlock();
db.setDatabaseName(file); db.setDatabaseName(file);
if (!db.open()) if (!db.open())
{ {
@ -179,7 +183,9 @@ namespace core {
qlonglong id=++ConnCounter; qlonglong id=++ConnCounter;
Mcounter.unlock(); Mcounter.unlock();
{ {
addDatabaseMutex.lock();
QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id)));
addDatabaseMutex.unlock();
QString db=gtilecache+"Data.qmdb"; QString db=gtilecache+"Data.qmdb";
cn.setDatabaseName(db); cn.setDatabaseName(db);
cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE");
@ -225,7 +231,9 @@ namespace core {
QString db=dir+"Data.qmdb"; QString db=dir+"Data.qmdb";
{ {
addDatabaseMutex.lock();
QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id)));
addDatabaseMutex.unlock();
cn.setDatabaseName(db); cn.setDatabaseName(db);
cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE");
@ -260,7 +268,9 @@ namespace core {
Mcounter.lock(); Mcounter.lock();
qlonglong id=++ConnCounter; qlonglong id=++ConnCounter;
Mcounter.unlock(); Mcounter.unlock();
addDatabaseMutex.lock();
QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id)));
addDatabaseMutex.unlock();
cn.setDatabaseName(db); cn.setDatabaseName(db);
cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE");
if(cn.open()) if(cn.open())
@ -298,12 +308,16 @@ namespace core {
ret=CreateEmptyDB(destFile); ret=CreateEmptyDB(destFile);
} }
if(!ret) return false; if(!ret) return false;
addDatabaseMutex.lock();
QSqlDatabase ca(QSqlDatabase::addDatabase("QSQLITE","ca")); QSqlDatabase ca(QSqlDatabase::addDatabase("QSQLITE","ca"));
addDatabaseMutex.unlock();
ca.setDatabaseName(sourceFile); ca.setDatabaseName(sourceFile);
if(ca.open()) if(ca.open())
{ {
addDatabaseMutex.lock();
QSqlDatabase cb(QSqlDatabase::addDatabase("QSQLITE","cb")); QSqlDatabase cb(QSqlDatabase::addDatabase("QSQLITE","cb"));
addDatabaseMutex.unlock();
cb.setDatabaseName(destFile); cb.setDatabaseName(destFile);
if(cb.open()) if(cb.open())
{ {

Loading…
Cancel
Save