From e8a0834b92ab15be351ebabb0fce0a1abbbf710d Mon Sep 17 00:00:00 2001 From: Garet Halliday <me@garet.holiday> Date: Thu, 24 Aug 2023 16:51:29 -0500 Subject: [PATCH] beginnings of psql --- lib/psql/query.go | 62 ++++++++++++++++++++++++++++++++++++++++++ lib/psql/query_test.go | 37 +++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 lib/psql/query.go create mode 100644 lib/psql/query_test.go diff --git a/lib/psql/query.go b/lib/psql/query.go new file mode 100644 index 00000000..c7614236 --- /dev/null +++ b/lib/psql/query.go @@ -0,0 +1,62 @@ +package psql + +import ( + "crypto/tls" + "errors" + "io" + "log" + + "pggat2/lib/bouncer/backends/v0" + "pggat2/lib/zap" + packets "pggat2/lib/zap/packets/v3.0" +) + +type resultReader struct{} + +func (T *resultReader) EnableSSLClient(_ *tls.Config) error { + return errors.New("ssl not supported") +} + +func (T *resultReader) EnableSSLServer(_ *tls.Config) error { + return errors.New("ssl not supported") +} + +func (T *resultReader) ReadByte() (byte, error) { + return 0, io.EOF +} + +func (T *resultReader) ReadPacket(_ bool) (zap.Packet, error) { + return nil, io.EOF +} + +func (T *resultReader) WriteByte(_ byte) error { + return nil +} + +func (T *resultReader) WritePacket(packet zap.Packet) error { + switch packet.Type() { + case packets.TypeRowDescription: + log.Println("row description", packet) + case packets.TypeDataRow: + log.Println("data row", packet) + } + return nil +} + +func (T *resultReader) Close() error { + return nil +} + +var _ zap.ReadWriter = (*resultReader)(nil) + +func Query(server zap.ReadWriter, query string) error { + var res resultReader + ctx := backends.Context{ + Peer: &res, + } + if err := backends.QueryString(&ctx, server, query); err != nil { + return err + } + + return nil +} diff --git a/lib/psql/query_test.go b/lib/psql/query_test.go new file mode 100644 index 00000000..2f3449ee --- /dev/null +++ b/lib/psql/query_test.go @@ -0,0 +1,37 @@ +package psql + +import ( + "net" + "testing" + + "pggat2/lib/auth/credentials" + "pggat2/lib/bouncer/backends/v0" + "pggat2/lib/zap" +) + +func TestQuery(t *testing.T) { + // open server + s, err := net.Dial("tcp", "localhost:5432") + if err != nil { + t.Error(err) + return + } + server := zap.WrapNetConn(s) + _, err = backends.Accept(server, backends.AcceptOptions{ + Credentials: credentials.Cleartext{ + Username: "postgres", + Password: "password", + }, + Database: "postgres", + }) + if err != nil { + t.Error(err) + return + } + + err = Query(server, "SELECT * FROM pg_shadow") + if err != nil { + t.Error(err) + return + } +} -- GitLab