summaryrefslogtreecommitdiff
path: root/platform/default/mbgl/storage/offline_database.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/mbgl/storage/offline_database.hpp')
-rw-r--r--platform/default/mbgl/storage/offline_database.hpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/platform/default/mbgl/storage/offline_database.hpp b/platform/default/mbgl/storage/offline_database.hpp
new file mode 100644
index 0000000000..854ebdb47d
--- /dev/null
+++ b/platform/default/mbgl/storage/offline_database.hpp
@@ -0,0 +1,94 @@
+#ifndef MBGL_OFFLINE_DATABASE
+#define MBGL_OFFLINE_DATABASE
+
+#include <mbgl/storage/resource.hpp>
+#include <mbgl/storage/offline.hpp>
+#include <mbgl/util/noncopyable.hpp>
+#include <mbgl/util/optional.hpp>
+#include <mbgl/util/constants.hpp>
+
+#include <unordered_map>
+#include <memory>
+#include <string>
+
+namespace mapbox {
+namespace sqlite {
+class Database;
+class Statement;
+}
+}
+
+namespace mbgl {
+
+class Response;
+class TileID;
+
+class OfflineDatabase : private util::noncopyable {
+public:
+ // Limits affect ambient caching (put) only; resources required by offline
+ // regions are exempt.
+ OfflineDatabase(const std::string& path,
+ uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE);
+ ~OfflineDatabase();
+
+ optional<Response> get(const Resource&);
+ uint64_t put(const Resource&, const Response&);
+
+ std::vector<OfflineRegion> listRegions();
+
+ OfflineRegion createRegion(const OfflineRegionDefinition&,
+ const OfflineRegionMetadata&);
+
+ void deleteRegion(OfflineRegion&&);
+
+ optional<Response> getRegionResource(int64_t regionID, const Resource&);
+ uint64_t putRegionResource(int64_t regionID, const Resource&, const Response&);
+
+ OfflineRegionDefinition getRegionDefinition(int64_t regionID);
+ OfflineRegionStatus getRegionCompletedStatus(int64_t regionID);
+
+private:
+ void ensureSchema();
+ void removeExisting();
+
+ class Statement {
+ public:
+ explicit Statement(mapbox::sqlite::Statement& stmt_) : stmt(stmt_) {}
+ Statement(Statement&&) = default;
+ Statement(const Statement&) = delete;
+ ~Statement();
+
+ mapbox::sqlite::Statement* operator->() { return &stmt; };
+
+ private:
+ mapbox::sqlite::Statement& stmt;
+ };
+
+ Statement getStatement(const char *);
+
+ optional<Response> getTile(const Resource::TileData&);
+ void putTile(const Resource::TileData&, const Response&,
+ const std::string&, bool compressed);
+
+ optional<Response> getResource(const Resource&);
+ void putResource(const Resource&, const Response&,
+ const std::string&, bool compressed);
+
+ uint64_t putInternal(const Resource&, const Response&, bool evict);
+ void markUsed(int64_t regionID, const Resource&);
+
+ const std::string path;
+ std::unique_ptr<::mapbox::sqlite::Database> db;
+ std::unordered_map<const char *, std::unique_ptr<::mapbox::sqlite::Statement>> statements;
+
+ template <class T>
+ T getPragma(const char *);
+
+ uint64_t maximumCacheSize;
+
+ bool evict(uint64_t neededFreeSize);
+};
+
+} // namespace mbgl
+
+#endif