Skip to content

Commit e32cc6c

Browse files
committed
comments
1 parent ba95437 commit e32cc6c

File tree

2 files changed

+44
-19
lines changed

2 files changed

+44
-19
lines changed

Sources/PostgreSQL/Message/PostgreSQLMessageSerializer.swift

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,54 @@ import Async
22
import Bits
33
import Foundation
44

5-
final class PostgreSQLMessageSerializer: ByteSerializer {
5+
/// Byte-stream serializer for `PostgreSQLMessage`.
6+
final class PostgreSQLMessageSerializer: TranslatingStream {
7+
/// See `TranslatingStream.Input`
68
typealias Input = PostgreSQLMessage
9+
10+
/// See `TranslatingStream.Output`
711
typealias Output = ByteBuffer
812

9-
var state: ByteSerializerState<PostgreSQLMessageSerializer>
13+
/// The internal buffer to serialize messages into.
1014
let buffer: MutableByteBuffer
1115

16+
/// Excess data from a previous serialization that needs to be processed.
17+
var excess: Data?
18+
19+
/// Creates a new `PostgreSQLMessageSerializer`.
1220
init(bufferSize: Int = 4096) {
1321
buffer = MutableByteBuffer(start: .allocate(capacity: bufferSize), count: bufferSize)
14-
state = .init()
1522
}
1623

17-
func serialize(_ message: PostgreSQLMessage, state: Data?) throws -> ByteSerializerResult<PostgreSQLMessageSerializer> {
18-
if let state = state {
19-
return serialize(data: state)
20-
}
24+
/// See `TranslatingStream.translate`
25+
func translate(input: PostgreSQLMessage) throws -> Future<TranslatingStreamResult<ByteBuffer>> {
26+
return try Future(_translate(input: input))
27+
}
2128

22-
let data = try PostgreSQLMessageEncoder().encode(message)
23-
return serialize(data: data)
29+
/// Non-future implementation of `TranslatingStream.translate`
30+
func _translate(input: PostgreSQLMessage) throws -> TranslatingStreamResult<ByteBuffer> {
31+
if let excess = self.excess {
32+
self.excess = nil
33+
return serialize(data: excess)
34+
} else {
35+
let data = try PostgreSQLMessageEncoder().encode(input)
36+
return serialize(data: data)
37+
}
2438
}
2539

26-
func serialize(data: Data) -> ByteSerializerResult<PostgreSQLMessageSerializer> {
27-
print("serialize: \(data.hexDebug)")
40+
/// Serializes data, storing `excess` if it does not fit in the buffer.
41+
func serialize(data: Data) -> TranslatingStreamResult<ByteBuffer> {
2842
let count = data.copyBytes(to: buffer)
2943
let view = ByteBuffer(start: buffer.baseAddress, count: count)
3044
if data.count > count {
31-
return .incomplete(view, state: data[count..<data.count])
45+
self.excess = data[count..<data.count]
46+
return .excess(view)
3247
} else {
33-
return .complete(view)
48+
return .sufficient(view)
3449
}
3550
}
3651

52+
/// Called when `PostgreSQLMessageSerializer` deinitializes.
3753
deinit {
3854
buffer.baseAddress?.deallocate(capacity: buffer.count)
3955
}

Sources/postgresql/Message/PostgreSQLMessageParser.swift

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,38 @@ import Async
22
import Bits
33
import Foundation
44

5+
/// Byte-stream parser for `PostgreSQLMessage`
56
final class PostgreSQLMessageParser: TranslatingStream {
7+
/// See `TranslatingStream.Input`
68
typealias Input = ByteBuffer
9+
10+
/// See `TranslatingStream.Output`
711
typealias Output = PostgreSQLMessage
812

13+
/// Data being worked on currently.
914
var buffered: Data
15+
16+
/// Excess data waiting to be parsed.
1017
var excess: Data?
1118

19+
/// Creates a new `PostgreSQLMessageParser`.
1220
init() {
1321
buffered = Data()
1422
}
1523

24+
/// See TranslatingStream.translate
1625
func translate(input: ByteBuffer) throws -> Future<TranslatingStreamResult<PostgreSQLMessage>> {
17-
return try Future(_translate(input: input))
18-
}
19-
20-
func _translate(input: ByteBuffer) throws -> TranslatingStreamResult<PostgreSQLMessage> {
26+
let result: TranslatingStreamResult<PostgreSQLMessage>
2127
if let excess = self.excess {
22-
return try parse(data: excess)
28+
self.excess = nil
29+
result = try parse(data: excess)
2330
} else {
24-
return try parse(data: Data(input))
31+
result = try parse(data: Data(input))
2532
}
33+
return Future(result)
2634
}
2735

36+
/// Parses the data, setting `excess` or requesting more data if insufficient.
2837
func parse(data: Data) throws -> TranslatingStreamResult<PostgreSQLMessage> {
2938
// print("Parse: \(data.hexDebug)")
3039
let data = buffered + data

0 commit comments

Comments
 (0)