-
-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathPSQLTask.swift
119 lines (105 loc) · 3.43 KB
/
PSQLTask.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import Logging
import NIOCore
enum HandlerTask {
case extendedQuery(ExtendedQueryContext)
case closeCommand(CloseCommandContext)
case startListening(NotificationListener)
case cancelListening(String, Int)
case executePreparedStatement(PreparedStatementContext)
}
enum PSQLTask {
case extendedQuery(ExtendedQueryContext, writePromise: EventLoopPromise<Void>?)
case closeCommand(CloseCommandContext, writePromise: EventLoopPromise<Void>?)
func failWithError(_ error: PSQLError) {
switch self {
case .extendedQuery(let extendedQueryContext, let writePromise):
switch extendedQueryContext.query {
case .unnamed(_, let eventLoopPromise):
eventLoopPromise.fail(error)
case .executeStatement(_, let eventLoopPromise):
eventLoopPromise.fail(error)
case .prepareStatement(_, _, _, let eventLoopPromise):
eventLoopPromise.fail(error)
}
writePromise?.fail(error)
case .closeCommand(let closeCommandContext, let writePromise):
closeCommandContext.promise.fail(error)
writePromise?.fail(error)
}
}
}
final class ExtendedQueryContext {
enum Query {
case unnamed(PostgresQuery, EventLoopPromise<PSQLRowStream>)
case executeStatement(PSQLExecuteStatement, EventLoopPromise<PSQLRowStream>)
case prepareStatement(name: String, query: String, bindingDataTypes: [PostgresDataType], EventLoopPromise<RowDescription?>)
}
let query: Query
let logger: Logger
init(
query: PostgresQuery,
logger: Logger,
promise: EventLoopPromise<PSQLRowStream>
) {
self.query = .unnamed(query, promise)
self.logger = logger
}
init(
executeStatement: PSQLExecuteStatement,
logger: Logger,
promise: EventLoopPromise<PSQLRowStream>
) {
self.query = .executeStatement(executeStatement, promise)
self.logger = logger
}
init(
name: String,
query: String,
bindingDataTypes: [PostgresDataType],
logger: Logger,
promise: EventLoopPromise<RowDescription?>
) {
self.query = .prepareStatement(name: name, query: query, bindingDataTypes: bindingDataTypes, promise)
self.logger = logger
}
}
final class PreparedStatementContext: Sendable {
let name: String
let sql: String
let bindingDataTypes: [PostgresDataType]
let bindings: PostgresBindings
let logger: Logger
let promise: EventLoopPromise<PSQLRowStream>
init(
name: String,
sql: String,
bindings: PostgresBindings,
bindingDataTypes: [PostgresDataType],
logger: Logger,
promise: EventLoopPromise<PSQLRowStream>
) {
self.name = name
self.sql = sql
self.bindings = bindings
if bindingDataTypes.isEmpty {
self.bindingDataTypes = bindings.metadata.map(\.dataType)
} else {
self.bindingDataTypes = bindingDataTypes
}
self.logger = logger
self.promise = promise
}
}
final class CloseCommandContext {
let target: CloseTarget
let logger: Logger
let promise: EventLoopPromise<Void>
init(target: CloseTarget,
logger: Logger,
promise: EventLoopPromise<Void>
) {
self.target = target
self.logger = logger
self.promise = promise
}
}