QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCTileCacheDatabase.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QByteArray>
4#include <QtCore/QString>
5#include <QtSql/QSqlDatabase>
6
7#include <memory>
8#include <optional>
9
10#include "QGCTileCacheTypes.h"
11#include "QGCTile.h"
12
13struct QGCCacheTile;
14
16{
17public:
18 static constexpr quint64 kInvalidTileSet = UINT64_MAX;
19 static constexpr int kSchemaVersion = 1;
20
21 explicit QGCTileCacheDatabase(const QString &databasePath);
23
24 bool init();
25 bool connectDB();
26 void disconnectDB();
27
28 bool isValid() const { return _valid; }
29 bool hasFailed() const { return _failed; }
30
31 // Tiles
32 bool saveTile(const QString &hash, const QString &format, const QByteArray &img, const QString &type, quint64 tileSet);
33 std::unique_ptr<QGCCacheTile> getTile(const QString &hash);
34 std::optional<quint64> findTile(const QString &hash);
35
36 // Tile Sets
37 QList<TileSetRecord> getTileSets();
38 std::optional<quint64> createTileSet(const QString &name, const QString &mapTypeStr,
39 double topleftLat, double topleftLon,
40 double bottomRightLat, double bottomRightLon,
41 int minZoom, int maxZoom, const QString &type, quint32 numTiles);
42 bool deleteTileSet(quint64 id);
43 bool renameTileSet(quint64 setID, const QString &newName);
44 std::optional<quint64> findTileSetID(const QString &name);
45 bool resetDatabase();
46
47 // Downloads
48 QList<QGCTile> getTileDownloadList(quint64 setID, int count);
49 bool updateTileDownloadState(quint64 setID, int state, const QString &hash);
50 bool updateAllTileDownloadStates(quint64 setID, int state);
51
52 // Cache
53 bool pruneCache(quint64 amount);
55
56 // Stats
58 SetTotalsResult computeSetTotals(quint64 setID, bool isDefault, quint32 totalTileCount, const QString &type);
59
60 // Import/Export
61 DatabaseResult importSetsReplace(const QString &path, ProgressCallback progressCb);
62 DatabaseResult importSetsMerge(const QString &path, ProgressCallback progressCb);
63 DatabaseResult exportSets(const QList<TileSetRecord> &sets, const QString &path, ProgressCallback progressCb);
64
65 // Exposed for unit tests only
66 QSqlDatabase database() const;
67
68 static constexpr const char *kBingNoTileDoneKey = "_deleteBingNoTileTilesDone";
69
70private:
71 bool _ensureConnected() const;
72 QSqlDatabase _database() const;
73 bool _checkSchemaVersion();
74 bool _createDB(QSqlDatabase db, bool createDefault = true);
75 quint64 _getDefaultTileSet();
76 bool _deleteTilesByIDs(const QList<quint64> &ids);
77 QString _deduplicateSetName(const QString &name);
78 quint64 _copyTilesForSet(QSqlDatabase srcDB, quint64 srcSetID, quint64 dstSetID,
79 quint64 &currentCount, quint64 tileCount,
80 int &lastProgress, ProgressCallback progressCb,
81 quint64 *tilesIteratedOut, bool useTransaction = true);
82
83 QString _databasePath;
84 QString _connectionName;
85 quint64 _defaultSet = kInvalidTileSet;
86 bool _connected = false;
87 bool _valid = false;
88 bool _failed = false;
89 static constexpr int kPruneBatchSize = 128;
90 static constexpr const char *kUniqueTilesSubquery =
91 "SELECT A.tileID FROM SetTiles A JOIN SetTiles B ON A.tileID = B.tileID "
92 "WHERE B.setID = ? GROUP BY A.tileID HAVING COUNT(A.tileID) = 1";
93};
std::function< void(int)> ProgressCallback
std::optional< quint64 > findTileSetID(const QString &name)
std::optional< quint64 > createTileSet(const QString &name, const QString &mapTypeStr, double topleftLat, double topleftLon, double bottomRightLat, double bottomRightLon, int minZoom, int maxZoom, const QString &type, quint32 numTiles)
bool updateAllTileDownloadStates(quint64 setID, int state)
bool pruneCache(quint64 amount)
std::unique_ptr< QGCCacheTile > getTile(const QString &hash)
SetTotalsResult computeSetTotals(quint64 setID, bool isDefault, quint32 totalTileCount, const QString &type)
DatabaseResult exportSets(const QList< TileSetRecord > &sets, const QString &path, ProgressCallback progressCb)
static constexpr quint64 kInvalidTileSet
bool updateTileDownloadState(quint64 setID, int state, const QString &hash)
static constexpr const char * kBingNoTileDoneKey
DatabaseResult importSetsReplace(const QString &path, ProgressCallback progressCb)
QList< QGCTile > getTileDownloadList(quint64 setID, int count)
bool renameTileSet(quint64 setID, const QString &newName)
static constexpr int kSchemaVersion
QSqlDatabase database() const
QList< TileSetRecord > getTileSets()
bool saveTile(const QString &hash, const QString &format, const QByteArray &img, const QString &type, quint64 tileSet)
DatabaseResult importSetsMerge(const QString &path, ProgressCallback progressCb)
std::optional< quint64 > findTile(const QString &hash)