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

Cherry-pick #9817: Remove database on schema downgrade #9837

Merged
merged 3 commits into from
Aug 29, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion platform/default/mbgl/storage/offline_database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void OfflineDatabase::ensureSchema() {
case 3: // no-op and fall through
case 4: migrateToVersion5(); // fall through
case 5: return;
default: throw std::runtime_error("unknown schema version");
default: break; // downgrade, delete the database
}

removeExisting();
Expand Down
Binary file added test/fixtures/offline_database/v999.db
Binary file not shown.
35 changes: 35 additions & 0 deletions test/storage/offline_database.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,17 @@ static int databaseSyncMode(const std::string& path) {
return stmt.get<int>(0);
}

static std::vector<std::string> databaseTableColumns(const std::string& path, const std::string& name) {
mapbox::sqlite::Database db(path, mapbox::sqlite::ReadOnly);
const auto sql = std::string("pragma table_info(") + name + ")";
mapbox::sqlite::Statement stmt = db.prepare(sql.c_str());
std::vector<std::string> columns;
while (stmt.run()) {
columns.push_back(stmt.get<std::string>(1));
}
return columns;
}

TEST(OfflineDatabase, MigrateFromV2Schema) {
using namespace mbgl;

Expand Down Expand Up @@ -698,3 +709,27 @@ TEST(OfflineDatabase, MigrateFromV4Schema) {
// Synchronous setting should be FULL (2) after migration to v5.
EXPECT_EQ(2, databaseSyncMode("test/fixtures/offline_database/v5.db"));
}

TEST(OfflineDatabase, DowngradeSchema) {
using namespace mbgl;

// v999.db is a v999 database, it should be deleted
// and recreated with the current schema.

deleteFile("test/fixtures/offline_database/migrated.db");
writeFile("test/fixtures/offline_database/migrated.db", util::read_file("test/fixtures/offline_database/v999.db"));

{
OfflineDatabase db("test/fixtures/offline_database/migrated.db", 0);
}

EXPECT_EQ(5, databaseUserVersion("test/fixtures/offline_database/migrated.db"));

EXPECT_EQ((std::vector<std::string>{ "id", "url_template", "pixel_ratio", "z", "x", "y",
"expires", "modified", "etag", "data", "compressed",
"accessed" }),
databaseTableColumns("test/fixtures/offline_database/migrated.db", "tiles"));
EXPECT_EQ((std::vector<std::string>{ "id", "url", "kind", "expires", "modified", "etag", "data",
"compressed", "accessed" }),
databaseTableColumns("test/fixtures/offline_database/migrated.db", "resources"));
}