swift
dbinfo.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 
4 #include "misc/db/dbinfo.h"
5 
6 #include <QStringBuilder>
7 
9 
10 using namespace swift::misc::network;
11 
12 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::db, CDbInfo)
13 
14 namespace swift::misc::db
15 {
16  CDbInfo::CDbInfo(int key, const QString &tableName, int entries)
17  : IDatastoreObjectWithIntegerKey(key), m_tableName(tableName.trimmed().toLower()), m_entries(entries)
18  {
19  this->setEntity(this->getEntity());
20  Q_ASSERT_X(tableName.isEmpty() || m_entity != CEntityFlags::NoEntity, Q_FUNC_INFO, "Wrong entity");
21  }
22 
23  bool CDbInfo::isValid() const { return m_entity != CEntityFlags::NoEntity && !m_tableName.isEmpty(); }
24 
25  CEntityFlags::Entity CDbInfo::getEntity() const
26  {
27  if (m_entity != CEntityFlags::NoEntity) { return m_entity; }
28  const QString tn(this->getTableName());
29  return CEntityFlags::singleEntityByName(tn);
30  }
31 
32  const QString &CDbInfo::getSharedFileName() const
33  {
34  const CEntityFlags::Entity entity = CEntityFlags::singleEntityByName(this->getTableName());
35  return CDbInfo::entityToSharedName(entity);
36  }
37 
38  const QString &CDbInfo::getServiceName() const
39  {
40  const CEntityFlags::Entity entity = CEntityFlags::singleEntityByName(this->getTableName());
41  return CDbInfo::entityToServiceName(entity);
42  }
43 
44  void CDbInfo::setEntity(CEntityFlags::Entity entity) { m_entity = entity; }
45 
46  bool CDbInfo::matchesEntity(CEntityFlags::Entity entity) const
47  {
48  return entity.testFlag(CEntityFlags::entityToEntityFlag(this->getEntity()));
49  }
50 
51  void CDbInfo::setTableName(const QString &tableName)
52  {
53  m_tableName = tableName.trimmed().toLower();
54  m_entity = this->getEntity();
55  }
56 
57  QString CDbInfo::convertToQString(bool i18n) const
58  {
59  Q_UNUSED(i18n);
60  return QStringLiteral("Table %1 with entries %1").arg(m_tableName).arg(m_entries);
61  }
62 
64  {
65  if (index.isMyself()) { return QVariant::fromValue(*this); }
66  const ColumnIndex i = index.frontCasted<ColumnIndex>();
67  switch (i)
68  {
69  case IndexTableName: return QVariant::fromValue(m_tableName);
70  case IndexEntries: return QVariant::fromValue(m_entries);
71  case IndexEntity: return QVariant::fromValue(m_entity);
72  default:
76  }
77  }
78 
79  void CDbInfo::setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
80  {
81  if (index.isMyself())
82  {
83  (*this) = variant.value<CDbInfo>();
84  return;
85  }
86  const ColumnIndex i = index.frontCasted<ColumnIndex>();
87  switch (i)
88  {
89  case IndexTableName: this->setTableName(variant.toString()); break;
90  case IndexEntries: this->setTableName(variant.toString()); break;
91  case IndexEntity: this->setEntity(static_cast<CEntityFlags::Entity>(variant.toInt())); break;
92  default:
94  {
96  }
97  else { CValueObject::setPropertyByIndex(index, variant); }
98  break;
99  }
100  }
101 
102  int CDbInfo::comparePropertyByIndex(CPropertyIndexRef index, const CDbInfo &compareValue) const
103  {
104  if (index.isMyself()) { return getTableName().compare(compareValue.getTableName(), Qt::CaseInsensitive); }
106  {
107  return IDatastoreObjectWithIntegerKey::comparePropertyByIndex(index, compareValue);
108  }
109  const ColumnIndex i = index.frontCasted<ColumnIndex>();
110  switch (i)
111  {
112  case IndexTableName: return this->getTableName().compare(compareValue.getTableName(), Qt::CaseInsensitive);
113  case IndexEntries: return Compare::compare(this->getEntries(), compareValue.getEntries());
114  case IndexEntity: return Compare::compare(this->getEntity(), compareValue.getEntity());
115  default: Q_ASSERT_X(false, Q_FUNC_INFO, "No comparison possible");
116  }
117  return 0;
118  }
119 
120  CDbInfo CDbInfo::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
121  {
122  if (!existsKey(json, prefix))
123  {
124  // when using relationship, this can be null
125  return CDbInfo();
126  }
127  const int id(json.value(prefix % u"id").toInt());
128  const int entries(json.value(prefix % u"entries").toInt());
129  const QString tableName(json.value(prefix % u"tablename").toString());
130  CDbInfo dbInfo(id, tableName, entries);
131  dbInfo.setKeyVersionTimestampFromDatabaseJson(json, prefix);
132  return dbInfo;
133  }
134 
135  const QStringList &CDbInfo::sharedFileNames()
136  {
137  static const QStringList names({ "aircrafticao.json", "airlineicao.json", "airports.json", "countries.json",
138  "distributors.json", "liveries.json", "models.json",
139  "aircraftcategories.json" });
140  return names;
141  }
142 
144  {
145  static const QString f("dbinfo.json");
146  return f;
147  }
148 
149  const QStringList &CDbInfo::serviceNames()
150  {
151  static const QStringList names({ "jsonaircrafticao.php", "jsonairlineicao.php", "jsonairport.php",
152  "jsoncountry.php", "jsondistributor.php", "jsonlivery.php",
153  "jsonaircraftmodel.php", "jsonaircraftcategory.php" });
154  return names;
155  }
156 
157  const QString &CDbInfo::entityToSharedName(CEntityFlags::Entity entity)
158  {
159  static const QString empty;
160  switch (entity)
161  {
162  case CEntityFlags::AircraftIcaoEntity: return sharedFileNames().at(0);
163  case CEntityFlags::AirlineIcaoEntity: return sharedFileNames().at(1);
164  case CEntityFlags::AirportEntity: return sharedFileNames().at(2);
165  case CEntityFlags::CountryEntity: return sharedFileNames().at(3);
166  case CEntityFlags::DistributorEntity: return sharedFileNames().at(4);
167  case CEntityFlags::LiveryEntity: return sharedFileNames().at(5);
168  case CEntityFlags::ModelEntity: return sharedFileNames().at(6);
169  case CEntityFlags::AircraftCategoryEntity: return sharedFileNames().at(7);
170  default: break;
171  }
172  return empty;
173  }
174 
175  const QString &CDbInfo::entityToServiceName(CEntityFlags::Entity entity)
176  {
177  static const QString empty;
178  switch (entity)
179  {
180  case CEntityFlags::AircraftIcaoEntity: return serviceNames().at(0);
181  case CEntityFlags::AirlineIcaoEntity: return serviceNames().at(1);
182  case CEntityFlags::AirportEntity: return serviceNames().at(2);
183  case CEntityFlags::CountryEntity: return serviceNames().at(3);
184  case CEntityFlags::DistributorEntity: return serviceNames().at(4);
185  case CEntityFlags::LiveryEntity: return serviceNames().at(5);
186  case CEntityFlags::ModelEntity: return serviceNames().at(6);
187  case CEntityFlags::AircraftCategoryEntity: return serviceNames().at(7);
188  default: break;
189  }
190  return empty;
191  }
192 } // namespace swift::misc::db
Non-owning reference to a CPropertyIndex with a subset of its features.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
Info about the latest models.
Definition: dbinfo.h:22
CDbInfo()=default
Constructor.
int comparePropertyByIndex(CPropertyIndexRef index, const CDbInfo &compareValue) const
Compare by index.
Definition: dbinfo.cpp:102
const QString & getSharedFileName() const
The shared file name such as "airports.json".
Definition: dbinfo.cpp:32
static const QString & sharedInfoFileName()
Get shared info file name.
Definition: dbinfo.cpp:143
const QString & getServiceName() const
Service name such as "jsonairport.php".
Definition: dbinfo.cpp:38
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: dbinfo.cpp:79
static const QStringList & sharedFileNames()
The shared file names.
Definition: dbinfo.cpp:135
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: dbinfo.cpp:63
bool isValid() const
Valid?
Definition: dbinfo.cpp:23
static const QStringList & serviceNames()
Service names.
Definition: dbinfo.cpp:149
static const QString & entityToSharedName(network::CEntityFlags::Entity entity)
Get shared file name.
Definition: dbinfo.cpp:157
bool matchesEntity(network::CEntityFlags::Entity entity) const
Matches given entity.
Definition: dbinfo.cpp:46
int getEntries() const
Entry count.
Definition: dbinfo.h:60
QString convertToQString(bool i18n=false) const
Cast as QString.
Definition: dbinfo.cpp:57
const QString & getTableName() const
Table name.
Definition: dbinfo.h:42
static CDbInfo fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
From our database JSON format.
Definition: dbinfo.cpp:120
void setEntity(network::CEntityFlags::Entity entity)
Set entity, should be in sync with a corresponding table name.
Definition: dbinfo.cpp:44
void setTableName(const QString &tableName)
Set table name.
Definition: dbinfo.cpp:51
static const QString & entityToServiceName(network::CEntityFlags::Entity entity)
Get service file name.
Definition: dbinfo.cpp:175
network::CEntityFlags::Entity getEntity() const
Get entity (based on table name.
Definition: dbinfo.cpp:25
Class from which a derived class can inherit datastore-related functions.
Definition: datastore.h:70
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
Definition: datastore.cpp:94
static bool existsKey(const QJsonObject &json, const QString &prefix=QString())
Is a key available?
Definition: datastore.cpp:88
static bool canHandleIndex(swift::misc::CPropertyIndexRef index)
Can given index be handled?
Definition: datastore.cpp:147
int comparePropertyByIndex(CPropertyIndexRef index, const IDatastoreObjectWithIntegerKey &compareValue) const
Compare for index.
Definition: datastore.cpp:127
void setKeyVersionTimestampFromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
Set key and timestamp values.
Definition: datastore.cpp:79
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: datastore.cpp:110
void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: mixinindex.h:160
QVariant propertyByIndex(CPropertyIndexRef index) const
Property by index.
Definition: mixinindex.h:167
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67