From 4b1179cfd8c6bb1cf7f46bcff58337c5f1b3d268 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 18 Jul 2016 01:27:37 +0200 Subject: [PATCH] refs #709, allow to read directly from DB (bypassing caches) * allow to reload * copying array size of response for debugging purposes --- src/blackcore/db/databasereader.cpp | 16 ++++++++++++-- src/blackcore/db/databasereader.h | 8 +++++-- src/blackcore/webdataservices.cpp | 33 ++++++++++++++++++++++++++++- src/blackcore/webdataservices.h | 8 ++++++- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/blackcore/db/databasereader.cpp b/src/blackcore/db/databasereader.cpp index 1c3fbf7bb..6ac198cea 100644 --- a/src/blackcore/db/databasereader.cpp +++ b/src/blackcore/db/databasereader.cpp @@ -101,6 +101,12 @@ namespace BlackCore // signals for the cached entities this->emitReadSignalPerSingleCachedEntity(cachedEntities); + // Real read from DB + this->startReadFromDbInBackgroundThread(entities, newerThan); + } + + void CDatabaseReader::startReadFromDbInBackgroundThread(CEntityFlags::Entity entities, const QDateTime &newerThan) + { // ps_read is implemented in the derived classes if (entities == CEntityFlags::NoEntity) { return; } const bool s = QMetaObject::invokeMethod(this, "ps_read", @@ -138,13 +144,13 @@ namespace BlackCore if (jsonResponse.isArray()) { // directly an array, no further info - datastoreResponse.m_jsonArray = jsonResponse.array(); + datastoreResponse.setJsonArray(jsonResponse.array()); datastoreResponse.m_updated = QDateTime::currentDateTimeUtc(); } else { QJsonObject responseObject(jsonResponse.object()); - datastoreResponse.m_jsonArray = responseObject["data"].toArray(); + datastoreResponse.setJsonArray(responseObject["data"].toArray()); QString ts(responseObject["latest"].toString()); datastoreResponse.m_updated = ts.isEmpty() ? QDateTime::currentDateTimeUtc() : CDatastoreUtility::parseTimestamp(ts); datastoreResponse.m_restricted = responseObject["restricted"].toBool(); @@ -306,5 +312,11 @@ namespace BlackCore { return CNetworkUtils::canConnect(getDbUrl()); } + + void CDatabaseReader::JsonDatastoreResponse::setJsonArray(const QJsonArray &value) + { + m_jsonArray = value; + m_arraySize = value.size(); + } } // ns } // ns diff --git a/src/blackcore/db/databasereader.h b/src/blackcore/db/databasereader.h index de23ec55d..dd60a8470 100644 --- a/src/blackcore/db/databasereader.h +++ b/src/blackcore/db/databasereader.h @@ -48,7 +48,8 @@ namespace BlackCore { QJsonArray m_jsonArray; //!< JSON array data QDateTime m_updated; //!< when was the latest updated? - bool m_restricted = false; //!< restricted reponse, only data changed + int m_arraySize = -1; //!< size of array, if applicable (copied to member for debugging purposes) + bool m_restricted = false; //!< restricted reponse, only changed data BlackMisc::CStatusMessage m_message; //!< last error or warning //! Any data? @@ -85,7 +86,7 @@ namespace BlackCore QJsonArray getJsonArray() const { return m_jsonArray; } //! Set the JSON array - void setJsonArray(const QJsonArray &value) { m_jsonArray = value; } + void setJsonArray(const QJsonArray &value); //! Implicit conversion operator QJsonArray() const { return m_jsonArray; } @@ -94,6 +95,9 @@ namespace BlackCore //! Start reading in own thread void readInBackgroundThread(BlackMisc::Network::CEntityFlags::Entity entities, const QDateTime &newerThan); + //! Start reading in own thread (without config/caching) + void startReadFromDbInBackgroundThread(BlackMisc::Network::CEntityFlags::Entity entities, const QDateTime &newerThan); + //! Can connect to DB //! \threadsafe bool canConnect() const; diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 4490ec05b..8ed64da8f 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -159,6 +159,12 @@ namespace BlackCore return false; } + void CWebDataServices::syncronizeDbCaches(CEntityFlags::Entity entities) + { + if (this->m_modelDataReader) { this->m_modelDataReader->syncronizeCaches(entities); } + if (this->m_icaoDataReader) { this->m_icaoDataReader->syncronizeCaches(entities); } + } + CEntityFlags::Entity CWebDataServices::triggerRead(CEntityFlags::Entity whatToRead, const QDateTime &newerThan) { m_initialRead = true; // read started @@ -213,6 +219,31 @@ namespace BlackCore return triggeredRead; } + CEntityFlags::Entity CWebDataServices::triggerReloadFromDb(CEntityFlags::Entity whatToRead, const QDateTime &newerThan) + { + CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity; + if (m_icaoDataReader) + { + if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity) || whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity) || whatToRead.testFlag(CEntityFlags::CountryEntity)) + { + CEntityFlags::Entity icaoEntities = whatToRead & CEntityFlags::AllIcaoAndCountries; + m_icaoDataReader->startReadFromDbInBackgroundThread(icaoEntities, newerThan); + triggeredRead |= icaoEntities; + } + } + + if (m_modelDataReader) + { + if (whatToRead.testFlag(CEntityFlags::LiveryEntity) || whatToRead.testFlag(CEntityFlags::DistributorEntity) || whatToRead.testFlag(CEntityFlags::ModelEntity)) + { + CEntityFlags::Entity modelEntities = whatToRead & CEntityFlags::DistributorLiveryModel; + m_modelDataReader->startReadFromDbInBackgroundThread(modelEntities, newerThan); + triggeredRead |= modelEntities; + } + } + return triggeredRead; + } + QDateTime CWebDataServices::getCacheTimestamp(CEntityFlags::Entity entity) const { Q_ASSERT_X(CEntityFlags::isSingleEntity(entity), Q_FUNC_INFO, "Need single entity"); @@ -710,7 +741,7 @@ namespace BlackCore // read entities if (delayMs > 100) { - this->singleShotReadInBackground(entities, 0); + this->singleShotReadInBackground(entities, delayMs); } else { diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 18f8e6f3a..e2eb5f1bb 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -283,7 +283,10 @@ namespace BlackCore BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &models) const; //! Trigger read of new data - BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &dateTime = QDateTime()); + BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan = QDateTime()); + + //! Trigger reload from DB + BlackMisc::Network::CEntityFlags::Entity triggerReloadFromDb(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan = QDateTime()); //! Corresponding cache timestamp if applicable //! \threadsafe @@ -304,6 +307,9 @@ namespace BlackCore //! Can connect to swift DB? bool canConnectSwiftDb() const; + //! Syncronize all DB caches + void syncronizeDbCaches(BlackMisc::Network::CEntityFlags::Entity entities); + //! Write data to disk (mainly for testing scenarios) bool writeDbDataToDisk(const QString &dir) const;