Newer
Older
package backends
import (
packets "gfx.cafe/gfx/pggat/lib/fed/packets/v3.0"
"gfx.cafe/gfx/pggat/lib/util/strutil"
copyFail := packets.CopyFail("peer failed")
ctx.Packet = ©Fail
return err
}
case packets.TypeCopyDone, packets.TypeCopyFail:
case packets.TypeCopyData,
packets.TypeNoticeResponse,
packets.TypeParameterStatus,
packets.TypeNotificationResponse:
return err
}
for {
if err != nil {
return err
}
case packets.TypeCommandComplete,
packets.TypeRowDescription,
packets.TypeDataRow,
packets.TypeEmptyQueryResponse,
packets.TypeErrorResponse,
packets.TypeNoticeResponse,
packets.TypeParameterStatus,
packets.TypeNotificationResponse:
var p packets.ReadyForQuery
err = fed.ToConcrete(&p, ctx.Packet)
func queryString(ctx *context, q string) error {
qq := packets.Query(q)
func QueryString(server, peer *fed.Conn, query string) (err, peerError error) {
ctx := context{
Server: server,
Peer: peer,
}
err = queryString(&ctx, query)
peerError = ctx.PeerError
return
}
func SetParameter(server, peer *fed.Conn, name strutil.CIString, value string) (err, peerError error) {
var q strings.Builder
escapedName := strutil.Escape(name.String(), '"')
escapedValue := strutil.Escape(value, '\'')
q.Grow(len(`SET "" = ''`) + len(escapedName) + len(escapedValue))
q.WriteString(`SET "`)
q.WriteString(escapedName)
q.WriteString(`" = '`)
q.WriteString(escapedValue)
q.WriteString(`'`)
case packets.TypeErrorResponse,
packets.TypeFunctionCallResponse,
packets.TypeNoticeResponse,
packets.TypeParameterStatus,
packets.TypeNotificationResponse:
var p packets.ReadyForQuery
err = fed.ToConcrete(&p, ctx.Packet)
if i > 10000 {
log.Printf("long sync, packet %c", ctx.Packet.Type())
}
packets.TypeErrorResponse,
packets.TypeRowDescription,
packets.TypeNoData,
packets.TypeParameterDescription,
packets.TypeCommandComplete,
packets.TypeDataRow,
packets.TypeEmptyQueryResponse,
packets.TypePortalSuspended,
packets.TypeNoticeResponse,
packets.TypeParameterStatus,
packets.TypeNotificationResponse:
var p packets.ReadyForQuery
err = fed.ToConcrete(&p, ctx.Packet)
func Sync(server, peer *fed.Conn) (err, peerErr error) {
}
_, err = sync(&ctx)
peerErr = ctx.PeerError
return
}
func eqp(ctx *context) error {
if err != nil {
return err
}
if ok {
return nil
}
}
if err != nil {
return err
}
if ok {
return nil
}
case packets.TypeParse, packets.TypeBind, packets.TypeClose, packets.TypeDescribe, packets.TypeExecute, packets.TypeFlush:
// phony sync call, we can just reply with a fake ReadyForQuery(TxState)
case packets.TypeParse, packets.TypeBind, packets.TypeClose, packets.TypeDescribe, packets.TypeExecute, packets.TypeFlush:
if err != nil {
return err
}
if ctx.TxState != 'I' {
func Transaction(server, peer *fed.Conn, initialPacket fed.Packet) (err, peerError error) {