diff --git a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift index d6638f63..92ca054d 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift @@ -24,7 +24,12 @@ throw InMemoryDatabase() } - let metadatabase = try DatabasePool(path: url.path(percentEncoded: false)) + let metadatabase: any DatabaseWriter = + if url.isInMemory { + try DatabaseQueue(path: url.absoluteString) + } else { + try DatabasePool(path: url.path(percentEncoded: false)) + } 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..8657d2a9 --- /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 + ) + let mainDatabaseFile = try metadatabase.read { db in + try String.fetchOne(db, sql: "SELECT file FROM pragma_database_list WHERE name = 'main'") + } + // NB: SQLite reports an empty file path for in-memory databases. A non-empty path + // means the metadatabase was silently created on disk. + #expect(mainDatabaseFile == "") + } + } +#endif