Skip to content

Commit 1eb7714

Browse files
author
Sven Over
committed
Add ParameterDescription message to pg-protocol
1 parent 4b22927 commit 1eb7714

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

packages/pg-protocol/src/inbound-parser.test.ts

+35
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,35 @@ var expectedTwoRowMessage = {
144144
],
145145
}
146146

147+
var emptyParameterDescriptionBuffer = new BufferList()
148+
.addInt16(0) // number of parameters
149+
.join(true, 't')
150+
151+
var oneParameterDescBuf = buffers.parameterDescription([1111])
152+
153+
var twoParameterDescBuf = buffers.parameterDescription([2222, 3333])
154+
155+
var expectedEmptyParameterDescriptionMessage = {
156+
name: 'parameterDescription',
157+
length: 6,
158+
parameterCount: 0,
159+
dataTypeIDs: [],
160+
}
161+
162+
var expectedOneParameterMessage = {
163+
name: 'parameterDescription',
164+
length: 10,
165+
parameterCount: 1,
166+
dataTypeIDs: [1111],
167+
}
168+
169+
var expectedTwoParameterMessage = {
170+
name: 'parameterDescription',
171+
length: 14,
172+
parameterCount: 2,
173+
dataTypeIDs: [2222, 3333],
174+
}
175+
147176
var testForMessage = function (buffer: Buffer, expectedMessage: any) {
148177
it('recieves and parses ' + expectedMessage.name, async () => {
149178
const messages = await parseBuffers([buffer])
@@ -245,6 +274,12 @@ describe('PgPacketStream', function () {
245274
testForMessage(twoRowBuf, expectedTwoRowMessage)
246275
})
247276

277+
describe('parameterDescription messages', function () {
278+
testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage)
279+
testForMessage(oneParameterDescBuf, expectedOneParameterMessage)
280+
testForMessage(twoParameterDescBuf, expectedTwoParameterMessage)
281+
})
282+
248283
describe('parsing rows', function () {
249284
describe('parsing empty row', function () {
250285
testForMessage(emptyRowFieldBuf, {

packages/pg-protocol/src/messages.ts

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export type MessageName =
1111
| 'copyDone'
1212
| 'copyData'
1313
| 'rowDescription'
14+
| 'parameterDescription'
1415
| 'parameterStatus'
1516
| 'backendKeyData'
1617
| 'notification'
@@ -152,6 +153,14 @@ export class RowDescriptionMessage {
152153
}
153154
}
154155

156+
export class ParameterDescriptionMessage {
157+
public readonly name: MessageName = MessageName.parameterDescription
158+
public readonly dataTypeIDs: number[]
159+
constructor(public readonly length: number, public readonly parameterCount: number) {
160+
this.dataTypeIDs = new Array(this.parameterCount)
161+
}
162+
}
163+
155164
export class ParameterStatusMessage {
156165
public readonly name: MessageName = 'parameterStatus'
157166
constructor(

packages/pg-protocol/src/parser.ts

+14
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
CopyResponse,
1616
NotificationResponseMessage,
1717
RowDescriptionMessage,
18+
ParameterDescriptionMessage,
1819
Field,
1920
DataRowMessage,
2021
ParameterStatusMessage,
@@ -62,6 +63,7 @@ const enum MessageCodes {
6263
ErrorMessage = 0x45, // E
6364
NoticeMessage = 0x4e, // N
6465
RowDescriptionMessage = 0x54, // T
66+
ParameterDescriptionMessage = 0x74, // t
6567
PortalSuspended = 0x73, // s
6668
ReplicationStart = 0x57, // W
6769
EmptyQuery = 0x49, // I
@@ -188,6 +190,8 @@ export class Parser {
188190
return this.parseErrorMessage(offset, length, bytes, 'notice')
189191
case MessageCodes.RowDescriptionMessage:
190192
return this.parseRowDescriptionMessage(offset, length, bytes)
193+
case MessageCodes.ParameterDescriptionMessage:
194+
return this.parseParameterDescriptionMessage(offset, length, bytes)
191195
case MessageCodes.CopyIn:
192196
return this.parseCopyInMessage(offset, length, bytes)
193197
case MessageCodes.CopyOut:
@@ -264,6 +268,16 @@ export class Parser {
264268
return new Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode)
265269
}
266270

271+
private parseParameterDescriptionMessage(offset: number, length: number, bytes: Buffer) {
272+
this.reader.setBuffer(offset, bytes)
273+
const parameterCount = this.reader.int16()
274+
const message = new ParameterDescriptionMessage(length, parameterCount)
275+
for (let i = 0; i < parameterCount; i++) {
276+
message.dataTypeIDs[i] = this.reader.int32()
277+
}
278+
return message
279+
}
280+
267281
private parseDataRowMessage(offset: number, length: number, bytes: Buffer) {
268282
this.reader.setBuffer(offset, bytes)
269283
const fieldCount = this.reader.int16()

packages/pg-protocol/src/testing/test-buffers.ts

+10
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ const buffers = {
6262
return buf.join(true, 'T')
6363
},
6464

65+
parameterDescription: function (dataTypeIDs: number[]) {
66+
dataTypeIDs = dataTypeIDs || []
67+
var buf = new BufferList()
68+
buf.addInt16(dataTypeIDs.length)
69+
dataTypeIDs.forEach(function (dataTypeID) {
70+
buf.addInt32(dataTypeID)
71+
})
72+
return buf.join(true, 't')
73+
},
74+
6575
dataRow: function (columns: any[]) {
6676
columns = columns || []
6777
var buf = new BufferList()

0 commit comments

Comments
 (0)