diff options
Diffstat (limited to 'vendor/github.com/jackc/pgx/v5/pgproto3')
57 files changed, 0 insertions, 5001 deletions
diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/README.md b/vendor/github.com/jackc/pgx/v5/pgproto3/README.md deleted file mode 100644 index 7a26f1cbd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# pgproto3 - -Package pgproto3 is an encoder and decoder of the PostgreSQL wire protocol version 3. - -pgproto3 can be used as a foundation for PostgreSQL drivers, proxies, mock servers, load balancers and more. - -See example/pgfortune for a playful example of a fake PostgreSQL server. diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_cleartext_password.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_cleartext_password.go deleted file mode 100644 index ac2962e9e..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_cleartext_password.go +++ /dev/null @@ -1,51 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationCleartextPassword is a message sent from the backend indicating that a clear-text password is required. -type AuthenticationCleartextPassword struct { -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationCleartextPassword) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationCleartextPassword) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationCleartextPassword) Decode(src []byte) error { - if len(src) != 4 { - return errors.New("bad authentication message size") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeCleartextPassword { - return errors.New("bad auth type") - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationCleartextPassword) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeCleartextPassword) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src AuthenticationCleartextPassword) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "AuthenticationCleartextPassword", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss.go deleted file mode 100644 index 178ef31d8..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss.go +++ /dev/null @@ -1,58 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type AuthenticationGSS struct{} - -func (a *AuthenticationGSS) Backend() {} - -func (a *AuthenticationGSS) AuthenticationResponse() {} - -func (a *AuthenticationGSS) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("authentication message too short") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeGSS { - return errors.New("bad auth type") - } - return nil -} - -func (a *AuthenticationGSS) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeGSS) - return finishMessage(dst, sp) -} - -func (a *AuthenticationGSS) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data []byte - }{ - Type: "AuthenticationGSS", - }) -} - -func (a *AuthenticationGSS) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Type string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss_continue.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss_continue.go deleted file mode 100644 index 2ba3f3b3e..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_gss_continue.go +++ /dev/null @@ -1,67 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type AuthenticationGSSContinue struct { - Data []byte -} - -func (a *AuthenticationGSSContinue) Backend() {} - -func (a *AuthenticationGSSContinue) AuthenticationResponse() {} - -func (a *AuthenticationGSSContinue) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("authentication message too short") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeGSSCont { - return errors.New("bad auth type") - } - - a.Data = src[4:] - return nil -} - -func (a *AuthenticationGSSContinue) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeGSSCont) - dst = append(dst, a.Data...) - return finishMessage(dst, sp) -} - -func (a *AuthenticationGSSContinue) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data []byte - }{ - Type: "AuthenticationGSSContinue", - Data: a.Data, - }) -} - -func (a *AuthenticationGSSContinue) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Type string - Data []byte - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - a.Data = msg.Data - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_md5_password.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_md5_password.go deleted file mode 100644 index 854c6404e..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_md5_password.go +++ /dev/null @@ -1,76 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationMD5Password is a message sent from the backend indicating that an MD5 hashed password is required. -type AuthenticationMD5Password struct { - Salt [4]byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationMD5Password) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationMD5Password) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationMD5Password) Decode(src []byte) error { - if len(src) != 8 { - return errors.New("bad authentication message size") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeMD5Password { - return errors.New("bad auth type") - } - - copy(dst.Salt[:], src[4:8]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationMD5Password) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeMD5Password) - dst = append(dst, src.Salt[:]...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src AuthenticationMD5Password) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Salt [4]byte - }{ - Type: "AuthenticationMD5Password", - Salt: src.Salt, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *AuthenticationMD5Password) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Type string - Salt [4]byte - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Salt = msg.Salt - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_ok.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_ok.go deleted file mode 100644 index ec11d39f1..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_ok.go +++ /dev/null @@ -1,51 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationOk is a message sent from the backend indicating that authentication was successful. -type AuthenticationOk struct { -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationOk) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationOk) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationOk) Decode(src []byte) error { - if len(src) != 4 { - return errors.New("bad authentication message size") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeOk { - return errors.New("bad auth type") - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationOk) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeOk) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src AuthenticationOk) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "AuthenticationOK", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl.go deleted file mode 100644 index e66580f44..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl.go +++ /dev/null @@ -1,72 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationSASL is a message sent from the backend indicating that SASL authentication is required. -type AuthenticationSASL struct { - AuthMechanisms []string -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationSASL) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationSASL) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationSASL) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("authentication message too short") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeSASL { - return errors.New("bad auth type") - } - - authMechanisms := src[4:] - for len(authMechanisms) > 1 { - idx := bytes.IndexByte(authMechanisms, 0) - if idx == -1 { - return &invalidMessageFormatErr{messageType: "AuthenticationSASL", details: "unterminated string"} - } - dst.AuthMechanisms = append(dst.AuthMechanisms, string(authMechanisms[:idx])) - authMechanisms = authMechanisms[idx+1:] - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationSASL) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeSASL) - - for _, s := range src.AuthMechanisms { - dst = append(dst, []byte(s)...) - dst = append(dst, 0) - } - dst = append(dst, 0) - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src AuthenticationSASL) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - AuthMechanisms []string - }{ - Type: "AuthenticationSASL", - AuthMechanisms: src.AuthMechanisms, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_continue.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_continue.go deleted file mode 100644 index 70fba4a67..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_continue.go +++ /dev/null @@ -1,75 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationSASLContinue is a message sent from the backend containing a SASL challenge. -type AuthenticationSASLContinue struct { - Data []byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationSASLContinue) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationSASLContinue) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationSASLContinue) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("authentication message too short") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeSASLContinue { - return errors.New("bad auth type") - } - - dst.Data = src[4:] - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationSASLContinue) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeSASLContinue) - dst = append(dst, src.Data...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src AuthenticationSASLContinue) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data string - }{ - Type: "AuthenticationSASLContinue", - Data: string(src.Data), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *AuthenticationSASLContinue) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Data string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Data = []byte(msg.Data) - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_final.go b/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_final.go deleted file mode 100644 index 84976c2a3..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/authentication_sasl_final.go +++ /dev/null @@ -1,75 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// AuthenticationSASLFinal is a message sent from the backend indicating a SASL authentication has completed. -type AuthenticationSASLFinal struct { - Data []byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*AuthenticationSASLFinal) Backend() {} - -// Backend identifies this message as an authentication response. -func (*AuthenticationSASLFinal) AuthenticationResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *AuthenticationSASLFinal) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("authentication message too short") - } - - authType := binary.BigEndian.Uint32(src) - - if authType != AuthTypeSASLFinal { - return errors.New("bad auth type") - } - - dst.Data = src[4:] - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *AuthenticationSASLFinal) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'R') - dst = pgio.AppendUint32(dst, AuthTypeSASLFinal) - dst = append(dst, src.Data...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Unmarshaler. -func (src AuthenticationSASLFinal) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data string - }{ - Type: "AuthenticationSASLFinal", - Data: string(src.Data), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *AuthenticationSASLFinal) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Data string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Data = []byte(msg.Data) - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/backend.go b/vendor/github.com/jackc/pgx/v5/pgproto3/backend.go deleted file mode 100644 index 28cff049a..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/backend.go +++ /dev/null @@ -1,299 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" -) - -// Backend acts as a server for the PostgreSQL wire protocol version 3. -type Backend struct { - cr *chunkReader - w io.Writer - - // tracer is used to trace messages when Send or Receive is called. This means an outbound message is traced - // before it is actually transmitted (i.e. before Flush). - tracer *tracer - - wbuf []byte - encodeError error - - // Frontend message flyweights - bind Bind - cancelRequest CancelRequest - _close Close - copyFail CopyFail - copyData CopyData - copyDone CopyDone - describe Describe - execute Execute - flush Flush - functionCall FunctionCall - gssEncRequest GSSEncRequest - parse Parse - query Query - sslRequest SSLRequest - startupMessage StartupMessage - sync Sync - terminate Terminate - - bodyLen int - maxBodyLen int // maxBodyLen is the maximum length of a message body in octets. If a message body exceeds this length, Receive will return an error. - msgType byte - partialMsg bool - authType uint32 -} - -const ( - minStartupPacketLen = 4 // minStartupPacketLen is a single 32-bit int version or code. - maxStartupPacketLen = 10000 // maxStartupPacketLen is MAX_STARTUP_PACKET_LENGTH from PG source. -) - -// NewBackend creates a new Backend. -func NewBackend(r io.Reader, w io.Writer) *Backend { - cr := newChunkReader(r, 0) - return &Backend{cr: cr, w: w} -} - -// Send sends a message to the frontend (i.e. the client). The message is buffered until Flush is called. Any error -// encountered will be returned from Flush. -func (b *Backend) Send(msg BackendMessage) { - if b.encodeError != nil { - return - } - - prevLen := len(b.wbuf) - newBuf, err := msg.Encode(b.wbuf) - if err != nil { - b.encodeError = err - return - } - b.wbuf = newBuf - - if b.tracer != nil { - b.tracer.traceMessage('B', int32(len(b.wbuf)-prevLen), msg) - } -} - -// Flush writes any pending messages to the frontend (i.e. the client). -func (b *Backend) Flush() error { - if err := b.encodeError; err != nil { - b.encodeError = nil - b.wbuf = b.wbuf[:0] - return &writeError{err: err, safeToRetry: true} - } - - n, err := b.w.Write(b.wbuf) - - const maxLen = 1024 - if len(b.wbuf) > maxLen { - b.wbuf = make([]byte, 0, maxLen) - } else { - b.wbuf = b.wbuf[:0] - } - - if err != nil { - return &writeError{err: err, safeToRetry: n == 0} - } - - return nil -} - -// Trace starts tracing the message traffic to w. It writes in a similar format to that produced by the libpq function -// PQtrace. -func (b *Backend) Trace(w io.Writer, options TracerOptions) { - b.tracer = &tracer{ - w: w, - buf: &bytes.Buffer{}, - TracerOptions: options, - } -} - -// Untrace stops tracing. -func (b *Backend) Untrace() { - b.tracer = nil -} - -// ReceiveStartupMessage receives the initial connection message. This method is used of the normal Receive method -// because the initial connection message is "special" and does not include the message type as the first byte. This -// will return either a StartupMessage, SSLRequest, GSSEncRequest, or CancelRequest. -func (b *Backend) ReceiveStartupMessage() (FrontendMessage, error) { - buf, err := b.cr.Next(4) - if err != nil { - return nil, err - } - msgSize := int(binary.BigEndian.Uint32(buf) - 4) - - if msgSize < minStartupPacketLen || msgSize > maxStartupPacketLen { - return nil, fmt.Errorf("invalid length of startup packet: %d", msgSize) - } - - buf, err = b.cr.Next(msgSize) - if err != nil { - return nil, translateEOFtoErrUnexpectedEOF(err) - } - - code := binary.BigEndian.Uint32(buf) - - switch code { - case ProtocolVersionNumber: - err = b.startupMessage.Decode(buf) - if err != nil { - return nil, err - } - return &b.startupMessage, nil - case sslRequestNumber: - err = b.sslRequest.Decode(buf) - if err != nil { - return nil, err - } - return &b.sslRequest, nil - case cancelRequestCode: - err = b.cancelRequest.Decode(buf) - if err != nil { - return nil, err - } - return &b.cancelRequest, nil - case gssEncReqNumber: - err = b.gssEncRequest.Decode(buf) - if err != nil { - return nil, err - } - return &b.gssEncRequest, nil - default: - return nil, fmt.Errorf("unknown startup message code: %d", code) - } -} - -// Receive receives a message from the frontend. The returned message is only valid until the next call to Receive. -func (b *Backend) Receive() (FrontendMessage, error) { - if !b.partialMsg { - header, err := b.cr.Next(5) - if err != nil { - return nil, translateEOFtoErrUnexpectedEOF(err) - } - - b.msgType = header[0] - - msgLength := int(binary.BigEndian.Uint32(header[1:])) - if msgLength < 4 { - return nil, fmt.Errorf("invalid message length: %d", msgLength) - } - - b.bodyLen = msgLength - 4 - if b.maxBodyLen > 0 && b.bodyLen > b.maxBodyLen { - return nil, &ExceededMaxBodyLenErr{b.maxBodyLen, b.bodyLen} - } - b.partialMsg = true - } - - var msg FrontendMessage - switch b.msgType { - case 'B': - msg = &b.bind - case 'C': - msg = &b._close - case 'D': - msg = &b.describe - case 'E': - msg = &b.execute - case 'F': - msg = &b.functionCall - case 'f': - msg = &b.copyFail - case 'd': - msg = &b.copyData - case 'c': - msg = &b.copyDone - case 'H': - msg = &b.flush - case 'P': - msg = &b.parse - case 'p': - switch b.authType { - case AuthTypeSASL: - msg = &SASLInitialResponse{} - case AuthTypeSASLContinue: - msg = &SASLResponse{} - case AuthTypeSASLFinal: - msg = &SASLResponse{} - case AuthTypeGSS, AuthTypeGSSCont: - msg = &GSSResponse{} - case AuthTypeCleartextPassword, AuthTypeMD5Password: - fallthrough - default: - // to maintain backwards compatibility - msg = &PasswordMessage{} - } - case 'Q': - msg = &b.query - case 'S': - msg = &b.sync - case 'X': - msg = &b.terminate - default: - return nil, fmt.Errorf("unknown message type: %c", b.msgType) - } - - msgBody, err := b.cr.Next(b.bodyLen) - if err != nil { - return nil, translateEOFtoErrUnexpectedEOF(err) - } - - b.partialMsg = false - - err = msg.Decode(msgBody) - if err != nil { - return nil, err - } - - if b.tracer != nil { - b.tracer.traceMessage('F', int32(5+len(msgBody)), msg) - } - - return msg, nil -} - -// SetAuthType sets the authentication type in the backend. -// Since multiple message types can start with 'p', SetAuthType allows -// contextual identification of FrontendMessages. For example, in the -// PG message flow documentation for PasswordMessage: -// -// Byte1('p') -// -// Identifies the message as a password response. Note that this is also used for -// GSSAPI, SSPI and SASL response messages. The exact message type can be deduced from -// the context. -// -// Since the Frontend does not know about the state of a backend, it is important -// to call SetAuthType() after an authentication request is received by the Frontend. -func (b *Backend) SetAuthType(authType uint32) error { - switch authType { - case AuthTypeOk, - AuthTypeCleartextPassword, - AuthTypeMD5Password, - AuthTypeSCMCreds, - AuthTypeGSS, - AuthTypeGSSCont, - AuthTypeSSPI, - AuthTypeSASL, - AuthTypeSASLContinue, - AuthTypeSASLFinal: - b.authType = authType - default: - return fmt.Errorf("authType not recognized: %d", authType) - } - - return nil -} - -// SetMaxBodyLen sets the maximum length of a message body in octets. -// If a message body exceeds this length, Receive will return an error. -// This is useful for protecting against malicious clients that send -// large messages with the intent of causing memory exhaustion. -// The default value is 0. -// If maxBodyLen is 0, then no maximum is enforced. -func (b *Backend) SetMaxBodyLen(maxBodyLen int) { - b.maxBodyLen = maxBodyLen -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/backend_key_data.go b/vendor/github.com/jackc/pgx/v5/pgproto3/backend_key_data.go deleted file mode 100644 index 23f5da677..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/backend_key_data.go +++ /dev/null @@ -1,50 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type BackendKeyData struct { - ProcessID uint32 - SecretKey uint32 -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*BackendKeyData) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *BackendKeyData) Decode(src []byte) error { - if len(src) != 8 { - return &invalidMessageLenErr{messageType: "BackendKeyData", expectedLen: 8, actualLen: len(src)} - } - - dst.ProcessID = binary.BigEndian.Uint32(src[:4]) - dst.SecretKey = binary.BigEndian.Uint32(src[4:]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *BackendKeyData) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'K') - dst = pgio.AppendUint32(dst, src.ProcessID) - dst = pgio.AppendUint32(dst, src.SecretKey) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src BackendKeyData) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ProcessID uint32 - SecretKey uint32 - }{ - Type: "BackendKeyData", - ProcessID: src.ProcessID, - SecretKey: src.SecretKey, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/big_endian.go b/vendor/github.com/jackc/pgx/v5/pgproto3/big_endian.go deleted file mode 100644 index f7bdb97eb..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/big_endian.go +++ /dev/null @@ -1,37 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" -) - -type BigEndianBuf [8]byte - -func (b BigEndianBuf) Int16(n int16) []byte { - buf := b[0:2] - binary.BigEndian.PutUint16(buf, uint16(n)) - return buf -} - -func (b BigEndianBuf) Uint16(n uint16) []byte { - buf := b[0:2] - binary.BigEndian.PutUint16(buf, n) - return buf -} - -func (b BigEndianBuf) Int32(n int32) []byte { - buf := b[0:4] - binary.BigEndian.PutUint32(buf, uint32(n)) - return buf -} - -func (b BigEndianBuf) Uint32(n uint32) []byte { - buf := b[0:4] - binary.BigEndian.PutUint32(buf, n) - return buf -} - -func (b BigEndianBuf) Int64(n int64) []byte { - buf := b[0:8] - binary.BigEndian.PutUint64(buf, uint64(n)) - return buf -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/bind.go b/vendor/github.com/jackc/pgx/v5/pgproto3/bind.go deleted file mode 100644 index ad6ac48bf..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/bind.go +++ /dev/null @@ -1,223 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type Bind struct { - DestinationPortal string - PreparedStatement string - ParameterFormatCodes []int16 - Parameters [][]byte - ResultFormatCodes []int16 -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Bind) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Bind) Decode(src []byte) error { - *dst = Bind{} - - idx := bytes.IndexByte(src, 0) - if idx < 0 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - dst.DestinationPortal = string(src[:idx]) - rp := idx + 1 - - idx = bytes.IndexByte(src[rp:], 0) - if idx < 0 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - dst.PreparedStatement = string(src[rp : rp+idx]) - rp += idx + 1 - - if len(src[rp:]) < 2 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - parameterFormatCodeCount := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - - if parameterFormatCodeCount > 0 { - dst.ParameterFormatCodes = make([]int16, parameterFormatCodeCount) - - if len(src[rp:]) < len(dst.ParameterFormatCodes)*2 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - for i := 0; i < parameterFormatCodeCount; i++ { - dst.ParameterFormatCodes[i] = int16(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - } - } - - if len(src[rp:]) < 2 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - parameterCount := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - - if parameterCount > 0 { - dst.Parameters = make([][]byte, parameterCount) - - for i := 0; i < parameterCount; i++ { - if len(src[rp:]) < 4 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - - msgSize := int(int32(binary.BigEndian.Uint32(src[rp:]))) - rp += 4 - - // null - if msgSize == -1 { - continue - } - - if len(src[rp:]) < msgSize { - return &invalidMessageFormatErr{messageType: "Bind"} - } - - dst.Parameters[i] = src[rp : rp+msgSize] - rp += msgSize - } - } - - if len(src[rp:]) < 2 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - resultFormatCodeCount := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - - dst.ResultFormatCodes = make([]int16, resultFormatCodeCount) - if len(src[rp:]) < len(dst.ResultFormatCodes)*2 { - return &invalidMessageFormatErr{messageType: "Bind"} - } - for i := 0; i < resultFormatCodeCount; i++ { - dst.ResultFormatCodes[i] = int16(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Bind) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'B') - - dst = append(dst, src.DestinationPortal...) - dst = append(dst, 0) - dst = append(dst, src.PreparedStatement...) - dst = append(dst, 0) - - if len(src.ParameterFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many parameter format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ParameterFormatCodes))) - for _, fc := range src.ParameterFormatCodes { - dst = pgio.AppendInt16(dst, fc) - } - - if len(src.Parameters) > math.MaxUint16 { - return nil, errors.New("too many parameters") - } - dst = pgio.AppendUint16(dst, uint16(len(src.Parameters))) - for _, p := range src.Parameters { - if p == nil { - dst = pgio.AppendInt32(dst, -1) - continue - } - - dst = pgio.AppendInt32(dst, int32(len(p))) - dst = append(dst, p...) - } - - if len(src.ResultFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many result format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ResultFormatCodes))) - for _, fc := range src.ResultFormatCodes { - dst = pgio.AppendInt16(dst, fc) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Bind) MarshalJSON() ([]byte, error) { - formattedParameters := make([]map[string]string, len(src.Parameters)) - for i, p := range src.Parameters { - if p == nil { - continue - } - - textFormat := true - if len(src.ParameterFormatCodes) == 1 { - textFormat = src.ParameterFormatCodes[0] == 0 - } else if len(src.ParameterFormatCodes) > 1 { - textFormat = src.ParameterFormatCodes[i] == 0 - } - - if textFormat { - formattedParameters[i] = map[string]string{"text": string(p)} - } else { - formattedParameters[i] = map[string]string{"binary": hex.EncodeToString(p)} - } - } - - return json.Marshal(struct { - Type string - DestinationPortal string - PreparedStatement string - ParameterFormatCodes []int16 - Parameters []map[string]string - ResultFormatCodes []int16 - }{ - Type: "Bind", - DestinationPortal: src.DestinationPortal, - PreparedStatement: src.PreparedStatement, - ParameterFormatCodes: src.ParameterFormatCodes, - Parameters: formattedParameters, - ResultFormatCodes: src.ResultFormatCodes, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *Bind) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - DestinationPortal string - PreparedStatement string - ParameterFormatCodes []int16 - Parameters []map[string]string - ResultFormatCodes []int16 - } - err := json.Unmarshal(data, &msg) - if err != nil { - return err - } - dst.DestinationPortal = msg.DestinationPortal - dst.PreparedStatement = msg.PreparedStatement - dst.ParameterFormatCodes = msg.ParameterFormatCodes - dst.Parameters = make([][]byte, len(msg.Parameters)) - dst.ResultFormatCodes = msg.ResultFormatCodes - for n, parameter := range msg.Parameters { - dst.Parameters[n], err = getValueFromJSON(parameter) - if err != nil { - return fmt.Errorf("cannot get param %d: %w", n, err) - } - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/bind_complete.go b/vendor/github.com/jackc/pgx/v5/pgproto3/bind_complete.go deleted file mode 100644 index bacf30d88..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/bind_complete.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type BindComplete struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*BindComplete) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *BindComplete) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "BindComplete", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *BindComplete) Encode(dst []byte) ([]byte, error) { - return append(dst, '2', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src BindComplete) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "BindComplete", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/cancel_request.go b/vendor/github.com/jackc/pgx/v5/pgproto3/cancel_request.go deleted file mode 100644 index 6b52dd977..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/cancel_request.go +++ /dev/null @@ -1,58 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -const cancelRequestCode = 80877102 - -type CancelRequest struct { - ProcessID uint32 - SecretKey uint32 -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*CancelRequest) Frontend() {} - -func (dst *CancelRequest) Decode(src []byte) error { - if len(src) != 12 { - return errors.New("bad cancel request size") - } - - requestCode := binary.BigEndian.Uint32(src) - - if requestCode != cancelRequestCode { - return errors.New("bad cancel request code") - } - - dst.ProcessID = binary.BigEndian.Uint32(src[4:]) - dst.SecretKey = binary.BigEndian.Uint32(src[8:]) - - return nil -} - -// Encode encodes src into dst. dst will include the 4 byte message length. -func (src *CancelRequest) Encode(dst []byte) ([]byte, error) { - dst = pgio.AppendInt32(dst, 16) - dst = pgio.AppendInt32(dst, cancelRequestCode) - dst = pgio.AppendUint32(dst, src.ProcessID) - dst = pgio.AppendUint32(dst, src.SecretKey) - return dst, nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CancelRequest) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ProcessID uint32 - SecretKey uint32 - }{ - Type: "CancelRequest", - ProcessID: src.ProcessID, - SecretKey: src.SecretKey, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/chunkreader.go b/vendor/github.com/jackc/pgx/v5/pgproto3/chunkreader.go deleted file mode 100644 index fc0fa61e9..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/chunkreader.go +++ /dev/null @@ -1,90 +0,0 @@ -package pgproto3 - -import ( - "io" - - "github.com/jackc/pgx/v5/internal/iobufpool" -) - -// chunkReader is a io.Reader wrapper that minimizes IO reads and memory allocations. It allocates memory in chunks and -// will read as much as will fit in the current buffer in a single call regardless of how large a read is actually -// requested. The memory returned via Next is only valid until the next call to Next. -// -// This is roughly equivalent to a bufio.Reader that only uses Peek and Discard to never copy bytes. -type chunkReader struct { - r io.Reader - - buf *[]byte - rp, wp int // buf read position and write position - - minBufSize int -} - -// newChunkReader creates and returns a new chunkReader for r with default configuration. If minBufSize is <= 0 it uses -// a default value. -func newChunkReader(r io.Reader, minBufSize int) *chunkReader { - if minBufSize <= 0 { - // By historical reasons Postgres currently has 8KB send buffer inside, - // so here we want to have at least the same size buffer. - // @see https://github.com/postgres/postgres/blob/249d64999615802752940e017ee5166e726bc7cd/src/backend/libpq/pqcomm.c#L134 - // @see https://www.postgresql.org/message-id/0cdc5485-cb3c-5e16-4a46-e3b2f7a41322%40ya.ru - // - // In addition, testing has found no benefit of any larger buffer. - minBufSize = 8192 - } - - return &chunkReader{ - r: r, - minBufSize: minBufSize, - buf: iobufpool.Get(minBufSize), - } -} - -// Next returns buf filled with the next n bytes. buf is only valid until next call of Next. If an error occurs, buf -// will be nil. -func (r *chunkReader) Next(n int) (buf []byte, err error) { - // Reset the buffer if it is empty - if r.rp == r.wp { - if len(*r.buf) != r.minBufSize { - iobufpool.Put(r.buf) - r.buf = iobufpool.Get(r.minBufSize) - } - r.rp = 0 - r.wp = 0 - } - - // n bytes already in buf - if (r.wp - r.rp) >= n { - buf = (*r.buf)[r.rp : r.rp+n : r.rp+n] - r.rp += n - return buf, err - } - - // buf is smaller than requested number of bytes - if len(*r.buf) < n { - bigBuf := iobufpool.Get(n) - r.wp = copy((*bigBuf), (*r.buf)[r.rp:r.wp]) - r.rp = 0 - iobufpool.Put(r.buf) - r.buf = bigBuf - } - - // buf is large enough, but need to shift filled area to start to make enough contiguous space - minReadCount := n - (r.wp - r.rp) - if (len(*r.buf) - r.wp) < minReadCount { - r.wp = copy((*r.buf), (*r.buf)[r.rp:r.wp]) - r.rp = 0 - } - - // Read at least the required number of bytes from the underlying io.Reader - readBytesCount, err := io.ReadAtLeast(r.r, (*r.buf)[r.wp:], minReadCount) - r.wp += readBytesCount - // fmt.Println("read", n) - if err != nil { - return nil, err - } - - buf = (*r.buf)[r.rp : r.rp+n : r.rp+n] - r.rp += n - return buf, nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/close.go b/vendor/github.com/jackc/pgx/v5/pgproto3/close.go deleted file mode 100644 index 0b50f27cb..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/close.go +++ /dev/null @@ -1,81 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" - "errors" -) - -type Close struct { - ObjectType byte // 'S' = prepared statement, 'P' = portal - Name string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Close) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Close) Decode(src []byte) error { - if len(src) < 2 { - return &invalidMessageFormatErr{messageType: "Close"} - } - - dst.ObjectType = src[0] - rp := 1 - - idx := bytes.IndexByte(src[rp:], 0) - if idx != len(src[rp:])-1 { - return &invalidMessageFormatErr{messageType: "Close"} - } - - dst.Name = string(src[rp : len(src)-1]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Close) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'C') - dst = append(dst, src.ObjectType) - dst = append(dst, src.Name...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Close) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ObjectType string - Name string - }{ - Type: "Close", - ObjectType: string(src.ObjectType), - Name: src.Name, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *Close) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - ObjectType string - Name string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - if len(msg.ObjectType) != 1 { - return errors.New("invalid length for Close.ObjectType") - } - - dst.ObjectType = byte(msg.ObjectType[0]) - dst.Name = msg.Name - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/close_complete.go b/vendor/github.com/jackc/pgx/v5/pgproto3/close_complete.go deleted file mode 100644 index 833f7a12c..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/close_complete.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type CloseComplete struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CloseComplete) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CloseComplete) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "CloseComplete", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CloseComplete) Encode(dst []byte) ([]byte, error) { - return append(dst, '3', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CloseComplete) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "CloseComplete", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/command_complete.go b/vendor/github.com/jackc/pgx/v5/pgproto3/command_complete.go deleted file mode 100644 index eba70947d..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/command_complete.go +++ /dev/null @@ -1,66 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" -) - -type CommandComplete struct { - CommandTag []byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CommandComplete) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CommandComplete) Decode(src []byte) error { - idx := bytes.IndexByte(src, 0) - if idx == -1 { - return &invalidMessageFormatErr{messageType: "CommandComplete", details: "unterminated string"} - } - if idx != len(src)-1 { - return &invalidMessageFormatErr{messageType: "CommandComplete", details: "string terminated too early"} - } - - dst.CommandTag = src[:idx] - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CommandComplete) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'C') - dst = append(dst, src.CommandTag...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CommandComplete) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - CommandTag string - }{ - Type: "CommandComplete", - CommandTag: string(src.CommandTag), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *CommandComplete) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - CommandTag string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.CommandTag = []byte(msg.CommandTag) - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_both_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_both_response.go deleted file mode 100644 index 99e1afea4..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_both_response.go +++ /dev/null @@ -1,95 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type CopyBothResponse struct { - OverallFormat byte - ColumnFormatCodes []uint16 -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CopyBothResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyBothResponse) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - if buf.Len() < 3 { - return &invalidMessageFormatErr{messageType: "CopyBothResponse"} - } - - overallFormat := buf.Next(1)[0] - - columnCount := int(binary.BigEndian.Uint16(buf.Next(2))) - if buf.Len() != columnCount*2 { - return &invalidMessageFormatErr{messageType: "CopyBothResponse"} - } - - columnFormatCodes := make([]uint16, columnCount) - for i := 0; i < columnCount; i++ { - columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2)) - } - - *dst = CopyBothResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes} - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyBothResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'W') - dst = append(dst, src.OverallFormat) - if len(src.ColumnFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many column format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes))) - for _, fc := range src.ColumnFormatCodes { - dst = pgio.AppendUint16(dst, fc) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyBothResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ColumnFormatCodes []uint16 - }{ - Type: "CopyBothResponse", - ColumnFormatCodes: src.ColumnFormatCodes, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *CopyBothResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - OverallFormat string - ColumnFormatCodes []uint16 - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - if len(msg.OverallFormat) != 1 { - return errors.New("invalid length for CopyBothResponse.OverallFormat") - } - - dst.OverallFormat = msg.OverallFormat[0] - dst.ColumnFormatCodes = msg.ColumnFormatCodes - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_data.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_data.go deleted file mode 100644 index 89ecdd4dd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_data.go +++ /dev/null @@ -1,59 +0,0 @@ -package pgproto3 - -import ( - "encoding/hex" - "encoding/json" -) - -type CopyData struct { - Data []byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CopyData) Backend() {} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*CopyData) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyData) Decode(src []byte) error { - dst.Data = src - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyData) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'd') - dst = append(dst, src.Data...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyData) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data string - }{ - Type: "CopyData", - Data: hex.EncodeToString(src.Data), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *CopyData) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Data string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Data = []byte(msg.Data) - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_done.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_done.go deleted file mode 100644 index 040814dbd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_done.go +++ /dev/null @@ -1,38 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type CopyDone struct { -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CopyDone) Backend() {} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*CopyDone) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyDone) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "CopyDone", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyDone) Encode(dst []byte) ([]byte, error) { - return append(dst, 'c', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyDone) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "CopyDone", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_fail.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_fail.go deleted file mode 100644 index 72a85fd09..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_fail.go +++ /dev/null @@ -1,45 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" -) - -type CopyFail struct { - Message string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*CopyFail) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyFail) Decode(src []byte) error { - idx := bytes.IndexByte(src, 0) - if idx != len(src)-1 { - return &invalidMessageFormatErr{messageType: "CopyFail"} - } - - dst.Message = string(src[:idx]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyFail) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'f') - dst = append(dst, src.Message...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyFail) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Message string - }{ - Type: "CopyFail", - Message: src.Message, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_in_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_in_response.go deleted file mode 100644 index 06cf99ced..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_in_response.go +++ /dev/null @@ -1,96 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type CopyInResponse struct { - OverallFormat byte - ColumnFormatCodes []uint16 -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*CopyInResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyInResponse) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - if buf.Len() < 3 { - return &invalidMessageFormatErr{messageType: "CopyInResponse"} - } - - overallFormat := buf.Next(1)[0] - - columnCount := int(binary.BigEndian.Uint16(buf.Next(2))) - if buf.Len() != columnCount*2 { - return &invalidMessageFormatErr{messageType: "CopyInResponse"} - } - - columnFormatCodes := make([]uint16, columnCount) - for i := 0; i < columnCount; i++ { - columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2)) - } - - *dst = CopyInResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes} - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyInResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'G') - - dst = append(dst, src.OverallFormat) - if len(src.ColumnFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many column format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes))) - for _, fc := range src.ColumnFormatCodes { - dst = pgio.AppendUint16(dst, fc) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyInResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ColumnFormatCodes []uint16 - }{ - Type: "CopyInResponse", - ColumnFormatCodes: src.ColumnFormatCodes, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *CopyInResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - OverallFormat string - ColumnFormatCodes []uint16 - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - if len(msg.OverallFormat) != 1 { - return errors.New("invalid length for CopyInResponse.OverallFormat") - } - - dst.OverallFormat = msg.OverallFormat[0] - dst.ColumnFormatCodes = msg.ColumnFormatCodes - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_out_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/copy_out_response.go deleted file mode 100644 index 549e916c1..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/copy_out_response.go +++ /dev/null @@ -1,96 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type CopyOutResponse struct { - OverallFormat byte - ColumnFormatCodes []uint16 -} - -func (*CopyOutResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *CopyOutResponse) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - if buf.Len() < 3 { - return &invalidMessageFormatErr{messageType: "CopyOutResponse"} - } - - overallFormat := buf.Next(1)[0] - - columnCount := int(binary.BigEndian.Uint16(buf.Next(2))) - if buf.Len() != columnCount*2 { - return &invalidMessageFormatErr{messageType: "CopyOutResponse"} - } - - columnFormatCodes := make([]uint16, columnCount) - for i := 0; i < columnCount; i++ { - columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2)) - } - - *dst = CopyOutResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes} - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *CopyOutResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'H') - - dst = append(dst, src.OverallFormat) - - if len(src.ColumnFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many column format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes))) - for _, fc := range src.ColumnFormatCodes { - dst = pgio.AppendUint16(dst, fc) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src CopyOutResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ColumnFormatCodes []uint16 - }{ - Type: "CopyOutResponse", - ColumnFormatCodes: src.ColumnFormatCodes, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *CopyOutResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - OverallFormat string - ColumnFormatCodes []uint16 - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - if len(msg.OverallFormat) != 1 { - return errors.New("invalid length for CopyOutResponse.OverallFormat") - } - - dst.OverallFormat = msg.OverallFormat[0] - dst.ColumnFormatCodes = msg.ColumnFormatCodes - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/data_row.go b/vendor/github.com/jackc/pgx/v5/pgproto3/data_row.go deleted file mode 100644 index fdfb0f7f6..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/data_row.go +++ /dev/null @@ -1,143 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/hex" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type DataRow struct { - Values [][]byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*DataRow) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *DataRow) Decode(src []byte) error { - if len(src) < 2 { - return &invalidMessageFormatErr{messageType: "DataRow"} - } - rp := 0 - fieldCount := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - - // If the capacity of the values slice is too small OR substantially too - // large reallocate. This is too avoid one row with many columns from - // permanently allocating memory. - if cap(dst.Values) < fieldCount || cap(dst.Values)-fieldCount > 32 { - newCap := 32 - if newCap < fieldCount { - newCap = fieldCount - } - dst.Values = make([][]byte, fieldCount, newCap) - } else { - dst.Values = dst.Values[:fieldCount] - } - - for i := 0; i < fieldCount; i++ { - if len(src[rp:]) < 4 { - return &invalidMessageFormatErr{messageType: "DataRow"} - } - - valueLen := int(int32(binary.BigEndian.Uint32(src[rp:]))) - rp += 4 - - // null - if valueLen == -1 { - dst.Values[i] = nil - } else { - if len(src[rp:]) < valueLen || valueLen < 0 { - return &invalidMessageFormatErr{messageType: "DataRow"} - } - - dst.Values[i] = src[rp : rp+valueLen : rp+valueLen] - rp += valueLen - } - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *DataRow) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'D') - - if len(src.Values) > math.MaxUint16 { - return nil, errors.New("too many values") - } - dst = pgio.AppendUint16(dst, uint16(len(src.Values))) - for _, v := range src.Values { - if v == nil { - dst = pgio.AppendInt32(dst, -1) - continue - } - - dst = pgio.AppendInt32(dst, int32(len(v))) - dst = append(dst, v...) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src DataRow) MarshalJSON() ([]byte, error) { - formattedValues := make([]map[string]string, len(src.Values)) - for i, v := range src.Values { - if v == nil { - continue - } - - var hasNonPrintable bool - for _, b := range v { - if b < 32 { - hasNonPrintable = true - break - } - } - - if hasNonPrintable { - formattedValues[i] = map[string]string{"binary": hex.EncodeToString(v)} - } else { - formattedValues[i] = map[string]string{"text": string(v)} - } - } - - return json.Marshal(struct { - Type string - Values []map[string]string - }{ - Type: "DataRow", - Values: formattedValues, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *DataRow) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Values []map[string]string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Values = make([][]byte, len(msg.Values)) - for n, parameter := range msg.Values { - var err error - dst.Values[n], err = getValueFromJSON(parameter) - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/describe.go b/vendor/github.com/jackc/pgx/v5/pgproto3/describe.go deleted file mode 100644 index 89feff215..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/describe.go +++ /dev/null @@ -1,80 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" - "errors" -) - -type Describe struct { - ObjectType byte // 'S' = prepared statement, 'P' = portal - Name string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Describe) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Describe) Decode(src []byte) error { - if len(src) < 2 { - return &invalidMessageFormatErr{messageType: "Describe"} - } - - dst.ObjectType = src[0] - rp := 1 - - idx := bytes.IndexByte(src[rp:], 0) - if idx != len(src[rp:])-1 { - return &invalidMessageFormatErr{messageType: "Describe"} - } - - dst.Name = string(src[rp : len(src)-1]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Describe) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'D') - dst = append(dst, src.ObjectType) - dst = append(dst, src.Name...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Describe) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ObjectType string - Name string - }{ - Type: "Describe", - ObjectType: string(src.ObjectType), - Name: src.Name, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *Describe) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - ObjectType string - Name string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - if len(msg.ObjectType) != 1 { - return errors.New("invalid length for Describe.ObjectType") - } - - dst.ObjectType = byte(msg.ObjectType[0]) - dst.Name = msg.Name - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/doc.go b/vendor/github.com/jackc/pgx/v5/pgproto3/doc.go deleted file mode 100644 index 0afd18e29..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/doc.go +++ /dev/null @@ -1,11 +0,0 @@ -// Package pgproto3 is an encoder and decoder of the PostgreSQL wire protocol version 3. -// -// The primary interfaces are Frontend and Backend. They correspond to a client and server respectively. Messages are -// sent with Send (or a specialized Send variant). Messages are automatically buffered to minimize small writes. Call -// Flush to ensure a message has actually been sent. -// -// The Trace method of Frontend and Backend can be used to examine the wire-level message traffic. It outputs in a -// similar format to the PQtrace function in libpq. -// -// See https://www.postgresql.org/docs/current/protocol-message-formats.html for meanings of the different messages. -package pgproto3 diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/empty_query_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/empty_query_response.go deleted file mode 100644 index cb6cca073..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/empty_query_response.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type EmptyQueryResponse struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*EmptyQueryResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *EmptyQueryResponse) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "EmptyQueryResponse", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *EmptyQueryResponse) Encode(dst []byte) ([]byte, error) { - return append(dst, 'I', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src EmptyQueryResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "EmptyQueryResponse", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/error_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/error_response.go deleted file mode 100644 index 6ef9bd061..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/error_response.go +++ /dev/null @@ -1,326 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" - "strconv" -) - -type ErrorResponse struct { - Severity string - SeverityUnlocalized string // only in 9.6 and greater - Code string - Message string - Detail string - Hint string - Position int32 - InternalPosition int32 - InternalQuery string - Where string - SchemaName string - TableName string - ColumnName string - DataTypeName string - ConstraintName string - File string - Line int32 - Routine string - - UnknownFields map[byte]string -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*ErrorResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *ErrorResponse) Decode(src []byte) error { - *dst = ErrorResponse{} - - buf := bytes.NewBuffer(src) - - for { - k, err := buf.ReadByte() - if err != nil { - return err - } - if k == 0 { - break - } - - vb, err := buf.ReadBytes(0) - if err != nil { - return err - } - v := string(vb[:len(vb)-1]) - - switch k { - case 'S': - dst.Severity = v - case 'V': - dst.SeverityUnlocalized = v - case 'C': - dst.Code = v - case 'M': - dst.Message = v - case 'D': - dst.Detail = v - case 'H': - dst.Hint = v - case 'P': - s := v - n, _ := strconv.ParseInt(s, 10, 32) - dst.Position = int32(n) - case 'p': - s := v - n, _ := strconv.ParseInt(s, 10, 32) - dst.InternalPosition = int32(n) - case 'q': - dst.InternalQuery = v - case 'W': - dst.Where = v - case 's': - dst.SchemaName = v - case 't': - dst.TableName = v - case 'c': - dst.ColumnName = v - case 'd': - dst.DataTypeName = v - case 'n': - dst.ConstraintName = v - case 'F': - dst.File = v - case 'L': - s := v - n, _ := strconv.ParseInt(s, 10, 32) - dst.Line = int32(n) - case 'R': - dst.Routine = v - - default: - if dst.UnknownFields == nil { - dst.UnknownFields = make(map[byte]string) - } - dst.UnknownFields[k] = v - } - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *ErrorResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'E') - dst = src.appendFields(dst) - return finishMessage(dst, sp) -} - -func (src *ErrorResponse) appendFields(dst []byte) []byte { - if src.Severity != "" { - dst = append(dst, 'S') - dst = append(dst, src.Severity...) - dst = append(dst, 0) - } - if src.SeverityUnlocalized != "" { - dst = append(dst, 'V') - dst = append(dst, src.SeverityUnlocalized...) - dst = append(dst, 0) - } - if src.Code != "" { - dst = append(dst, 'C') - dst = append(dst, src.Code...) - dst = append(dst, 0) - } - if src.Message != "" { - dst = append(dst, 'M') - dst = append(dst, src.Message...) - dst = append(dst, 0) - } - if src.Detail != "" { - dst = append(dst, 'D') - dst = append(dst, src.Detail...) - dst = append(dst, 0) - } - if src.Hint != "" { - dst = append(dst, 'H') - dst = append(dst, src.Hint...) - dst = append(dst, 0) - } - if src.Position != 0 { - dst = append(dst, 'P') - dst = append(dst, strconv.Itoa(int(src.Position))...) - dst = append(dst, 0) - } - if src.InternalPosition != 0 { - dst = append(dst, 'p') - dst = append(dst, strconv.Itoa(int(src.InternalPosition))...) - dst = append(dst, 0) - } - if src.InternalQuery != "" { - dst = append(dst, 'q') - dst = append(dst, src.InternalQuery...) - dst = append(dst, 0) - } - if src.Where != "" { - dst = append(dst, 'W') - dst = append(dst, src.Where...) - dst = append(dst, 0) - } - if src.SchemaName != "" { - dst = append(dst, 's') - dst = append(dst, src.SchemaName...) - dst = append(dst, 0) - } - if src.TableName != "" { - dst = append(dst, 't') - dst = append(dst, src.TableName...) - dst = append(dst, 0) - } - if src.ColumnName != "" { - dst = append(dst, 'c') - dst = append(dst, src.ColumnName...) - dst = append(dst, 0) - } - if src.DataTypeName != "" { - dst = append(dst, 'd') - dst = append(dst, src.DataTypeName...) - dst = append(dst, 0) - } - if src.ConstraintName != "" { - dst = append(dst, 'n') - dst = append(dst, src.ConstraintName...) - dst = append(dst, 0) - } - if src.File != "" { - dst = append(dst, 'F') - dst = append(dst, src.File...) - dst = append(dst, 0) - } - if src.Line != 0 { - dst = append(dst, 'L') - dst = append(dst, strconv.Itoa(int(src.Line))...) - dst = append(dst, 0) - } - if src.Routine != "" { - dst = append(dst, 'R') - dst = append(dst, src.Routine...) - dst = append(dst, 0) - } - - for k, v := range src.UnknownFields { - dst = append(dst, k) - dst = append(dst, v...) - dst = append(dst, 0) - } - - dst = append(dst, 0) - - return dst -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src ErrorResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Severity string - SeverityUnlocalized string // only in 9.6 and greater - Code string - Message string - Detail string - Hint string - Position int32 - InternalPosition int32 - InternalQuery string - Where string - SchemaName string - TableName string - ColumnName string - DataTypeName string - ConstraintName string - File string - Line int32 - Routine string - - UnknownFields map[byte]string - }{ - Type: "ErrorResponse", - Severity: src.Severity, - SeverityUnlocalized: src.SeverityUnlocalized, - Code: src.Code, - Message: src.Message, - Detail: src.Detail, - Hint: src.Hint, - Position: src.Position, - InternalPosition: src.InternalPosition, - InternalQuery: src.InternalQuery, - Where: src.Where, - SchemaName: src.SchemaName, - TableName: src.TableName, - ColumnName: src.ColumnName, - DataTypeName: src.DataTypeName, - ConstraintName: src.ConstraintName, - File: src.File, - Line: src.Line, - Routine: src.Routine, - UnknownFields: src.UnknownFields, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *ErrorResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Type string - Severity string - SeverityUnlocalized string // only in 9.6 and greater - Code string - Message string - Detail string - Hint string - Position int32 - InternalPosition int32 - InternalQuery string - Where string - SchemaName string - TableName string - ColumnName string - DataTypeName string - ConstraintName string - File string - Line int32 - Routine string - - UnknownFields map[byte]string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - - dst.Severity = msg.Severity - dst.SeverityUnlocalized = msg.SeverityUnlocalized - dst.Code = msg.Code - dst.Message = msg.Message - dst.Detail = msg.Detail - dst.Hint = msg.Hint - dst.Position = msg.Position - dst.InternalPosition = msg.InternalPosition - dst.InternalQuery = msg.InternalQuery - dst.Where = msg.Where - dst.SchemaName = msg.SchemaName - dst.TableName = msg.TableName - dst.ColumnName = msg.ColumnName - dst.DataTypeName = msg.DataTypeName - dst.ConstraintName = msg.ConstraintName - dst.File = msg.File - dst.Line = msg.Line - dst.Routine = msg.Routine - - dst.UnknownFields = msg.UnknownFields - - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/execute.go b/vendor/github.com/jackc/pgx/v5/pgproto3/execute.go deleted file mode 100644 index 31bc714d1..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/execute.go +++ /dev/null @@ -1,58 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type Execute struct { - Portal string - MaxRows uint32 -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Execute) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Execute) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - b, err := buf.ReadBytes(0) - if err != nil { - return err - } - dst.Portal = string(b[:len(b)-1]) - - if buf.Len() < 4 { - return &invalidMessageFormatErr{messageType: "Execute"} - } - dst.MaxRows = binary.BigEndian.Uint32(buf.Next(4)) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Execute) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'E') - dst = append(dst, src.Portal...) - dst = append(dst, 0) - dst = pgio.AppendUint32(dst, src.MaxRows) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Execute) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Portal string - MaxRows uint32 - }{ - Type: "Execute", - Portal: src.Portal, - MaxRows: src.MaxRows, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/flush.go b/vendor/github.com/jackc/pgx/v5/pgproto3/flush.go deleted file mode 100644 index e5dc1fbbd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/flush.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type Flush struct{} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Flush) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Flush) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "Flush", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Flush) Encode(dst []byte) ([]byte, error) { - return append(dst, 'H', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Flush) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "Flush", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/frontend.go b/vendor/github.com/jackc/pgx/v5/pgproto3/frontend.go deleted file mode 100644 index 056e547cd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/frontend.go +++ /dev/null @@ -1,468 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" -) - -// Frontend acts as a client for the PostgreSQL wire protocol version 3. -type Frontend struct { - cr *chunkReader - w io.Writer - - // tracer is used to trace messages when Send or Receive is called. This means an outbound message is traced - // before it is actually transmitted (i.e. before Flush). It is safe to change this variable when the Frontend is - // idle. Setting and unsetting tracer provides equivalent functionality to PQtrace and PQuntrace in libpq. - tracer *tracer - - wbuf []byte - encodeError error - - // Backend message flyweights - authenticationOk AuthenticationOk - authenticationCleartextPassword AuthenticationCleartextPassword - authenticationMD5Password AuthenticationMD5Password - authenticationGSS AuthenticationGSS - authenticationGSSContinue AuthenticationGSSContinue - authenticationSASL AuthenticationSASL - authenticationSASLContinue AuthenticationSASLContinue - authenticationSASLFinal AuthenticationSASLFinal - backendKeyData BackendKeyData - bindComplete BindComplete - closeComplete CloseComplete - commandComplete CommandComplete - copyBothResponse CopyBothResponse - copyData CopyData - copyInResponse CopyInResponse - copyOutResponse CopyOutResponse - copyDone CopyDone - dataRow DataRow - emptyQueryResponse EmptyQueryResponse - errorResponse ErrorResponse - functionCallResponse FunctionCallResponse - noData NoData - noticeResponse NoticeResponse - notificationResponse NotificationResponse - parameterDescription ParameterDescription - parameterStatus ParameterStatus - parseComplete ParseComplete - readyForQuery ReadyForQuery - rowDescription RowDescription - portalSuspended PortalSuspended - - bodyLen int - maxBodyLen int // maxBodyLen is the maximum length of a message body in octets. If a message body exceeds this length, Receive will return an error. - msgType byte - partialMsg bool - authType uint32 -} - -// NewFrontend creates a new Frontend. -func NewFrontend(r io.Reader, w io.Writer) *Frontend { - cr := newChunkReader(r, 0) - return &Frontend{cr: cr, w: w} -} - -// Send sends a message to the backend (i.e. the server). The message is buffered until Flush is called. Any error -// encountered will be returned from Flush. -// -// Send can work with any FrontendMessage. Some commonly used message types such as Bind have specialized send methods -// such as SendBind. These methods should be preferred when the type of message is known up front (e.g. when building an -// extended query protocol query) as they may be faster due to knowing the type of msg rather than it being hidden -// behind an interface. -func (f *Frontend) Send(msg FrontendMessage) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceMessage('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// Flush writes any pending messages to the backend (i.e. the server). -func (f *Frontend) Flush() error { - if err := f.encodeError; err != nil { - f.encodeError = nil - f.wbuf = f.wbuf[:0] - return &writeError{err: err, safeToRetry: true} - } - - if len(f.wbuf) == 0 { - return nil - } - - n, err := f.w.Write(f.wbuf) - - const maxLen = 1024 - if len(f.wbuf) > maxLen { - f.wbuf = make([]byte, 0, maxLen) - } else { - f.wbuf = f.wbuf[:0] - } - - if err != nil { - return &writeError{err: err, safeToRetry: n == 0} - } - - return nil -} - -// Trace starts tracing the message traffic to w. It writes in a similar format to that produced by the libpq function -// PQtrace. -func (f *Frontend) Trace(w io.Writer, options TracerOptions) { - f.tracer = &tracer{ - w: w, - buf: &bytes.Buffer{}, - TracerOptions: options, - } -} - -// Untrace stops tracing. -func (f *Frontend) Untrace() { - f.tracer = nil -} - -// SendBind sends a Bind message to the backend (i.e. the server). The message is buffered until Flush is called. Any -// error encountered will be returned from Flush. -func (f *Frontend) SendBind(msg *Bind) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceBind('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendParse sends a Parse message to the backend (i.e. the server). The message is buffered until Flush is called. Any -// error encountered will be returned from Flush. -func (f *Frontend) SendParse(msg *Parse) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceParse('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendClose sends a Close message to the backend (i.e. the server). The message is buffered until Flush is called. Any -// error encountered will be returned from Flush. -func (f *Frontend) SendClose(msg *Close) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceClose('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendDescribe sends a Describe message to the backend (i.e. the server). The message is buffered until Flush is -// called. Any error encountered will be returned from Flush. -func (f *Frontend) SendDescribe(msg *Describe) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceDescribe('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendExecute sends an Execute message to the backend (i.e. the server). The message is buffered until Flush is called. -// Any error encountered will be returned from Flush. -func (f *Frontend) SendExecute(msg *Execute) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.TraceQueryute('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendSync sends a Sync message to the backend (i.e. the server). The message is buffered until Flush is called. Any -// error encountered will be returned from Flush. -func (f *Frontend) SendSync(msg *Sync) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceSync('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendQuery sends a Query message to the backend (i.e. the server). The message is buffered until Flush is called. Any -// error encountered will be returned from Flush. -func (f *Frontend) SendQuery(msg *Query) { - if f.encodeError != nil { - return - } - - prevLen := len(f.wbuf) - newBuf, err := msg.Encode(f.wbuf) - if err != nil { - f.encodeError = err - return - } - f.wbuf = newBuf - - if f.tracer != nil { - f.tracer.traceQuery('F', int32(len(f.wbuf)-prevLen), msg) - } -} - -// SendUnbufferedEncodedCopyData immediately sends an encoded CopyData message to the backend (i.e. the server). This method -// is more efficient than sending a CopyData message with Send as the message data is not copied to the internal buffer -// before being written out. The internal buffer is flushed before the message is sent. -func (f *Frontend) SendUnbufferedEncodedCopyData(msg []byte) error { - err := f.Flush() - if err != nil { - return err - } - - n, err := f.w.Write(msg) - if err != nil { - return &writeError{err: err, safeToRetry: n == 0} - } - - if f.tracer != nil { - f.tracer.traceCopyData('F', int32(len(msg)-1), &CopyData{}) - } - - return nil -} - -func translateEOFtoErrUnexpectedEOF(err error) error { - if err == io.EOF { - return io.ErrUnexpectedEOF - } - return err -} - -// Receive receives a message from the backend. The returned message is only valid until the next call to Receive. -func (f *Frontend) Receive() (BackendMessage, error) { - if !f.partialMsg { - header, err := f.cr.Next(5) - if err != nil { - return nil, translateEOFtoErrUnexpectedEOF(err) - } - - f.msgType = header[0] - - msgLength := int(binary.BigEndian.Uint32(header[1:])) - if msgLength < 4 { - return nil, fmt.Errorf("invalid message length: %d", msgLength) - } - - f.bodyLen = msgLength - 4 - if f.maxBodyLen > 0 && f.bodyLen > f.maxBodyLen { - return nil, &ExceededMaxBodyLenErr{f.maxBodyLen, f.bodyLen} - } - f.partialMsg = true - } - - msgBody, err := f.cr.Next(f.bodyLen) - if err != nil { - return nil, translateEOFtoErrUnexpectedEOF(err) - } - - f.partialMsg = false - - var msg BackendMessage - switch f.msgType { - case '1': - msg = &f.parseComplete - case '2': - msg = &f.bindComplete - case '3': - msg = &f.closeComplete - case 'A': - msg = &f.notificationResponse - case 'c': - msg = &f.copyDone - case 'C': - msg = &f.commandComplete - case 'd': - msg = &f.copyData - case 'D': - msg = &f.dataRow - case 'E': - msg = &f.errorResponse - case 'G': - msg = &f.copyInResponse - case 'H': - msg = &f.copyOutResponse - case 'I': - msg = &f.emptyQueryResponse - case 'K': - msg = &f.backendKeyData - case 'n': - msg = &f.noData - case 'N': - msg = &f.noticeResponse - case 'R': - var err error - msg, err = f.findAuthenticationMessageType(msgBody) - if err != nil { - return nil, err - } - case 's': - msg = &f.portalSuspended - case 'S': - msg = &f.parameterStatus - case 't': - msg = &f.parameterDescription - case 'T': - msg = &f.rowDescription - case 'V': - msg = &f.functionCallResponse - case 'W': - msg = &f.copyBothResponse - case 'Z': - msg = &f.readyForQuery - default: - return nil, fmt.Errorf("unknown message type: %c", f.msgType) - } - - err = msg.Decode(msgBody) - if err != nil { - return nil, err - } - - if f.tracer != nil { - f.tracer.traceMessage('B', int32(5+len(msgBody)), msg) - } - - return msg, nil -} - -// Authentication message type constants. -// See src/include/libpq/pqcomm.h for all -// constants. -const ( - AuthTypeOk = 0 - AuthTypeCleartextPassword = 3 - AuthTypeMD5Password = 5 - AuthTypeSCMCreds = 6 - AuthTypeGSS = 7 - AuthTypeGSSCont = 8 - AuthTypeSSPI = 9 - AuthTypeSASL = 10 - AuthTypeSASLContinue = 11 - AuthTypeSASLFinal = 12 -) - -func (f *Frontend) findAuthenticationMessageType(src []byte) (BackendMessage, error) { - if len(src) < 4 { - return nil, errors.New("authentication message too short") - } - f.authType = binary.BigEndian.Uint32(src[:4]) - - switch f.authType { - case AuthTypeOk: - return &f.authenticationOk, nil - case AuthTypeCleartextPassword: - return &f.authenticationCleartextPassword, nil - case AuthTypeMD5Password: - return &f.authenticationMD5Password, nil - case AuthTypeSCMCreds: - return nil, errors.New("AuthTypeSCMCreds is unimplemented") - case AuthTypeGSS: - return &f.authenticationGSS, nil - case AuthTypeGSSCont: - return &f.authenticationGSSContinue, nil - case AuthTypeSSPI: - return nil, errors.New("AuthTypeSSPI is unimplemented") - case AuthTypeSASL: - return &f.authenticationSASL, nil - case AuthTypeSASLContinue: - return &f.authenticationSASLContinue, nil - case AuthTypeSASLFinal: - return &f.authenticationSASLFinal, nil - default: - return nil, fmt.Errorf("unknown authentication type: %d", f.authType) - } -} - -// GetAuthType returns the authType used in the current state of the frontend. -// See SetAuthType for more information. -func (f *Frontend) GetAuthType() uint32 { - return f.authType -} - -func (f *Frontend) ReadBufferLen() int { - return f.cr.wp - f.cr.rp -} - -// SetMaxBodyLen sets the maximum length of a message body in octets. -// If a message body exceeds this length, Receive will return an error. -// This is useful for protecting against a corrupted server that sends -// messages with incorrect length, which can cause memory exhaustion. -// The default value is 0. -// If maxBodyLen is 0, then no maximum is enforced. -func (f *Frontend) SetMaxBodyLen(maxBodyLen int) { - f.maxBodyLen = maxBodyLen -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/function_call.go b/vendor/github.com/jackc/pgx/v5/pgproto3/function_call.go deleted file mode 100644 index 7d83579ff..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/function_call.go +++ /dev/null @@ -1,102 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type FunctionCall struct { - Function uint32 - ArgFormatCodes []uint16 - Arguments [][]byte - ResultFormatCode uint16 -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*FunctionCall) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *FunctionCall) Decode(src []byte) error { - *dst = FunctionCall{} - rp := 0 - // Specifies the object ID of the function to call. - dst.Function = binary.BigEndian.Uint32(src[rp:]) - rp += 4 - // The number of argument format codes that follow (denoted C below). - // This can be zero to indicate that there are no arguments or that the arguments all use the default format (text); - // or one, in which case the specified format code is applied to all arguments; - // or it can equal the actual number of arguments. - nArgumentCodes := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - argumentCodes := make([]uint16, nArgumentCodes) - for i := 0; i < nArgumentCodes; i++ { - // The argument format codes. Each must presently be zero (text) or one (binary). - ac := binary.BigEndian.Uint16(src[rp:]) - if ac != 0 && ac != 1 { - return &invalidMessageFormatErr{messageType: "FunctionCall"} - } - argumentCodes[i] = ac - rp += 2 - } - dst.ArgFormatCodes = argumentCodes - - // Specifies the number of arguments being supplied to the function. - nArguments := int(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - arguments := make([][]byte, nArguments) - for i := 0; i < nArguments; i++ { - // The length of the argument value, in bytes (this count does not include itself). Can be zero. - // As a special case, -1 indicates a NULL argument value. No value bytes follow in the NULL case. - argumentLength := int(binary.BigEndian.Uint32(src[rp:])) - rp += 4 - if argumentLength == -1 { - arguments[i] = nil - } else { - // The value of the argument, in the format indicated by the associated format code. n is the above length. - argumentValue := src[rp : rp+argumentLength] - rp += argumentLength - arguments[i] = argumentValue - } - } - dst.Arguments = arguments - // The format code for the function result. Must presently be zero (text) or one (binary). - resultFormatCode := binary.BigEndian.Uint16(src[rp:]) - if resultFormatCode != 0 && resultFormatCode != 1 { - return &invalidMessageFormatErr{messageType: "FunctionCall"} - } - dst.ResultFormatCode = resultFormatCode - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *FunctionCall) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'F') - dst = pgio.AppendUint32(dst, src.Function) - - if len(src.ArgFormatCodes) > math.MaxUint16 { - return nil, errors.New("too many arg format codes") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ArgFormatCodes))) - for _, argFormatCode := range src.ArgFormatCodes { - dst = pgio.AppendUint16(dst, argFormatCode) - } - - if len(src.Arguments) > math.MaxUint16 { - return nil, errors.New("too many arguments") - } - dst = pgio.AppendUint16(dst, uint16(len(src.Arguments))) - for _, argument := range src.Arguments { - if argument == nil { - dst = pgio.AppendInt32(dst, -1) - } else { - dst = pgio.AppendInt32(dst, int32(len(argument))) - dst = append(dst, argument...) - } - } - dst = pgio.AppendUint16(dst, src.ResultFormatCode) - return finishMessage(dst, sp) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/function_call_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/function_call_response.go deleted file mode 100644 index 1f2734952..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/function_call_response.go +++ /dev/null @@ -1,97 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/hex" - "encoding/json" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type FunctionCallResponse struct { - Result []byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*FunctionCallResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *FunctionCallResponse) Decode(src []byte) error { - if len(src) < 4 { - return &invalidMessageFormatErr{messageType: "FunctionCallResponse"} - } - rp := 0 - resultSize := int(binary.BigEndian.Uint32(src[rp:])) - rp += 4 - - if resultSize == -1 { - dst.Result = nil - return nil - } - - if len(src[rp:]) != resultSize { - return &invalidMessageFormatErr{messageType: "FunctionCallResponse"} - } - - dst.Result = src[rp:] - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *FunctionCallResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'V') - - if src.Result == nil { - dst = pgio.AppendInt32(dst, -1) - } else { - dst = pgio.AppendInt32(dst, int32(len(src.Result))) - dst = append(dst, src.Result...) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src FunctionCallResponse) MarshalJSON() ([]byte, error) { - var formattedValue map[string]string - var hasNonPrintable bool - for _, b := range src.Result { - if b < 32 { - hasNonPrintable = true - break - } - } - - if hasNonPrintable { - formattedValue = map[string]string{"binary": hex.EncodeToString(src.Result)} - } else { - formattedValue = map[string]string{"text": string(src.Result)} - } - - return json.Marshal(struct { - Type string - Result map[string]string - }{ - Type: "FunctionCallResponse", - Result: formattedValue, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *FunctionCallResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - Result map[string]string - } - err := json.Unmarshal(data, &msg) - if err != nil { - return err - } - dst.Result, err = getValueFromJSON(msg.Result) - return err -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/gss_enc_request.go b/vendor/github.com/jackc/pgx/v5/pgproto3/gss_enc_request.go deleted file mode 100644 index 70cb20cd5..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/gss_enc_request.go +++ /dev/null @@ -1,49 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -const gssEncReqNumber = 80877104 - -type GSSEncRequest struct { -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*GSSEncRequest) Frontend() {} - -func (dst *GSSEncRequest) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("gss encoding request too short") - } - - requestCode := binary.BigEndian.Uint32(src) - - if requestCode != gssEncReqNumber { - return errors.New("bad gss encoding request code") - } - - return nil -} - -// Encode encodes src into dst. dst will include the 4 byte message length. -func (src *GSSEncRequest) Encode(dst []byte) ([]byte, error) { - dst = pgio.AppendInt32(dst, 8) - dst = pgio.AppendInt32(dst, gssEncReqNumber) - return dst, nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src GSSEncRequest) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ProtocolVersion uint32 - Parameters map[string]string - }{ - Type: "GSSEncRequest", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/gss_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/gss_response.go deleted file mode 100644 index 10d937759..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/gss_response.go +++ /dev/null @@ -1,46 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type GSSResponse struct { - Data []byte -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (g *GSSResponse) Frontend() {} - -func (g *GSSResponse) Decode(data []byte) error { - g.Data = data - return nil -} - -func (g *GSSResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'p') - dst = append(dst, g.Data...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (g *GSSResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data []byte - }{ - Type: "GSSResponse", - Data: g.Data, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (g *GSSResponse) UnmarshalJSON(data []byte) error { - var msg struct { - Data []byte - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - g.Data = msg.Data - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/no_data.go b/vendor/github.com/jackc/pgx/v5/pgproto3/no_data.go deleted file mode 100644 index cbcaad40c..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/no_data.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type NoData struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*NoData) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *NoData) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "NoData", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *NoData) Encode(dst []byte) ([]byte, error) { - return append(dst, 'n', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src NoData) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "NoData", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/notice_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/notice_response.go deleted file mode 100644 index 497aba6dd..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/notice_response.go +++ /dev/null @@ -1,19 +0,0 @@ -package pgproto3 - -type NoticeResponse ErrorResponse - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*NoticeResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *NoticeResponse) Decode(src []byte) error { - return (*ErrorResponse)(dst).Decode(src) -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *NoticeResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'N') - dst = (*ErrorResponse)(src).appendFields(dst) - return finishMessage(dst, sp) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/notification_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/notification_response.go deleted file mode 100644 index 243b6bf7c..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/notification_response.go +++ /dev/null @@ -1,71 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type NotificationResponse struct { - PID uint32 - Channel string - Payload string -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*NotificationResponse) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *NotificationResponse) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - if buf.Len() < 4 { - return &invalidMessageFormatErr{messageType: "NotificationResponse", details: "too short"} - } - - pid := binary.BigEndian.Uint32(buf.Next(4)) - - b, err := buf.ReadBytes(0) - if err != nil { - return err - } - channel := string(b[:len(b)-1]) - - b, err = buf.ReadBytes(0) - if err != nil { - return err - } - payload := string(b[:len(b)-1]) - - *dst = NotificationResponse{PID: pid, Channel: channel, Payload: payload} - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *NotificationResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'A') - dst = pgio.AppendUint32(dst, src.PID) - dst = append(dst, src.Channel...) - dst = append(dst, 0) - dst = append(dst, src.Payload...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src NotificationResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - PID uint32 - Channel string - Payload string - }{ - Type: "NotificationResponse", - PID: src.PID, - Channel: src.Channel, - Payload: src.Payload, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_description.go b/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_description.go deleted file mode 100644 index 1ef27b75f..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_description.go +++ /dev/null @@ -1,67 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type ParameterDescription struct { - ParameterOIDs []uint32 -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*ParameterDescription) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *ParameterDescription) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - if buf.Len() < 2 { - return &invalidMessageFormatErr{messageType: "ParameterDescription"} - } - - // Reported parameter count will be incorrect when number of args is greater than uint16 - buf.Next(2) - // Instead infer parameter count by remaining size of message - parameterCount := buf.Len() / 4 - - *dst = ParameterDescription{ParameterOIDs: make([]uint32, parameterCount)} - - for i := 0; i < parameterCount; i++ { - dst.ParameterOIDs[i] = binary.BigEndian.Uint32(buf.Next(4)) - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *ParameterDescription) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 't') - - if len(src.ParameterOIDs) > math.MaxUint16 { - return nil, errors.New("too many parameter oids") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ParameterOIDs))) - for _, oid := range src.ParameterOIDs { - dst = pgio.AppendUint32(dst, oid) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src ParameterDescription) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ParameterOIDs []uint32 - }{ - Type: "ParameterDescription", - ParameterOIDs: src.ParameterOIDs, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_status.go b/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_status.go deleted file mode 100644 index 9ee0720b5..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/parameter_status.go +++ /dev/null @@ -1,58 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" -) - -type ParameterStatus struct { - Name string - Value string -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*ParameterStatus) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *ParameterStatus) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - b, err := buf.ReadBytes(0) - if err != nil { - return err - } - name := string(b[:len(b)-1]) - - b, err = buf.ReadBytes(0) - if err != nil { - return err - } - value := string(b[:len(b)-1]) - - *dst = ParameterStatus{Name: name, Value: value} - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *ParameterStatus) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'S') - dst = append(dst, src.Name...) - dst = append(dst, 0) - dst = append(dst, src.Value...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (ps ParameterStatus) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Name string - Value string - }{ - Type: "ParameterStatus", - Name: ps.Name, - Value: ps.Value, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/parse.go b/vendor/github.com/jackc/pgx/v5/pgproto3/parse.go deleted file mode 100644 index 6ba3486cf..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/parse.go +++ /dev/null @@ -1,89 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type Parse struct { - Name string - Query string - ParameterOIDs []uint32 -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Parse) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Parse) Decode(src []byte) error { - *dst = Parse{} - - buf := bytes.NewBuffer(src) - - b, err := buf.ReadBytes(0) - if err != nil { - return err - } - dst.Name = string(b[:len(b)-1]) - - b, err = buf.ReadBytes(0) - if err != nil { - return err - } - dst.Query = string(b[:len(b)-1]) - - if buf.Len() < 2 { - return &invalidMessageFormatErr{messageType: "Parse"} - } - parameterOIDCount := int(binary.BigEndian.Uint16(buf.Next(2))) - - for i := 0; i < parameterOIDCount; i++ { - if buf.Len() < 4 { - return &invalidMessageFormatErr{messageType: "Parse"} - } - dst.ParameterOIDs = append(dst.ParameterOIDs, binary.BigEndian.Uint32(buf.Next(4))) - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Parse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'P') - - dst = append(dst, src.Name...) - dst = append(dst, 0) - dst = append(dst, src.Query...) - dst = append(dst, 0) - - if len(src.ParameterOIDs) > math.MaxUint16 { - return nil, errors.New("too many parameter oids") - } - dst = pgio.AppendUint16(dst, uint16(len(src.ParameterOIDs))) - for _, oid := range src.ParameterOIDs { - dst = pgio.AppendUint32(dst, oid) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Parse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Name string - Query string - ParameterOIDs []uint32 - }{ - Type: "Parse", - Name: src.Name, - Query: src.Query, - ParameterOIDs: src.ParameterOIDs, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/parse_complete.go b/vendor/github.com/jackc/pgx/v5/pgproto3/parse_complete.go deleted file mode 100644 index cff9e27d0..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/parse_complete.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type ParseComplete struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*ParseComplete) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *ParseComplete) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "ParseComplete", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *ParseComplete) Encode(dst []byte) ([]byte, error) { - return append(dst, '1', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src ParseComplete) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "ParseComplete", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/password_message.go b/vendor/github.com/jackc/pgx/v5/pgproto3/password_message.go deleted file mode 100644 index d820d3275..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/password_message.go +++ /dev/null @@ -1,49 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" -) - -type PasswordMessage struct { - Password string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*PasswordMessage) Frontend() {} - -// Frontend identifies this message as an authentication response. -func (*PasswordMessage) InitialResponse() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *PasswordMessage) Decode(src []byte) error { - buf := bytes.NewBuffer(src) - - b, err := buf.ReadBytes(0) - if err != nil { - return err - } - dst.Password = string(b[:len(b)-1]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *PasswordMessage) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'p') - dst = append(dst, src.Password...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src PasswordMessage) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Password string - }{ - Type: "PasswordMessage", - Password: src.Password, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/pgproto3.go b/vendor/github.com/jackc/pgx/v5/pgproto3/pgproto3.go deleted file mode 100644 index 128f97f87..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/pgproto3.go +++ /dev/null @@ -1,120 +0,0 @@ -package pgproto3 - -import ( - "encoding/hex" - "errors" - "fmt" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -// maxMessageBodyLen is the maximum length of a message body in bytes. See PG_LARGE_MESSAGE_LIMIT in the PostgreSQL -// source. It is defined as (MaxAllocSize - 1). MaxAllocSize is defined as 0x3fffffff. -const maxMessageBodyLen = (0x3fffffff - 1) - -// Message is the interface implemented by an object that can decode and encode -// a particular PostgreSQL message. -type Message interface { - // Decode is allowed and expected to retain a reference to data after - // returning (unlike encoding.BinaryUnmarshaler). - Decode(data []byte) error - - // Encode appends itself to dst and returns the new buffer. - Encode(dst []byte) ([]byte, error) -} - -// FrontendMessage is a message sent by the frontend (i.e. the client). -type FrontendMessage interface { - Message - Frontend() // no-op method to distinguish frontend from backend methods -} - -// BackendMessage is a message sent by the backend (i.e. the server). -type BackendMessage interface { - Message - Backend() // no-op method to distinguish frontend from backend methods -} - -type AuthenticationResponseMessage interface { - BackendMessage - AuthenticationResponse() // no-op method to distinguish authentication responses -} - -type invalidMessageLenErr struct { - messageType string - expectedLen int - actualLen int -} - -func (e *invalidMessageLenErr) Error() string { - return fmt.Sprintf("%s body must have length of %d, but it is %d", e.messageType, e.expectedLen, e.actualLen) -} - -type invalidMessageFormatErr struct { - messageType string - details string -} - -func (e *invalidMessageFormatErr) Error() string { - return fmt.Sprintf("%s body is invalid %s", e.messageType, e.details) -} - -type writeError struct { - err error - safeToRetry bool -} - -func (e *writeError) Error() string { - return fmt.Sprintf("write failed: %s", e.err.Error()) -} - -func (e *writeError) SafeToRetry() bool { - return e.safeToRetry -} - -func (e *writeError) Unwrap() error { - return e.err -} - -type ExceededMaxBodyLenErr struct { - MaxExpectedBodyLen int - ActualBodyLen int -} - -func (e *ExceededMaxBodyLenErr) Error() string { - return fmt.Sprintf("invalid body length: expected at most %d, but got %d", e.MaxExpectedBodyLen, e.ActualBodyLen) -} - -// getValueFromJSON gets the value from a protocol message representation in JSON. -func getValueFromJSON(v map[string]string) ([]byte, error) { - if v == nil { - return nil, nil - } - if text, ok := v["text"]; ok { - return []byte(text), nil - } - if binary, ok := v["binary"]; ok { - return hex.DecodeString(binary) - } - return nil, errors.New("unknown protocol representation") -} - -// beginMessage begins a new message of type t. It appends the message type and a placeholder for the message length to -// dst. It returns the new buffer and the position of the message length placeholder. -func beginMessage(dst []byte, t byte) ([]byte, int) { - dst = append(dst, t) - sp := len(dst) - dst = pgio.AppendInt32(dst, -1) - return dst, sp -} - -// finishMessage finishes a message that was started with beginMessage. It computes the message length and writes it to -// dst[sp]. If the message length is too large it returns an error. Otherwise it returns the final message buffer. -func finishMessage(dst []byte, sp int) ([]byte, error) { - messageBodyLen := len(dst[sp:]) - if messageBodyLen > maxMessageBodyLen { - return nil, errors.New("message body too large") - } - pgio.SetInt32(dst[sp:], int32(messageBodyLen)) - return dst, nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/portal_suspended.go b/vendor/github.com/jackc/pgx/v5/pgproto3/portal_suspended.go deleted file mode 100644 index 9e2f8cbc4..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/portal_suspended.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type PortalSuspended struct{} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*PortalSuspended) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *PortalSuspended) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "PortalSuspended", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *PortalSuspended) Encode(dst []byte) ([]byte, error) { - return append(dst, 's', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src PortalSuspended) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "PortalSuspended", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/query.go b/vendor/github.com/jackc/pgx/v5/pgproto3/query.go deleted file mode 100644 index aebdfde89..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/query.go +++ /dev/null @@ -1,45 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/json" -) - -type Query struct { - String string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Query) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Query) Decode(src []byte) error { - i := bytes.IndexByte(src, 0) - if i != len(src)-1 { - return &invalidMessageFormatErr{messageType: "Query"} - } - - dst.String = string(src[:i]) - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Query) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'Q') - dst = append(dst, src.String...) - dst = append(dst, 0) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Query) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - String string - }{ - Type: "Query", - String: src.String, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/ready_for_query.go b/vendor/github.com/jackc/pgx/v5/pgproto3/ready_for_query.go deleted file mode 100644 index a56af9fb2..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/ready_for_query.go +++ /dev/null @@ -1,61 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" - "errors" -) - -type ReadyForQuery struct { - TxStatus byte -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*ReadyForQuery) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *ReadyForQuery) Decode(src []byte) error { - if len(src) != 1 { - return &invalidMessageLenErr{messageType: "ReadyForQuery", expectedLen: 1, actualLen: len(src)} - } - - dst.TxStatus = src[0] - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *ReadyForQuery) Encode(dst []byte) ([]byte, error) { - return append(dst, 'Z', 0, 0, 0, 5, src.TxStatus), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src ReadyForQuery) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - TxStatus string - }{ - Type: "ReadyForQuery", - TxStatus: string(src.TxStatus), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *ReadyForQuery) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - TxStatus string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - if len(msg.TxStatus) != 1 { - return errors.New("invalid length for ReadyForQuery.TxStatus") - } - dst.TxStatus = msg.TxStatus[0] - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/row_description.go b/vendor/github.com/jackc/pgx/v5/pgproto3/row_description.go deleted file mode 100644 index dc2a4ddf2..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/row_description.go +++ /dev/null @@ -1,166 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "math" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -const ( - TextFormat = 0 - BinaryFormat = 1 -) - -type FieldDescription struct { - Name []byte - TableOID uint32 - TableAttributeNumber uint16 - DataTypeOID uint32 - DataTypeSize int16 - TypeModifier int32 - Format int16 -} - -// MarshalJSON implements encoding/json.Marshaler. -func (fd FieldDescription) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Name string - TableOID uint32 - TableAttributeNumber uint16 - DataTypeOID uint32 - DataTypeSize int16 - TypeModifier int32 - Format int16 - }{ - Name: string(fd.Name), - TableOID: fd.TableOID, - TableAttributeNumber: fd.TableAttributeNumber, - DataTypeOID: fd.DataTypeOID, - DataTypeSize: fd.DataTypeSize, - TypeModifier: fd.TypeModifier, - Format: fd.Format, - }) -} - -type RowDescription struct { - Fields []FieldDescription -} - -// Backend identifies this message as sendable by the PostgreSQL backend. -func (*RowDescription) Backend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *RowDescription) Decode(src []byte) error { - - if len(src) < 2 { - return &invalidMessageFormatErr{messageType: "RowDescription"} - } - fieldCount := int(binary.BigEndian.Uint16(src)) - rp := 2 - - dst.Fields = dst.Fields[0:0] - - for i := 0; i < fieldCount; i++ { - var fd FieldDescription - - idx := bytes.IndexByte(src[rp:], 0) - if idx < 0 { - return &invalidMessageFormatErr{messageType: "RowDescription"} - } - fd.Name = src[rp : rp+idx] - rp += idx + 1 - - // Since buf.Next() doesn't return an error if we hit the end of the buffer - // check Len ahead of time - if len(src[rp:]) < 18 { - return &invalidMessageFormatErr{messageType: "RowDescription"} - } - - fd.TableOID = binary.BigEndian.Uint32(src[rp:]) - rp += 4 - fd.TableAttributeNumber = binary.BigEndian.Uint16(src[rp:]) - rp += 2 - fd.DataTypeOID = binary.BigEndian.Uint32(src[rp:]) - rp += 4 - fd.DataTypeSize = int16(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - fd.TypeModifier = int32(binary.BigEndian.Uint32(src[rp:])) - rp += 4 - fd.Format = int16(binary.BigEndian.Uint16(src[rp:])) - rp += 2 - - dst.Fields = append(dst.Fields, fd) - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *RowDescription) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'T') - - if len(src.Fields) > math.MaxUint16 { - return nil, errors.New("too many fields") - } - dst = pgio.AppendUint16(dst, uint16(len(src.Fields))) - for _, fd := range src.Fields { - dst = append(dst, fd.Name...) - dst = append(dst, 0) - - dst = pgio.AppendUint32(dst, fd.TableOID) - dst = pgio.AppendUint16(dst, fd.TableAttributeNumber) - dst = pgio.AppendUint32(dst, fd.DataTypeOID) - dst = pgio.AppendInt16(dst, fd.DataTypeSize) - dst = pgio.AppendInt32(dst, fd.TypeModifier) - dst = pgio.AppendInt16(dst, fd.Format) - } - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src RowDescription) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Fields []FieldDescription - }{ - Type: "RowDescription", - Fields: src.Fields, - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *RowDescription) UnmarshalJSON(data []byte) error { - var msg struct { - Fields []struct { - Name string - TableOID uint32 - TableAttributeNumber uint16 - DataTypeOID uint32 - DataTypeSize int16 - TypeModifier int32 - Format int16 - } - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - dst.Fields = make([]FieldDescription, len(msg.Fields)) - for n, field := range msg.Fields { - dst.Fields[n] = FieldDescription{ - Name: []byte(field.Name), - TableOID: field.TableOID, - TableAttributeNumber: field.TableAttributeNumber, - DataTypeOID: field.DataTypeOID, - DataTypeSize: field.DataTypeSize, - TypeModifier: field.TypeModifier, - Format: field.Format, - } - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_initial_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_initial_response.go deleted file mode 100644 index 9eb1b6a4b..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_initial_response.go +++ /dev/null @@ -1,90 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -type SASLInitialResponse struct { - AuthMechanism string - Data []byte -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*SASLInitialResponse) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *SASLInitialResponse) Decode(src []byte) error { - *dst = SASLInitialResponse{} - - rp := 0 - - idx := bytes.IndexByte(src, 0) - if idx < 0 { - return errors.New("invalid SASLInitialResponse") - } - - dst.AuthMechanism = string(src[rp:idx]) - rp = idx + 1 - - rp += 4 // The rest of the message is data so we can just skip the size - dst.Data = src[rp:] - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *SASLInitialResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'p') - - dst = append(dst, []byte(src.AuthMechanism)...) - dst = append(dst, 0) - - dst = pgio.AppendInt32(dst, int32(len(src.Data))) - dst = append(dst, src.Data...) - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src SASLInitialResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - AuthMechanism string - Data string - }{ - Type: "SASLInitialResponse", - AuthMechanism: src.AuthMechanism, - Data: string(src.Data), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *SASLInitialResponse) UnmarshalJSON(data []byte) error { - // Ignore null, like in the main JSON package. - if string(data) == "null" { - return nil - } - - var msg struct { - AuthMechanism string - Data string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - dst.AuthMechanism = msg.AuthMechanism - if msg.Data != "" { - decoded, err := hex.DecodeString(msg.Data) - if err != nil { - return err - } - dst.Data = decoded - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_response.go b/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_response.go deleted file mode 100644 index 1b604c254..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/sasl_response.go +++ /dev/null @@ -1,56 +0,0 @@ -package pgproto3 - -import ( - "encoding/hex" - "encoding/json" -) - -type SASLResponse struct { - Data []byte -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*SASLResponse) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *SASLResponse) Decode(src []byte) error { - *dst = SASLResponse{Data: src} - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *SASLResponse) Encode(dst []byte) ([]byte, error) { - dst, sp := beginMessage(dst, 'p') - dst = append(dst, src.Data...) - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src SASLResponse) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Data string - }{ - Type: "SASLResponse", - Data: string(src.Data), - }) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler. -func (dst *SASLResponse) UnmarshalJSON(data []byte) error { - var msg struct { - Data string - } - if err := json.Unmarshal(data, &msg); err != nil { - return err - } - if msg.Data != "" { - decoded, err := hex.DecodeString(msg.Data) - if err != nil { - return err - } - dst.Data = decoded - } - return nil -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/ssl_request.go b/vendor/github.com/jackc/pgx/v5/pgproto3/ssl_request.go deleted file mode 100644 index b0fc28476..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/ssl_request.go +++ /dev/null @@ -1,49 +0,0 @@ -package pgproto3 - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -const sslRequestNumber = 80877103 - -type SSLRequest struct { -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*SSLRequest) Frontend() {} - -func (dst *SSLRequest) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("ssl request too short") - } - - requestCode := binary.BigEndian.Uint32(src) - - if requestCode != sslRequestNumber { - return errors.New("bad ssl request code") - } - - return nil -} - -// Encode encodes src into dst. dst will include the 4 byte message length. -func (src *SSLRequest) Encode(dst []byte) ([]byte, error) { - dst = pgio.AppendInt32(dst, 8) - dst = pgio.AppendInt32(dst, sslRequestNumber) - return dst, nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src SSLRequest) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ProtocolVersion uint32 - Parameters map[string]string - }{ - Type: "SSLRequest", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/startup_message.go b/vendor/github.com/jackc/pgx/v5/pgproto3/startup_message.go deleted file mode 100644 index 3af4587d8..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/startup_message.go +++ /dev/null @@ -1,94 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "errors" - "fmt" - - "github.com/jackc/pgx/v5/internal/pgio" -) - -const ProtocolVersionNumber = 196608 // 3.0 - -type StartupMessage struct { - ProtocolVersion uint32 - Parameters map[string]string -} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*StartupMessage) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *StartupMessage) Decode(src []byte) error { - if len(src) < 4 { - return errors.New("startup message too short") - } - - dst.ProtocolVersion = binary.BigEndian.Uint32(src) - rp := 4 - - if dst.ProtocolVersion != ProtocolVersionNumber { - return fmt.Errorf("Bad startup message version number. Expected %d, got %d", ProtocolVersionNumber, dst.ProtocolVersion) - } - - dst.Parameters = make(map[string]string) - for { - idx := bytes.IndexByte(src[rp:], 0) - if idx < 0 { - return &invalidMessageFormatErr{messageType: "StartupMessage"} - } - key := string(src[rp : rp+idx]) - rp += idx + 1 - - idx = bytes.IndexByte(src[rp:], 0) - if idx < 0 { - return &invalidMessageFormatErr{messageType: "StartupMessage"} - } - value := string(src[rp : rp+idx]) - rp += idx + 1 - - dst.Parameters[key] = value - - if len(src[rp:]) == 1 { - if src[rp] != 0 { - return fmt.Errorf("Bad startup message last byte. Expected 0, got %d", src[rp]) - } - break - } - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *StartupMessage) Encode(dst []byte) ([]byte, error) { - sp := len(dst) - dst = pgio.AppendInt32(dst, -1) - - dst = pgio.AppendUint32(dst, src.ProtocolVersion) - for k, v := range src.Parameters { - dst = append(dst, k...) - dst = append(dst, 0) - dst = append(dst, v...) - dst = append(dst, 0) - } - dst = append(dst, 0) - - return finishMessage(dst, sp) -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src StartupMessage) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - ProtocolVersion uint32 - Parameters map[string]string - }{ - Type: "StartupMessage", - ProtocolVersion: src.ProtocolVersion, - Parameters: src.Parameters, - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/sync.go b/vendor/github.com/jackc/pgx/v5/pgproto3/sync.go deleted file mode 100644 index ea4fc9594..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/sync.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type Sync struct{} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Sync) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Sync) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "Sync", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Sync) Encode(dst []byte) ([]byte, error) { - return append(dst, 'S', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Sync) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "Sync", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/terminate.go b/vendor/github.com/jackc/pgx/v5/pgproto3/terminate.go deleted file mode 100644 index 35a9dc837..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/terminate.go +++ /dev/null @@ -1,34 +0,0 @@ -package pgproto3 - -import ( - "encoding/json" -) - -type Terminate struct{} - -// Frontend identifies this message as sendable by a PostgreSQL frontend. -func (*Terminate) Frontend() {} - -// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message -// type identifier and 4 byte message length. -func (dst *Terminate) Decode(src []byte) error { - if len(src) != 0 { - return &invalidMessageLenErr{messageType: "Terminate", expectedLen: 0, actualLen: len(src)} - } - - return nil -} - -// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length. -func (src *Terminate) Encode(dst []byte) ([]byte, error) { - return append(dst, 'X', 0, 0, 0, 4), nil -} - -// MarshalJSON implements encoding/json.Marshaler. -func (src Terminate) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - }{ - Type: "Terminate", - }) -} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go b/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go deleted file mode 100644 index 6cc7d3e36..000000000 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go +++ /dev/null @@ -1,416 +0,0 @@ -package pgproto3 - -import ( - "bytes" - "fmt" - "io" - "strconv" - "strings" - "sync" - "time" -) - -// tracer traces the messages send to and from a Backend or Frontend. The format it produces roughly mimics the -// format produced by the libpq C function PQtrace. -type tracer struct { - TracerOptions - - mux sync.Mutex - w io.Writer - buf *bytes.Buffer -} - -// TracerOptions controls tracing behavior. It is roughly equivalent to the libpq function PQsetTraceFlags. -type TracerOptions struct { - // SuppressTimestamps prevents printing of timestamps. - SuppressTimestamps bool - - // RegressMode redacts fields that may be vary between executions. - RegressMode bool -} - -func (t *tracer) traceMessage(sender byte, encodedLen int32, msg Message) { - switch msg := msg.(type) { - case *AuthenticationCleartextPassword: - t.traceAuthenticationCleartextPassword(sender, encodedLen, msg) - case *AuthenticationGSS: - t.traceAuthenticationGSS(sender, encodedLen, msg) - case *AuthenticationGSSContinue: - t.traceAuthenticationGSSContinue(sender, encodedLen, msg) - case *AuthenticationMD5Password: - t.traceAuthenticationMD5Password(sender, encodedLen, msg) - case *AuthenticationOk: - t.traceAuthenticationOk(sender, encodedLen, msg) - case *AuthenticationSASL: - t.traceAuthenticationSASL(sender, encodedLen, msg) - case *AuthenticationSASLContinue: - t.traceAuthenticationSASLContinue(sender, encodedLen, msg) - case *AuthenticationSASLFinal: - t.traceAuthenticationSASLFinal(sender, encodedLen, msg) - case *BackendKeyData: - t.traceBackendKeyData(sender, encodedLen, msg) - case *Bind: - t.traceBind(sender, encodedLen, msg) - case *BindComplete: - t.traceBindComplete(sender, encodedLen, msg) - case *CancelRequest: - t.traceCancelRequest(sender, encodedLen, msg) - case *Close: - t.traceClose(sender, encodedLen, msg) - case *CloseComplete: - t.traceCloseComplete(sender, encodedLen, msg) - case *CommandComplete: - t.traceCommandComplete(sender, encodedLen, msg) - case *CopyBothResponse: - t.traceCopyBothResponse(sender, encodedLen, msg) - case *CopyData: - t.traceCopyData(sender, encodedLen, msg) - case *CopyDone: - t.traceCopyDone(sender, encodedLen, msg) - case *CopyFail: - t.traceCopyFail(sender, encodedLen, msg) - case *CopyInResponse: - t.traceCopyInResponse(sender, encodedLen, msg) - case *CopyOutResponse: - t.traceCopyOutResponse(sender, encodedLen, msg) - case *DataRow: - t.traceDataRow(sender, encodedLen, msg) - case *Describe: - t.traceDescribe(sender, encodedLen, msg) - case *EmptyQueryResponse: - t.traceEmptyQueryResponse(sender, encodedLen, msg) - case *ErrorResponse: - t.traceErrorResponse(sender, encodedLen, msg) - case *Execute: - t.TraceQueryute(sender, encodedLen, msg) - case *Flush: - t.traceFlush(sender, encodedLen, msg) - case *FunctionCall: - t.traceFunctionCall(sender, encodedLen, msg) - case *FunctionCallResponse: - t.traceFunctionCallResponse(sender, encodedLen, msg) - case *GSSEncRequest: - t.traceGSSEncRequest(sender, encodedLen, msg) - case *NoData: - t.traceNoData(sender, encodedLen, msg) - case *NoticeResponse: - t.traceNoticeResponse(sender, encodedLen, msg) - case *NotificationResponse: - t.traceNotificationResponse(sender, encodedLen, msg) - case *ParameterDescription: - t.traceParameterDescription(sender, encodedLen, msg) - case *ParameterStatus: - t.traceParameterStatus(sender, encodedLen, msg) - case *Parse: - t.traceParse(sender, encodedLen, msg) - case *ParseComplete: - t.traceParseComplete(sender, encodedLen, msg) - case *PortalSuspended: - t.tracePortalSuspended(sender, encodedLen, msg) - case *Query: - t.traceQuery(sender, encodedLen, msg) - case *ReadyForQuery: - t.traceReadyForQuery(sender, encodedLen, msg) - case *RowDescription: - t.traceRowDescription(sender, encodedLen, msg) - case *SSLRequest: - t.traceSSLRequest(sender, encodedLen, msg) - case *StartupMessage: - t.traceStartupMessage(sender, encodedLen, msg) - case *Sync: - t.traceSync(sender, encodedLen, msg) - case *Terminate: - t.traceTerminate(sender, encodedLen, msg) - default: - t.writeTrace(sender, encodedLen, "Unknown", nil) - } -} - -func (t *tracer) traceAuthenticationCleartextPassword(sender byte, encodedLen int32, msg *AuthenticationCleartextPassword) { - t.writeTrace(sender, encodedLen, "AuthenticationCleartextPassword", nil) -} - -func (t *tracer) traceAuthenticationGSS(sender byte, encodedLen int32, msg *AuthenticationGSS) { - t.writeTrace(sender, encodedLen, "AuthenticationGSS", nil) -} - -func (t *tracer) traceAuthenticationGSSContinue(sender byte, encodedLen int32, msg *AuthenticationGSSContinue) { - t.writeTrace(sender, encodedLen, "AuthenticationGSSContinue", nil) -} - -func (t *tracer) traceAuthenticationMD5Password(sender byte, encodedLen int32, msg *AuthenticationMD5Password) { - t.writeTrace(sender, encodedLen, "AuthenticationMD5Password", nil) -} - -func (t *tracer) traceAuthenticationOk(sender byte, encodedLen int32, msg *AuthenticationOk) { - t.writeTrace(sender, encodedLen, "AuthenticationOk", nil) -} - -func (t *tracer) traceAuthenticationSASL(sender byte, encodedLen int32, msg *AuthenticationSASL) { - t.writeTrace(sender, encodedLen, "AuthenticationSASL", nil) -} - -func (t *tracer) traceAuthenticationSASLContinue(sender byte, encodedLen int32, msg *AuthenticationSASLContinue) { - t.writeTrace(sender, encodedLen, "AuthenticationSASLContinue", nil) -} - -func (t *tracer) traceAuthenticationSASLFinal(sender byte, encodedLen int32, msg *AuthenticationSASLFinal) { - t.writeTrace(sender, encodedLen, "AuthenticationSASLFinal", nil) -} - -func (t *tracer) traceBackendKeyData(sender byte, encodedLen int32, msg *BackendKeyData) { - t.writeTrace(sender, encodedLen, "BackendKeyData", func() { - if t.RegressMode { - t.buf.WriteString("\t NNNN NNNN") - } else { - fmt.Fprintf(t.buf, "\t %d %d", msg.ProcessID, msg.SecretKey) - } - }) -} - -func (t *tracer) traceBind(sender byte, encodedLen int32, msg *Bind) { - t.writeTrace(sender, encodedLen, "Bind", func() { - fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.DestinationPortal)), traceDoubleQuotedString([]byte(msg.PreparedStatement)), len(msg.ParameterFormatCodes)) - for _, fc := range msg.ParameterFormatCodes { - fmt.Fprintf(t.buf, " %d", fc) - } - fmt.Fprintf(t.buf, " %d", len(msg.Parameters)) - for _, p := range msg.Parameters { - fmt.Fprintf(t.buf, " %s", traceSingleQuotedString(p)) - } - fmt.Fprintf(t.buf, " %d", len(msg.ResultFormatCodes)) - for _, fc := range msg.ResultFormatCodes { - fmt.Fprintf(t.buf, " %d", fc) - } - }) -} - -func (t *tracer) traceBindComplete(sender byte, encodedLen int32, msg *BindComplete) { - t.writeTrace(sender, encodedLen, "BindComplete", nil) -} - -func (t *tracer) traceCancelRequest(sender byte, encodedLen int32, msg *CancelRequest) { - t.writeTrace(sender, encodedLen, "CancelRequest", nil) -} - -func (t *tracer) traceClose(sender byte, encodedLen int32, msg *Close) { - t.writeTrace(sender, encodedLen, "Close", nil) -} - -func (t *tracer) traceCloseComplete(sender byte, encodedLen int32, msg *CloseComplete) { - t.writeTrace(sender, encodedLen, "CloseComplete", nil) -} - -func (t *tracer) traceCommandComplete(sender byte, encodedLen int32, msg *CommandComplete) { - t.writeTrace(sender, encodedLen, "CommandComplete", func() { - fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString(msg.CommandTag)) - }) -} - -func (t *tracer) traceCopyBothResponse(sender byte, encodedLen int32, msg *CopyBothResponse) { - t.writeTrace(sender, encodedLen, "CopyBothResponse", nil) -} - -func (t *tracer) traceCopyData(sender byte, encodedLen int32, msg *CopyData) { - t.writeTrace(sender, encodedLen, "CopyData", nil) -} - -func (t *tracer) traceCopyDone(sender byte, encodedLen int32, msg *CopyDone) { - t.writeTrace(sender, encodedLen, "CopyDone", nil) -} - -func (t *tracer) traceCopyFail(sender byte, encodedLen int32, msg *CopyFail) { - t.writeTrace(sender, encodedLen, "CopyFail", func() { - fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.Message))) - }) -} - -func (t *tracer) traceCopyInResponse(sender byte, encodedLen int32, msg *CopyInResponse) { - t.writeTrace(sender, encodedLen, "CopyInResponse", nil) -} - -func (t *tracer) traceCopyOutResponse(sender byte, encodedLen int32, msg *CopyOutResponse) { - t.writeTrace(sender, encodedLen, "CopyOutResponse", nil) -} - -func (t *tracer) traceDataRow(sender byte, encodedLen int32, msg *DataRow) { - t.writeTrace(sender, encodedLen, "DataRow", func() { - fmt.Fprintf(t.buf, "\t %d", len(msg.Values)) - for _, v := range msg.Values { - if v == nil { - t.buf.WriteString(" -1") - } else { - fmt.Fprintf(t.buf, " %d %s", len(v), traceSingleQuotedString(v)) - } - } - }) -} - -func (t *tracer) traceDescribe(sender byte, encodedLen int32, msg *Describe) { - t.writeTrace(sender, encodedLen, "Describe", func() { - fmt.Fprintf(t.buf, "\t %c %s", msg.ObjectType, traceDoubleQuotedString([]byte(msg.Name))) - }) -} - -func (t *tracer) traceEmptyQueryResponse(sender byte, encodedLen int32, msg *EmptyQueryResponse) { - t.writeTrace(sender, encodedLen, "EmptyQueryResponse", nil) -} - -func (t *tracer) traceErrorResponse(sender byte, encodedLen int32, msg *ErrorResponse) { - t.writeTrace(sender, encodedLen, "ErrorResponse", nil) -} - -func (t *tracer) TraceQueryute(sender byte, encodedLen int32, msg *Execute) { - t.writeTrace(sender, encodedLen, "Execute", func() { - fmt.Fprintf(t.buf, "\t %s %d", traceDoubleQuotedString([]byte(msg.Portal)), msg.MaxRows) - }) -} - -func (t *tracer) traceFlush(sender byte, encodedLen int32, msg *Flush) { - t.writeTrace(sender, encodedLen, "Flush", nil) -} - -func (t *tracer) traceFunctionCall(sender byte, encodedLen int32, msg *FunctionCall) { - t.writeTrace(sender, encodedLen, "FunctionCall", nil) -} - -func (t *tracer) traceFunctionCallResponse(sender byte, encodedLen int32, msg *FunctionCallResponse) { - t.writeTrace(sender, encodedLen, "FunctionCallResponse", nil) -} - -func (t *tracer) traceGSSEncRequest(sender byte, encodedLen int32, msg *GSSEncRequest) { - t.writeTrace(sender, encodedLen, "GSSEncRequest", nil) -} - -func (t *tracer) traceNoData(sender byte, encodedLen int32, msg *NoData) { - t.writeTrace(sender, encodedLen, "NoData", nil) -} - -func (t *tracer) traceNoticeResponse(sender byte, encodedLen int32, msg *NoticeResponse) { - t.writeTrace(sender, encodedLen, "NoticeResponse", nil) -} - -func (t *tracer) traceNotificationResponse(sender byte, encodedLen int32, msg *NotificationResponse) { - t.writeTrace(sender, encodedLen, "NotificationResponse", func() { - fmt.Fprintf(t.buf, "\t %d %s %s", msg.PID, traceDoubleQuotedString([]byte(msg.Channel)), traceDoubleQuotedString([]byte(msg.Payload))) - }) -} - -func (t *tracer) traceParameterDescription(sender byte, encodedLen int32, msg *ParameterDescription) { - t.writeTrace(sender, encodedLen, "ParameterDescription", nil) -} - -func (t *tracer) traceParameterStatus(sender byte, encodedLen int32, msg *ParameterStatus) { - t.writeTrace(sender, encodedLen, "ParameterStatus", func() { - fmt.Fprintf(t.buf, "\t %s %s", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Value))) - }) -} - -func (t *tracer) traceParse(sender byte, encodedLen int32, msg *Parse) { - t.writeTrace(sender, encodedLen, "Parse", func() { - fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Query)), len(msg.ParameterOIDs)) - for _, oid := range msg.ParameterOIDs { - fmt.Fprintf(t.buf, " %d", oid) - } - }) -} - -func (t *tracer) traceParseComplete(sender byte, encodedLen int32, msg *ParseComplete) { - t.writeTrace(sender, encodedLen, "ParseComplete", nil) -} - -func (t *tracer) tracePortalSuspended(sender byte, encodedLen int32, msg *PortalSuspended) { - t.writeTrace(sender, encodedLen, "PortalSuspended", nil) -} - -func (t *tracer) traceQuery(sender byte, encodedLen int32, msg *Query) { - t.writeTrace(sender, encodedLen, "Query", func() { - fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.String))) - }) -} - -func (t *tracer) traceReadyForQuery(sender byte, encodedLen int32, msg *ReadyForQuery) { - t.writeTrace(sender, encodedLen, "ReadyForQuery", func() { - fmt.Fprintf(t.buf, "\t %c", msg.TxStatus) - }) -} - -func (t *tracer) traceRowDescription(sender byte, encodedLen int32, msg *RowDescription) { - t.writeTrace(sender, encodedLen, "RowDescription", func() { - fmt.Fprintf(t.buf, "\t %d", len(msg.Fields)) - for _, fd := range msg.Fields { - fmt.Fprintf(t.buf, ` %s %d %d %d %d %d %d`, traceDoubleQuotedString(fd.Name), fd.TableOID, fd.TableAttributeNumber, fd.DataTypeOID, fd.DataTypeSize, fd.TypeModifier, fd.Format) - } - }) -} - -func (t *tracer) traceSSLRequest(sender byte, encodedLen int32, msg *SSLRequest) { - t.writeTrace(sender, encodedLen, "SSLRequest", nil) -} - -func (t *tracer) traceStartupMessage(sender byte, encodedLen int32, msg *StartupMessage) { - t.writeTrace(sender, encodedLen, "StartupMessage", nil) -} - -func (t *tracer) traceSync(sender byte, encodedLen int32, msg *Sync) { - t.writeTrace(sender, encodedLen, "Sync", nil) -} - -func (t *tracer) traceTerminate(sender byte, encodedLen int32, msg *Terminate) { - t.writeTrace(sender, encodedLen, "Terminate", nil) -} - -func (t *tracer) writeTrace(sender byte, encodedLen int32, msgType string, writeDetails func()) { - t.mux.Lock() - defer t.mux.Unlock() - defer func() { - if t.buf.Cap() > 1024 { - t.buf = &bytes.Buffer{} - } else { - t.buf.Reset() - } - }() - - if !t.SuppressTimestamps { - now := time.Now() - t.buf.WriteString(now.Format("2006-01-02 15:04:05.000000")) - t.buf.WriteByte('\t') - } - - t.buf.WriteByte(sender) - t.buf.WriteByte('\t') - t.buf.WriteString(msgType) - t.buf.WriteByte('\t') - t.buf.WriteString(strconv.FormatInt(int64(encodedLen), 10)) - - if writeDetails != nil { - writeDetails() - } - - t.buf.WriteByte('\n') - t.buf.WriteTo(t.w) -} - -// traceDoubleQuotedString returns t.buf as a double-quoted string without any escaping. It is roughly equivalent to -// pqTraceOutputString in libpq. -func traceDoubleQuotedString(buf []byte) string { - return `"` + string(buf) + `"` -} - -// traceSingleQuotedString returns buf as a single-quoted string with non-printable characters hex-escaped. It is -// roughly equivalent to pqTraceOutputNchar in libpq. -func traceSingleQuotedString(buf []byte) string { - sb := &strings.Builder{} - - sb.WriteByte('\'') - for _, b := range buf { - if b < 32 || b > 126 { - fmt.Fprintf(sb, `\x%x`, b) - } else { - sb.WriteByte(b) - } - } - sb.WriteByte('\'') - - return sb.String() -} |