From e5a15dff4ff898af03ed8ed8febd2d91673e719b Mon Sep 17 00:00:00 2001
From: Garet Halliday <me@garet.holiday>
Date: Thu, 31 Aug 2023 18:13:39 -0500
Subject: [PATCH] connection over unix socket

---
 lib/gat/modes/pgbouncer/pools.go | 86 ++++++++++++++++++++------------
 pgbouncer.ini                    |  2 +-
 2 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/lib/gat/modes/pgbouncer/pools.go b/lib/gat/modes/pgbouncer/pools.go
index 8fe62276..f4dc5224 100644
--- a/lib/gat/modes/pgbouncer/pools.go
+++ b/lib/gat/modes/pgbouncer/pools.go
@@ -5,6 +5,7 @@ import (
 	"errors"
 	"net"
 	"strconv"
+	"strings"
 	"time"
 
 	"tuxpa.in/a/zlog/log"
@@ -172,9 +173,43 @@ func (T *Pools) Lookup(user, database string) *pool.Pool {
 		Database: database,
 	}, p)
 
-	if db.Host == "" {
+	var dialer pool.Dialer
+
+	dbCreds := creds
+	if db.Password != "" {
+		// lookup password
+		dbCreds = credentials.FromString(user, db.Password)
+	}
+
+	acceptOptions := backends.AcceptOptions{
+		SSLMode: T.Config.PgBouncer.ServerTLSSSLMode,
+		SSLConfig: &tls.Config{
+			InsecureSkipVerify: true, // TODO(garet)
+		},
+		Credentials:       dbCreds,
+		Database:          backendDatabase,
+		StartupParameters: db.StartupParameters,
+	}
+
+	if db.Host == "" || strings.HasPrefix(db.Host, "/") {
 		// connect over unix socket
-		// TODO(garet)
+		dir := db.Host
+		port := db.Port
+		if !strings.HasPrefix(dir, "/") {
+			dir = dir + "/"
+		}
+
+		if port == 0 {
+			port = 5432
+		}
+
+		dir = dir + ".s.PGSQL." + strconv.Itoa(port)
+
+		dialer = pool.NetDialer{
+			Network:       "unix",
+			Address:       dir,
+			AcceptOptions: acceptOptions,
+		}
 	} else {
 		var address string
 		if db.Port == 0 {
@@ -183,40 +218,27 @@ func (T *Pools) Lookup(user, database string) *pool.Pool {
 			address = net.JoinHostPort(db.Host, strconv.Itoa(db.Port))
 		}
 
-		creds := creds
-		if db.Password != "" {
-			// lookup password
-			creds = credentials.FromString(user, db.Password)
-		}
-
 		// connect over tcp
-		dialer := pool.NetDialer{
-			Network: "tcp",
-			Address: address,
-			AcceptOptions: backends.AcceptOptions{
-				SSLMode: T.Config.PgBouncer.ServerTLSSSLMode,
-				SSLConfig: &tls.Config{
-					InsecureSkipVerify: true, // TODO(garet)
-				},
-				Credentials:       creds,
-				Database:          backendDatabase,
-				StartupParameters: db.StartupParameters,
-			},
-		}
-		recipe := pool.Recipe{
-			Dialer:         dialer,
-			MinConnections: db.MinPoolSize,
-			MaxConnections: db.MaxDBConnections,
-		}
-		if recipe.MinConnections == 0 {
-			recipe.MinConnections = T.Config.PgBouncer.MinPoolSize
-		}
-		if recipe.MaxConnections == 0 {
-			recipe.MaxConnections = T.Config.PgBouncer.MaxDBConnections
+		dialer = pool.NetDialer{
+			Network:       "tcp",
+			Address:       address,
+			AcceptOptions: acceptOptions,
 		}
+	}
 
-		p.AddRecipe("pgbouncer", recipe)
+	recipe := pool.Recipe{
+		Dialer:         dialer,
+		MinConnections: db.MinPoolSize,
+		MaxConnections: db.MaxDBConnections,
+	}
+	if recipe.MinConnections == 0 {
+		recipe.MinConnections = T.Config.PgBouncer.MinPoolSize
 	}
+	if recipe.MaxConnections == 0 {
+		recipe.MaxConnections = T.Config.PgBouncer.MaxDBConnections
+	}
+
+	p.AddRecipe("pgbouncer", recipe)
 
 	return p
 }
diff --git a/pgbouncer.ini b/pgbouncer.ini
index ee698d0f..d458e49a 100644
--- a/pgbouncer.ini
+++ b/pgbouncer.ini
@@ -6,4 +6,4 @@ track_extra_parameters = IntervalStyle, session_authorization, default_transacti
 auth_user = postgres
 
 [databases]
-* = host=localhost datestyle=Postgres,MDY timezone=PST8PDT
+* = host=/tmp/ datestyle=Postgres,MDY timezone=PST8PDT
-- 
GitLab