Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit 03a4dc2

Browse files
committedAug 6, 2018
[core] harden OfflineDatabase
1 parent 99a365d commit 03a4dc2

16 files changed

+1157
-353
lines changed
 

‎cmake/test-files.cmake

+2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ set(MBGL_TEST_FILES
9595
test/src/mbgl/test/fixture_log_observer.hpp
9696
test/src/mbgl/test/getrss.cpp
9797
test/src/mbgl/test/getrss.hpp
98+
test/src/mbgl/test/sqlite3_test_fs.cpp
99+
test/src/mbgl/test/sqlite3_test_fs.hpp
98100
test/src/mbgl/test/stub_file_source.cpp
99101
test/src/mbgl/test/stub_file_source.hpp
100102
test/src/mbgl/test/stub_geometry_tile_feature.hpp

‎include/mbgl/storage/offline.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,11 @@ class OfflineRegion {
187187
public:
188188
// Move-only; not publicly constructible.
189189
OfflineRegion(OfflineRegion&&);
190-
OfflineRegion& operator=(OfflineRegion&&);
191190
~OfflineRegion();
192191

193192
OfflineRegion() = delete;
194193
OfflineRegion(const OfflineRegion&) = delete;
194+
OfflineRegion& operator=(OfflineRegion&&) = delete;
195195
OfflineRegion& operator=(const OfflineRegion&) = delete;
196196

197197
int64_t getID() const;

‎platform/default/default_file_source.cpp

+19-9
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ class DefaultFileSource::Impl {
7474
}
7575

7676
void getRegionStatus(int64_t regionID, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) {
77-
try {
78-
callback({}, getDownload(regionID).getStatus());
79-
} catch (...) {
77+
if (auto download = getDownload(regionID)) {
78+
callback({}, download->getStatus());
79+
} else {
8080
callback(std::current_exception(), {});
8181
}
8282
}
@@ -92,11 +92,15 @@ class DefaultFileSource::Impl {
9292
}
9393

9494
void setRegionObserver(int64_t regionID, std::unique_ptr<OfflineRegionObserver> observer) {
95-
getDownload(regionID).setObserver(std::move(observer));
95+
if (auto download = getDownload(regionID)) {
96+
download->setObserver(std::move(observer));
97+
}
9698
}
9799

98100
void setRegionDownloadState(int64_t regionID, OfflineRegionDownloadState state) {
99-
getDownload(regionID).setState(state);
101+
if (auto download = getDownload(regionID)) {
102+
download->setState(state);
103+
}
100104
}
101105

102106
void request(AsyncRequest* req, Resource resource, ActorRef<FileSourceRequest> ref) {
@@ -181,13 +185,19 @@ class DefaultFileSource::Impl {
181185
}
182186

183187
private:
184-
OfflineDownload& getDownload(int64_t regionID) {
188+
OfflineDownload* getDownload(int64_t regionID) {
185189
auto it = downloads.find(regionID);
186190
if (it != downloads.end()) {
187-
return *it->second;
191+
return it->second.get();
192+
}
193+
auto definition = offlineDatabase->getRegionDefinition(regionID);
194+
if (!definition) {
195+
return nullptr;
188196
}
189-
return *downloads.emplace(regionID,
190-
std::make_unique<OfflineDownload>(regionID, offlineDatabase->getRegionDefinition(regionID), *offlineDatabase, onlineFileSource)).first->second;
197+
198+
auto download = std::make_unique<OfflineDownload>(regionID, std::move(*definition),
199+
*offlineDatabase, onlineFileSource);
200+
return downloads.emplace(regionID, std::move(download)).first->second.get();
191201
}
192202

193203
// shared so that destruction is done on the creating thread

0 commit comments

Comments
 (0)
This repository has been archived.