Files
UUVPN/iOS-SwiftUI-Code/GRDB.swift-6.29.3/GRDB/Core/TransactionClock.swift
T

66 lines
2.2 KiB
Swift

import Foundation
/// A type that provides the moment of a transaction.
///
/// - note: [**🔥 EXPERIMENTAL**](https://github.com/groue/GRDB.swift/blob/master/README.md#what-are-experimental-features)
///
/// ## Topics
///
/// ### Built-in Clocks
///
/// - ``DefaultTransactionClock``
/// - ``CustomTransactionClock``
public protocol TransactionClock {
/// Returns the date of the current transaction.
///
/// This function is called whenever a transaction starts - precisely
/// speaking, whenever the database connection leaves the auto-commit mode.
///
/// It is also called when the ``Database/transactionDate`` property is
/// called, and the database connection is not in a transaction.
///
/// Related SQLite documentation: <https://www.sqlite.org/c3ref/get_autocommit.html>
func now(_ db: Database) throws -> Date
}
extension TransactionClock where Self == DefaultTransactionClock {
/// Returns the default clock.
public static var `default`: Self { DefaultTransactionClock() }
}
extension TransactionClock where Self == CustomTransactionClock {
/// Returns a custom clock.
///
/// The provided closure is called whenever a transaction starts - precisely
/// speaking, whenever the database connection leaves the auto-commit mode.
///
/// It is also called when the ``Database/transactionDate`` property is
/// called, and the database connection is not in a transaction.
public static func custom(_ now: @escaping (Database) throws -> Date) -> Self {
CustomTransactionClock(now)
}
}
/// The default transaction clock.
public struct DefaultTransactionClock: TransactionClock {
/// Returns the start date of the current transaction.
public func now(_ db: Database) throws -> Date {
// An opportunity to fetch transaction time from the database when
// SQLite supports the feature.
Date()
}
}
/// A custom transaction clock.
public struct CustomTransactionClock: TransactionClock {
let _now: (Database) throws -> Date
public init(_ now: @escaping (Database) throws -> Date) {
self._now = now
}
public func now(_ db: Database) throws -> Date {
try _now(db)
}
}