diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2018-08-13 16:29:14 -0700 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2018-08-14 17:03:46 -0700 |
commit | 6e06e55b95fdb9070d32d44786441255871dbb0b (patch) | |
tree | d9e074da720f8339966c99ded803f4f59a83b68e /platform/default | |
parent | 89515de769aea0b54a800514f7deaf65649d9d54 (diff) | |
download | qtlocation-mapboxgl-6e06e55b95fdb9070d32d44786441255871dbb0b.tar.gz |
WIP: use expected<T, E> for passing on errors
Diffstat (limited to 'platform/default')
-rw-r--r-- | platform/default/default_file_source.cpp | 58 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_database.cpp | 35 | ||||
-rw-r--r-- | platform/default/mbgl/storage/offline_database.hpp | 16 |
3 files changed, 49 insertions, 60 deletions
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp index 051e1b125c..93f10eea72 100644 --- a/platform/default/default_file_source.cpp +++ b/platform/default/default_file_source.cpp @@ -45,61 +45,44 @@ public: onlineFileSource.setResourceTransform(std::move(transform)); } - void listRegions(std::function<void (std::exception_ptr, optional<std::vector<OfflineRegion>>)> callback) { - try { - callback({}, offlineDatabase->listRegions()); - } catch (...) { - callback(std::current_exception(), {}); - } + void listRegions(std::function<void (expected<OfflineRegions, std::exception_ptr>)> callback) { + callback(offlineDatabase->listRegions()); } void createRegion(const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata, - std::function<void (std::exception_ptr, optional<OfflineRegion>)> callback) { - try { - callback({}, offlineDatabase->createRegion(definition, metadata)); - } catch (...) { - callback(std::current_exception(), {}); - } + std::function<void (expected<OfflineRegion, std::exception_ptr>)> callback) { + callback(offlineDatabase->createRegion(definition, metadata)); } void updateMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata, - std::function<void (std::exception_ptr, optional<OfflineRegionMetadata>)> callback) { - try { - callback({}, offlineDatabase->updateMetadata(regionID, metadata)); - } catch (...) { - callback(std::current_exception(), {}); - } + std::function<void (expected<OfflineRegionMetadata, std::exception_ptr>)> callback) { + callback(offlineDatabase->updateMetadata(regionID, metadata)); } - void getRegionStatus(int64_t regionID, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) { + void getRegionStatus(int64_t regionID, std::function<void (expected<OfflineRegionStatus, std::exception_ptr>)> callback) { if (auto download = getDownload(regionID)) { - callback({}, download->getStatus()); + callback(download.value()->getStatus()); } else { - callback(std::current_exception(), {}); + callback(unexpected<std::exception_ptr>(download.error())); } } void deleteRegion(OfflineRegion&& region, std::function<void (std::exception_ptr)> callback) { - try { - downloads.erase(region.getID()); - offlineDatabase->deleteRegion(std::move(region)); - callback({}); - } catch (...) { - callback(std::current_exception()); - } + downloads.erase(region.getID()); + callback(offlineDatabase->deleteRegion(std::move(region))); } void setRegionObserver(int64_t regionID, std::unique_ptr<OfflineRegionObserver> observer) { if (auto download = getDownload(regionID)) { - download->setObserver(std::move(observer)); + download.value()->setObserver(std::move(observer)); } } void setRegionDownloadState(int64_t regionID, OfflineRegionDownloadState state) { if (auto download = getDownload(regionID)) { - download->setState(state); + download.value()->setState(state); } } @@ -185,17 +168,16 @@ public: } private: - OfflineDownload* getDownload(int64_t regionID) { + expected<OfflineDownload*, std::exception_ptr> getDownload(int64_t regionID) { auto it = downloads.find(regionID); if (it != downloads.end()) { return it->second.get(); } auto definition = offlineDatabase->getRegionDefinition(regionID); if (!definition) { - return nullptr; + return unexpected<std::exception_ptr>(definition.error()); } - - auto download = std::make_unique<OfflineDownload>(regionID, std::move(*definition), + auto download = std::make_unique<OfflineDownload>(regionID, std::move(definition.value()), *offlineDatabase, onlineFileSource); return downloads.emplace(regionID, std::move(download)).first->second.get(); } @@ -266,19 +248,19 @@ std::unique_ptr<AsyncRequest> DefaultFileSource::request(const Resource& resourc return std::move(req); } -void DefaultFileSource::listOfflineRegions(std::function<void (std::exception_ptr, optional<std::vector<OfflineRegion>>)> callback) { +void DefaultFileSource::listOfflineRegions(std::function<void (expected<OfflineRegions, std::exception_ptr>)> callback) { impl->actor().invoke(&Impl::listRegions, callback); } void DefaultFileSource::createOfflineRegion(const OfflineRegionDefinition& definition, const OfflineRegionMetadata& metadata, - std::function<void (std::exception_ptr, optional<OfflineRegion>)> callback) { + std::function<void (expected<OfflineRegion, std::exception_ptr>)> callback) { impl->actor().invoke(&Impl::createRegion, definition, metadata, callback); } void DefaultFileSource::updateOfflineMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata, - std::function<void (std::exception_ptr, optional<OfflineRegionMetadata>)> callback) { + std::function<void (expected<OfflineRegionMetadata, std::exception_ptr>)> callback) { impl->actor().invoke(&Impl::updateMetadata, regionID, metadata, callback); } @@ -294,7 +276,7 @@ void DefaultFileSource::setOfflineRegionDownloadState(OfflineRegion& region, Off impl->actor().invoke(&Impl::setRegionDownloadState, region.getID(), state); } -void DefaultFileSource::getOfflineRegionStatus(OfflineRegion& region, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) const { +void DefaultFileSource::getOfflineRegionStatus(OfflineRegion& region, std::function<void (expected<OfflineRegionStatus, std::exception_ptr>)> callback) const { impl->actor().invoke(&Impl::getRegionStatus, region.getID(), callback); } diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp index cfa7f52977..7516185f27 100644 --- a/platform/default/mbgl/storage/offline_database.cpp +++ b/platform/default/mbgl/storage/offline_database.cpp @@ -592,14 +592,15 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile, return true; } -std::vector<OfflineRegion> OfflineDatabase::listRegions() try { +expected<OfflineRegions, std::exception_ptr> OfflineDatabase::listRegions() try { mapbox::sqlite::Query query{ getStatement("SELECT id, definition, description FROM regions") }; - std::vector<OfflineRegion> result; + OfflineRegions result; while (query.run()) { const auto id = query.get<int64_t>(0); const auto definition = query.get<std::string>(1); const auto description = query.get<std::vector<uint8_t>>(2); try { + // Construct, then move because this constructor is private. OfflineRegion region(id, decodeOfflineRegionDefinition(definition), description); result.emplace_back(std::move(region)); } catch (const std::exception& ex) { @@ -608,14 +609,16 @@ std::vector<OfflineRegion> OfflineDatabase::listRegions() try { Log::Error(Event::General, "%s", ex.what()); } } - return result; + // Explicit move to avoid triggering the copy constructor. + return { std::move(result) }; } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "list regions"); - return {}; + return unexpected<std::exception_ptr>(std::current_exception()); } -optional<OfflineRegion> OfflineDatabase::createRegion(const OfflineRegionDefinition& definition, - const OfflineRegionMetadata& metadata) try { +expected<OfflineRegion, std::exception_ptr> +OfflineDatabase::createRegion(const OfflineRegionDefinition& definition, + const OfflineRegionMetadata& metadata) try { // clang-format off mapbox::sqlite::Query query{ getStatement( "INSERT INTO regions (definition, description) " @@ -628,10 +631,11 @@ optional<OfflineRegion> OfflineDatabase::createRegion(const OfflineRegionDefinit return OfflineRegion(query.lastInsertRowId(), definition, metadata); } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "create region"); - return nullopt; + return unexpected<std::exception_ptr>(std::current_exception()); } -optional<OfflineRegionMetadata> OfflineDatabase::updateMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata) try { +expected<OfflineRegionMetadata, std::exception_ptr> +OfflineDatabase::updateMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata) try { // clang-format off mapbox::sqlite::Query query{ getStatement( "UPDATE regions SET description = ?1 " @@ -644,10 +648,10 @@ optional<OfflineRegionMetadata> OfflineDatabase::updateMetadata(const int64_t re return metadata; } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "update region metadata"); - return nullopt; + return unexpected<std::exception_ptr>(std::current_exception()); } -void OfflineDatabase::deleteRegion(OfflineRegion&& region) try { +std::exception_ptr OfflineDatabase::deleteRegion(OfflineRegion&& region) try { { mapbox::sqlite::Query query{ getStatement("DELETE FROM regions WHERE id = ?") }; query.bind(1, region.getID()); @@ -660,9 +664,10 @@ void OfflineDatabase::deleteRegion(OfflineRegion&& region) try { // Ensure that the cached offlineTileCount value is recalculated. offlineMapboxTileCount = {}; + return nullptr; } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "delete region"); - return; + return std::current_exception(); } optional<std::pair<Response, uint64_t>> OfflineDatabase::getRegionResource(int64_t regionID, const Resource& resource) try { @@ -848,7 +853,7 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) { } } -optional<OfflineRegionDefinition> OfflineDatabase::getRegionDefinition(int64_t regionID) try { +expected<OfflineRegionDefinition, std::exception_ptr> OfflineDatabase::getRegionDefinition(int64_t regionID) try { mapbox::sqlite::Query query{ getStatement("SELECT definition FROM regions WHERE id = ?1") }; query.bind(1, regionID); query.run(); @@ -856,10 +861,10 @@ optional<OfflineRegionDefinition> OfflineDatabase::getRegionDefinition(int64_t r return decodeOfflineRegionDefinition(query.get<std::string>(0)); } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "load region"); - return nullopt; + return unexpected<std::exception_ptr>(std::current_exception()); } -optional<OfflineRegionStatus> OfflineDatabase::getRegionCompletedStatus(int64_t regionID) try { +expected<OfflineRegionStatus, std::exception_ptr> OfflineDatabase::getRegionCompletedStatus(int64_t regionID) try { OfflineRegionStatus result; std::tie(result.completedResourceCount, result.completedResourceSize) @@ -873,7 +878,7 @@ optional<OfflineRegionStatus> OfflineDatabase::getRegionCompletedStatus(int64_t return result; } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "get region status"); - return nullopt; + return unexpected<std::exception_ptr>(std::current_exception()); } std::pair<int64_t, int64_t> OfflineDatabase::getCompletedResourceCountAndSize(int64_t regionID) { diff --git a/platform/default/mbgl/storage/offline_database.hpp b/platform/default/mbgl/storage/offline_database.hpp index cdad11b79e..fbe6c707e1 100644 --- a/platform/default/mbgl/storage/offline_database.hpp +++ b/platform/default/mbgl/storage/offline_database.hpp @@ -7,6 +7,7 @@ #include <mbgl/util/optional.hpp> #include <mbgl/util/constants.hpp> #include <mbgl/util/mapbox.hpp> +#include <mbgl/util/expected.hpp> #include <unordered_map> #include <memory> @@ -47,14 +48,15 @@ public: // Return value is (inserted, stored size) std::pair<bool, uint64_t> put(const Resource&, const Response&); - std::vector<OfflineRegion> listRegions(); + expected<OfflineRegions, std::exception_ptr> listRegions(); - optional<OfflineRegion> createRegion(const OfflineRegionDefinition&, - const OfflineRegionMetadata&); + expected<OfflineRegion, std::exception_ptr> createRegion(const OfflineRegionDefinition&, + const OfflineRegionMetadata&); - optional<OfflineRegionMetadata> updateMetadata(const int64_t regionID, const OfflineRegionMetadata&); + expected<OfflineRegionMetadata, std::exception_ptr> + updateMetadata(const int64_t regionID, const OfflineRegionMetadata&); - void deleteRegion(OfflineRegion&&); + std::exception_ptr deleteRegion(OfflineRegion&&); // Return value is (response, stored size) optional<std::pair<Response, uint64_t>> getRegionResource(int64_t regionID, const Resource&); @@ -62,8 +64,8 @@ public: uint64_t putRegionResource(int64_t regionID, const Resource&, const Response&); void putRegionResources(int64_t regionID, const std::list<std::tuple<Resource, Response>>&, OfflineRegionStatus&); - optional<OfflineRegionDefinition> getRegionDefinition(int64_t regionID); - optional<OfflineRegionStatus> getRegionCompletedStatus(int64_t regionID); + expected<OfflineRegionDefinition, std::exception_ptr> getRegionDefinition(int64_t regionID); + expected<OfflineRegionStatus, std::exception_ptr> getRegionCompletedStatus(int64_t regionID); void setOfflineMapboxTileCountLimit(uint64_t); uint64_t getOfflineMapboxTileCountLimit(); |