diff --git a/src/blackcore/db/airportdatareader.cpp b/src/blackcore/db/airportdatareader.cpp index adfc694e9..8b3ce2c7a 100644 --- a/src/blackcore/db/airportdatareader.cpp +++ b/src/blackcore/db/airportdatareader.cpp @@ -161,9 +161,10 @@ namespace BlackCore CAirportList airports; if (res.isRestricted()) { + const CAirportList incAirports(CAirportList::fromDatabaseJson(res)); + if (incAirports.isEmpty()) { return; } // currently ignored airports = this->getAirports(); - CAirportList updates(CAirportList::fromDatabaseJson(res)); - airports.replaceOrAddObjectsByKey(updates); + airports.replaceOrAddObjectsByKey(incAirports); } else { @@ -200,11 +201,7 @@ namespace BlackCore CUrl url = getAirportsUrl(mode); if (!url.isEmpty()) { - if (!newerThan.isNull()) - { - const QString tss(newerThan.toString(Qt::ISODate)); - url.appendQuery(QString(parameterLatestTimestamp() + "=" + tss)); - } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CAirportDataReader::ps_parseAirportData }); emit dataRead(CEntityFlags::AirportEntity, CEntityFlags::StartRead, 0); } diff --git a/src/blackcore/db/databasereader.cpp b/src/blackcore/db/databasereader.cpp index b5a855e63..654d5f003 100644 --- a/src/blackcore/db/databasereader.cpp +++ b/src/blackcore/db/databasereader.cpp @@ -574,6 +574,12 @@ namespace BlackCore } } + QString CDatabaseReader::dateTimeToDbLatestTs(const QDateTime &ts) + { + if (!ts.isValid()) return ""; + return ts.toUTC().toString(Qt::ISODate); + } + const CLogCategoryList &CDatabaseReader::getLogCategories() { static const BlackMisc::CLogCategoryList cats @@ -589,6 +595,13 @@ namespace BlackCore return p; } + QString CDatabaseReader::queryLatestTimestamp(const QDateTime &ts) + { + if (!ts.isValid()) return ""; + const QString q = parameterLatestTimestamp() + "=" + dateTimeToDbLatestTs(ts); + return q; + } + const QString &CDatabaseReader::parameterLatestId() { static const QString p("latestId"); diff --git a/src/blackcore/db/databasereader.h b/src/blackcore/db/databasereader.h index 2abe6776f..bee8a888e 100644 --- a/src/blackcore/db/databasereader.h +++ b/src/blackcore/db/databasereader.h @@ -227,12 +227,6 @@ namespace BlackCore //! Log categories static const BlackMisc::CLogCategoryList &getLogCategories(); - //! Name of latest timestamp - static const QString ¶meterLatestTimestamp(); - - //! Name of parameter for latest id - static const QString ¶meterLatestId(); - //! swift DB server reachable? static bool canPingSwiftServer(); @@ -300,6 +294,19 @@ namespace BlackCore //! File name for given mode, either php service or shared file name static QString fileNameForMode(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Db::CDbFlags::DataRetrievalModeFlag mode); + //! Name of latest timestamp + static const QString ¶meterLatestTimestamp(); + + //! Name of parameter for latest id + static const QString ¶meterLatestId(); + + //! A newer than value understood by swift DB + //! \sa CDatabaseReader::parameterLatestTimestamp + static QString dateTimeToDbLatestTs(const QDateTime &ts); + + //! Latest timestamp query for DB + static QString queryLatestTimestamp(const QDateTime &ts); + //! \name Cache access //! @{ //! Synchronize caches for given entities diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index b731db1d4..26cd6721b 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -146,7 +146,7 @@ namespace BlackCore CUrl url(getAircraftIcaoUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CIcaoDataReader::ps_parseAircraftIcaoData }); entitiesTriggered |= CEntityFlags::AircraftIcaoEntity; } @@ -161,7 +161,7 @@ namespace BlackCore CUrl url(getAirlineIcaoUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CIcaoDataReader::ps_parseAirlineIcaoData }); entitiesTriggered |= CEntityFlags::AirlineIcaoEntity; } @@ -176,7 +176,7 @@ namespace BlackCore CUrl url(getCountryUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) { url.appendQuery("newer=" + newerThan.toString(Qt::ISODate)); } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CIcaoDataReader::ps_parseCountryData }); entitiesTriggered |= CEntityFlags::CountryEntity; } @@ -238,8 +238,21 @@ namespace BlackCore return; } - // normally read from special view which already filter incomplete - const CAircraftIcaoCodeList codes = CAircraftIcaoCodeList::fromDatabaseJson(res, true); + CAircraftIcaoCodeList codes; + if (res.isRestricted()) + { + // create full list if it was just incremental + const CAircraftIcaoCodeList incIcao(CAircraftIcaoCodeList::fromDatabaseJson(res, true)); + if (incIcao.isEmpty()) { return; } // currently ignored + codes = this->getAircraftIcaoCodes(); + codes.replaceOrAddObjectsByKey(incIcao); + } + else + { + // normally read from special view which already filters incomplete + codes = CAircraftIcaoCodeList::fromDatabaseJson(res, true); + } + const int n = codes.size(); qint64 latestTimestamp = codes.latestTimestampMsecsSinceEpoch(); if (n > 0 && latestTimestamp < 0) @@ -266,7 +279,22 @@ namespace BlackCore emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0); return; } - const CAirlineIcaoCodeList codes = CAirlineIcaoCodeList::fromDatabaseJson(res, true); + + CAirlineIcaoCodeList codes; + if (res.isRestricted()) + { + // create full list if it was just incremental + const CAirlineIcaoCodeList incIcao(CAirlineIcaoCodeList::fromDatabaseJson(res, true)); + if (incIcao.isEmpty()) { return; } // currently ignored + codes = this->getAirlineIcaoCodes(); + codes.replaceOrAddObjectsByKey(incIcao); + } + else + { + // normally read from special view which already filters incomplete + codes = CAirlineIcaoCodeList::fromDatabaseJson(res, true); + } + const int n = codes.size(); qint64 latestTimestamp = codes.latestTimestampMsecsSinceEpoch(); if (n > 0 && latestTimestamp < 0) @@ -291,7 +319,22 @@ namespace BlackCore emit dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0); return; } - const CCountryList countries = CCountryList::fromDatabaseJson(res); + + CCountryList countries; + if (res.isRestricted()) + { + // create full list if it was just incremental + const CCountryList incCountries(CCountryList::fromDatabaseJson(res)); + if (incCountries.isEmpty()) { return; } // currently ignored + countries = this->getCountries(); + countries.replaceOrAddObjectsByKey(incCountries); + } + else + { + // normally read from special view which already filters incomplete + countries = CCountryList::fromDatabaseJson(res); + } + const int n = countries.size(); qint64 latestTimestamp = countries.latestTimestampMsecsSinceEpoch(); if (n > 0 && latestTimestamp < 0) diff --git a/src/blackcore/db/modeldatareader.cpp b/src/blackcore/db/modeldatareader.cpp index da4c3a1db..78d279880 100644 --- a/src/blackcore/db/modeldatareader.cpp +++ b/src/blackcore/db/modeldatareader.cpp @@ -166,11 +166,7 @@ namespace BlackCore CUrl url(getLiveryUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) - { - const QString tss(newerThan.toString(Qt::ISODate)); - url.appendQuery(QString(parameterLatestTimestamp() + "=" + tss)); - } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CModelDataReader::ps_parseLiveryData}); triggeredRead |= CEntityFlags::LiveryEntity; } @@ -185,11 +181,7 @@ namespace BlackCore CUrl url(getDistributorUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) - { - const QString tss(newerThan.toString(Qt::ISODate)); - url.appendQuery(QString(parameterLatestTimestamp() + "=" + tss)); - } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CModelDataReader::ps_parseDistributorData}); triggeredRead |= CEntityFlags::DistributorEntity; } @@ -204,11 +196,7 @@ namespace BlackCore CUrl url(getModelUrl(mode)); if (!url.isEmpty()) { - if (!newerThan.isNull()) - { - const QString tss(newerThan.toString(Qt::ISODate)); - url.appendQuery(QString(parameterLatestTimestamp() + "=" + tss)); - } + url.appendQuery(queryLatestTimestamp(newerThan)); sApp->getFromNetwork(url, { this, &CModelDataReader::ps_parseModelData}); triggeredRead |= CEntityFlags::ModelEntity; } @@ -274,8 +262,10 @@ namespace BlackCore if (res.isRestricted()) { // create full list if it was just incremental + const CLiveryList incLiveries(CLiveryList::fromDatabaseJson(res)); + if (incLiveries.isEmpty()) { return; } // currenty ignored liveries = this->getLiveries(); - liveries.replaceOrAddObjectsByKey(CLiveryList::fromDatabaseJson(res)); + liveries.replaceOrAddObjectsByKey(incLiveries); } else { @@ -314,8 +304,10 @@ namespace BlackCore if (res.isRestricted()) { // create full list if it was just incremental + const CDistributorList incDistributors(CDistributorList::fromDatabaseJson(res)); + if (incDistributors.isEmpty()) { return; } // currently ignored distributors = this->getDistributors(); - distributors.replaceOrAddObjectsByKey(CDistributorList::fromDatabaseJson(res)); + distributors.replaceOrAddObjectsByKey(incDistributors); } else { @@ -354,8 +346,10 @@ namespace BlackCore if (res.isRestricted()) { // create full list if it was just incremental + const CAircraftModelList incModels(CAircraftModelList::fromDatabaseJson(res)); + if (incModels.isEmpty()) { return; } // currently ignored models = this->getModels(); - models.replaceOrAddObjectsByKey(CAircraftModelList::fromDatabaseJson(res)); + models.replaceOrAddObjectsByKey(incModels); } else {