Skip to content

Instantly share code, notes, and snippets.

@rueian
Last active March 16, 2020 10:09
Show Gist options
  • Save rueian/7c2715d80e2c3b764d9974464c48c96c to your computer and use it in GitHub Desktop.
Save rueian/7c2715d80e2c3b764d9974464c48c96c to your computer and use it in GitHub Desktop.
pgproxy for query, parse, bind messages
package main
import (
"encoding/hex"
"fmt"
"github.com/rueian/pgbroker/backend"
"github.com/rueian/pgbroker/message"
"github.com/rueian/pgbroker/proxy"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":5433")
if err != nil {
panic(err)
}
clientMessageHandlers := proxy.NewClientMessageHandlers()
serverMessageHandlers := proxy.NewServerMessageHandlers()
serverMessageHandlers.AddHandleDataRow(func(ms *proxy.Ctx, msg *message.DataRow) (row *message.DataRow, err error) {
for i, column := range msg.ColumnValues {
if len(ms.RowDescription.Fields) == 0 || ms.RowDescription.Fields[i].FormatCode == 0 {
fmt.Printf("Result DataRaw: column=%d format=text len=%d value=%s\n", i, column.DataLength(), string(column.DataBytes()))
} else {
fmt.Printf("Result DataRaw: column=%d format=byte len=%d hex=%s\n", i, column.DataLength(), hex.EncodeToString(column.DataBytes()))
}
}
return msg, nil
})
clientMessageHandlers.AddHandleQuery(func(ctx *proxy.Ctx, msg *message.Query) (query *message.Query, e error) {
fmt.Printf("Simple Query: len=%d query=%s\n", len(msg.QueryString), msg.QueryString)
return msg, nil
})
clientMessageHandlers.AddHandleParse(func(md *proxy.Ctx, msg *message.Parse) (parse *message.Parse, err error) {
fmt.Printf("Parse Query: name=%s query=%s\n", msg.PreparedStatementName, msg.QueryString)
return msg, nil
})
clientMessageHandlers.AddHandleBind(func(md *proxy.Ctx, msg *message.Bind) (bind *message.Bind, err error) {
for i, value := range msg.ParameterValues {
if len(msg.ParameterFormatCodes) == 0 || msg.ParameterFormatCodes[i] == 0 {
fmt.Printf("Bind Parameter: %d format=text len=%d value=%s\n", i, value.DataLength(), string(value.DataBytes()))
} else {
fmt.Printf("Bind Parameter: %d format=byte len=%d hex=%s\n", i, value.DataLength(), hex.EncodeToString(value.DataBytes()))
}
}
md.RowDescription = &message.RowDescription{Fields: make([]message.Field, len(msg.ResultColumnFormatCodes))}
for i, format := range msg.ResultColumnFormatCodes {
md.RowDescription.Fields[i].FormatCode = format
if format == 0 {
fmt.Printf("Bind ResultFormatCodes: column=%d format=text\n", i)
} else {
fmt.Printf("Bind ResultFormatCodes: column=%d format=byte\n", i)
}
}
if len(msg.ResultColumnFormatCodes) == 0 {
fmt.Printf("Bind ResultFormatCodes: no result format codes\n")
}
return msg, nil
})
server := proxy.Server{
PGResolver: backend.NewStaticPGResolver("127.0.0.1:5432"),
ConnInfoStore: backend.NewInMemoryConnInfoStore(),
ClientMessageHandlers: clientMessageHandlers,
ServerMessageHandlers: serverMessageHandlers,
}
server.Serve(ln)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment