#pragma once #include #include #include #include #include #include #include #include #include namespace mapbox { namespace sqlite { class Database; class Statement; } // namespace sqlite } // namespace mapbox 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(std::string path, uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE); ~OfflineDatabase(); optional get(const Resource&); // Return value is (inserted, stored size) std::pair put(const Resource&, const Response&); std::vector listRegions(); OfflineRegion createRegion(const OfflineRegionDefinition&, const OfflineRegionMetadata&); OfflineRegionMetadata updateMetadata(const int64_t regionID, const OfflineRegionMetadata&); void deleteRegion(OfflineRegion&&); // Return value is (response, stored size) optional> getRegionResource(int64_t regionID, const Resource&); optional hasRegionResource(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); void setOfflineMapboxTileCountLimit(uint64_t); uint64_t getOfflineMapboxTileCountLimit(); bool offlineMapboxTileCountLimitExceeded(); uint64_t getOfflineMapboxTileCount(); private: void connect(int flags); int userVersion(); void ensureSchema(); void removeExisting(); void migrateToVersion3(); void migrateToVersion5(); 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> getTile(const Resource::TileData&); optional hasTile(const Resource::TileData&); bool putTile(const Resource::TileData&, const Response&, const std::string&, bool compressed); optional> getResource(const Resource&); optional hasResource(const Resource&); bool putResource(const Resource&, const Response&, const std::string&, bool compressed); optional> getInternal(const Resource&); optional hasInternal(const Resource&); std::pair putInternal(const Resource&, const Response&, bool evict); // Return value is true iff the resource was previously unused by any other regions. bool markUsed(int64_t regionID, const Resource&); std::pair getCompletedResourceCountAndSize(int64_t regionID); std::pair getCompletedTileCountAndSize(int64_t regionID); const std::string path; std::unique_ptr<::mapbox::sqlite::Database> db; std::unordered_map> statements; template T getPragma(const char *); uint64_t maximumCacheSize; uint64_t offlineMapboxTileCountLimit = util::mapbox::DEFAULT_OFFLINE_TILE_COUNT_LIMIT; optional offlineMapboxTileCount; bool evict(uint64_t neededFreeSize); }; } // namespace mbgl