forked from vapor/postgres-nio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPSQLFrontendMessage.swift
134 lines (125 loc) · 3.71 KB
/
PSQLFrontendMessage.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import NIOCore
/// A wire message that is created by a Postgres client to be consumed by Postgres server.
///
/// All messages are defined in the official Postgres Documentation in the section
/// [Frontend/Backend Protocol – Message Formats](https://www.postgresql.org/docs/13/protocol-message-formats.html)
enum PSQLFrontendMessage {
case bind(Bind)
case cancel(Cancel)
case close(Close)
case describe(Describe)
case execute(Execute)
case flush
case parse(Parse)
case password(Password)
case saslInitialResponse(SASLInitialResponse)
case saslResponse(SASLResponse)
case sslRequest(SSLRequest)
case sync
case startup(Startup)
case terminate
enum ID: UInt8, Equatable {
case bind
case close
case describe
case execute
case flush
case parse
case password
case saslInitialResponse
case saslResponse
case sync
case terminate
init?(rawValue: UInt8) {
switch rawValue {
case UInt8(ascii: "B"):
self = .bind
case UInt8(ascii: "C"):
self = .close
case UInt8(ascii: "D"):
self = .describe
case UInt8(ascii: "E"):
self = .execute
case UInt8(ascii: "H"):
self = .flush
case UInt8(ascii: "P"):
self = .parse
case UInt8(ascii: "p"):
self = .password
case UInt8(ascii: "p"):
self = .saslInitialResponse
case UInt8(ascii: "p"):
self = .saslResponse
case UInt8(ascii: "S"):
self = .sync
case UInt8(ascii: "X"):
self = .terminate
default:
return nil
}
}
var rawValue: UInt8 {
switch self {
case .bind:
return UInt8(ascii: "B")
case .close:
return UInt8(ascii: "C")
case .describe:
return UInt8(ascii: "D")
case .execute:
return UInt8(ascii: "E")
case .flush:
return UInt8(ascii: "H")
case .parse:
return UInt8(ascii: "P")
case .password:
return UInt8(ascii: "p")
case .saslInitialResponse:
return UInt8(ascii: "p")
case .saslResponse:
return UInt8(ascii: "p")
case .sync:
return UInt8(ascii: "S")
case .terminate:
return UInt8(ascii: "X")
}
}
}
}
extension PSQLFrontendMessage {
var id: ID {
switch self {
case .bind:
return .bind
case .cancel:
preconditionFailure("Cancel messages don't have an identifier")
case .close:
return .close
case .describe:
return .describe
case .execute:
return .execute
case .flush:
return .flush
case .parse:
return .parse
case .password:
return .password
case .saslInitialResponse:
return .saslInitialResponse
case .saslResponse:
return .saslResponse
case .sslRequest:
preconditionFailure("SSL requests don't have an identifier")
case .startup:
preconditionFailure("Startup messages don't have an identifier")
case .sync:
return .sync
case .terminate:
return .terminate
}
}
}
protocol PSQLMessagePayloadEncodable {
func encode(into buffer: inout ByteBuffer)
}