From 4166982954b4a0f43fc63d8bee74de62178ec35d Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 25 Oct 2017 17:05:11 +0200 Subject: [PATCH] Ref T118, allow to just provide an id (from backend) and set the entity on swift side * added getDistributorForDbKey * added fillInMissingAircraftAndLiveryEntities * fromDbJson function adjusted --- src/blackcore/db/databaseutils.cpp | 39 ++++++++++++++++++++++ src/blackcore/db/databaseutils.h | 3 ++ src/blackcore/db/databasewriter.cpp | 2 ++ src/blackcore/db/modeldatareader.cpp | 7 ++++ src/blackcore/db/modeldatareader.h | 4 +++ src/blackcore/webdataservices.cpp | 6 ++++ src/blackcore/webdataservices.h | 4 +++ src/blackmisc/simulation/aircraftmodel.cpp | 33 ++++++++++++++++-- 8 files changed, 95 insertions(+), 3 deletions(-) diff --git a/src/blackcore/db/databaseutils.cpp b/src/blackcore/db/databaseutils.cpp index 9cde234ec..2fafc6ba0 100644 --- a/src/blackcore/db/databaseutils.cpp +++ b/src/blackcore/db/databaseutils.cpp @@ -118,6 +118,45 @@ namespace BlackCore return CDatabaseUtils::consolidateModelsWithDbDataAllowsGuiRefresh(models, force, false); } + int CDatabaseUtils::fillInMissingAircraftAndLiveryEntities(CAircraftModelList &models) + { + // fill in those entities which have only an id (key), but no data yet + int c = 0; + for (CAircraftModel &model : models) + { + bool changed = false; + if (model.getLivery().hasValidDbKey() && !model.getLivery().hasCompleteData()) + { + const CLivery livery = sApp->getWebDataServices()->getLiveryForDbKey(model.getLivery().getDbKey()); + if (livery.isLoadedFromDb()) + { + model.setLivery(livery); + changed = true; + } + } + if (model.getAircraftIcaoCode().hasValidDbKey() && !model.getAircraftIcaoCode().hasCompleteData()) + { + const CAircraftIcaoCode icao = sApp->getWebDataServices()->getAircraftIcaoCodeForDbKey(model.getAircraftIcaoCode().getDbKey()); + if (icao.isLoadedFromDb()) + { + model.setAircraftIcaoCode(icao); + changed = true; + } + } + if (model.getDistributor().hasValidDbKey() && !model.getDistributor().hasCompleteData()) + { + const CDistributor distributor = sApp->getWebDataServices()->getDistributorForDbKey(model.getDistributor().getDbKey()); + if (distributor.isLoadedFromDb()) + { + model.setDistributor(distributor); + changed = true; + } + } + if (changed) { c++; } + } + return c; + } + CAircraftModelList CDatabaseUtils::consolidateModelsWithSimulatorModelsAllowsGuiRefresh(const CAircraftModelList &models, const CAircraftModelList &simulatorModels, bool processEvents) { if (models.isEmpty() || simulatorModels.isEmpty()) { return models; } diff --git a/src/blackcore/db/databaseutils.h b/src/blackcore/db/databaseutils.h index c3050a159..502a05c06 100644 --- a/src/blackcore/db/databaseutils.h +++ b/src/blackcore/db/databaseutils.h @@ -47,6 +47,9 @@ namespace BlackCore //! Consolidate models with DB data static int consolidateModelsWithDbData(BlackMisc::Simulation::CAircraftModelList &models, bool force); + //! Fill in missing data if only the id is provided, but no data + static int fillInMissingAircraftAndLiveryEntities(BlackMisc::Simulation::CAircraftModelList &models); + //! Consolidate models with simulator model data (aka "models on disk") //! \remark kept here with the other consolidate functions, but actually DB independent static BlackMisc::Simulation::CAircraftModelList consolidateModelsWithSimulatorModelsAllowsGuiRefresh(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CAircraftModelList &simulatorModels, bool processEvents); diff --git a/src/blackcore/db/databasewriter.cpp b/src/blackcore/db/databasewriter.cpp index 1c67160f1..59ae5880a 100644 --- a/src/blackcore/db/databasewriter.cpp +++ b/src/blackcore/db/databasewriter.cpp @@ -134,11 +134,13 @@ namespace BlackCore CStatusMessageList msgs; bool directWrite; const bool sendingSuccessful = CDatastoreUtility::parseSwiftPublishResponse(dataFileData, modelsPublished, modelsSkipped, msgs, directWrite); + const int c = CDatabaseUtils::fillInMissingAircraftAndLiveryEntities(modelsPublished); emit this->publishedModels(modelsPublished, modelsSkipped, msgs, sendingSuccessful, directWrite); if (!modelsPublished.isEmpty()) { emit this->publishedModelsSimplified(modelsPublished); } + Q_UNUSED(c); } else { diff --git a/src/blackcore/db/modeldatareader.cpp b/src/blackcore/db/modeldatareader.cpp index 25c9999db..dc1e331f1 100644 --- a/src/blackcore/db/modeldatareader.cpp +++ b/src/blackcore/db/modeldatareader.cpp @@ -85,6 +85,13 @@ namespace BlackCore return m_distributorCache.get(); } + CDistributor CModelDataReader::getDistributorForDbKey(const QString &dbKey) const + { + if (dbKey.isEmpty()) { return CDistributor(); } + const CDistributorList distributors(getDistributors()); + return distributors.findByKeyOrAlias(dbKey); + } + CAircraftModelList CModelDataReader::getModels() const { return m_modelCache.get(); diff --git a/src/blackcore/db/modeldatareader.h b/src/blackcore/db/modeldatareader.h index 12d35e314..0757979a8 100644 --- a/src/blackcore/db/modeldatareader.h +++ b/src/blackcore/db/modeldatareader.h @@ -71,6 +71,10 @@ namespace BlackCore //! \threadsafe BlackMisc::Simulation::CDistributorList getDistributors() const; + //! Get distributor for id + //! \threadsafe + BlackMisc::Simulation::CDistributor getDistributorForDbKey(const QString &dbKey) const; + //! Get models //! \threadsafe BlackMisc::Simulation::CAircraftModelList getModels() const; diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 8d7ce68c3..8a43e787a 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -456,6 +456,12 @@ namespace BlackCore return 0; } + CDistributor CWebDataServices::getDistributorForDbKey(const QString &key) const + { + if (m_modelDataReader) { return m_modelDataReader->getDistributorForDbKey(key); } + return CDistributor(); + } + CDistributor CWebDataServices::smartDistributorSelector(const CDistributor &distributor) const { if (m_modelDataReader) { return m_modelDataReader->smartDistributorSelector(distributor); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index 3c9d93ffa..6a8430bf1 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -162,6 +162,10 @@ namespace BlackCore //! \threadsafe int getDistributorsCount() const; + //! Distributor for key + //! \threadsafe + BlackMisc::Simulation::CDistributor getDistributorForDbKey(const QString &key) const; + //! Use distributor object to select the best complete distributor from DB //! \threadsafe BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributor) const; diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 782747c55..343639df9 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -712,9 +712,36 @@ namespace BlackMisc const QString modelMode(json.value(prefix + "mode").toString()); const CSimulatorInfo simInfo = CSimulatorInfo::fromDatabaseJson(json, prefix); - const CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, "ac_")); - const CLivery livery(CLivery::fromDatabaseJson(json, "liv_")); - const CDistributor distributor(CDistributor::fromDatabaseJson(json, "dist_")); + CDistributor distributor(CDistributor::fromDatabaseJson(json, "dist_")); + CAircraftIcaoCode aircraftIcao(CAircraftIcaoCode::fromDatabaseJson(json, "ac_")); + CLivery livery(CLivery::fromDatabaseJson(json, "liv_")); + + if (!aircraftIcao.isLoadedFromDb()) + { + const int idAircraftIcao = json.value(prefix + "idaircrafticao").toInt(-1); + if (idAircraftIcao >= 0) + { + aircraftIcao.setDbKey(idAircraftIcao); + } + } + + if (!livery.isLoadedFromDb()) + { + const int idLivery = json.value(prefix + "idlivery").toInt(-1); + if (idLivery >= 0) + { + livery.setDbKey(idLivery); + } + } + + if (!distributor.isLoadedFromDb()) + { + const QString idDistributor = json.value(prefix + "iddistributor").toString(); + if (!idDistributor.isEmpty()) + { + distributor.setDbKey(idDistributor); + } + } CAircraftModel model( modelString, CAircraftModel::TypeDatabaseEntry, simInfo, modelName, modelDescription, aircraftIcao, livery