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