From 78eeffe1717a37a91e6c59681421a20c52a4d003 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Fri, 14 Jun 2019 16:53:09 +0300 Subject: [core] Clear/Invalidate should also work on non-tile resources These methods were only affecting tiles, but they should really work on every resource like style, glyphs, etc. --- .../src/mbgl/storage/default_file_source.cpp | 16 +++--- .../default/src/mbgl/storage/offline_database.cpp | 59 ++++++++++++++++++---- 2 files changed, 56 insertions(+), 19 deletions(-) (limited to 'platform/default/src/mbgl') diff --git a/platform/default/src/mbgl/storage/default_file_source.cpp b/platform/default/src/mbgl/storage/default_file_source.cpp index 0f786f3868..b296e448af 100644 --- a/platform/default/src/mbgl/storage/default_file_source.cpp +++ b/platform/default/src/mbgl/storage/default_file_source.cpp @@ -188,12 +188,12 @@ public: callback(offlineDatabase->resetDatabase()); } - void invalidateTileCache(std::function callback) { - callback(offlineDatabase->invalidateTileCache()); + void invalidateAmbientCache(std::function callback) { + callback(offlineDatabase->invalidateAmbientCache()); } - void clearTileCache(std::function callback) { - callback(offlineDatabase->clearTileCache()); + void clearAmbientCache(std::function callback) { + callback(offlineDatabase->clearAmbientCache()); } private: @@ -343,12 +343,12 @@ void DefaultFileSource::resetDatabase(std::function c impl->actor().invoke(&Impl::resetDatabase, std::move(callback)); } -void DefaultFileSource::invalidateTileCache(std::function callback) { - impl->actor().invoke(&Impl::invalidateTileCache, callback); +void DefaultFileSource::invalidateAmbientCache(std::function callback) { + impl->actor().invoke(&Impl::invalidateAmbientCache, std::move(callback)); } -void DefaultFileSource::clearTileCache(std::function callback) { - impl->actor().invoke(&Impl::clearTileCache, callback); +void DefaultFileSource::clearAmbientCache(std::function callback) { + impl->actor().invoke(&Impl::clearAmbientCache, std::move(callback)); } // For testing only: diff --git a/platform/default/src/mbgl/storage/offline_database.cpp b/platform/default/src/mbgl/storage/offline_database.cpp index ab04cde5ed..7caa013f9f 100644 --- a/platform/default/src/mbgl/storage/offline_database.cpp +++ b/platform/default/src/mbgl/storage/offline_database.cpp @@ -604,9 +604,9 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, return true; } -std::exception_ptr OfflineDatabase::invalidateTileCache() try { +std::exception_ptr OfflineDatabase::invalidateAmbientCache() try { // clang-format off - mapbox::sqlite::Query query{ getStatement( + mapbox::sqlite::Query tileQuery{ getStatement( "UPDATE tiles " "SET expires = 0, must_revalidate = 1 " "WHERE id NOT IN (" @@ -615,16 +615,29 @@ std::exception_ptr OfflineDatabase::invalidateTileCache() try { ) }; // clang-format on - query.run(); + tileQuery.run(); + + // clang-format off + mapbox::sqlite::Query resourceQuery{ getStatement( + "UPDATE resources " + "SET expires = 0, must_revalidate = 1 " + "WHERE id NOT IN (" + " SELECT resource_id FROM region_resources" + ")" + ) }; + // clang-format on + + resourceQuery.run(); + return nullptr; } catch (const mapbox::sqlite::Exception& ex) { - handleError(ex, "invalidate tile cache"); + handleError(ex, "invalidate ambient cache"); return std::current_exception(); } -std::exception_ptr OfflineDatabase::clearTileCache() try { +std::exception_ptr OfflineDatabase::clearAmbientCache() try { // clang-format off - mapbox::sqlite::Query query{ getStatement( + mapbox::sqlite::Query tileQuery{ getStatement( "DELETE FROM tiles " "WHERE id NOT IN (" " SELECT tile_id FROM region_tiles" @@ -632,20 +645,31 @@ std::exception_ptr OfflineDatabase::clearTileCache() try { ) }; // clang-format on - query.run(); + tileQuery.run(); + + // clang-format off + mapbox::sqlite::Query resourceQuery{ getStatement( + "DELETE FROM resources " + "WHERE id NOT IN (" + " SELECT resource_id FROM region_resources" + ")" + ) }; + // clang-format on + + resourceQuery.run(); db->exec("VACUUM"); return nullptr; } catch (const mapbox::sqlite::Exception& ex) { - handleError(ex, "clear tile cache"); + handleError(ex, "clear ambient cache"); return std::current_exception(); } std::exception_ptr OfflineDatabase::invalidateRegion(int64_t regionID) try { { // clang-format off - mapbox::sqlite::Query query{ getStatement( + mapbox::sqlite::Query tileQuery{ getStatement( "UPDATE tiles " "SET expires = 0, must_revalidate = 1 " "WHERE id IN (" @@ -654,8 +678,21 @@ std::exception_ptr OfflineDatabase::invalidateRegion(int64_t regionID) try { ) }; // clang-format on - query.bind(1, regionID); - query.run(); + tileQuery.bind(1, regionID); + tileQuery.run(); + + // clang-format off + mapbox::sqlite::Query resourceQuery{ getStatement( + "UPDATE resources " + "SET expires = 0, must_revalidate = 1 " + "WHERE id IN (" + " SELECT resource_id FROM region_resources WHERE region_id = ?" + ")" + ) }; + // clang-format on + + resourceQuery.bind(1, regionID); + resourceQuery.run(); } assert(db); -- cgit v1.2.1