Skip to content

Commit 3f3b361

Browse files
authored
fix promise leak (vapor#57)
* fix promise leak * remove comment * fix channel write promise
1 parent 9f7184d commit 3f3b361

File tree

3 files changed

+55
-11
lines changed

3 files changed

+55
-11
lines changed

Sources/PostgresNIO/Connection/PostgresRequest.swift

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,6 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
8383
}
8484
}
8585

86-
private func _write(context: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) throws {
87-
let request = self.unwrapOutboundIn(data)
88-
self.queue.append(request)
89-
let messages = try request.delegate.start()
90-
for message in messages {
91-
context.write(self.wrapOutboundOut(message), promise: nil)
92-
}
93-
context.flush()
94-
}
95-
9686
func channelRead(context: ChannelHandlerContext, data: NIOAny) {
9787
do {
9888
try self._channelRead(context: context, data: data)
@@ -102,9 +92,14 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
10292
}
10393

10494
func write(context: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) {
95+
let request = self.unwrapOutboundIn(data)
96+
self.queue.append(request)
10597
do {
106-
try self._write(context: context, data: data, promise: promise)
98+
let messages = try request.delegate.start()
99+
self.write(context: context, items: messages, promise: promise)
100+
context.flush()
107101
} catch {
102+
promise?.fail(error)
108103
self.errorCaught(context: context, error: error)
109104
}
110105
}
@@ -117,3 +112,18 @@ final class PostgresRequestHandler: ChannelDuplexHandler {
117112
context.close(mode: mode, promise: promise)
118113
}
119114
}
115+
116+
117+
extension ChannelInboundHandler {
118+
func write(context: ChannelHandlerContext, items: [OutboundOut], promise: EventLoopPromise<Void>?) {
119+
var items = items
120+
if let last = items.popLast() {
121+
for item in items {
122+
context.write(self.wrapOutboundOut(item), promise: nil)
123+
}
124+
context.write(self.wrapOutboundOut(last), promise: promise)
125+
} else {
126+
promise?.succeed(())
127+
}
128+
}
129+
}

Sources/PostgresNIO/Data/PostgresData+Double.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,20 @@ extension PostgresData {
3131
}
3232
}
3333
}
34+
35+
extension Double: PostgresDataConvertible {
36+
public static var postgresDataType: PostgresDataType {
37+
return .float8
38+
}
39+
40+
public init?(postgresData: PostgresData) {
41+
guard let double = postgresData.double else {
42+
return nil
43+
}
44+
self = double
45+
}
46+
47+
public var postgresData: PostgresData? {
48+
return .init(double: self)
49+
}
50+
}

Sources/PostgresNIO/Data/PostgresData+Float.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,20 @@ extension PostgresData {
2727
}
2828
}
2929
}
30+
31+
extension Float: PostgresDataConvertible {
32+
public static var postgresDataType: PostgresDataType {
33+
return .float4
34+
}
35+
36+
public init?(postgresData: PostgresData) {
37+
guard let float = postgresData.float else {
38+
return nil
39+
}
40+
self = float
41+
}
42+
43+
public var postgresData: PostgresData? {
44+
return .init(float: self)
45+
}
46+
}

0 commit comments

Comments
 (0)