#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace mapbox { namespace sqlite { class Database; class Statement; class Query; class Exception; } // namespace sqlite } // namespace mapbox namespace mbgl { class Response; class TileID; namespace util { struct IOException; } // namespace util struct MapboxTileLimitExceededException : util::Exception { MapboxTileLimitExceededException() : util::Exception("Mapbox tile limit exceeded") {} }; 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&); expected listRegions(); expected createRegion(const OfflineRegionDefinition&, const OfflineRegionMetadata&); expected updateMetadata(const int64_t regionID, const OfflineRegionMetadata&); std::exception_ptr 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&); void putRegionResources(int64_t regionID, const std::list>&, OfflineRegionStatus&); expected getRegionDefinition(int64_t regionID); expected getRegionCompletedStatus(int64_t regionID); void setOfflineMapboxTileCountLimit(uint64_t); uint64_t getOfflineMapboxTileCountLimit(); bool offlineMapboxTileCountLimitExceeded(); uint64_t getOfflineMapboxTileCount(); bool exceedsOfflineMapboxTileCountLimit(const Resource&); private: void initialize(); void handleError(const mapbox::sqlite::Exception&, const char* action); void handleError(const util::IOException&, const char* action); void removeExisting(); void removeOldCacheTable(); void createSchema(); void migrateToVersion5(); void migrateToVersion3(); void migrateToVersion6(); mapbox::sqlite::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); uint64_t putRegionResourceInternal(int64_t regionID, const Resource&, const Response&); 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 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