-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathFluentSQLiteDriver.swift
59 lines (49 loc) · 1.79 KB
/
FluentSQLiteDriver.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import NIOCore
import FluentKit
@preconcurrency import AsyncKit
import SQLiteNIO
import SQLiteKit
import Logging
struct FluentSQLiteDriver: DatabaseDriver {
let pool: EventLoopGroupConnectionPool<SQLiteConnectionSource>
let dataEncoder: SQLiteDataEncoder
let dataDecoder: SQLiteDataDecoder
let sqlLogLevel: Logger.Level?
var eventLoopGroup: any EventLoopGroup {
self.pool.eventLoopGroup
}
func makeDatabase(with context: DatabaseContext) -> any Database {
FluentSQLiteDatabase(
database: ConnectionPoolSQLiteDatabase(pool: self.pool.pool(for: context.eventLoop), logger: context.logger),
context: context,
dataEncoder: self.dataEncoder,
dataDecoder: self.dataDecoder,
queryLogLevel: self.sqlLogLevel,
inTransaction: false
)
}
func shutdown() {
try? self.pool.syncShutdownGracefully()
}
func shutdownAsync() async {
try? await self.pool.shutdownAsync()
}
}
struct ConnectionPoolSQLiteDatabase: SQLiteDatabase {
let pool: EventLoopConnectionPool<SQLiteConnectionSource>
let logger: Logger
var eventLoop: any EventLoop {
self.pool.eventLoop
}
func lastAutoincrementID() -> EventLoopFuture<Int> {
self.pool.withConnection(logger: self.logger) { $0.lastAutoincrementID() }
}
func withConnection<T>(_ closure: @escaping (SQLiteConnection) -> EventLoopFuture<T>) -> EventLoopFuture<T> {
self.pool.withConnection(logger: self.logger) { closure($0) }
}
func query(_ query: String, _ binds: [SQLiteData], logger: Logger, _ onRow: @escaping @Sendable (SQLiteRow) -> Void) -> EventLoopFuture<Void> {
self.withConnection {
$0.query(query, binds, logger: logger, onRow)
}
}
}