From 3d80b1b3aac1b94bd4319a7a550942bd3e21f971 Mon Sep 17 00:00:00 2001 From: Lukas Kubanek Date: Fri, 24 Jul 2026 10:44:34 +0200 Subject: [PATCH] Fix in-memory metadatabase creation in defaultMetadatabase --- .../CloudKit/Internal/Metadatabase.swift | 7 ++++- .../CloudKitTests/MetadatabaseTests.swift | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Tests/SQLiteDataTests/CloudKitTests/MetadatabaseTests.swift 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