diff --git a/extensions/kDBDatasets/Datasets.cpp b/extensions/kDBDatasets/Datasets.cpp index cd3f668fefc2b3a15fe949e2a53ce295abebf47b..7354461b3bcd185e4b5d1e370520836aa265eff2 100644 --- a/extensions/kDBDatasets/Datasets.cpp +++ b/extensions/kDBDatasets/Datasets.cpp @@ -53,8 +53,7 @@ struct Datasets::Private : public QSharedData QSharedPointer<Dataset::Private::Definition> createDefinition(const knowCore::Uri& _datasetUri, const knowCore::Uri& _typeUri, const knowGIS::GeometryObject& _geometry); - - struct Static + struct Cache { QMutex mutex; DatasetsPrivateT datasets_private; @@ -62,7 +61,18 @@ struct Datasets::Private : public QSharedData QList<QUuid> handledConnection; void handleConnection(const kDB::Repository::Connection& _connection); }; - static Static s_static; + QSharedPointer<Cache> cache = getCache(); + static QWeakPointer<Cache> s_cache; + static QSharedPointer<Cache> getCache() + { + QSharedPointer<Cache> cache = s_cache; + if(not cache) + { + cache = QSharedPointer<Cache>(new Cache()); + s_cache = cache; + } + return cache; + } }; QSharedPointer<Dataset::Private::Definition> Datasets::Private::createDefinition(const knowCore::Uri& _datasetUri, const knowCore::Uri& _typeUri, const knowGIS::GeometryObject& _geometry) @@ -74,15 +84,15 @@ QSharedPointer<Dataset::Private::Definition> Datasets::Private::createDefinition ds_def->serverUuid = connection.serverUuid(); { - QMutexLocker l(&Private::s_static.mutex); - Private::s_static.definitions[connection.connectionUuid()][_datasetUri] = ds_def; + QMutexLocker l(&cache->mutex); + cache->definitions[connection.connectionUuid()][_datasetUri] = ds_def; } return ds_def; } -Datasets::Private::Static Datasets::Private::s_static; +QWeakPointer<Datasets::Private::Cache> Datasets::Private::s_cache; -void Datasets::Private::Static::handleConnection(const kDB::Repository::Connection& _connection) +void Datasets::Private::Cache::handleConnection(const kDB::Repository::Connection& _connection) { QUuid cuuid = _connection.connectionUuid(); if(not handledConnection.contains(cuuid)) @@ -90,23 +100,30 @@ void Datasets::Private::Static::handleConnection(const kDB::Repository::Connecti handledConnection.append(cuuid); _connection.executeDisconnection([cuuid]() { - s_static.definitions.remove(cuuid); + QSharedPointer<Private::Cache> cache = Private::getCache(); + QMutexLocker l(&cache->mutex); + cache->definitions.remove(cuuid); }); } } void Datasets::clearCache() { - QMutexLocker l(&Private::s_static.mutex); - Private::s_static.datasets_private.clear(); - Private::s_static.definitions.clear(); + QSharedPointer<Private::Cache> cache = Private::getCache(); + if(cache) + { + QMutexLocker l(&cache->mutex); + cache->datasets_private.clear(); + cache->definitions.clear(); + } } knowCore::ReturnValue<Datasets> Datasets::get(const kDB::Repository::Connection& _connection, const knowCore::Uri& _graph) { - QMutexLocker l(&Private::s_static.mutex); - Private::s_static.handleConnection(_connection); - Private::Uri2Private& u2p = Private::s_static.datasets_private[_connection.connectionUuid()]; + QSharedPointer<Private::Cache> cache = Private::getCache(); + QMutexLocker l(&cache->mutex); + cache->handleConnection(_connection); + Private::Uri2Private& u2p = cache->datasets_private[_connection.connectionUuid()]; if(u2p.contains(_graph)) { QExplicitlySharedDataPointer<Private> d(new Private); @@ -143,8 +160,9 @@ knowCore::ReturnValue<Datasets> Datasets::get(const kDB::Repository::Connection& knowCore::ReturnValue<Datasets> Datasets::create(const kDB::Repository::Connection& _connection, const knowCore::Uri& _graph) { if(get(_connection, _graph).success()) return kCrvError("Cannot create datasets with name {}, it already exits.", _graph); - QMutexLocker l(&Private::s_static.mutex); - Private::s_static.handleConnection(_connection); + QSharedPointer<Private::Cache> cache = Private::getCache(); + QMutexLocker l(&cache->mutex); + cache->handleConnection(_connection); if(_connection.graphsManager()->hasTripleStore(_graph)) { return kCrvLogError("Cannot create triple store for datasets '{0}', '{0}' is already used for a different purpose", _graph); @@ -158,7 +176,7 @@ knowCore::ReturnValue<Datasets> Datasets::create(const kDB::Repository::Connecti QExplicitlySharedDataPointer<Private> d(new Private); d->definition = def; d->connection = _connection; - Private::s_static.datasets_private[_connection.connectionUuid()][_graph] = def; + cache->datasets_private[_connection.connectionUuid()][_graph] = def; return kCrvSuccess(Datasets(d)); } @@ -171,11 +189,12 @@ knowCore::ReturnValue<Datasets> Datasets::getOrCreate(const kDB::Repository::Con Datasets Datasets::allDatasets(const kDB::Repository::Connection& _connection) { - QMutexLocker l(&Private::s_static.mutex); + QSharedPointer<Private::Cache> cache = Private::getCache(); + QMutexLocker l(&cache->mutex); // Make sure the union is created - Private::s_static.handleConnection(_connection); + cache->handleConnection(_connection); _connection.graphsManager()->getUnion(knowCore::Uris::askcore_graphs::all_datasets); - Private::Uri2Private& u2p = Private::s_static.datasets_private[_connection.connectionUuid()]; + Private::Uri2Private& u2p = cache->datasets_private[_connection.connectionUuid()]; if(u2p.contains(knowCore::Uris::askcore_graphs::all_datasets)) { QExplicitlySharedDataPointer<Private> d(new Private); @@ -271,8 +290,8 @@ knowCore::ReturnValue<Dataset> Datasets::dataset(const knowCore::Uri& _datasetUr { QSharedPointer<Dataset::Private::Definition> ds_def; { - QMutexLocker l(&Private::s_static.mutex); - ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(_datasetUri); + QMutexLocker l(&d->cache->mutex); + ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(_datasetUri); } // If the definition is not available, check in the database if(not ds_def) @@ -330,11 +349,11 @@ QList<Dataset> Datasets::all() const { for(const Queries::DatasetsSelectAll::Result& result : r.data) { - QMutexLocker l(&Private::s_static.mutex); + QMutexLocker l(&d->cache->mutex); Dataset ds; ds.d = new Dataset::Private; ds.d->connection = d->connection; - QSharedPointer<Dataset::Private::Definition> ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(result.uri()); + QSharedPointer<Dataset::Private::Definition> ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(result.uri()); if(not ds_def) { l.unlock(); @@ -424,8 +443,8 @@ knowCore::ReturnValue<QList<Dataset>> Datasets::datasets(const QList<QPair<knowC QSharedPointer<Dataset::Private::Definition> ds_def; { - QMutexLocker l(&Private::s_static.mutex); - ds_def = Private::s_static.definitions.value(d->connection.connectionUuid()).value(ds_uri); + QMutexLocker l(&d->cache->mutex); + ds_def = d->cache->definitions.value(d->connection.connectionUuid()).value(ds_uri); } if(not ds_def) { @@ -443,8 +462,8 @@ knowCore::ReturnValue<QList<Dataset>> Datasets::datasets(const QList<QPair<knowC ds_def->serverUuid = d->connection.serverUuid(); { - QMutexLocker l(&Private::s_static.mutex); - Private::s_static.definitions[d->connection.connectionUuid()][ds_uri] = ds_def; + QMutexLocker l(&d->cache->mutex); + d->cache->definitions[d->connection.connectionUuid()][ds_uri] = ds_def; } } else { // If the definition is available, make sure the graphs list is up to date