8 #include <QElapsedTimer>
11 #include <QJsonDocument>
12 #include <QNetworkReply>
14 #include <QReadLocker>
15 #include <QScopedPointer>
16 #include <QScopedPointerDeleteLater>
17 #include <QStringBuilder>
20 #include <QWriteLocker>
34 using namespace swift::misc::db;
35 using namespace swift::misc::aviation;
36 using namespace swift::misc::network;
106 bool preferOperatingAirlines)
const
149 const QDateTime &newerThan)
153 entities &= CEntityFlags::AllIcaoCountriesCategory;
155 CEntityFlags::Entity entitiesTriggered = CEntityFlags::NoEntity;
156 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
158 CUrl url = this->getAircraftIcaoUrl(mode);
163 entitiesTriggered |= CEntityFlags::AircraftIcaoEntity;
168 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
170 CUrl url = this->getAirlineIcaoUrl(mode);
175 entitiesTriggered |= CEntityFlags::AirlineIcaoEntity;
180 if (entities.testFlag(CEntityFlags::CountryEntity))
182 CUrl url = this->getCountryUrl(mode);
187 entitiesTriggered |= CEntityFlags::CountryEntity;
192 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
194 CUrl url = this->getAircraftCategoryUrl(mode);
199 entitiesTriggered |= CEntityFlags::AircraftCategoryEntity;
204 if (entitiesTriggered != CEntityFlags::NoEntity)
206 emit this->
dataRead(entitiesTriggered, CEntityFlags::ReadStarted, 0,
getBaseUrl(mode));
210 void CIcaoDataReader::aircraftIcaoCacheChanged() { this->
cacheHasChanged(CEntityFlags::AircraftIcaoEntity); }
212 void CIcaoDataReader::airlineIcaoCacheChanged() { this->
cacheHasChanged(CEntityFlags::AirlineIcaoEntity); }
214 void CIcaoDataReader::countryCacheChanged() { this->
cacheHasChanged(CEntityFlags::CountryEntity); }
216 void CIcaoDataReader::aircraftCategoryCacheChanged()
221 void CIcaoDataReader::baseUrlCacheChanged()
226 void CIcaoDataReader::updateReaderUrl(
const CUrl &url)
228 const CUrl current = m_readerUrlCache.
get();
229 if (current == url) {
return; }
234 void CIcaoDataReader::parseAircraftIcaoData(QNetworkReply *nwReplyPtr)
238 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
241 const CDatabaseReader::JsonDatastoreResponse res =
243 const QUrl url = nwReply->url();
245 if (res.hasErrorMessage())
248 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFailed, 0, url);
252 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadParsing, 0, url);
256 if (res.isRestricted())
260 CAircraftIcaoCodeList::fromDatabaseJson(res, categories,
true, &inconsistent));
261 if (incrementalCodes.isEmpty()) {
return; }
270 codes = CAircraftIcaoCodeList::fromDatabaseJson(res, categories,
true, &inconsistent);
271 this->
logParseMessage(
"aircraft ICAO", codes.
size(),
static_cast<int>(time.elapsed()), res);
277 u
"Inconsistent aircraft codes: " % inconsistent.
dbKeysAsString(
", ")),
282 const int n = codes.
size();
284 if (n > 0 && latestTimestamp < 0)
286 CLogMessage(
this).
error(u
"No timestamp in aircraft ICAO list, setting to last modified value");
290 m_aircraftIcaoCache.
set(codes, latestTimestamp);
291 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
296 void CIcaoDataReader::parseAirlineIcaoData(QNetworkReply *nwReplyPtr)
298 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
301 const QUrl url = nwReply->url();
302 const CDatabaseReader::JsonDatastoreResponse res =
304 if (res.hasErrorMessage())
307 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0, url);
311 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadParsing, 0, url);
314 if (res.isRestricted())
318 CAirlineIcaoCodeList::fromDatabaseJson(res,
true, &inconsistent));
319 if (incrementalCodes.isEmpty()) {
return; }
328 codes = CAirlineIcaoCodeList::fromDatabaseJson(res,
true, &inconsistent);
329 this->
logParseMessage(
"airline ICAO", codes.
size(),
static_cast<int>(time.elapsed()), res);
335 u
"Inconsistent airline codes: " % inconsistent.
dbKeysAsString(
", ")),
340 const int n = codes.
size();
342 if (n > 0 && latestTimestamp < 0)
344 CLogMessage(
this).
error(u
"No timestamp in airline ICAO list, setting to last modified value");
348 m_airlineIcaoCache.
set(codes, latestTimestamp);
349 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
354 void CIcaoDataReader::parseCountryData(QNetworkReply *nwReplyPtr)
356 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
357 const CDatabaseReader::JsonDatastoreResponse res =
359 const QUrl url = nwReply->url();
361 if (res.hasErrorMessage())
364 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0, url);
368 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadParsing, 0, url);
370 if (res.isRestricted())
374 if (incrementalCountries.isEmpty()) {
return; }
384 this->
logParseMessage(
"countries", countries.
size(),
static_cast<int>(time.elapsed()), res);
388 const int n = countries.
size();
390 if (n > 0 && latestTimestamp < 0)
392 CLogMessage(
this).
error(u
"No timestamp in country list, setting to last modified value");
396 m_countryCache.
set(countries, latestTimestamp);
397 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
402 void CIcaoDataReader::parseAircraftCategoryData(QNetworkReply *nwReplyPtr)
404 QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> nwReply(nwReplyPtr);
405 const CDatabaseReader::JsonDatastoreResponse res =
407 const QUrl url = nwReply->url();
409 if (res.hasErrorMessage())
412 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFailed, 0, url);
416 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadParsing, 0, url);
418 if (res.isRestricted())
422 if (incrementalCategories.isEmpty()) {
return; }
431 categories = CAircraftCategoryList::fromDatabaseJson(res);
432 this->
logParseMessage(
"categories", categories.
size(),
static_cast<int>(time.elapsed()), res);
436 const int n = categories.
size();
438 if (n > 0 && latestTimestamp < 0)
440 CLogMessage(
this).
error(u
"No timestamp in category list, setting to last modified value");
444 m_categoryCache.
set(categories, latestTimestamp);
445 this->updateReaderUrl(this->
getBaseUrl(CDbFlags::DbReading));
451 bool overrideNewerOnly)
453 const QDir directory(dir);
454 if (!directory.exists()) {
return CStatusMessage(
this).
error(u
"Missing directory '%1'") << dir; }
458 whatToRead &= CEntityFlags::AllIcaoCountriesCategory;
459 CEntityFlags::Entity reallyRead = CEntityFlags::NoEntity;
460 if (whatToRead.testFlag(CEntityFlags::CountryEntity))
463 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::CountryEntity));
464 const QFileInfo fi(fileName);
472 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
474 if (countriesJson.isEmpty())
483 const int c = countries.
size();
484 msgs.
push_back(m_countryCache.
set(countries, fi.birthTime().toUTC().toMSecsSinceEpoch()));
485 reallyRead |= CEntityFlags::CountryEntity;
486 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFinished, c, url);
490 emit this->
dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0, url);
492 ex,
this, QStringLiteral(
"Reading countries from '%1'").arg(fileName)));
498 if (whatToRead.testFlag(CEntityFlags::AircraftIcaoEntity))
501 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AircraftIcaoEntity));
502 const QFileInfo fi(fileName);
504 else if (!this->
overrideCacheFromFile(overrideNewerOnly, fi, CEntityFlags::AircraftIcaoEntity, msgs))
510 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
512 if (aircraftJson.isEmpty())
521 CAircraftIcaoCodeList::fromMultipleJsonFormats(aircraftJson);
522 const int c = aircraftIcaos.
size();
524 m_aircraftIcaoCache.
set(aircraftIcaos, fi.birthTime().toUTC().toMSecsSinceEpoch()));
525 reallyRead |= CEntityFlags::AircraftIcaoEntity;
526 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, c, url);
530 emit this->
dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFailed, 0, url);
532 ex,
this, QStringLiteral(
"Reading aircraft ICAOs from '%1'").arg(fileName)));
538 if (whatToRead.testFlag(CEntityFlags::AirlineIcaoEntity))
541 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AirlineIcaoEntity));
542 const QFileInfo fi(fileName);
550 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
552 if (airlineJson.isEmpty())
561 CAirlineIcaoCodeList::fromMultipleJsonFormats(airlineJson);
562 const int c = airlineIcaos.
size();
564 m_airlineIcaoCache.
set(airlineIcaos, fi.birthTime().toUTC().toMSecsSinceEpoch()));
565 reallyRead |= CEntityFlags::AirlineIcaoEntity;
566 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, c, url);
570 emit this->
dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0, url);
572 ex,
this, QStringLiteral(
"Reading airline ICAOs from '%1'").arg(fileName)));
578 if (whatToRead.testFlag(CEntityFlags::AircraftCategoryEntity))
581 directory.absolutePath(), CDbInfo::entityToSharedName(CEntityFlags::AircraftCategoryEntity));
582 const QFileInfo fi(fileName);
584 else if (!this->
overrideCacheFromFile(overrideNewerOnly, fi, CEntityFlags::AircraftCategoryEntity, msgs))
590 const QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
592 if (aircraftCategory.isEmpty())
601 CAircraftCategoryList::fromMultipleJsonFormats(aircraftCategory);
602 const int c = aircraftCategories.
size();
604 m_categoryCache.
set(aircraftCategories, fi.birthTime().toUTC().toMSecsSinceEpoch()));
605 reallyRead |= CEntityFlags::AircraftCategoryEntity;
606 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFinished, c, url);
610 emit this->
dataRead(CEntityFlags::AircraftCategoryEntity, CEntityFlags::ReadFailed, 0, url);
612 ex,
this, QStringLiteral(
"Reading categories from '%1'").arg(fileName)));
622 bool overrideNewerOnly)
624 if (dir.isEmpty() || whatToRead == CEntityFlags::NoEntity) {
return false; }
626 QPointer<CIcaoDataReader> myself(
this);
628 if (!myself) {
return; }
638 if (!directory.exists()) {
return false; }
639 QList<QPair<CEntityFlags::EntityFlag, QString>> fileContents;
642 const QString json(QJsonDocument(this->
getCountries().toJson()).toJson());
643 fileContents.push_back({ CEntityFlags::CountryEntity, json });
649 fileContents.push_back({ CEntityFlags::AircraftIcaoEntity, json });
655 fileContents.push_back({ CEntityFlags::AirlineIcaoEntity, json });
661 fileContents.push_back({ CEntityFlags::AircraftCategoryEntity, json });
664 for (
const auto &pair : fileContents)
677 return CEntityFlags::AllIcaoCountriesCategory;
682 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
684 if (m_syncedAircraftIcaoCache) {
return; }
685 m_syncedAircraftIcaoCache =
true;
688 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
690 if (m_syncedAirlineIcaoCache) {
return; }
691 m_syncedAirlineIcaoCache =
true;
694 if (entities.testFlag(CEntityFlags::CountryEntity))
696 if (m_syncedCountryCache) {
return; }
697 m_syncedCountryCache =
true;
700 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
702 if (m_syncedCategories) {
return; }
703 m_syncedCategories =
true;
710 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity)) { m_aircraftIcaoCache.
admit(); }
711 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity)) { m_airlineIcaoCache.
admit(); }
712 if (entities.testFlag(CEntityFlags::CountryEntity)) { m_countryCache.
admit(); }
713 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity)) { m_categoryCache.
admit(); }
718 if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
722 if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
726 if (entities.testFlag(CEntityFlags::CountryEntity))
730 if (entities.testFlag(CEntityFlags::AircraftCategoryEntity))
744 default:
return QDateTime();
752 case CEntityFlags::AircraftIcaoEntity:
return m_aircraftIcaoCache.
get().size();
753 case CEntityFlags::AirlineIcaoEntity:
return m_airlineIcaoCache.
get().size();
754 case CEntityFlags::CountryEntity:
return m_countryCache.
get().size();
755 case CEntityFlags::AircraftCategoryEntity:
return m_categoryCache.
get().size();
762 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
763 if (this->
getCacheCount(CEntityFlags::AircraftIcaoEntity) > 0) entities |= CEntityFlags::AircraftIcaoEntity;
764 if (this->
getCacheCount(CEntityFlags::AirlineIcaoEntity) > 0) entities |= CEntityFlags::AirlineIcaoEntity;
765 if (this->
getCacheCount(CEntityFlags::CountryEntity) > 0) entities |= CEntityFlags::CountryEntity;
766 if (this->
getCacheCount(CEntityFlags::AircraftCategoryEntity) > 0)
767 entities |= CEntityFlags::AircraftCategoryEntity;
773 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
775 entities |= CEntityFlags::AircraftIcaoEntity;
777 entities |= CEntityFlags::AirlineIcaoEntity;
779 entities |= CEntityFlags::CountryEntity;
781 entities |= CEntityFlags::CountryEntity;
788 oldUrlInfo = m_readerUrlCache.
get();
789 newUrlInfo = this->
getBaseUrl(CDbFlags::DbReading);
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
data::CGlobalSetup getGlobalSetup() const
Global setup.
static void logInconsistentData(const swift::misc::CStatusMessage &msg, const char *funcInfo=nullptr)
Use this to log inconsistent data.
void threadAssertCheck() const
Make sure everything runs correctly in own thread.
QNetworkReply * getFromNetworkAndLog(const swift::misc::network::CUrl &url, const swift::misc::CSlot< void(QNetworkReply *)> &callback)
Get request from network, and log with m_urlReadLog.
bool doWorkCheck() const
Still enabled etc.?
qint64 lastModifiedMsSinceEpoch(QNetworkReply *nwReply) const
When was reply last modified, -1 if N/A.
swift::misc::network::CUrl getDbIcaoReaderUrl() const
ICAO reader URL.
Value object encapsulating a list of reader configs.
Specialized version of threaded reader for DB data.
void emitAndLogDataRead(swift::misc::network::CEntityFlags::Entity entity, int number, const JsonDatastoreResponse &res)
Emit signal and log when data have been read.
static QString queryLatestTimestamp(const QDateTime &ts)
Latest timestamp query for DB.
virtual void cacheHasChanged(swift::misc::network::CEntityFlags::Entity entities)
Cache for given entity has changed.
void logNoWorkingUrl(swift::misc::network::CEntityFlags::Entity entity)
Log if no working URL exists, using m_noWorkingUrlSeverity.
bool overrideCacheFromFile(bool overrideNewerOnly, const QFileInfo &fileInfo, swift::misc::network::CEntityFlags::Entity entity, swift::misc::CStatusMessageList &msgs) const
Override cache from file.
swift::misc::network::CUrl getBaseUrl(swift::misc::db::CDbFlags::DataRetrievalModeFlag mode) const
Base URL for mode (either a shared or DB URL)
void dataRead(swift::misc::network::CEntityFlags::Entity entities, swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url)
Combined read signal.
static bool isChangedUrl(const swift::misc::network::CUrl &oldUrl, const swift::misc::network::CUrl ¤tUrl)
Has URL been changed? Means we load from a different server.
static QString fileNameForMode(swift::misc::network::CEntityFlags::Entity entity, swift::misc::db::CDbFlags::DataRetrievalModeFlag mode)
File name for given mode, either php service or shared file name.
CDatabaseReader::JsonDatastoreResponse setStatusAndTransformReplyIntoDatastoreResponse(QNetworkReply *nwReply)
Check if terminated or error, otherwise split into array of objects.
void logParseMessage(const QString &entity, int size, int msElapsed, const JsonDatastoreResponse &response) const
Parsing info message.
bool hasCacheTimestampNewerThan(swift::misc::network::CEntityFlags::Entity entity, const QDateTime &threshold) const
Has entity a valid and newer timestamp.
static QJsonObject readQJsonObjectFromDatabaseFile(const QString &filename)
QJsonObject from database JSON file (normally shared file)
swift::misc::CCountry getCountryForName(const QString &name) const
Get country for ISO name.
swift::misc::CCountry getCountryForIsoCode(const QString &isoCode) const
Get country for ISO code.
virtual void read(swift::misc::network::CEntityFlags::Entity entities, swift::misc::db::CDbFlags::DataRetrievalModeFlag mode, const QDateTime &newerThan)
Read / re-read data file.
bool containsAirlineIcaoDesignator(const QString &designator) const
Contains given designator?
int getCountriesCount() const
Get countries count.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int key) const
Get airline ICAO information for key.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueIataCodeOrDefault(const QString &iataCode) const
Find by IATA code if this is unique, otherwise return default object.
virtual swift::misc::CStatusMessageList readFromJsonFiles(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
int getAirlineIcaoCodesCount() const
Get airline ICAO information count.
bool writeToJsonFiles(const QString &dir)
Write to static DB data file.
int getAircraftCategoryCount() const
Get aircraft category count.
virtual int getCacheCount(swift::misc::network::CEntityFlags::Entity entity) const
Cache`s number of entities.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const
Get aircraft ICAO information.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheCount() const
Entities already having data in cache.
virtual QDateTime getCacheTimestamp(swift::misc::network::CEntityFlags::Entity entity) const
Get cache timestamp.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const
Get aircraft ICAO information for designator.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const
Find by v-designator, this should be unique.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const
Get airline ICAO information.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForIataCode(const QString &iataCode) const
Get aircraft ICAO information for IATA code.
virtual swift::misc::network::CEntityFlags::Entity getSupportedEntities() const
Supported entities by this reader.
virtual bool readFromJsonFilesInBackground(const QString &dir, swift::misc::network::CEntityFlags::Entity whatToRead, bool overrideNewerOnly)
Data read from local data.
swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForDesignator(const QString &designator) const
Get aircraft ICAO information for designator.
virtual bool hasChangedUrl(swift::misc::network::CEntityFlags::Entity entity, swift::misc::network::CUrl &oldUrlInfo, swift::misc::network::CUrl &newUrlInfo) const
Changed URL, means the cache values have been read from elsewhere.
virtual void admitCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CAircraftCategoryList getAircraftCategories() const
Get aircraft categories.
swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForUniqueDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
Find by ICAO code if this is unique, otherwise return default object.
virtual swift::misc::network::CEntityFlags::Entity getEntitiesWithCacheTimestampNewerThan(const QDateTime &threshold) const
Entities already having data in cache (based on timestamp assumption)
bool areAllDataRead() const
All data read?
swift::misc::CCountryList getCountries() const
Get countries.
virtual void invalidateCaches(swift::misc::network::CEntityFlags::Entity entities)
Invalidate the caches for given entities.
int getAircraftIcaoCodesCount() const
Get aircraft ICAO information count.
bool containsAircraftIcaoDesignator(const QString &designator) const
Contains designator?
virtual void synchronizeCaches(swift::misc::network::CEntityFlags::Entity entities)
Admit caches for given entities.
swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const swift::misc::aviation::CAirlineIcaoCode &icaoPattern, const swift::misc::aviation::CCallsign &callsign=swift::misc::aviation::CCallsign()) const
Get best match for airline ICAO code.
swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForIataCode(const QString &iataCode) const
Find by IATA code Not unique because of virtual airlines and ceased airlines.
virtual swift::misc::network::CUrl getDbServiceBaseUrl() const
Get the service URL, individual for each reader.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const
Get aircraft ICAO information for key.
swift::misc::aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const swift::misc::aviation::CAircraftIcaoCode &icaoPattern) const
Get best match for incomplete aircraft ICAO code.
const QString & getKey() const
Get the key string of this value.
T get() const
Get a copy of the current value.
Value object encapsulating a list of countries.
static CCountryList fromDatabaseJson(const QJsonArray &array)
From our database JSON format.
CCountry findBestMatchByCountryName(const QString &candidate) const
Find "best match" by country.
CCountry findByIsoCode(const QString &isoCode) const
Find by ISO code.
static CDataCache * instance()
Return the singleton instance.
CStatusMessage set(const typename Trait::type &value, qint64 timestamp=0)
Write a new value. Must be called from the thread in which the owner lives.
void admit()
If the value is load-deferred, trigger the deferred load (async).
QDateTime getAvailableTimestamp() const
Get the timestamp of the value, or of the deferred value that is available to be loaded.
void synchronize()
If the value is currently being loaded, wait for it to finish loading, and call the notification slot...
static bool writeStringToFile(const QString &content, const QString &fileNameAndPath)
Write string to text file.
static QString appendFilePaths(const QString &path1, const QString &path2)
Append file paths.
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Class for emitting a log message.
static void preformatted(const CStatusMessage &statusMessage)
Sends a verbatim, preformatted message to the log.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
static CStatusMessage fromJsonException(const CJsonException &ex, const CLogCategoryList &categories, const QString &prefix)
Object from JSON exception message.
constexpr static auto SeverityInfo
Status severities.
bool isFailure() const
Operation considered unsuccessful.
Status messages, e.g. from Core -> GUI.
bool isFailure() const
Any message is marked as failure.
void clearAllValues(const QString &keyPrefix={})
Clear all values from the cache.
static CWorker * fromTask(QObject *owner, const QString &name, F &&task)
Returns a new worker object which lives in a new thread.
qint64 latestTimestampMsecsSinceEpoch() const
Latest timestamp.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
CAircraftIcaoCodeList findByDesignator(const QString &designator, int fuzzySearch=-1) const
Find by designator.
CAircraftIcaoCode findFirstByDesignatorAndRank(const QString &designator) const
Find by designator, then best match by rank.
bool containsDesignator(const QString &designator) const
Contains designator?
CAircraftIcaoCode smartAircraftIcaoSelector(const CAircraftIcaoCode &icaoPattern) const
Best selection by given pattern, also searches IATA and family information.
CAircraftIcaoCodeList findByIataCode(const QString &iata, int fuzzySearch=-1) const
Find by IATA code.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
CAirlineIcaoCode findByUniqueIataCodeOrDefault(const QString &iata) const
Find by IATA code if this is unique, otherwise return default object.
bool containsVDesignator(const QString &vDesignator) const
Contains given designator?
CAirlineIcaoCodeList findByIataCode(const QString &iata) const
Find by IATA code Not unique because of virtual airlines and ceased airlines.
CAirlineIcaoCode findByUniqueVDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
Find by ICAO code if this is unique, otherwise return default object.
CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const
Best selection by given pattern.
CAirlineIcaoCodeList findByVDesignator(const QString &designator) const
Find by v-designator, this should be unique.
Value object encapsulating information of a callsign.
DataRetrievalModeFlag
Which data to read, requires corresponding readers.
int replaceOrAddObjectsByKey(const CONTAINER &container)
Update or insert data (based on DB key)
OBJ findByKey(KEYTYPE key, const OBJ ¬Found=OBJ()) const
Object with key, notFound otherwise.
QString dbKeysAsString(const QString &separator) const
The DB keys as string.
static CCountryList fromMultipleJsonFormats(const QJsonObject &jsonObject)
From multiple JSON formats.
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
bool isEmpty() const
Empty.
CUrl withAppendedPath(const QString &path) const
Append path.
void appendQuery(const QString &queryToAppend)
Append query.
Core data traits (aka cached values) and classes.
Classes interacting with the swift database (aka "datastore").
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...