diff --git a/kDB/Repository/Connection.cpp b/kDB/Repository/Connection.cpp index fa1163c7572b12a54f6cfa215d7af73e2b29065d..dae409a76c9bfe544e06b9ce99cf21c4451eb282 100644 --- a/kDB/Repository/Connection.cpp +++ b/kDB/Repository/Connection.cpp @@ -400,6 +400,15 @@ knowCore::ReturnVoid Connection::Private::loadExtensions() knowDBC::Result r = q.execute(); if(r) { + for(int i = 0; i < r.tuples(); ++i) + { + QString extension = r.value(i, 0).value<QString>().expectSuccess(); + QMutexLocker l(&metainformation_lock); + if(not enabledExtensions.contains(extension)) + { + enabledExtensions.append(extension); + } + } for(int i = 0; i < r.tuples(); ++i) { QString extension = r.value(i, 0).value<QString>().expectSuccess(); @@ -489,7 +498,10 @@ void Connection::disconnect() knowCore::ReturnVoid Connection::connect(bool _initialise_database) { - if(not d->connections.isEmpty()) return kCrvError("Already connected"); + { + QMutexLocker l(&d->connections_lock); + if(not d->connections.isEmpty()) return kCrvError("Already connected"); + } d->uuid = QUuid::createUuid(); @@ -590,6 +602,7 @@ knowCore::ReturnVoid Connection::connect(bool _initialise_database) } else { + QMutexLocker l(&d->connections_lock); d->connections.append(conn); d->available_connections.append(conn); } @@ -629,9 +642,10 @@ knowCore::ReturnVoid Connection::connect(bool _initialise_database) if(not new_instance) { ConnectionHandle handle(*this); - KNOWCORE_RETURN_VALUE_TRY_VOID(d->load_sql_files(handle.connection(), {":/DatabaseInterface/PostgreSQL/sql/initdb_44.sql"})); + KNOWCORE_RETURN_VALUE_TRY_VOID(d->load_sql_files(handle.connection(), {":/DatabaseInterface/PostgreSQL/sql/version_control_44.sql"})); } } + // Load units KNOWCORE_RETURN_VALUE_TRY_VOID_DO( DatabaseInterface::PostgreSQL::SQLInterface::setUnitConversionFactors(d->self_p), @@ -769,6 +783,7 @@ knowCore::ReturnVoid Connection::connect(bool _initialise_database) bool Connection::isConnected() const { + QMutexLocker l(&d->connections_lock); return d->connections.size() > 0; } @@ -836,6 +851,7 @@ knowCore::ReturnVoid Connection::enableExtension(const QString& _extension) if(d->loadedExtensions.contains(_extension)) return kCrvSuccess(); l.unlock(); KNOWCORE_RETURN_VALUE_TRY_VOID(d->loadExtension(_extension)); + if(d->enabledExtensions.contains(_extension)) return kCrvSuccess(); knowDBC::Query q = createSQLQuery("INSERT INTO extensions(name) VALUES (:name)"); q.bindValue(":name", _extension); knowDBC::Result r = q.execute(); @@ -843,6 +859,7 @@ knowCore::ReturnVoid Connection::enableExtension(const QString& _extension) { KDB_REPOSITORY_REPORT_QUERY_ERROR_RETURN("error inserting extension", r); } + d->enabledExtensions.append(_extension); return kCrvSuccess(); } diff --git a/kDB/Repository/Connection_p.h b/kDB/Repository/Connection_p.h index 585f316ee9aae8b0cde6889f965ce47ada491d22..04ede204e3901b53170f94cdb58d0ad26547c71b 100644 --- a/kDB/Repository/Connection_p.h +++ b/kDB/Repository/Connection_p.h @@ -75,7 +75,7 @@ namespace kDB QString uniqueTableName(const QString& _prefix, const QString& _key); - QStringList loadedExtensions; + QStringList loadedExtensions, enabledExtensions; knowCore::ReturnVoid loadExtension(const QString& _extension); knowCore::ReturnVoid loadExtensions();