swift
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 <QStringBuilder>
10 
11 using namespace swift::misc;
12 using namespace swift::misc::db;
13 using namespace swift::misc::network;
14 using namespace swift::misc::physical_quantities;
15 
17 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::core::db, CDatabaseReaderConfig, CDatabaseReaderConfigList)
18 
19 namespace swift::core::db
20 {
21  CDatabaseReaderConfig::CDatabaseReaderConfig(CEntityFlags::Entity entities,
22  CDbFlags::DataRetrievalMode retrievalFlags, const CTime &cacheLifetime)
23  : m_entities(entities), m_retrievalMode(retrievalFlags), m_cacheLifetime(cacheLifetime)
24  {
25  // void
26  }
27 
28  QString CDatabaseReaderConfig::convertToQString(bool i18n) const
29  {
30  return CDbFlags::flagToString(this->getRetrievalMode()) % u' ' %
31  CEntityFlags::entitiesToString(this->getEntities()) % u' ' % m_cacheLifetime.toQString(i18n);
32  }
33 
34  CEntityFlags::Entity CDatabaseReaderConfig::getEntities() const
35  {
36  return static_cast<CEntityFlags::Entity>(m_entities);
37  }
38 
39  bool CDatabaseReaderConfig::supportsEntities(CEntityFlags::Entity entities) const
40  {
41  const int myEntities = static_cast<int>(this->getEntities());
42  const int testEnties = static_cast<int>(entities);
43  const int common = myEntities & testEnties;
44  return (common == testEnties) || (common == myEntities);
45  }
46 
47  CDbFlags::DataRetrievalMode CDatabaseReaderConfig::getRetrievalMode() const
48  {
49  return static_cast<CDbFlags::DataRetrievalMode>(m_retrievalMode);
50  }
51 
52  void CDatabaseReaderConfig::markAsDbDown()
53  {
54  CDbFlags::DataRetrievalMode m = this->getRetrievalMode();
55  m = CDbFlags::adjustWhenDbIsDown(m);
56  m_retrievalMode = static_cast<int>(m);
57  }
58 
59  void CDatabaseReaderConfig::setCacheLifetime(const CTime &time) { m_cacheLifetime = time; }
60 
61  bool CDatabaseReaderConfig::possiblyReadsFromSwiftDb() const
62  {
63  if (!this->isValid()) { return false; }
64  if (!CEntityFlags::anySwiftDbEntity(this->getEntities())) { return false; }
65  return (this->getRetrievalMode().testFlag(CDbFlags::DbReading));
66  }
67 
68  bool CDatabaseReaderConfig::needsSharedInfoFile() const
69  {
70  if (!this->isValid()) { return false; }
71  if (!CEntityFlags::anySwiftDbEntity(this->getEntities())) { return false; }
72  return (this->getRetrievalMode().testFlag(CDbFlags::Shared) ||
73  this->getRetrievalMode().testFlag(CDbFlags::SharedInfoOnly));
74  }
75 
76  bool CDatabaseReaderConfig::possiblyWritesToSwiftDb() const
77  {
78  if (!this->isValid()) { return false; }
79  if (!CEntityFlags::anySwiftDbEntity(this->getEntities())) { return false; }
80  return (this->getRetrievalMode().testFlag(CDbFlags::DbWriting));
81  }
82 
83  bool CDatabaseReaderConfig::possiblyReadsFromCache() const
84  {
85  if (!this->isValid()) { return false; }
86  return (this->getRetrievalMode().testFlag(CDbFlags::Cached) ||
87  this->getRetrievalMode().testFlag(CDbFlags::CacheThenDb) ||
88  this->getRetrievalMode().testFlag(CDbFlags::CacheThenShared));
89  }
90 
91  bool CDatabaseReaderConfig::isValid() const { return m_entities != CEntityFlags::NoEntity; }
92 
93  CDatabaseReaderConfigList::CDatabaseReaderConfigList(const CSequence<CDatabaseReaderConfig> &other)
94  : CSequence<CDatabaseReaderConfig>(other)
95  {}
96 
97  CDatabaseReaderConfig
98  CDatabaseReaderConfigList::findFirstOrDefaultForEntity(const CEntityFlags::Entity entities) const
99  {
100  const bool single = CEntityFlags::isSingleEntity(entities);
101  const CEntityFlags::EntityFlag testFlag = CEntityFlags::entityToEntityFlag(entities); // cannot cast directly
102  for (const CDatabaseReaderConfig &config : *this)
103  {
104  if (single)
105  {
106  if (config.getEntities().testFlag(testFlag)) { return config; }
107  }
108  else
109  {
110  if (config.getEntities() == entities) { return config; }
111  }
112  }
113  return CDatabaseReaderConfig(); // not found
114  }
115 
116  void CDatabaseReaderConfigList::markAsDbDown()
117  {
118  for (CDatabaseReaderConfig &config : *this) { config.markAsDbDown(); }
119  }
120 
121  void CDatabaseReaderConfigList::setCacheLifetimes(const CTime &time)
122  {
123  for (CDatabaseReaderConfig &config : *this) { config.setCacheLifetime(time); }
124  }
125 
126  bool CDatabaseReaderConfigList::possiblyReadsFromSwiftDb() const
127  {
128  for (const CDatabaseReaderConfig &config : *this)
129  {
130  if (config.possiblyReadsFromSwiftDb()) { return true; }
131  }
132  return false;
133  }
134 
135  bool CDatabaseReaderConfigList::possiblyWritesToSwiftDb() const
136  {
137  for (const CDatabaseReaderConfig &config : *this)
138  {
139  if (config.possiblyWritesToSwiftDb()) { return true; }
140  }
141  return false;
142  }
143 
144  bool CDatabaseReaderConfigList::needsSharedInfoObjects(CEntityFlags::Entity entities) const
145  {
146  for (const CDatabaseReaderConfig &config : *this)
147  {
148  if (!config.supportsEntities(entities)) { continue; }
149  if (config.needsSharedInfoFile()) { return true; }
150  }
151  return false;
152  }
153 
154  bool CDatabaseReaderConfigList::needsSharedInfoFile(CEntityFlags::Entity entities) const
155  {
156  for (const CDatabaseReaderConfig &config : *this)
157  {
158  if (!config.supportsEntities(entities)) { continue; }
159  if (config.needsSharedInfoFile()) { return true; }
160  }
161  return false;
162  }
163 
164  bool CDatabaseReaderConfigList::needsSharedInfoObjectsIfCachesEmpty(CEntityFlags::Entity entities,
165  CEntityFlags::Entity cachedEntities) const
166  {
167  for (const CDatabaseReaderConfig &config : *this)
168  {
169  if (!config.supportsEntities(entities)) { continue; }
170  if (!config.needsSharedInfoFile()) { continue; }
171  if (!config.getRetrievalMode().testFlag(CDbFlags::Cached)) { return true; } // does not support caching
172 
173  const CEntityFlags::Entity configEntities = config.getEntities();
174  const CEntityFlags::Entity configEntitiesNotCached = configEntities & ~cachedEntities;
175  if (configEntitiesNotCached != CEntityFlags::NoEntity) { return true; } // we have entities not yet cached
176  }
177  return false;
178  }
179 
180  CEntityFlags::Entity CDatabaseReaderConfigList::getEntitesCachedOrReadFromDB() const
181  {
182  CEntityFlags::Entity entities = CEntityFlags::NoEntity;
183  for (const CDatabaseReaderConfig &config : *this)
184  {
185  if (config.possiblyReadsFromSwiftDb() || config.possiblyReadsFromCache())
186  {
187  entities |= config.getEntities();
188  }
189  }
190  return entities;
191  }
192 
193  CDatabaseReaderConfigList CDatabaseReaderConfigList::forMappingTool()
194  {
195  const CTime cacheLifetime(5.0, CTimeUnit::min());
196  CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheThenDb;
197  retrievalFlags |= CDbFlags::DbWriting;
198  CDatabaseReaderConfigList l;
199  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
200  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
201  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, CDbFlags::Ignore,
202  cacheLifetime)); // not needed in mapping tool
203  l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
204  l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
205  l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
206  l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
207  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
208  return l;
209  }
210 
211  CDatabaseReaderConfigList CDatabaseReaderConfigList::forPilotClient()
212  {
213  const CTime cacheLifetime(30.0, CTimeUnit::d());
214  const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheAndSharedInfo;
215  CDbFlags::DataRetrievalMode retrievalFlagsWriting = retrievalFlags;
216  retrievalFlagsWriting |= CDbFlags::DbWriting;
217 
218  CDatabaseReaderConfigList l;
219  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
220  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
221  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, retrievalFlags, cacheLifetime));
222  l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
223  l.push_back(
224  CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlagsWriting, cacheLifetime)); // for wizard
225  l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
226  l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
227  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
228  return l;
229  }
230 
231  CDatabaseReaderConfigList CDatabaseReaderConfigList::forLauncher()
232  {
233  const CTime cacheLifetime(30.0, CTimeUnit::d());
234  const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::CacheThenShared;
235  CDatabaseReaderConfigList l;
236  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
237  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
238  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, CDbFlags::Ignore,
239  cacheLifetime)); // not needed in mapping tool
240  l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
241  l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
242  l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
243  l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
244  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
245  return l;
246  }
247 
248  CDatabaseReaderConfigList CDatabaseReaderConfigList::allDirectDbAccess()
249  {
250  const CTime cacheLifetime(0.0, CTimeUnit::min());
251  const CDbFlags::DataRetrievalMode retrievalFlags = CDbFlags::DbReading;
252  CDatabaseReaderConfigList l;
253  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftIcaoEntity, retrievalFlags, cacheLifetime));
254  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirlineIcaoEntity, retrievalFlags, cacheLifetime));
255  l.push_back(CDatabaseReaderConfig(CEntityFlags::AirportEntity, retrievalFlags, cacheLifetime));
256  l.push_back(CDatabaseReaderConfig(CEntityFlags::DistributorEntity, retrievalFlags, cacheLifetime));
257  l.push_back(CDatabaseReaderConfig(CEntityFlags::ModelEntity, retrievalFlags, cacheLifetime));
258  l.push_back(CDatabaseReaderConfig(CEntityFlags::LiveryEntity, retrievalFlags, cacheLifetime));
259  l.push_back(CDatabaseReaderConfig(CEntityFlags::CountryEntity, retrievalFlags, cacheLifetime));
260  l.push_back(CDatabaseReaderConfig(CEntityFlags::AircraftCategoryEntity, retrievalFlags, cacheLifetime));
261  return l;
262  }
263 } // namespace swift::core::db
264 
EntityFlag
Which data to read, requires corresponding readers.
Definition: entityflags.h:26
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