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