diff --git a/Sources/SQLiteData/CloudKit/DefaultSyncEngine.swift b/Sources/SQLiteData/CloudKit/DefaultSyncEngine.swift index a8edd53c..af7264f8 100644 --- a/Sources/SQLiteData/CloudKit/DefaultSyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/DefaultSyncEngine.swift @@ -55,11 +55,7 @@ } public static var testValue: SyncEngine { - try! SyncEngine( - for: DatabasePool( - path: URL.temporaryDirectory.appending(path: "\(UUID().uuidString).sqlite").path() - ) - ) + try! SyncEngine(for: temporaryDatabasePool()) } } #endif diff --git a/Sources/SQLiteData/Internal/TemporaryDatabase.swift b/Sources/SQLiteData/Internal/TemporaryDatabase.swift new file mode 100644 index 00000000..1da57181 --- /dev/null +++ b/Sources/SQLiteData/Internal/TemporaryDatabase.swift @@ -0,0 +1,36 @@ +import Foundation +import GRDB + +func temporaryDatabasePool(configuration: Configuration = Configuration()) throws -> DatabasePool { + try FileManager.default.createDirectory( + at: temporaryDatabaseDirectory, withIntermediateDirectories: true + ) + return try DatabasePool( + path: temporaryDatabaseDirectory + .appending(path: "\(UUID().uuidString).db") + .path(percentEncoded: false), + configuration: configuration + ) +} + +private let temporaryDatabaseDirectory: URL = { + let directory = URL.temporaryDirectory.appending( + path: "co.pointfree.SQLiteData", + directoryHint: .isDirectory + ) + let processDirectories = + (try? FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil)) + ?? [] + for processDirectory in processDirectories { + guard + let processIdentifier = pid_t(processDirectory.lastPathComponent), + kill(processIdentifier, 0) != 0, + errno == ESRCH + else { continue } + try? FileManager.default.removeItem(at: processDirectory) + } + return directory.appending( + path: "\(ProcessInfo.processInfo.processIdentifier)", + directoryHint: .isDirectory + ) +}() diff --git a/Sources/SQLiteData/StructuredQueries+GRDB/DefaultDatabase.swift b/Sources/SQLiteData/StructuredQueries+GRDB/DefaultDatabase.swift index 2f70021d..1a6ee3ca 100644 --- a/Sources/SQLiteData/StructuredQueries+GRDB/DefaultDatabase.swift +++ b/Sources/SQLiteData/StructuredQueries+GRDB/DefaultDatabase.swift @@ -36,10 +36,7 @@ public func defaultDatabase( } database = try DatabasePool(path: path ?? defaultPath, configuration: configuration) case .preview, .test: - database = try DatabasePool( - path: "\(NSTemporaryDirectory())\(UUID().uuidString).db", - configuration: configuration - ) + database = try temporaryDatabasePool(configuration: configuration) } return database }