swift
Loading...
Searching...
No Matches
databasereaderconfig.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2016 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
5// without the Doxygen exclusion I get a strange no matching class member found for warning in the gcc build
6
8
9#include <algorithm>
10
11#include <QStringBuilder>
12
13using namespace swift::misc;
14using namespace swift::misc::db;
15using namespace swift::misc::network;
16using namespace swift::misc::physical_quantities;
17
19SWIFT_DEFINE_SEQUENCE_MIXINS(swift::core::db, CDatabaseReaderConfig, CDatabaseReaderConfigList)
20
21namespace swift::core::db
22{
23 CDatabaseReaderConfig::CDatabaseReaderConfig(CEntityFlags::Entity entities,
24 CDbFlags::DataRetrievalMode retrievalFlags, const CTime &cacheLifetime)
25 : m_entities(entities), m_retrievalMode(retrievalFlags), m_cacheLifetime(cacheLifetime)
26 {
27 // void
28 }
29
30 QString CDatabaseReaderConfig::convertToQString(bool i18n) const
31 {
32 return CDbFlags::flagToString(this->getRetrievalMode()) % u' ' %
33 CEntityFlags::entitiesToString(this->getEntities()) % u' ' % m_cacheLifetime.toQString(i18n);
34 }
35
36 CEntityFlags::Entity CDatabaseReaderConfig::getEntities() const
37 {
38 return static_cast<CEntityFlags::Entity>(m_entities);
39 }
40
41 bool CDatabaseReaderConfig::supportsEntities(CEntityFlags::Entity entities) const
42 {
43 const int myEntities = static_cast<int>(this->getEntities());
44 const int testEnties = static_cast<int>(entities);
45 const int common = myEntities & testEnties;
46 return (common == testEnties) || (common == myEntities);
47 }
48
49 CDbFlags::DataRetrievalMode CDatabaseReaderConfig::getRetrievalMode() const
50 {
51 return static_cast<CDbFlags::DataRetrievalMode>(m_retrievalMode);
52 }
53
54 void CDatabaseReaderConfig::markAsDbDown()
55 {
56 CDbFlags::DataRetrievalMode m = this->getRetrievalMode();
58 m_retrievalMode = static_cast<int>(m);
59 }
60
61 void CDatabaseReaderConfig::setCacheLifetime(const CTime &time) { m_cacheLifetime = time; }
62
63 bool CDatabaseReaderConfig::possiblyReadsFromSwiftDb() const
64 {
65 if (!this->isValid())
66 {
67 return false;
68 }
69 if (!CEntityFlags::anySwiftDbEntity(this->getEntities()))
70 {
71 return false;
72 }
73 return (this->getRetrievalMode().testFlag(CDbFlags::DbReading));
74 }
75
76 bool CDatabaseReaderConfig::needsSharedInfoFile() const
77 {
78 if (!this->isValid())
79 {
80 return false;
81 }
82 if (!CEntityFlags::anySwiftDbEntity(this->getEntities()))
83 {
84 return false;
85 }
86 return (this->getRetrievalMode().testFlag(CDbFlags::Shared) ||
87 this->getRetrievalMode().testFlag(CDbFlags::SharedInfoOnly));
88 }
89
90 bool CDatabaseReaderConfig::possiblyWritesToSwiftDb() const
91 {
92 if (!this->isValid())
93 {
94 return false;
95 }
96 if (!CEntityFlags::anySwiftDbEntity(this->getEntities()))
97 {
98 return false;
99 }
100 return (this->getRetrievalMode().testFlag(CDbFlags::DbWriting));
101 }
102
103 bool CDatabaseReaderConfig::possiblyReadsFromCache() const
104 {
105 if (!this->isValid())
106 {
107 return false;
108 }
109 return (this->getRetrievalMode().testFlag(CDbFlags::Cached) ||
110 this->getRetrievalMode().testFlag(CDbFlags::CacheThenDb) ||
111 this->getRetrievalMode().testFlag(CDbFlags::CacheThenShared));
112 }
113
114 bool CDatabaseReaderConfig::isValid() const { return m_entities != CEntityFlags::NoEntity; }
115
116 CDatabaseReaderConfigList::CDatabaseReaderConfigList(const CSequence<CDatabaseReaderConfig> &other)
117 : CSequence<CDatabaseReaderConfig>(other)
118 {}
119
120 CDatabaseReaderConfig
121 CDatabaseReaderConfigList::findFirstOrDefaultForEntity(const CEntityFlags::Entity entities) const
122 {
123 const bool single = CEntityFlags::isSingleEntity(entities);
124 const CEntityFlags::EntityFlag testFlag = CEntityFlags::entityToEntityFlag(entities); // cannot cast directly
125 for (const CDatabaseReaderConfig &config : *this)
126 {
127 if (single)
128 {
129 if (config.getEntities().testFlag(testFlag))
130 {
131 return config;
132 }
133 }
134 else
135 {
136 if (config.getEntities() == entities)
137 {
138 return config;
139 }
140 }
141 }
142 return {}; // not found
143 }
144
145 void CDatabaseReaderConfigList::markAsDbDown()
146 {
147 for (CDatabaseReaderConfig &config : *this)
148 {
149 config.markAsDbDown();
150 }
151 }
152
153 void CDatabaseReaderConfigList::setCacheLifetimes(const CTime &time)
154 {
155 for (CDatabaseReaderConfig &config : *this)
156 {
157 config.setCacheLifetime(time);
158 }
159 }
160
161 bool CDatabaseReaderConfigList::possiblyReadsFromSwiftDb() const
162 {
163 return std::ranges::any_of(
164 *this, [](const CDatabaseReaderConfig &config) { return config.possiblyReadsFromSwiftDb(); });
165 }
166
167 bool CDatabaseReaderConfigList::possiblyWritesToSwiftDb() const
168 {
169 return std::ranges::any_of(
170 *this, [](const CDatabaseReaderConfig &config) { return config.possiblyWritesToSwiftDb(); });
171 }
172
173 bool CDatabaseReaderConfigList::needsSharedInfoObjects(CEntityFlags::Entity entities) const
174 {
175 return std::ranges::any_of(*this, [&](const CDatabaseReaderConfig &config) {
176 return config.supportsEntities(entities) && config.needsSharedInfoFile();
177 });
178 }
179
180 bool CDatabaseReaderConfigList::needsSharedInfoFile(CEntityFlags::Entity entities) const
181 {
182 return std::ranges::any_of(*this, [&](const CDatabaseReaderConfig &config) {
183 return config.supportsEntities(entities) && config.needsSharedInfoFile();
184 });
185 }
186
187 bool CDatabaseReaderConfigList::needsSharedInfoObjectsIfCachesEmpty(CEntityFlags::Entity entities,
188 CEntityFlags::Entity cachedEntities) const
189 {
190 return std::ranges::any_of(*this, [&entities, &cachedEntities](const CDatabaseReaderConfig &config) {
191 if (!config.supportsEntities(entities)) return false;
192 if (!config.needsSharedInfoFile()) return false;
193 if (!config.getRetrievalMode().testFlag(CDbFlags::Cached)) return true;
194
195 const CEntityFlags::Entity configEntities = config.getEntities();
196 const CEntityFlags::Entity configEntitiesNotCached = configEntities & ~cachedEntities;
197 return configEntitiesNotCached != CEntityFlags::NoEntity;
198 });
199 }
200
201 CEntityFlags::Entity CDatabaseReaderConfigList::getEntitesCachedOrReadFromDB() const
202 {
203 CEntityFlags::Entity entities = CEntityFlags::NoEntity;
204 for (const CDatabaseReaderConfig &config : *this)
205 {
206 if (config.possiblyReadsFromSwiftDb() || config.possiblyReadsFromCache())
207 {
208 entities |= config.getEntities();
209 }
210 }
211 return entities;
212 }
213
214 CDatabaseReaderConfigList CDatabaseReaderConfigList::forMappingTool()
215 {
216 const CTime cacheLifetime(5.0, CTimeUnit::min());
217 CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheThenDb;
218 retrievalFlags |= CDbFlags::DbWriting;
219 CDatabaseReaderConfigList l;
220 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
221 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
222 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, CDbFlags::Ignore,
223 cacheLifetime)); // not needed in mapping tool
224 l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
225 l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
226 l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
227 l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
228 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
229 return l;
230 }
231
232 CDatabaseReaderConfigList CDatabaseReaderConfigList::forPilotClient()
233 {
234 const CTime cacheLifetime(30.0, CTimeUnit::d());
235 const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheAndSharedInfo;
236 CDbFlags::DataRetrievalMode retrievalFlagsWriting = retrievalFlags;
237 retrievalFlagsWriting |= CDbFlags::DbWriting;
238
239 CDatabaseReaderConfigList l;
240 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
241 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
242 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, retrievalFlags, cacheLifetime));
243 l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
244 l.push_back(
245 CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlagsWriting, cacheLifetime)); // for wizard
246 l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
247 l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
248 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
249 return l;
250 }
251
252 CDatabaseReaderConfigList CDatabaseReaderConfigList::forLauncher()
253 {
254 const CTime cacheLifetime(30.0, CTimeUnit::d());
255 const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheThenShared;
256 CDatabaseReaderConfigList l;
257 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
258 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
259 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, CDbFlags::Ignore,
260 cacheLifetime)); // not needed in mapping tool
261 l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
262 l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
263 l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
264 l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
265 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
266 return l;
267 }
268
269 CDatabaseReaderConfigList CDatabaseReaderConfigList::allDirectDbAccess()
270 {
271 const CTime cacheLifetime(0.0, CTimeUnit::min());
272 const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::DbReading;
273 CDatabaseReaderConfigList l;
274 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
275 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
276 l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, retrievalFlags, cacheLifetime));
277 l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
278 l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
279 l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
280 l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
281 l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
282 return l;
283 }
284} // namespace swift::core::db
285
CDatabaseReaderConfig()=default
Default constructor.
Generic sequential container with value semantics.
Definition sequence.h:86
static DataRetrievalMode adjustWhenDbIsDown(DataRetrievalMode mode)
Adjust flag as we already know DB is down.
Definition dbflags.cpp:62
@ CacheThenShared
Cache where possible, otherwise shared.
Definition dbflags.h:35
@ DbWriting
DB writing.
Definition dbflags.h:28
@ DbReading
directly from DB
Definition dbflags.h:27
@ Shared
shared directory
Definition dbflags.h:29
@ Ignore
ignore this entity
Definition dbflags.h:33
@ SharedInfoOnly
shared info file only
Definition dbflags.h:30
@ CacheThenDb
Cache where possible, otherwise DB.
Definition dbflags.h:34
@ CacheAndSharedInfo
Cached data plus shared info file.
Definition dbflags.h:36
static QString flagToString(DataRetrievalModeFlag flag)
Convert to string.
Definition dbflags.cpp:18
static bool isSingleEntity(CEntityFlags::Entity flag)
Representing single entity?
static EntityFlag entityToEntityFlag(Entity entity)
To flag (when explicit conversion is needed).
EntityFlag
Which data to read, requires corresponding readers.
Definition entityflags.h:26
@ AircraftCategoryEntity
aircraft category entities
Definition entityflags.h:40
@ AirlineIcaoEntity
ICAO codes for airlines.
Definition entityflags.h:31
@ AircraftIcaoEntity
ICAO codes for aircraft.
Definition entityflags.h:30
static bool anySwiftDbEntity(Entity entities)
Representing at least one DB entity.
static QString entitiesToString(CEntityFlags::Entity entities, const QString &separator=", ")
Entities to string list.
static CTimeUnit min()
Minute.
Definition units.h:963
Classes interacting with the swift database (aka "datastore").
Free functions in swift::misc.
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition sequence.h:63
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition valueobject.h:67