databasecache.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "databasecache.h"
  2. #include "src/database/database.h"
  3. #include "src/opl.h"
  4. #include <QSqlQuery>
  5. namespace OPL{
  6. void DatabaseCache::init()
  7. {
  8. LOG << "Initialising database cache...";
  9. updateTails();
  10. updatePilots();
  11. updateAirports();
  12. updateSimulators();
  13. updateAircraft();
  14. // Listen to database for updates, reload cache if needed
  15. QObject::connect(DB, &OPL::Database::dataBaseUpdated,
  16. this, &OPL::DatabaseCache::onDatabaseUpdated);
  17. }
  18. const IdMap DatabaseCache::fetchMap(CompleterTarget target)
  19. {
  20. QString statement;
  21. switch (target) {
  22. case AirportsICAO:
  23. statement.append(QStringLiteral("SELECT ROWID, icao FROM airports"));
  24. break;
  25. case AirportsIATA:
  26. statement.append(QStringLiteral("SELECT ROWID, iata FROM airports WHERE iata NOT NULL"));
  27. break;
  28. case AirportNames:
  29. statement.append(QStringLiteral("SELECT ROWID, name FROM airports"));
  30. break;
  31. case PilotNames:
  32. statement.append(QStringLiteral("SELECT ROWID, lastname||', '||firstname FROM pilots"));
  33. break;
  34. case Tails:
  35. statement.append(QStringLiteral("SELECT ROWID, registration FROM tails"));
  36. break;
  37. case AircraftTypes:
  38. statement.append(QStringLiteral("SELECT ROWID, make||' '||model FROM aircraft WHERE model IS NOT NULL AND variant IS NULL "
  39. "UNION "
  40. "SELECT ROWID, make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL"));
  41. break;
  42. default:
  43. return {};
  44. }
  45. QSqlQuery query;
  46. query.setForwardOnly(true);
  47. query.prepare(statement);
  48. query.exec();
  49. IdMap id_map;
  50. while (query.next())
  51. id_map.insert(query.value(0).toInt(), query.value(1).toString());
  52. return id_map;
  53. }
  54. const QStringList DatabaseCache::fetchList(CompleterTarget target)
  55. {
  56. QString statement;
  57. switch (target) {
  58. case PilotNames:
  59. statement.append(QStringLiteral("SELECT lastname||', '||firstname FROM pilots"));
  60. break;
  61. case AircraftTypes:
  62. statement.append(QStringLiteral("SELECT make||' '||model FROM aircraft WHERE model IS NOT NULL AND variant IS NULL "
  63. "UNION "
  64. "SELECT make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL"));
  65. break;
  66. case AirportsAny:
  67. statement.append(QStringLiteral("SELECT icao FROM airports UNION SELECT iata FROM airports"));
  68. break;
  69. case Tails:
  70. statement.append(QStringLiteral("SELECT registration FROM tails"));
  71. break;
  72. case Companies:
  73. statement.append(QStringLiteral("SELECT company FROM pilots"));
  74. break;
  75. default:
  76. DEB << "Not a valid completer target for this function.";
  77. return QStringList();
  78. }
  79. QSqlQuery query;
  80. query.prepare(statement);
  81. query.setForwardOnly(true);
  82. query.exec();
  83. QStringList completer_list;
  84. while (query.next())
  85. completer_list.append(query.value(0).toString());
  86. completer_list.sort();
  87. completer_list.removeAll(QString());
  88. completer_list.removeDuplicates();
  89. return completer_list;
  90. }
  91. void DatabaseCache::updateTails()
  92. {
  93. tailsMap = fetchMap(Tails);
  94. tailsList = fetchList(Tails);
  95. for (auto &reg : tailsList) {
  96. if(reg.contains(QLatin1Char('-'))) { // check to avoid duplication if reg has no '-'
  97. QString copy = reg;
  98. reg.remove(QLatin1Char('-'));
  99. reg = copy + " (" + reg + QLatin1Char(')');
  100. }
  101. }
  102. }
  103. void DatabaseCache::updateAirports()
  104. {
  105. airportsMapIATA = fetchMap(AirportsIATA);
  106. airportsMapICAO = fetchMap(AirportsICAO);
  107. airportsMapNames = fetchMap(AirportNames);
  108. airportList = fetchList(AirportsAny);
  109. }
  110. void DatabaseCache::updateSimulators()
  111. {
  112. TODO << "not yet implemented";
  113. }
  114. void DatabaseCache::updatePilots()
  115. {
  116. pilotNamesMap = fetchMap(PilotNames);
  117. pilotNamesList = fetchList(PilotNames);
  118. companiesList = fetchList(Companies);
  119. }
  120. void DatabaseCache::updateAircraft()
  121. {
  122. aircraftList = fetchList(AircraftTypes);
  123. aircraftMap = fetchMap(AircraftTypes);
  124. }
  125. void DatabaseCache::onDatabaseUpdated(const OPL::DbTable table)
  126. {
  127. LOG << "Updating Database Cache...";
  128. switch (table) {
  129. case DbTable::Pilots:
  130. updatePilots();
  131. break;
  132. case DbTable::Tails:
  133. updateTails();
  134. break;
  135. case DbTable::Simulators:
  136. updateSimulators();
  137. break;
  138. case DbTable::Airports:
  139. updateAirports();
  140. break;
  141. case DbTable::Aircraft:
  142. updateAircraft();
  143. break;
  144. default:
  145. break;
  146. }
  147. emit databaseCacheUpdated(table);
  148. }
  149. const IdMap &DatabaseCache::getAirportsMapICAO() const
  150. {
  151. return airportsMapICAO;
  152. }
  153. const IdMap &DatabaseCache::getAirportsMapIATA() const
  154. {
  155. return airportsMapIATA;
  156. }
  157. const IdMap &DatabaseCache::getPilotNamesMap() const
  158. {
  159. return pilotNamesMap;
  160. }
  161. const QStringList &DatabaseCache::getPilotNamesList() const
  162. {
  163. return pilotNamesList;
  164. }
  165. const QStringList &DatabaseCache::getTailsList() const
  166. {
  167. return tailsList;
  168. }
  169. const QStringList &DatabaseCache::getAirportList() const
  170. {
  171. return airportList;
  172. }
  173. const QStringList &DatabaseCache::getCompaniesList() const
  174. {
  175. return companiesList;
  176. }
  177. const QStringList &DatabaseCache::getAircraftList() const
  178. {
  179. return aircraftList;
  180. }
  181. const IdMap &DatabaseCache::getAircraftMap() const
  182. {
  183. return aircraftMap;
  184. }
  185. const IdMap &DatabaseCache::getAirportsMapNames() const
  186. {
  187. return airportsMapNames;
  188. }
  189. const IdMap &DatabaseCache::getTailsMap() const
  190. {
  191. return tailsMap;
  192. }
  193. } // namespace OPL