diff --git a/codegen/protocol/packets.tmpl b/codegen/protocol/packets.tmpl index 9a27869763e7979f29bb5bd4d409c58e113b89c5..804e42c676e61e629a848f7e433a9396b96ac7d9 100644 --- a/codegen/protocol/packets.tmpl +++ b/codegen/protocol/packets.tmpl @@ -164,4 +164,29 @@ import "io" fields Fields{{$name}} } + func (T *{{$name}}) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + {{if $packet.Identifier -}} + _, err = WriteByte(writer, byte('{{$packet.Identifier}}')) + if err != nil { + length = 1 + return + } + {{end -}} + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return + } + {{end -}} \ No newline at end of file diff --git a/lib/gat/protocol/backend.go b/lib/gat/protocol/backend.go index 8e193dec60c6808a6623c8a2179d77bb1e36f7fc..97576ef21109a73cb7af0ead2dad2df9dded7d92 100644 --- a/lib/gat/protocol/backend.go +++ b/lib/gat/protocol/backend.go @@ -1,6 +1,9 @@ package protocol -import "io" +import ( + "bytes" + "io" +) // codegen: modify for debug only @@ -37,6 +40,29 @@ type Authentication struct { fields FieldsAuthentication } +func (T *Authentication) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('R')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsBackendKeyData struct { ProcessID int32 SecretKey int32 @@ -74,6 +100,29 @@ type BackendKeyData struct { fields FieldsBackendKeyData } +func (T *BackendKeyData) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('K')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsBindComplete struct { } @@ -91,6 +140,29 @@ type BindComplete struct { fields FieldsBindComplete } +func (T *BindComplete) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('2')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCloseComplete struct { } @@ -108,6 +180,29 @@ type CloseComplete struct { fields FieldsCloseComplete } +func (T *CloseComplete) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('3')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCommandComplete struct { Data string } @@ -135,6 +230,29 @@ type CommandComplete struct { fields FieldsCommandComplete } +func (T *CommandComplete) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('C')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCopyBothResponse struct { Format int8 ColumnFormats []int16 @@ -187,6 +305,29 @@ type CopyBothResponse struct { fields FieldsCopyBothResponse } +func (T *CopyBothResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('W')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCopyInResponse struct { Format int8 ColumnFormats []int16 @@ -239,6 +380,29 @@ type CopyInResponse struct { fields FieldsCopyInResponse } +func (T *CopyInResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('G')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCopyOutResponse struct { Format int8 ColumnFormats []int16 @@ -291,6 +455,29 @@ type CopyOutResponse struct { fields FieldsCopyOutResponse } +func (T *CopyOutResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('H')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsDataRowColumns struct { Bytes []int8 } @@ -371,6 +558,29 @@ type DataRow struct { fields FieldsDataRow } +func (T *DataRow) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('D')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsEmptyQueryResponse struct { } @@ -388,6 +598,29 @@ type EmptyQueryResponse struct { fields FieldsEmptyQueryResponse } +func (T *EmptyQueryResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('I')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsErrorResponse struct { Code byte Value string @@ -425,6 +658,29 @@ type ErrorResponse struct { fields FieldsErrorResponse } +func (T *ErrorResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('E')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsFunctionCallResponse struct { Result []byte } @@ -467,6 +723,29 @@ type FunctionCallResponse struct { fields FieldsFunctionCallResponse } +func (T *FunctionCallResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('V')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsNegotiateProtocolVersion struct { MinorVersion int32 NotRecognized []string @@ -519,6 +798,29 @@ type NegotiateProtocolVersion struct { fields FieldsNegotiateProtocolVersion } +func (T *NegotiateProtocolVersion) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('v')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsNoData struct { } @@ -536,6 +838,29 @@ type NoData struct { fields FieldsNoData } +func (T *NoData) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('n')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsNoticeResponse struct { Type byte Value string @@ -577,6 +902,29 @@ type NoticeResponse struct { fields FieldsNoticeResponse } +func (T *NoticeResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('N')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsNotificationResponse struct { ProcessID int32 Channel string @@ -624,6 +972,29 @@ type NotificationResponse struct { fields FieldsNotificationResponse } +func (T *NotificationResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('A')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsParameterDescription struct { Parameters []int32 } @@ -666,6 +1037,29 @@ type ParameterDescription struct { fields FieldsParameterDescription } +func (T *ParameterDescription) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('t')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsParameterStatus struct { Parameter string Value string @@ -703,6 +1097,29 @@ type ParameterStatus struct { fields FieldsParameterStatus } +func (T *ParameterStatus) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('S')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsParseComplete struct { } @@ -720,6 +1137,29 @@ type ParseComplete struct { fields FieldsParseComplete } +func (T *ParseComplete) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('1')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsPortalSuspended struct { } @@ -737,6 +1177,29 @@ type PortalSuspended struct { fields FieldsPortalSuspended } +func (T *PortalSuspended) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('s')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsReadForQuery struct { } @@ -754,6 +1217,29 @@ type ReadForQuery struct { fields FieldsReadForQuery } +func (T *ReadForQuery) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('Z')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsRowDescriptionFields struct { Name string TableId int32 @@ -878,3 +1364,26 @@ func (T *FieldsRowDescription) Write(writer io.Writer) (length int, err error) { type RowDescription struct { fields FieldsRowDescription } + +func (T *RowDescription) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('T')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} diff --git a/lib/gat/protocol/frontend.go b/lib/gat/protocol/frontend.go index d68e68cdcc3c47eb68fa1b84cc65b85f47447d8f..e152b4f2041396f728f4b5ae16154f62072d2d3b 100644 --- a/lib/gat/protocol/frontend.go +++ b/lib/gat/protocol/frontend.go @@ -154,6 +154,29 @@ type Bind struct { fields FieldsBind } +func (T *Bind) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('B')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCancelRequest struct { RequestCode int32 ProcessID int32 @@ -201,6 +224,29 @@ type CancelRequest struct { fields FieldsCancelRequest } +func (T *CancelRequest) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('F')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsClose struct { Which byte Name string @@ -238,6 +284,29 @@ type Close struct { fields FieldsClose } +func (T *Close) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('C')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCopyFail struct { Cause string } @@ -265,6 +334,29 @@ type CopyFail struct { fields FieldsCopyFail } +func (T *CopyFail) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('f')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsDescribe struct { Which byte Name string @@ -302,6 +394,29 @@ type Describe struct { fields FieldsDescribe } +func (T *Describe) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('D')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsExecute struct { Name string MaxRows int32 @@ -339,6 +454,29 @@ type Execute struct { fields FieldsExecute } +func (T *Execute) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('E')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsFlush struct { } @@ -356,6 +494,29 @@ type Flush struct { fields FieldsFlush } +func (T *Flush) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('H')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsFunctionCallArguments struct { Value []byte } @@ -481,6 +642,29 @@ type FunctionCall struct { fields FieldsFunctionCall } +func (T *FunctionCall) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('F')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsGSSENCRequest struct { EncryptionRequestCode int32 } @@ -508,6 +692,24 @@ type GSSENCRequest struct { fields FieldsGSSENCRequest } +func (T *GSSENCRequest) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsGSSResponse struct { Data []byte } @@ -541,6 +743,29 @@ type GSSResponse struct { fields FieldsGSSResponse } +func (T *GSSResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('p')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsParse struct { PreparedStatement string Query string @@ -603,6 +828,29 @@ type Parse struct { fields FieldsParse } +func (T *Parse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('P')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsPasswordMessage struct { Password string } @@ -630,6 +878,29 @@ type PasswordMessage struct { fields FieldsPasswordMessage } +func (T *PasswordMessage) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('p')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsQuery struct { Query string } @@ -657,6 +928,29 @@ type Query struct { fields FieldsQuery } +func (T *Query) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('Q')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsSASLInitialResponse struct { Mechanism string InitialResponse []byte @@ -709,6 +1003,29 @@ type SASLInitialResponse struct { fields FieldsSASLInitialResponse } +func (T *SASLInitialResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('p')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsSASLResponse struct { Data []byte } @@ -742,6 +1059,29 @@ type SASLResponse struct { fields FieldsSASLResponse } +func (T *SASLResponse) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('p')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsSSLRequest struct { SSLRequestCode int32 } @@ -769,6 +1109,24 @@ type SSLRequest struct { fields FieldsSSLRequest } +func (T *SSLRequest) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsStartupMessage struct { ProtocolVersionNumber int32 ParameterName string @@ -816,6 +1174,24 @@ type StartupMessage struct { fields FieldsStartupMessage } +func (T *StartupMessage) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsSync struct { } @@ -833,6 +1209,29 @@ type Sync struct { fields FieldsSync } +func (T *Sync) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('S')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsTerminate struct { } @@ -849,3 +1248,26 @@ func (T *FieldsTerminate) Write(writer io.Writer) (length int, err error) { type Terminate struct { fields FieldsTerminate } + +func (T *Terminate) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('X')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} diff --git a/lib/gat/protocol/shared.go b/lib/gat/protocol/shared.go index 147a7e71d0156db7286f5bcb6447c9c7204263dc..8793b61fab4aca53f72dcb757fcdf331b9f9e22a 100644 --- a/lib/gat/protocol/shared.go +++ b/lib/gat/protocol/shared.go @@ -37,6 +37,29 @@ type CopyData struct { fields FieldsCopyData } +func (T *CopyData) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('d')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +} + type FieldsCopyDone struct { } @@ -53,3 +76,26 @@ func (T *FieldsCopyDone) Write(writer io.Writer) (length int, err error) { type CopyDone struct { fields FieldsCopyDone } + +func (T *CopyDone) Write(writer io.Writer) (length int, err error) { + // TODO replace with pool + var buf bytes.Buffer + length, err = T.fields.Write(&buf) + if err != nil { + length = 0 + return + } + _, err = WriteByte(writer, byte('c')) + if err != nil { + length = 1 + return + } + _, err = WriteInt32(writer, int32(length)) + if err != nil { + length = 5 + return + } + length += 5 + _, err = writer.Write(buf.Bytes()) + return +}