@@ -12,24 +12,17 @@ extension PostgresConnection: PostgresDatabase {
12
12
self . channel. flush ( )
13
13
return promise. futureResult
14
14
}
15
-
15
+
16
16
public func withConnection< T> ( _ closure: ( PostgresConnection ) -> EventLoopFuture < T > ) -> EventLoopFuture < T > {
17
17
closure ( self )
18
18
}
19
19
}
20
20
21
- public protocol PostgresRequest {
22
- // return nil to end request
23
- func respond( to message: PostgresMessage ) throws -> [ PostgresMessage ] ?
24
- func start( ) throws -> [ PostgresMessage ]
25
- func log( to logger: Logger )
26
- }
27
-
28
21
final class PostgresRequestContext {
29
22
let delegate : PostgresRequest
30
23
let promise : EventLoopPromise < Void >
31
24
var lastError : Error ?
32
-
25
+
33
26
init ( delegate: PostgresRequest , promise: EventLoopPromise < Void > ) {
34
27
self . delegate = delegate
35
28
self . promise = promise
@@ -40,23 +33,23 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
40
33
typealias InboundIn = PostgresMessage
41
34
typealias OutboundIn = PostgresRequestContext
42
35
typealias OutboundOut = PostgresMessage
43
-
36
+
44
37
private var queue : [ PostgresRequestContext ]
45
38
let logger : Logger
46
-
39
+
47
40
public init ( logger: Logger ) {
48
41
self . queue = [ ]
49
42
self . logger = logger
50
43
}
51
-
44
+
52
45
private func _channelRead( context: ChannelHandlerContext , data: NIOAny ) throws {
53
46
let message = self . unwrapInboundIn ( data)
54
47
guard self . queue. count > 0 else {
55
48
// discard packet
56
49
return
57
50
}
58
51
let request = self . queue [ 0 ]
59
-
52
+
60
53
switch message. identifier {
61
54
case . error:
62
55
let error = try PostgresMessage . Error ( message: message)
@@ -67,7 +60,7 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
67
60
self . logger. notice ( " \( notice) " )
68
61
default : break
69
62
}
70
-
63
+
71
64
if let responses = try request. delegate. respond ( to: message) {
72
65
for response in responses {
73
66
context. write ( self . wrapOutboundOut ( response) , promise: nil )
@@ -82,7 +75,7 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
82
75
}
83
76
}
84
77
}
85
-
78
+
86
79
func channelRead( context: ChannelHandlerContext , data: NIOAny ) {
87
80
do {
88
81
try self . _channelRead ( context: context, data: data)
@@ -92,7 +85,7 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
92
85
// Regardless of error, also pass the message downstream; this is necessary for PostgresNotificationHandler (which is appended at the end) to receive notifications
93
86
context. fireChannelRead ( data)
94
87
}
95
-
88
+
96
89
func write( context: ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
97
90
let request = self . unwrapOutboundIn ( data)
98
91
self . queue. append ( request)
@@ -105,13 +98,16 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
105
98
self . errorCaught ( context: context, error: error)
106
99
}
107
100
}
108
-
101
+
109
102
func close( context: ChannelHandlerContext , mode: CloseMode , promise: EventLoopPromise < Void > ? ) {
103
+ let terminate = try ! PostgresMessage . Terminate ( ) . message ( )
104
+ context. write ( self . wrapOutboundOut ( terminate) , promise: nil )
105
+ context. close ( mode: mode, promise: promise)
106
+
110
107
for current in self . queue {
111
108
current. promise. fail ( PostgresError . connectionClosed)
112
109
}
113
110
self . queue = [ ]
114
- context. close ( mode: mode, promise: promise)
115
111
}
116
112
}
117
113
0 commit comments