diff --git a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift index fb316fd9..5b075097 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift @@ -27,10 +27,18 @@ var metadatabaseConfiguration = Configuration() metadatabaseConfiguration.observesSuspensionNotifications = configuration.observesSuspensionNotifications - let metadatabase = try DatabasePool( - path: url.path(percentEncoded: false), - configuration: metadatabaseConfiguration - ) + let metadatabase: any DatabaseWriter = + if url.isInMemory { + try DatabaseQueue( + path: url.absoluteString, + configuration: metadatabaseConfiguration + ) + } else { + try DatabasePool( + path: url.path(percentEncoded: false), + configuration: metadatabaseConfiguration + ) + } try migrate(metadatabase: metadatabase) return metadatabase } diff --git a/Tests/SQLiteDataTests/CloudKitTests/MetadatabaseTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MetadatabaseTests.swift new file mode 100644 index 00000000..eb00882a --- /dev/null +++ b/Tests/SQLiteDataTests/CloudKitTests/MetadatabaseTests.swift @@ -0,0 +1,26 @@ +#if canImport(CloudKit) + import Foundation + import GRDB + import OSLog + @testable import SQLiteData + import Testing + + @Suite struct MetadatabaseTests { + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + @Test func inMemoryMetadatabase() throws { + let url = try URL.metadatabase(databasePath: ":memory:", containerIdentifier: nil) + #expect(url.isInMemory) + + let metadatabase = try defaultMetadatabase( + logger: Logger(subsystem: "test", category: "test"), + url: url, + configuration: Configuration() + ) + let mainDatabaseFile = try metadatabase.read { db in + try String.fetchOne(db, sql: "SELECT file FROM pragma_database_list WHERE name = 'main'") + } + // Metadatabase is in-memory + #expect(mainDatabaseFile == "") + } + } +#endif