Merge branch 'charlesmchen/grdbSchemaVersionCheck' into release/3.0.0

This commit is contained in:
Matthew Chen 2019-11-19 11:03:37 -03:00
commit f0598a7c8d
3 changed files with 62 additions and 1 deletions

View File

@ -19,6 +19,8 @@ public class GRDBSchemaMigrator: NSObject {
} else {
try! newUserMigrator.migrate(grdbStorage.pool)
}
SSKPreferences.markGRDBSchemaAsLatest()
}
private var hasCreatedInitialSchema: Bool {
@ -44,8 +46,15 @@ public class GRDBSchemaMigrator: NSObject {
case signalAccount_add_contactAvatars
case signalAccount_add_contactAvatars_indices
case jobRecords_add_attachmentId
// NOTE: Every time we add a migration id, consider
// incrementing grdbSchemaVersionLatest.
// We only need to do this for breaking changes.
}
public static let grdbSchemaVersionDefault: UInt = 0
public static let grdbSchemaVersionLatest: UInt = 1
// An optimization for new users, we have the first migration import the latest schema
// and mark any other migrations as "already run".
private lazy var newUserMigrator: DatabaseMigrator = {

View File

@ -113,10 +113,14 @@ NSString *NSStringForDataStore(DataStore value)
// Allow developers to do this, but not QA, internal,
// public beta or production.
!SSKFeatureFlags.canRevertToYDB) {
OWSFailDebug(@"Reverting to YDB.");
return YES;
}
// TODO: also return true if unknown GRDB version.
if (SSKPreferences.hasUnknownGRDBSchema) {
OWSFailDebug(@"Unknown GRDB schema.");
return YES;
}
return NO;
}

View File

@ -107,4 +107,52 @@ public class SSKPreferences: NSObject {
appUserDefaults.set(value, forKey: didEverUseYdbKey)
appUserDefaults.synchronize()
}
// MARK: -
public class var grdbSchemaVersionDefault: UInt {
return GRDBSchemaMigrator.grdbSchemaVersionDefault
}
public class var grdbSchemaVersionLatest: UInt {
return GRDBSchemaMigrator.grdbSchemaVersionLatest
}
private static let grdbSchemaVersionKey = "grdbSchemaVersion"
private static func grdbSchemaVersion() -> UInt {
let appUserDefaults = CurrentAppContext().appUserDefaults()
guard let preference = appUserDefaults.object(forKey: grdbSchemaVersionKey) as? NSNumber else {
return grdbSchemaVersionDefault
}
return preference.uintValue
}
private static func setGrdbSchemaVersion(_ value: UInt) {
let lastKnownGrdbSchemaVersion = grdbSchemaVersion()
guard value != lastKnownGrdbSchemaVersion else {
return
}
guard value > lastKnownGrdbSchemaVersion else {
owsFailDebug("Reverting to earlier schema version: \(value)")
return
}
Logger.info("Updating schema version: \(lastKnownGrdbSchemaVersion) -> \(value)")
let appUserDefaults = CurrentAppContext().appUserDefaults()
appUserDefaults.set(value, forKey: grdbSchemaVersionKey)
appUserDefaults.synchronize()
}
@objc
public static func markGRDBSchemaAsLatest() {
setGrdbSchemaVersion(grdbSchemaVersionLatest)
}
@objc
public static func hasUnknownGRDBSchema() -> Bool {
guard grdbSchemaVersion() <= grdbSchemaVersionLatest else {
owsFailDebug("grdbSchemaVersion: \(grdbSchemaVersion()), grdbSchemaVersionLatest: \(grdbSchemaVersionLatest)")
return true
}
return false
}
}