diff options
-rw-r--r-- | platform/default/include/mbgl/storage/offline_database.hpp | 8 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/offline_database.cpp | 41 |
2 files changed, 49 insertions, 0 deletions
diff --git a/platform/default/include/mbgl/storage/offline_database.hpp b/platform/default/include/mbgl/storage/offline_database.hpp index 3ba15d5813..3de829e635 100644 --- a/platform/default/include/mbgl/storage/offline_database.hpp +++ b/platform/default/include/mbgl/storage/offline_database.hpp @@ -51,6 +51,13 @@ public: // Return value is (inserted, stored size) std::pair<bool, uint64_t> put(const Resource&, const Response&); + // Force Mapbox GL Native to revalidate tiles stored in the ambient + // cache with the tile server before using them, making sure they + // are the latest version. This is more efficient than cleaning the + // cache because if the tile is considered valid after the server + // lookup, it will not get downloaded again. + std::exception_ptr invalidateTileCache(); + expected<OfflineRegions, std::exception_ptr> listRegions(); expected<OfflineRegion, std::exception_ptr> createRegion(const OfflineRegionDefinition&, @@ -63,6 +70,7 @@ public: updateMetadata(const int64_t regionID, const OfflineRegionMetadata&); std::exception_ptr deleteRegion(OfflineRegion&&); + std::exception_ptr invalidateRegion(int64_t regionID); // Return value is (response, stored size) optional<std::pair<Response, uint64_t>> getRegionResource(int64_t regionID, const Resource&); diff --git a/platform/default/src/mbgl/storage/offline_database.cpp b/platform/default/src/mbgl/storage/offline_database.cpp index 1639c4484c..0b3bcc049f 100644 --- a/platform/default/src/mbgl/storage/offline_database.cpp +++ b/platform/default/src/mbgl/storage/offline_database.cpp @@ -606,6 +606,47 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, return true; } +std::exception_ptr OfflineDatabase::invalidateTileCache() try { + // clang-format off + mapbox::sqlite::Query query{ getStatement( + "UPDATE tiles " + "SET expires = 0, must_revalidate = 1 " + "WHERE id NOT IN (" + " SELECT tile_id FROM region_tiles" + ")" + ) }; + // clang-format on + + query.run(); + return nullptr; +} catch (const mapbox::sqlite::Exception& ex) { + handleError(ex, "invalidate tile cache"); + return std::current_exception(); +} + +std::exception_ptr OfflineDatabase::invalidateRegion(int64_t regionID) try { + { + // clang-format off + mapbox::sqlite::Query query{ getStatement( + "UPDATE tiles " + "SET expires = 0, must_revalidate = 1 " + "WHERE id IN (" + " SELECT tile_id FROM region_tiles WHERE region_id = ?" + ")" + ) }; + // clang-format on + + query.bind(1, regionID); + query.run(); + } + + assert(db); + return nullptr; +} catch (const mapbox::sqlite::Exception& ex) { + handleError(ex, "invalidate region"); + return std::current_exception(); +} + expected<OfflineRegions, std::exception_ptr> OfflineDatabase::listRegions() try { mapbox::sqlite::Query query{ getStatement("SELECT id, definition, description FROM regions") }; OfflineRegions result; |