From 45ca132fc5fba3ce11e7a83177172bae99e4e280 Mon Sep 17 00:00:00 2001 From: Garet Halliday <ghalliday@gfxlabs.io> Date: Fri, 2 Sep 2022 16:37:15 -0500 Subject: [PATCH] i love packetgen --- lib/gat/client.go | 13 ++++++++++--- lib/gat/protocol/backend.go | 26 ++++++++++++++++++-------- lib/gat/protocol/mod.go | 2 +- spec/protocol/backend.yaml | 5 ++++- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/lib/gat/client.go b/lib/gat/client.go index 95b0b717..938042e3 100644 --- a/lib/gat/client.go +++ b/lib/gat/client.go @@ -183,7 +183,9 @@ func (c *Client) Accept(ctx context.Context) error { } } c.log.Debug().Msg("Password authentication successful") - err = WriteAuthOk(c.wr) + authOk := new(protocol.Authentication) + authOk.Fields.Data = []byte{0, 0, 0, 0} + _, err = authOk.Write(c.wr) if err != nil { return err } @@ -191,11 +193,16 @@ func (c *Client) Accept(ctx context.Context) error { if err != nil { return err } - err = WriteBackendKeyData(c.wr, c.pid, c.secret_key) + backendKeyData := new(protocol.BackendKeyData) + backendKeyData.Fields.ProcessID = c.pid + backendKeyData.Fields.SecretKey = c.secret_key + _, err = backendKeyData.Write(c.wr) if err != nil { return err } - err = WriteReadyForQuery(c.wr) + readyForQuery := new(protocol.ReadyForQuery) + readyForQuery.Fields.Status = byte('I') + _, err = readyForQuery.Write(c.wr) if err != nil { return err } diff --git a/lib/gat/protocol/backend.go b/lib/gat/protocol/backend.go index aca9c0c4..890b969e 100644 --- a/lib/gat/protocol/backend.go +++ b/lib/gat/protocol/backend.go @@ -1553,26 +1553,36 @@ func (T *PortalSuspended) Write(writer io.Writer) (length int, err error) { var _ Packet = (*PortalSuspended)(nil) -type FieldsReadForQuery struct { +type FieldsReadyForQuery struct { + Status byte } -func (T *FieldsReadForQuery) Read(payloadLength int, reader io.Reader) (err error) { +func (T *FieldsReadyForQuery) Read(payloadLength int, reader io.Reader) (err error) { + T.Status, err = ReadByte(reader) + if err != nil { + return + } return } -func (T *FieldsReadForQuery) Write(writer io.Writer) (length int, err error) { +func (T *FieldsReadyForQuery) Write(writer io.Writer) (length int, err error) { var temp int + temp, err = WriteByte(writer, T.Status) + if err != nil { + return + } + length += temp _ = temp return } -type ReadForQuery struct { - Fields FieldsReadForQuery +type ReadyForQuery struct { + Fields FieldsReadyForQuery } // Read reads all but the packet identifier // WARNING: This packet DOES have an identifier. Call protocol.Read or trim the identifier first! -func (T *ReadForQuery) Read(reader io.Reader) (err error) { +func (T *ReadyForQuery) Read(reader io.Reader) (err error) { var length int32 length, err = ReadInt32(reader) if err != nil { @@ -1581,7 +1591,7 @@ func (T *ReadForQuery) Read(reader io.Reader) (err error) { return T.Fields.Read(int(length-4), reader) } -func (T *ReadForQuery) Write(writer io.Writer) (length int, err error) { +func (T *ReadyForQuery) Write(writer io.Writer) (length int, err error) { // TODO replace with pool var buf bytes.Buffer length, err = T.Fields.Write(&buf) @@ -1604,7 +1614,7 @@ func (T *ReadForQuery) Write(writer io.Writer) (length int, err error) { return } -var _ Packet = (*ReadForQuery)(nil) +var _ Packet = (*ReadyForQuery)(nil) type FieldsRowDescriptionFields struct { Name string diff --git a/lib/gat/protocol/mod.go b/lib/gat/protocol/mod.go index aa3e82f3..a62b287d 100644 --- a/lib/gat/protocol/mod.go +++ b/lib/gat/protocol/mod.go @@ -86,7 +86,7 @@ func Read(reader io.Reader) (packet Packet, err error) { case byte('Q'): packet = new(Query) case byte('Z'): - packet = new(ReadForQuery) + packet = new(ReadyForQuery) case byte('T'): packet = new(RowDescription) case byte('p'): diff --git a/spec/protocol/backend.yaml b/spec/protocol/backend.yaml index 467c2c35..eeffccbd 100644 --- a/spec/protocol/backend.yaml +++ b/spec/protocol/backend.yaml @@ -122,8 +122,11 @@ ParseComplete: Identifier: '1' PortalSuspended: Identifier: 's' -ReadForQuery: +ReadyForQuery: Identifier: 'Z' + Fields: + - Name: Status + Type: byte RowDescription: Identifier: 'T' Fields: -- GitLab