wip: first NewPGState
This commit is contained in:
60
pkg/state/state_postgres.go
Normal file
60
pkg/state/state_postgres.go
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package state
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/jackc/pgx/v5/pgxpool"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ----- PGState holds the shared connection pool
|
||||||
|
type PGState struct {
|
||||||
|
pool *pgxpool.Pool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- Create a new PGState, reading connection info from env vars
|
||||||
|
func NewPGState() *PGState {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
// Get connection URL from environment (standard: PGHOST, PGPORT, etc.)
|
||||||
|
dbURL := os.Getenv("DATABASE_URL") // canonical way: use DATABASE_URL
|
||||||
|
if dbURL == "" {
|
||||||
|
slog.Error("DATABASE_URL environment variable must be set")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a pool config
|
||||||
|
config, err := pgxpool.ParseConfig(dbURL)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to parse DATABASE_URL", "error", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optionally set pool tuning here
|
||||||
|
config.MaxConns = 10
|
||||||
|
|
||||||
|
pool, err := pgxpool.NewWithConfig(ctx, config)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to create pgx pool", "error", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
slog.Info("Connected to Postgres", "max_conns", config.MaxConns)
|
||||||
|
return &PGState{pool: pool}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- Sequence-based NextID (implements ServerState)
|
||||||
|
func (s *PGState) NextID() int {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
var id int
|
||||||
|
err := s.pool.QueryRow(ctx, `SELECT nextval('session_id_seq')`).Scan(&id)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("NextID query failed", "error", err)
|
||||||
|
panic("NextID(): " + err.Error()) // interface doesn't allow returning error
|
||||||
|
}
|
||||||
|
|
||||||
|
slog.Debug("NextID generated", "id", id)
|
||||||
|
return id
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user