From 5a67276fbb29867794f11c3e99d31be2aeca5ffc Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 10 Aug 2017 11:27:12 +0200 Subject: [PATCH] Ref T117, utility functions for reader * isDbModelEqualForPublishing * getModelForDbKey(int --- src/blackcore/db/modeldatareader.cpp | 7 ++++ src/blackcore/db/modeldatareader.h | 7 +++- src/blackcore/webdataservices.cpp | 54 ++++++++++++++++++++++++---- src/blackcore/webdataservices.h | 17 +++++++-- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/blackcore/db/modeldatareader.cpp b/src/blackcore/db/modeldatareader.cpp index 242535864..9e0e20aae 100644 --- a/src/blackcore/db/modeldatareader.cpp +++ b/src/blackcore/db/modeldatareader.cpp @@ -97,6 +97,13 @@ namespace BlackCore return models.findFirstByModelStringOrDefault(modelString); } + CAircraftModel CModelDataReader::getModelForDbKey(int dbKey) const + { + if (dbKey < 0) { return CAircraftModel(); } + const CAircraftModelList models(getModels()); + return models.findByKey(dbKey); + } + CAircraftModelList CModelDataReader::getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) { if (aircraftDesignator.isEmpty()) { return CAircraftModelList(); } diff --git a/src/blackcore/db/modeldatareader.h b/src/blackcore/db/modeldatareader.h index eb07d4ef7..50f1584b3 100644 --- a/src/blackcore/db/modeldatareader.h +++ b/src/blackcore/db/modeldatareader.h @@ -79,6 +79,10 @@ namespace BlackCore //! \threadsafe BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelString) const; + //! Get model for DB key + //! \threadsafe + BlackMisc::Simulation::CAircraftModel getModelForDbKey(int dbKey) const; + //! Get model for designator/combined code //! \threadsafe BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode); @@ -149,7 +153,8 @@ namespace BlackCore //! Read / re-read data file void ps_read(BlackMisc::Network::CEntityFlags::Entity entities = BlackMisc::Network::CEntityFlags::DistributorLiveryModel, - BlackMisc::Db::CDbFlags::DataRetrievalModeFlag mode = BlackMisc::Db::CDbFlags::DbReading, const QDateTime &newerThan = QDateTime()); + BlackMisc::Db::CDbFlags::DataRetrievalModeFlag mode = BlackMisc::Db::CDbFlags::DbReading, + const QDateTime &newerThan = QDateTime()); void ps_liveryCacheChanged(); void ps_modelCacheChanged(); diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index fee8cf1c4..65786bc12 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -148,9 +148,9 @@ namespace BlackCore if (m_vatsimDataFileReader) { m_vatsimDataFileReader->updateWithVatsimDataFileData(aircraftToBeUdpated); } } - CStatusMessageList CWebDataServices::asyncPublishModels(const CAircraftModelList &models) const + CStatusMessageList CWebDataServices::asyncPublishModels(const CAircraftModelList &modelsToBePublished) const { - if (m_databaseWriter) { return m_databaseWriter->asyncPublishModels(models);} + if (m_databaseWriter) { return m_databaseWriter->asyncPublishModels(modelsToBePublished);} return CStatusMessageList(); } @@ -541,6 +541,12 @@ namespace BlackCore return CAircraftModel(); } + CAircraftModel CWebDataServices::getModelForDbKey(int dbKey) const + { + if (m_modelDataReader) { return m_modelDataReader->getModelForDbKey(dbKey); } + return CAircraftModel(); + } + CAircraftIcaoCodeList CWebDataServices::getAircraftIcaoCodes() const { if (m_icaoDataReader) { return m_icaoDataReader->getAircraftIcaoCodes(); } @@ -702,9 +708,9 @@ namespace BlackCore return 0; } - CStatusMessageList CWebDataServices::validateForPublishing(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const + CStatusMessageList CWebDataServices::validateForPublishing(const CAircraftModelList &modelsToBePublished, bool ignoreEqual, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const { - CStatusMessageList msgs(models.validateForPublishing(validModels, invalidModels)); + CStatusMessageList msgs(modelsToBePublished.validateForPublishing(validModels, invalidModels)); // technical validation // check against existing distributors const CDistributorList distributors(this->getDistributors()); @@ -712,13 +718,49 @@ namespace BlackCore { // only further check the valid ones CAircraftModelList newValidModels; - CStatusMessageList msgsDistributos(validModels.validateDistributors(distributors, newValidModels, invalidModels)); + const CStatusMessageList msgsDistributors(validModels.validateDistributors(distributors, newValidModels, invalidModels)); + validModels = newValidModels; + msgs.push_back(msgsDistributors); + } + + // check if model is changed + // in case of not ignoreEqual we just check create the messages + { + CAircraftModelList newValidModels; + for (const CAircraftModel &publishModel : validModels) + { + CStatusMessageList equalMessages; + const bool changed = !this->isDbModelEqualForPublishing(publishModel, &equalMessages); + if (changed) + { + // all good + newValidModels.push_back(publishModel); + continue; + } + if (ignoreEqual) { equalMessages.warningToError(); } + msgs.push_back(CStatusMessage(this, ignoreEqual ? CStatusMessage::SeverityError : CStatusMessage::SeverityWarning, "Model: '%1', there is no change") << publishModel.getModelString()); + if (ignoreEqual) + { + invalidModels.push_back(publishModel); + } + else + { + newValidModels.push_back(publishModel); + } + } validModels = newValidModels; - msgs.push_back(msgsDistributos); } return msgs; } + bool CWebDataServices::isDbModelEqualForPublishing(const CAircraftModel &modelToBeChecked, CStatusMessageList *details) const + { + const CAircraftModel compareDbModel = modelToBeChecked.isLoadedFromDb() ? + this->getModelForDbKey(modelToBeChecked.getDbKey()) : + this->getModelForModelString(modelToBeChecked.getModelString()); + return modelToBeChecked.isEqualForPublishing(compareDbModel, details); + } + CAirlineIcaoCodeList CWebDataServices::getAirlineIcaoCodesForDesignator(const QString &designator) const { if (m_icaoDataReader) { return m_icaoDataReader->getAirlineIcaoCodesForDesignator(designator); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 9786a055d..087230f7e 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -229,9 +229,13 @@ namespace BlackCore //! \threadsafe BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const; + //! Model for model string if any + //! \threadsafe + BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelString) const; + //! Model for key if any //! \threadsafe - BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelKey) const; + BlackMisc::Simulation::CAircraftModel getModelForDbKey(int dbKey) const; //! Aircraft ICAO codes //! \threadsafe @@ -335,10 +339,17 @@ namespace BlackCore //! Validate for publishing //! \remark More detailed check than BlackMisc::Simulation::CAircraftModelList::validateForPublishing - BlackMisc::CStatusMessageList validateForPublishing(const BlackMisc::Simulation::CAircraftModelList &models, BlackMisc::Simulation::CAircraftModelList &validModels, BlackMisc::Simulation::CAircraftModelList &invalidModels) const; + BlackMisc::CStatusMessageList validateForPublishing( + const BlackMisc::Simulation::CAircraftModelList &modelsToBePublished, + bool ignoreEqual, + BlackMisc::Simulation::CAircraftModelList &validModels, + BlackMisc::Simulation::CAircraftModelList &invalidModels) const; + + //! \copydoc BlackMisc::Simulation::CAircraftModel::isEqualForPublishing + bool isDbModelEqualForPublishing(const BlackMisc::Simulation::CAircraftModel &modelToBeChecked, BlackMisc::CStatusMessageList *details = nullptr) const; //! Publish models to database - BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &models) const; + BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &modelsToBePublished) const; //! Trigger read of DB info objects void triggerReadOfDbInfoObjects();