From 467f37db7f34b725eaeb4f9098b871b6a5388741 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 27 May 2016 17:55:19 +0200 Subject: [PATCH] refs #649, added check for changed base URL to database reader (continued #649 after fixes of #664) --- src/blackcore/data/dbcaches.h | 5 +++-- src/blackcore/db/databasereader.cpp | 27 +++++++++++++++++++++++---- src/blackcore/db/databasereader.h | 6 ++++++ src/blackcore/db/icaodatareader.cpp | 8 ++++++++ src/blackcore/db/icaodatareader.h | 1 + src/blackcore/db/infodatareader.cpp | 7 +++++++ src/blackcore/db/infodatareader.h | 1 + src/blackcore/db/modeldatareader.cpp | 6 ++++++ src/blackcore/db/modeldatareader.h | 1 + src/blackmisc/network/url.cpp | 4 ++-- src/blackmisc/network/url.h | 2 +- 11 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/blackcore/data/dbcaches.h b/src/blackcore/data/dbcaches.h index c39584fe9..9e59d3064 100644 --- a/src/blackcore/data/dbcaches.h +++ b/src/blackcore/data/dbcaches.h @@ -84,11 +84,12 @@ namespace BlackCore //! Default value static const BlackMisc::Network::CUrl &defaultValue(); + //! First load is synchronous + static constexpr bool isPinned() { return true; } + //! Key in data cache static const char *key() { return "dbicaoreaderurl"; } }; - - } // ns } // ns diff --git a/src/blackcore/db/databasereader.cpp b/src/blackcore/db/databasereader.cpp index 765be344e..28f7a43f4 100644 --- a/src/blackcore/db/databasereader.cpp +++ b/src/blackcore/db/databasereader.cpp @@ -51,6 +51,7 @@ namespace BlackCore CEntityFlags::Entity allEntities = entities; CEntityFlags::Entity currentEntity = CEntityFlags::iterateDbEntities(allEntities); // CEntityFlags::InfoObjectEntity will be ignored const bool hasInfoObjects = this->hasInfoObjects(); + const bool changedUrl = this->hasChangedUrl(currentEntity); while (currentEntity) { const CDatabaseReaderConfig config(this->getConfigForEntity(currentEntity)); @@ -63,7 +64,7 @@ namespace BlackCore const qint64 cacheTimestamp = cacheTs.isValid() ? cacheTs.toMSecsSinceEpoch() : -1; const qint64 latestEntityTimestamp = latestEntityTs.isValid() ? latestEntityTs.toMSecsSinceEpoch() : -1; Q_ASSERT_X(latestEntityTimestamp > 0, Q_FUNC_INFO, "Missing timestamp"); - if (cacheTimestamp >= latestEntityTimestamp && cacheTimestamp > 0) + if (!changedUrl && cacheTimestamp >= latestEntityTimestamp && cacheTimestamp > 0) { this->syncronizeCaches(currentEntity); entities &= ~currentEntity; // do not load from web @@ -73,13 +74,21 @@ namespace BlackCore } else { - CLogMessage(this).info("Cache for %1 outdated, latest entity (%2, %3)") - << CEntityFlags::flagToString(currentEntity) - << latestEntityTs.toString() << latestEntityTimestamp; + if (changedUrl) + { + CLogMessage(this).info("Data location changed, will override cache"); + } + else + { + CLogMessage(this).info("Cache for %1 outdated, latest entity (%2, %3)") + << CEntityFlags::flagToString(currentEntity) + << latestEntityTs.toString() << latestEntityTimestamp; + } } } else { + // no info objects, server down this->syncronizeCaches(currentEntity); CLogMessage(this).info("No info object for %1, using cache") << CEntityFlags::flagToString(currentEntity); } @@ -181,6 +190,16 @@ namespace BlackCore return this->m_config.findFirstOrDefaultForEntity(entity); } + bool CDatabaseReader::isChangedUrl(const CUrl &oldUrl, const CUrl ¤tUrl) + { + if (oldUrl.isEmpty()) { return true; } + Q_ASSERT_X(!currentUrl.isEmpty(), Q_FUNC_INFO, "No base URL"); + + const QString oldS(oldUrl.getFullUrl(false)); + const QString currentS(currentUrl.getFullUrl(false)); + return oldS != currentS; + } + bool CDatabaseReader::canConnect() const { QReadLocker rl(&this->m_statusLock); diff --git a/src/blackcore/db/databasereader.h b/src/blackcore/db/databasereader.h index d89593d7a..4ab098a4f 100644 --- a/src/blackcore/db/databasereader.h +++ b/src/blackcore/db/databasereader.h @@ -154,6 +154,12 @@ namespace BlackCore //! Invalidate the caches for given entities virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) = 0; + //! Changed URL, means the cache values have been read from elsewhere + virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const = 0; + + //! Has URL been changed? Means we load from a differrent server + static bool isChangedUrl(const BlackMisc::Network::CUrl &oldUrl, const BlackMisc::Network::CUrl ¤tUrl); + private: //! Check if terminated or error, otherwise split into array of objects JsonDatastoreResponse transformReplyIntoDatastoreResponse(QNetworkReply *nwReply) const; diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index d7c6b1947..a6cef2ffc 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -263,6 +263,7 @@ namespace BlackCore } this->m_airlineIcaoCache.set(codes, latestTimestamp); + this->updateReaderUrl(this->getBaseUrl()); emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, n); CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::AirlineIcaoEntity) << urlString; } @@ -288,6 +289,7 @@ namespace BlackCore } this->m_countryCache.set(countries, latestTimestamp); + this->updateReaderUrl(this->getBaseUrl()); emit dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFinished, n); CLogMessage(this).info("Read %1 %2 from %3") << n << CEntityFlags::flagToString(CEntityFlags::CountryEntity) << urlString; } @@ -408,6 +410,12 @@ namespace BlackCore } } + bool CIcaoDataReader::hasChangedUrl(CEntityFlags::Entity entity) const + { + Q_UNUSED(entity); + return CDatabaseReader::isChangedUrl(this->m_readerUrlCache.getCopy(), this->getBaseUrl()); + } + CUrl CIcaoDataReader::getAircraftIcaoUrl(bool shared) const { return shared ? diff --git a/src/blackcore/db/icaodatareader.h b/src/blackcore/db/icaodatareader.h index ff7ffdd8b..91befb1c7 100644 --- a/src/blackcore/db/icaodatareader.h +++ b/src/blackcore/db/icaodatareader.h @@ -124,6 +124,7 @@ namespace BlackCore virtual void syncronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) override; + virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; //! @} private slots: diff --git a/src/blackcore/db/infodatareader.cpp b/src/blackcore/db/infodatareader.cpp index 8f39382f4..3191ad869 100644 --- a/src/blackcore/db/infodatareader.cpp +++ b/src/blackcore/db/infodatareader.cpp @@ -69,6 +69,13 @@ namespace BlackCore return QDateTime(); } + bool CInfoDataReader::hasChangedUrl(CEntityFlags::Entity entity) const + { + // not implemented + Q_UNUSED(entity); + return false; + } + void CInfoDataReader::read(CEntityFlags::Entity entities, const QDateTime &newerThan) { this->ps_read(entities, newerThan); diff --git a/src/blackcore/db/infodatareader.h b/src/blackcore/db/infodatareader.h index b36d79198..49e211461 100644 --- a/src/blackcore/db/infodatareader.h +++ b/src/blackcore/db/infodatareader.h @@ -62,6 +62,7 @@ namespace BlackCore virtual void syncronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) override; + virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; //! @} private slots: diff --git a/src/blackcore/db/modeldatareader.cpp b/src/blackcore/db/modeldatareader.cpp index d5363c67b..faabc55bd 100644 --- a/src/blackcore/db/modeldatareader.cpp +++ b/src/blackcore/db/modeldatareader.cpp @@ -443,6 +443,12 @@ namespace BlackCore return QDateTime(); } + bool CModelDataReader::hasChangedUrl(CEntityFlags::Entity entity) const + { + Q_UNUSED(entity); + return CDatabaseReader::isChangedUrl(CUrl(), this->getBaseUrl()); + } + CUrl CModelDataReader::getBaseUrl() const { const CUrl baseUrl(sApp->getGlobalSetup().getDbModelReaderUrl()); diff --git a/src/blackcore/db/modeldatareader.h b/src/blackcore/db/modeldatareader.h index 8793d39e9..92849cc68 100644 --- a/src/blackcore/db/modeldatareader.h +++ b/src/blackcore/db/modeldatareader.h @@ -129,6 +129,7 @@ namespace BlackCore virtual void syncronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual void invalidateCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; virtual QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entity) override; + virtual bool hasChangedUrl(BlackMisc::Network::CEntityFlags::Entity entity) const override; //! @} private slots: diff --git a/src/blackmisc/network/url.cpp b/src/blackmisc/network/url.cpp index 711a87112..4a2340e5c 100644 --- a/src/blackmisc/network/url.cpp +++ b/src/blackmisc/network/url.cpp @@ -107,14 +107,14 @@ namespace BlackMisc return m_query; } - QString CUrl::getFullUrl() const + QString CUrl::getFullUrl(bool withQuery) const { if (m_host.isEmpty()) { return ""; } QString qn(m_host); if (!hasDefaultPort() && hasPort()) { qn = qn.append(":").append(QString::number(m_port)); } if (hasPath()) { qn = qn.append("/").append(m_path).replace("//", "/"); } - if (hasQuery()) { qn = qn.append("?").append(m_query); } + if (hasQuery() && withQuery) { qn = qn.append("?").append(m_query); } if (hasScheme()) { qn = QString(this->getScheme()).append("://").append(qn); } return qn; } diff --git a/src/blackmisc/network/url.h b/src/blackmisc/network/url.h index bd0e78b55..c37edc220 100644 --- a/src/blackmisc/network/url.h +++ b/src/blackmisc/network/url.h @@ -110,7 +110,7 @@ namespace BlackMisc bool isEmpty() const; //! Qualified name - QString getFullUrl() const; + QString getFullUrl(bool withQuery = true) const; //! Set full URL void setFullUrl(const QString &fullUrl);