diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2018-02-22 13:38:26 +0200 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2018-06-04 12:09:32 +0300 |
commit | d928908ec849097440fd028454c538f1c1632a1e (patch) | |
tree | 9b436f4cdaf247d017fa7925d0421f1c36dceed9 /platform/default/mbgl/storage/offline_database.cpp | |
parent | 4146d8d9be3a732a626b0e537ed1490af9bc0427 (diff) | |
download | qtlocation-mapboxgl-d928908ec849097440fd028454c538f1c1632a1e.tar.gz |
[core] offline database - batch region resource inserts
Diffstat (limited to 'platform/default/mbgl/storage/offline_database.cpp')
-rw-r--r-- | platform/default/mbgl/storage/offline_database.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp index d2e1fe8ec1..cbf5483098 100644 --- a/platform/default/mbgl/storage/offline_database.cpp +++ b/platform/default/mbgl/storage/offline_database.cpp @@ -629,6 +629,43 @@ optional<int64_t> OfflineDatabase::hasRegionResource(int64_t regionID, const Res } uint64_t OfflineDatabase::putRegionResource(int64_t regionID, const Resource& resource, const Response& response) { + mapbox::sqlite::Transaction transaction(*db); + auto size = putRegionResourceInternal(regionID, resource, response); + transaction.commit(); + return size; +} + +void OfflineDatabase::putRegionResources(int64_t regionID, const std::list<std::tuple<Resource, Response>>& resources, OfflineRegionStatus& status) { + mapbox::sqlite::Transaction transaction(*db); + + for (const auto& elem : resources) { + const auto& resource = std::get<0>(elem); + const auto& response = std::get<1>(elem); + + try { + uint64_t resourceSize = putRegionResourceInternal(regionID, resource, response); + status.completedResourceCount++; + status.completedResourceSize += resourceSize; + if (resource.kind == Resource::Kind::Tile) { + status.completedTileCount += 1; + status.completedTileSize += resourceSize; + } + } catch (MapboxTileLimitExceededException) { + // Commit the rest of the batch and retrow + transaction.commit(); + throw; + } + } + + // Commit the completed batch + transaction.commit(); +} + +uint64_t OfflineDatabase::putRegionResourceInternal(int64_t regionID, const Resource& resource, const Response& response) { + if (exceedsOfflineMapboxTileCountLimit(resource)) { + throw MapboxTileLimitExceededException(); + } + uint64_t size = putInternal(resource, response, false).second; bool previouslyUnused = markUsed(regionID, resource); @@ -899,4 +936,10 @@ uint64_t OfflineDatabase::getOfflineMapboxTileCount() { return *offlineMapboxTileCount; } +bool OfflineDatabase::exceedsOfflineMapboxTileCountLimit(const Resource& resource) { + return resource.kind == Resource::Kind::Tile + && util::mapbox::isMapboxURL(resource.url) + && offlineMapboxTileCountLimitExceeded(); +} + } // namespace mbgl |