From 297c2f0539886f8aacfbc01ca9d0a867826481be Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 8 Jul 2017 20:33:48 +0200 Subject: [PATCH] Ref T104, return inconsistent aircraft/airline ICAOs codes - use audit - and log inconsistent DB entries --- src/blackcore/db/icaodatareader.cpp | 37 +++++++++++++------ src/blackcore/db/icaodatareader.h | 2 +- .../aviation/aircrafticaocodelist.cpp | 23 +++++++++--- src/blackmisc/aviation/aircrafticaocodelist.h | 2 +- .../aviation/airlineicaocodelist.cpp | 12 ++++-- src/blackmisc/aviation/airlineicaocodelist.h | 2 +- 6 files changed, 56 insertions(+), 22 deletions(-) diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index 26cd6721b..7356b65d1 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -15,6 +15,7 @@ #include "blackmisc/json.h" #include "blackmisc/logmessage.h" #include "blackmisc/statusmessage.h" +#include "blackmisc/verify.h" #include #include @@ -40,8 +41,8 @@ namespace BlackCore { namespace Db { - CIcaoDataReader::CIcaoDataReader(QObject *owner, const CDatabaseReaderConfigList &confg) : - CDatabaseReader(owner, confg, "CIcaoDataReader") + CIcaoDataReader::CIcaoDataReader(QObject *owner, const CDatabaseReaderConfigList &config) : + CDatabaseReader(owner, config, "CIcaoDataReader") { // init to avoid threading issues getBaseUrl(CDbFlags::DbReading); @@ -105,7 +106,7 @@ namespace BlackCore CAirlineIcaoCode CIcaoDataReader::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { - CAirlineIcaoCodeList codes(this->getAirlineIcaoCodes()); // thread safe copy + const CAirlineIcaoCodeList codes(this->getAirlineIcaoCodes()); // thread safe copy return codes.smartAirlineIcaoSelector(icaoPattern, callsign); } @@ -239,18 +240,25 @@ namespace BlackCore } CAircraftIcaoCodeList codes; + CAircraftIcaoCodeList inconsistent; if (res.isRestricted()) { // create full list if it was just incremental - const CAircraftIcaoCodeList incIcao(CAircraftIcaoCodeList::fromDatabaseJson(res, true)); - if (incIcao.isEmpty()) { return; } // currently ignored + const CAircraftIcaoCodeList incrementalCodes(CAircraftIcaoCodeList::fromDatabaseJson(res, true, &inconsistent)); + if (incrementalCodes.isEmpty()) { return; } // currently ignored codes = this->getAircraftIcaoCodes(); - codes.replaceOrAddObjectsByKey(incIcao); + codes.replaceOrAddObjectsByKey(incrementalCodes); } else { // normally read from special view which already filters incomplete - codes = CAircraftIcaoCodeList::fromDatabaseJson(res, true); + codes = CAircraftIcaoCodeList::fromDatabaseJson(res, true, &inconsistent); + } + + if (!inconsistent.isEmpty()) + { + BLACK_AUDIT_X(false, Q_FUNC_INFO, "Inconsistent aircraft codes"); + CLogMessage(this).warning("Inconsistent aircraft codes: %1") << inconsistent.dbKeysAsStrings(", "); } const int n = codes.size(); @@ -281,18 +289,25 @@ namespace BlackCore } CAirlineIcaoCodeList codes; + CAirlineIcaoCodeList inconsistent; if (res.isRestricted()) { // create full list if it was just incremental - const CAirlineIcaoCodeList incIcao(CAirlineIcaoCodeList::fromDatabaseJson(res, true)); - if (incIcao.isEmpty()) { return; } // currently ignored + const CAirlineIcaoCodeList incrementalCodes(CAirlineIcaoCodeList::fromDatabaseJson(res, true, &inconsistent)); + if (incrementalCodes.isEmpty()) { return; } // currently ignored codes = this->getAirlineIcaoCodes(); - codes.replaceOrAddObjectsByKey(incIcao); + codes.replaceOrAddObjectsByKey(incrementalCodes); } else { // normally read from special view which already filters incomplete - codes = CAirlineIcaoCodeList::fromDatabaseJson(res, true); + codes = CAirlineIcaoCodeList::fromDatabaseJson(res, true, &inconsistent); + } + + if (!inconsistent.isEmpty()) + { + BLACK_AUDIT_X(false, Q_FUNC_INFO, "Inconsistent airline codes"); + CLogMessage(this).warning("Inconsistent airline codes: %1") << inconsistent.dbKeysAsStrings(", "); } const int n = codes.size(); diff --git a/src/blackcore/db/icaodatareader.h b/src/blackcore/db/icaodatareader.h index 1ebb4e192..8f20a6a98 100644 --- a/src/blackcore/db/icaodatareader.h +++ b/src/blackcore/db/icaodatareader.h @@ -43,7 +43,7 @@ namespace BlackCore public: //! Constructor - explicit CIcaoDataReader(QObject *owner, const CDatabaseReaderConfigList &confg); + explicit CIcaoDataReader(QObject *owner, const CDatabaseReaderConfigList &config); //! Get aircraft ICAO information //! \threadsafe diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index a8bfcb173..14c0fff04 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -87,7 +87,7 @@ namespace BlackMisc CAircraftIcaoCodeList CAircraftIcaoCodeList::findEndingWith(const QString &icaoEnding) const { - QString ends = icaoEnding.trimmed().toUpper(); + const QString ends = icaoEnding.trimmed().toUpper(); if (ends.isEmpty()) { return CAircraftIcaoCodeList(); } CAircraftIcaoCodeList icaosDesignator; CAircraftIcaoCodeList icaosFamily; @@ -317,16 +317,29 @@ namespace BlackMisc return max; } - CAircraftIcaoCodeList CAircraftIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates) + CAircraftIcaoCodeList CAircraftIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates, CAircraftIcaoCodeList *inconsistent) { CAircraftIcaoCodeList codes; for (const QJsonValue &value : array) { const CAircraftIcaoCode icao(CAircraftIcaoCode::fromDatabaseJson(value.toObject())); - if (ignoreIncompleteAndDuplicates) + if (!icao.hasSpecialDesignator() && !icao.hasCompleteData()) { - if (!icao.hasSpecialDesignator() && !icao.hasCompleteData()) { continue; } - if (icao.isDbDuplicate()) { continue; } + if (ignoreIncompleteAndDuplicates) { continue; } + if (inconsistent) + { + inconsistent->push_back(icao); + continue; + } + } + if (icao.isDbDuplicate()) + { + if (ignoreIncompleteAndDuplicates) { continue; } + if (inconsistent) + { + inconsistent->push_back(icao); + continue; + } } codes.push_back(icao); } diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index 1b0b4593d..7a68383b0 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -135,7 +135,7 @@ namespace BlackMisc QPair maxCountManufacturer() const; //! From our database JSON format - static CAircraftIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates = true); + static CAircraftIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncompleteAndDuplicates = true, CAircraftIcaoCodeList *inconsistent = nullptr); }; } //namespace } // namespace diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index ffc0733dd..9c345ada2 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -185,15 +185,21 @@ namespace BlackMisc return airlineCode; } - CAirlineIcaoCodeList CAirlineIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete) + CAirlineIcaoCodeList CAirlineIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete, CAirlineIcaoCodeList *inconsistent) { CAirlineIcaoCodeList codes; for (const QJsonValue &value : array) { const CAirlineIcaoCode icao(CAirlineIcaoCode::fromDatabaseJson(value.toObject())); - if (ignoreIncomplete && !icao.hasCompleteData()) + const bool incomplete = !icao.hasCompleteData(); + if (incomplete) { - continue; + if (ignoreIncomplete) { continue; } + if (inconsistent) + { + inconsistent->push_back(icao); + continue; + } } codes.push_back(icao); } diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index 6ebfd3ab2..d75933694 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -96,7 +96,7 @@ namespace BlackMisc QStringList toNameCompleterStrings(bool sort = true) const; //! From our DB JSON - static CAirlineIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete = true); + static CAirlineIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete = true, CAirlineIcaoCodeList *inconsistent = nullptr); }; } //namespace } // namespace