databasecache.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. *openPilotLog - A FOSS Pilot Logbook Application
  3. *Copyright (C) 2020-2023 Felix Turowsky
  4. *
  5. *This program is free software: you can redistribute it and/or modify
  6. *it under the terms of the GNU General Public License as published by
  7. *the Free Software Foundation, either version 3 of the License, or
  8. *(at your option) any later version.
  9. *
  10. *This program is distributed in the hope that it will be useful,
  11. *but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. *GNU General Public License for more details.
  14. *
  15. *You should have received a copy of the GNU General Public License
  16. *along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. #include "databasecache.h"
  19. #include "src/database/database.h"
  20. #include "src/opl.h"
  21. #include <QSqlQuery>
  22. namespace OPL{
  23. void DatabaseCache::init()
  24. {
  25. LOG << "Initialising database cache...";
  26. updateTails();
  27. updatePilots();
  28. updateAirports();
  29. updateSimulators();
  30. updateAircraft();
  31. // Listen to database for updates, reload cache if needed
  32. QObject::connect(DB, &OPL::Database::dataBaseUpdated,
  33. this, &OPL::DatabaseCache::onDatabaseUpdated);
  34. }
  35. const IdMap DatabaseCache::fetchMap(CompleterTarget target)
  36. {
  37. QString statement;
  38. switch (target) {
  39. case AirportsICAO:
  40. statement.append(QStringLiteral("SELECT ROWID, icao FROM airports"));
  41. break;
  42. case AirportsIATA:
  43. statement.append(QStringLiteral("SELECT ROWID, iata FROM airports WHERE iata NOT NULL"));
  44. break;
  45. case AirportNames:
  46. statement.append(QStringLiteral("SELECT ROWID, name FROM airports"));
  47. break;
  48. case PilotNames:
  49. statement.append(QStringLiteral("SELECT ROWID, lastname||', '||firstname FROM pilots"));
  50. break;
  51. case Tails:
  52. statement.append(QStringLiteral("SELECT ROWID, registration FROM tails"));
  53. break;
  54. case AircraftTypes:
  55. statement.append(QStringLiteral("SELECT ROWID, make||' '||model FROM aircraft WHERE model IS NOT NULL AND variant IS NULL "
  56. "UNION "
  57. "SELECT ROWID, make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL"));
  58. break;
  59. default:
  60. return {};
  61. }
  62. QSqlQuery query;
  63. query.setForwardOnly(true);
  64. query.prepare(statement);
  65. query.exec();
  66. IdMap id_map;
  67. while (query.next())
  68. id_map.insert(query.value(0).toInt(), query.value(1).toString());
  69. return id_map;
  70. }
  71. const QStringList DatabaseCache::fetchList(CompleterTarget target)
  72. {
  73. QString statement;
  74. switch (target) {
  75. case PilotNames:
  76. statement.append(QStringLiteral("SELECT lastname||', '||firstname FROM pilots"));
  77. break;
  78. case AircraftTypes:
  79. statement.append(QStringLiteral("SELECT make||' '||model FROM aircraft WHERE model IS NOT NULL AND variant IS NULL "
  80. "UNION "
  81. "SELECT make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL"));
  82. break;
  83. case AirportsAny:
  84. statement.append(QStringLiteral("SELECT icao FROM airports UNION SELECT iata FROM airports"));
  85. break;
  86. case Tails:
  87. statement.append(QStringLiteral("SELECT registration FROM tails"));
  88. break;
  89. case Companies:
  90. statement.append(QStringLiteral("SELECT company FROM pilots"));
  91. break;
  92. default:
  93. DEB << "Not a valid completer target for this function.";
  94. return QStringList();
  95. }
  96. QSqlQuery query;
  97. query.prepare(statement);
  98. query.setForwardOnly(true);
  99. query.exec();
  100. QStringList completer_list;
  101. while (query.next())
  102. completer_list.append(query.value(0).toString());
  103. completer_list.sort();
  104. completer_list.removeAll(QString());
  105. completer_list.removeDuplicates();
  106. return completer_list;
  107. }
  108. void DatabaseCache::updateTails()
  109. {
  110. tailsMap = fetchMap(Tails);
  111. tailsList = fetchList(Tails);
  112. for (auto &reg : tailsList) {
  113. if(reg.contains(QLatin1Char('-'))) { // check to avoid duplication if reg has no '-'
  114. QString copy = reg;
  115. reg.remove(QLatin1Char('-'));
  116. reg = copy + " (" + reg + QLatin1Char(')');
  117. }
  118. }
  119. }
  120. void DatabaseCache::updateAirports()
  121. {
  122. airportsMapIATA = fetchMap(AirportsIATA);
  123. airportsMapICAO = fetchMap(AirportsICAO);
  124. airportsMapNames = fetchMap(AirportNames);
  125. airportList = fetchList(AirportsAny);
  126. }
  127. void DatabaseCache::updateSimulators()
  128. {
  129. TODO << "not yet implemented";
  130. }
  131. void DatabaseCache::updatePilots()
  132. {
  133. pilotNamesMap = fetchMap(PilotNames);
  134. pilotNamesList = fetchList(PilotNames);
  135. companiesList = fetchList(Companies);
  136. }
  137. void DatabaseCache::updateAircraft()
  138. {
  139. aircraftList = fetchList(AircraftTypes);
  140. aircraftMap = fetchMap(AircraftTypes);
  141. }
  142. void DatabaseCache::onDatabaseUpdated(const OPL::DbTable table)
  143. {
  144. LOG << "Updating Database Cache...";
  145. switch (table) {
  146. case DbTable::Pilots:
  147. updatePilots();
  148. break;
  149. case DbTable::Tails:
  150. updateTails();
  151. break;
  152. case DbTable::Simulators:
  153. updateSimulators();
  154. break;
  155. case DbTable::Airports:
  156. updateAirports();
  157. break;
  158. case DbTable::Aircraft:
  159. updateAircraft();
  160. break;
  161. default:
  162. break;
  163. }
  164. emit databaseCacheUpdated(table);
  165. }
  166. const IdMap &DatabaseCache::getAirportsMapICAO() const
  167. {
  168. return airportsMapICAO;
  169. }
  170. const IdMap &DatabaseCache::getAirportsMapIATA() const
  171. {
  172. return airportsMapIATA;
  173. }
  174. const IdMap &DatabaseCache::getPilotNamesMap() const
  175. {
  176. return pilotNamesMap;
  177. }
  178. const QStringList &DatabaseCache::getPilotNamesList() const
  179. {
  180. return pilotNamesList;
  181. }
  182. const QStringList &DatabaseCache::getTailsList() const
  183. {
  184. return tailsList;
  185. }
  186. const QStringList &DatabaseCache::getAirportList() const
  187. {
  188. return airportList;
  189. }
  190. const QStringList &DatabaseCache::getCompaniesList() const
  191. {
  192. return companiesList;
  193. }
  194. const QStringList &DatabaseCache::getAircraftList() const
  195. {
  196. return aircraftList;
  197. }
  198. const IdMap &DatabaseCache::getAircraftMap() const
  199. {
  200. return aircraftMap;
  201. }
  202. const IdMap &DatabaseCache::getAirportsMapNames() const
  203. {
  204. return airportsMapNames;
  205. }
  206. const IdMap &DatabaseCache::getTailsMap() const
  207. {
  208. return tailsMap;
  209. }
  210. } // namespace OPL