diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift index 1129d719c8..48d9d8efc3 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift @@ -31,6 +31,9 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { /// The DataStore configuration var configuration: InternalDatastoreConfiguration + + /// The database name provider + let databaseNameProvider: DatabaseNameProvider? var storageEngine: StorageEngineBehavior! @@ -57,18 +60,21 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { /// No-argument init that uses defaults for all providers public init(modelRegistration: AmplifyModelRegistration, - configuration dataStoreConfiguration: DataStoreConfiguration = .default) { + configuration dataStoreConfiguration: DataStoreConfiguration = .default, + databaseNameProvider: DatabaseNameProvider? = nil) { self.modelRegistration = modelRegistration self.configuration = InternalDatastoreConfiguration( isSyncEnabled: false, validAPIPluginKey: "awsAPIPlugin", validAuthPluginKey: "awsCognitoAuthPlugin", pluginConfiguration: dataStoreConfiguration) + self.databaseNameProvider = databaseNameProvider self.storageEngineBehaviorFactory = StorageEngine.init( isSyncEnabled: dataStoreConfiguration: + databaseNameProvider: validAPIPluginKey: validAuthPluginKey: modelRegistryVersion: @@ -81,6 +87,7 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { /// Internal initializer for testing init(modelRegistration: AmplifyModelRegistration, configuration dataStoreConfiguration: DataStoreConfiguration = .default, + databaseNameProvider: DatabaseNameProvider? = nil, storageEngineBehaviorFactory: StorageEngineBehaviorFactory? = nil, dataStorePublisher: ModelSubcriptionBehavior, operationQueue: OperationQueue = OperationQueue(), @@ -92,11 +99,13 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey, pluginConfiguration: dataStoreConfiguration) + self.databaseNameProvider = databaseNameProvider self.storageEngineBehaviorFactory = storageEngineBehaviorFactory ?? StorageEngine.init( isSyncEnabled: dataStoreConfiguration: + databaseNameProvider: validAPIPluginKey: validAuthPluginKey: modelRegistryVersion: @@ -173,6 +182,7 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { storageEngine = try storageEngineBehaviorFactory( configuration.isSyncEnabled, dataStoreConfiguration, + databaseNameProvider, configuration.validAPIPluginKey, configuration.validAuthPluginKey, modelRegistration.version, diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/StorageEngine.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/StorageEngine.swift index 0ea14ad64b..8e84a4f2a4 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/StorageEngine.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/StorageEngine.swift @@ -13,11 +13,14 @@ import AWSPluginsCore typealias StorageEngineBehaviorFactory = (Bool, DataStoreConfiguration, + DatabaseNameProvider?, String, String, String, UserDefaults) throws -> StorageEngineBehavior +public typealias DatabaseNameProvider = () -> String + // swiftlint:disable type_body_length final class StorageEngine: StorageEngineBehavior { // TODO: Make this private once we get a mutation flow that passes the type of mutation as needed @@ -93,13 +96,14 @@ final class StorageEngine: StorageEngineBehavior { convenience init(isSyncEnabled: Bool, dataStoreConfiguration: DataStoreConfiguration, + databaseNameProvider: DatabaseNameProvider?, validAPIPluginKey: String = "awsAPIPlugin", validAuthPluginKey: String = "awsCognitoAuthPlugin", modelRegistryVersion: String, userDefault: UserDefaults = UserDefaults.standard) throws { let key = kCFBundleNameKey as String - let databaseName = Bundle.main.object(forInfoDictionaryKey: key) as? String ?? "app" + let databaseName = databaseNameProvider?() ?? Bundle.main.object(forInfoDictionaryKey: key) as? String ?? "app" let storageAdapter = try SQLiteStorageEngineAdapter(version: modelRegistryVersion, databaseName: databaseName)