Skip to content

Commit 8aaeb25

Browse files
authored
Merge pull request groue#1653 from Jnosh/schema-changes-readonly
Fix DatabaseMigrator.hasSchemaChanges failing for readonly connections
2 parents 2c49a69 + a741fb3 commit 8aaeb25

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

GRDB/Migration/DatabaseMigrator.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ public struct DatabaseMigrator: Sendable {
333333
// Make sure the temporary database is configured
334334
// just as the migrated database
335335
var tmpConfig = db.configuration
336+
tmpConfig.readonly = false // We need write access
336337
tmpConfig.targetQueue = nil // Avoid deadlocks
337338
tmpConfig.writeTargetQueue = nil // Avoid deadlocks
338339
tmpConfig.label = "GRDB.DatabaseMigrator.temporary"

Tests/GRDBTests/DatabaseMigratorTests.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,42 @@ class DatabaseMigratorTests : GRDBTestCase {
679679
try migrator.migrate(dbQueue)
680680
}
681681

682+
func testHasSchemaChangesWorksWithReadonlyConfig() throws {
683+
// 1st version of the migrator
684+
var migrator1 = DatabaseMigrator()
685+
migrator1.registerMigration("1") { db in
686+
try db.create(table: "player") { t in
687+
t.autoIncrementedPrimaryKey("id")
688+
t.column("name", .text)
689+
}
690+
}
691+
692+
// 2nd version of the migrator
693+
var migrator2 = DatabaseMigrator()
694+
migrator2.registerMigration("1") { db in
695+
try db.create(table: "player") { t in
696+
t.autoIncrementedPrimaryKey("id")
697+
t.column("name", .text)
698+
t.column("score", .integer) // <- schema change, because reasons (development)
699+
}
700+
}
701+
702+
let dbName = ProcessInfo.processInfo.globallyUniqueString
703+
let dbQueue = try makeDatabaseQueue(filename: dbName)
704+
705+
try XCTAssertFalse(dbQueue.read(migrator1.hasSchemaChanges))
706+
try migrator1.migrate(dbQueue)
707+
try XCTAssertFalse(dbQueue.read(migrator1.hasSchemaChanges))
708+
try dbQueue.close()
709+
710+
// check that the migrator doesn't fail for a readonly connection
711+
dbConfiguration.readonly = true
712+
let readonlyQueue = try makeDatabaseQueue(filename: dbName)
713+
714+
try XCTAssertFalse(readonlyQueue.read(migrator1.hasSchemaChanges))
715+
try XCTAssertTrue(readonlyQueue.read(migrator2.hasSchemaChanges))
716+
}
717+
682718
func testEraseDatabaseOnSchemaChange() throws {
683719
// 1st version of the migrator
684720
var migrator1 = DatabaseMigrator()

0 commit comments

Comments
 (0)