package pgproto3

import (
	
	
	
)
Backend acts as a server for the PostgreSQL wire protocol version 3.
type Backend struct {
	cr ChunkReader
	w  io.Writer
NewBackend creates a new Backend.
func ( ChunkReader,  io.Writer) *Backend {
	return &Backend{cr: , w: }
}
Send sends a message to the frontend.
func ( *Backend) ( BackendMessage) error {
	,  := .w.Write(.Encode(nil))
	return 
}
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 ( *Backend) () (FrontendMessage, error) {
	,  := .cr.Next(4)
	if  != nil {
		return nil, 
	}
	 := int(binary.BigEndian.Uint32() - 4)

	,  = .cr.Next()
	if  != nil {
		return nil, 
	}

	 := binary.BigEndian.Uint32()

	switch  {
	case ProtocolVersionNumber:
		 = .startupMessage.Decode()
		if  != nil {
			return nil, 
		}
		return &.startupMessage, nil
	case sslRequestNumber:
		 = .sslRequest.Decode()
		if  != nil {
			return nil, 
		}
		return &.sslRequest, nil
	case cancelRequestCode:
		 = .cancelRequest.Decode()
		if  != nil {
			return nil, 
		}
		return &.cancelRequest, nil
	case gssEncReqNumber:
		 = .gssEncRequest.Decode()
		if  != nil {
			return nil, 
		}
		return &.gssEncRequest, nil
	default:
		return nil, fmt.Errorf("unknown startup message code: %d", )
	}
}
Receive receives a message from the frontend. The returned message is only valid until the next call to Receive.
func ( *Backend) () (FrontendMessage, error) {
	if !.partialMsg {
		,  := .cr.Next(5)
		if  != nil {
			return nil, 
		}

		.msgType = [0]
		.bodyLen = int(binary.BigEndian.Uint32([1:])) - 4
		.partialMsg = true
	}

	var  FrontendMessage
	switch .msgType {
	case 'B':
		 = &.bind
	case 'C':
		 = &._close
	case 'D':
		 = &.describe
	case 'E':
		 = &.execute
	case 'f':
		 = &.copyFail
	case 'H':
		 = &.flush
	case 'P':
		 = &.parse
	case 'p':
		 = &.passwordMessage
	case 'Q':
		 = &.query
	case 'S':
		 = &.sync
	case 'X':
		 = &.terminate
	default:
		return nil, fmt.Errorf("unknown message type: %c", .msgType)
	}

	,  := .cr.Next(.bodyLen)
	if  != nil {
		return nil, 
	}

	.partialMsg = false

	 = .Decode()
	return ,