diff options
author | Tore Halset <halset@pvv.ntnu.no> | 2016-10-17 18:27:07 +0200 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-10-17 09:27:07 -0700 |
commit | a4b79ac2892770456b03692c08f619bcc173c597 (patch) | |
tree | 11676e523b07156198fa78bdc518548d04a21b86 /platform/default/mbgl/storage/offline_database.cpp | |
parent | 76ed537be59482ac22b19e1e116388aea8c7742b (diff) | |
download | qtlocation-mapboxgl-a4b79ac2892770456b03692c08f619bcc173c597.tar.gz |
[core] Optimize OfflineDownload::ensureResource (#6707)
Add `OfflineDatabase::hasRegionResource`, for use when the actual contents are not needed by the caller, avoiding IO and decompression costs.
Diffstat (limited to 'platform/default/mbgl/storage/offline_database.cpp')
-rw-r--r-- | platform/default/mbgl/storage/offline_database.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp index b2ed16db56..4bcc9ad711 100644 --- a/platform/default/mbgl/storage/offline_database.cpp +++ b/platform/default/mbgl/storage/offline_database.cpp @@ -151,6 +151,15 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getInternal(const Resou } } +optional<int64_t> OfflineDatabase::hasInternal(const Resource& resource) { + if (resource.kind == Resource::Kind::Tile) { + assert(resource.tileData); + return hasTile(*resource.tileData); + } else { + return hasResource(resource); + } +} + std::pair<bool, uint64_t> OfflineDatabase::put(const Resource& resource, const Response& response) { return putInternal(resource, response, true); } @@ -236,6 +245,19 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getResource(const Resou return std::make_pair(response, size); } +optional<int64_t> OfflineDatabase::hasResource(const Resource& resource) { + // clang-format off + Statement stmt = getStatement("SELECT length(data) FROM resources WHERE url = ?"); + // clang-format on + + stmt->bind(1, resource.url); + if (!stmt->run()) { + return {}; + } + + return stmt->get<optional<int64_t>>(0); +} + bool OfflineDatabase::putResource(const Resource& resource, const Response& response, const std::string& data, @@ -386,6 +408,31 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getTile(const Resource: return std::make_pair(response, size); } +optional<int64_t> OfflineDatabase::hasTile(const Resource::TileData& tile) { + // clang-format off + Statement stmt = getStatement( + "SELECT length(data) " + "FROM tiles " + "WHERE url_template = ?1 " + " AND pixel_ratio = ?2 " + " AND x = ?3 " + " AND y = ?4 " + " AND z = ?5 "); + // clang-format on + + stmt->bind(1, tile.urlTemplate); + stmt->bind(2, tile.pixelRatio); + stmt->bind(3, tile.x); + stmt->bind(4, tile.y); + stmt->bind(5, tile.z); + + if (!stmt->run()) { + return {}; + } + + return stmt->get<optional<int64_t>>(0); +} + bool OfflineDatabase::putTile(const Resource::TileData& tile, const Response& response, const std::string& data, @@ -562,6 +609,16 @@ optional<std::pair<Response, uint64_t>> OfflineDatabase::getRegionResource(int64 return response; } +optional<int64_t> OfflineDatabase::hasRegionResource(int64_t regionID, const Resource& resource) { + auto response = hasInternal(resource); + + if (response) { + markUsed(regionID, resource); + } + + return response; +} + uint64_t OfflineDatabase::putRegionResource(int64_t regionID, const Resource& resource, const Response& response) { uint64_t size = putInternal(resource, response, false).second; bool previouslyUnused = markUsed(regionID, resource); |