From 352d8e1fbc8629afe1bd484d60aaea16cd41f44e Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:11:35 -0700 Subject: [PATCH] sqlite conn string ok --- src/with/pg.go | 45 +---------------------------- src/with/sql.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++ src/with/sqlite.go | 14 +++++++++ 3 files changed, 86 insertions(+), 44 deletions(-) create mode 100644 src/with/sql.go create mode 100644 src/with/sqlite.go diff --git a/src/with/pg.go b/src/with/pg.go index c79dd93..7ea096c 100644 --- a/src/with/pg.go +++ b/src/with/pg.go @@ -3,53 +3,10 @@ package with import ( "context" "database/sql" - "log" - "time" _ "github.com/lib/pq" ) func PSQL(ctx context.Context, conn string, foo func(db *sql.DB) error) error { - log.Println("opening...") - pg, err := sql.Open("postgres", conn) - if err != nil { - return err - } - defer func() { - log.Println("closed:", pg.Close()) - }() - - func() { - pinged := make(chan bool) - defer close(pinged) - for { - log.Println("pinging...") - go func() { - err := pg.PingContext(ctx) - if err != nil { - log.Println("!", err) - } - select { - case pinged <- err == nil: - case <-ctx.Done(): - case <-time.After(time.Second * 5): - } - }() - select { - case <-ctx.Done(): - return - case ok := <-pinged: - if ok { - return - } - } - select { - case <-ctx.Done(): - case <-time.After(time.Second): - } - } - }() - log.Println("connected") - - return foo(pg) + return _sql(ctx, "postgres", conn, foo) } diff --git a/src/with/sql.go b/src/with/sql.go new file mode 100644 index 0000000..7914010 --- /dev/null +++ b/src/with/sql.go @@ -0,0 +1,71 @@ +package with + +import ( + "context" + "database/sql" + "fmt" + "log" + "net/url" + "time" + + _ "modernc.org/sqlite" +) + +func SQL(ctx context.Context, conn string, foo func(*sql.DB) error) error { + u, err := url.Parse(conn) + if err != nil { + return err + } + switch u.Scheme { + case "sqlite": + return Sqlite(ctx, conn, foo) + case "postgres", "postgresql": + return PSQL(ctx, conn, foo) + } + return fmt.Errorf("unknown sql scheme %q", u.Scheme) +} + +func _sql(ctx context.Context, engine, conn string, foo func(db *sql.DB) error) error { + log.Printf("opening %s %s...", engine, conn) + db, err := sql.Open(engine, conn) + if err != nil { + return err + } + defer func() { + log.Println("closed:", db.Close()) + }() + + func() { + pinged := make(chan bool) + defer close(pinged) + for { + log.Println("pinging...") + go func() { + err := db.PingContext(ctx) + if err != nil { + log.Println("!", err) + } + select { + case pinged <- err == nil: + case <-ctx.Done(): + case <-time.After(time.Second * 5): + } + }() + select { + case <-ctx.Done(): + return + case ok := <-pinged: + if ok { + return + } + } + select { + case <-ctx.Done(): + case <-time.After(time.Second): + } + } + }() + log.Println("connected") + + return foo(db) +} diff --git a/src/with/sqlite.go b/src/with/sqlite.go new file mode 100644 index 0000000..7a4fcef --- /dev/null +++ b/src/with/sqlite.go @@ -0,0 +1,14 @@ +package with + +import ( + "context" + "database/sql" + "strings" + + _ "modernc.org/sqlite" +) + +func Sqlite(ctx context.Context, conn string, foo func(db *sql.DB) error) error { + conn = strings.TrimPrefix(conn, "sqlite://") + return _sql(ctx, "sqlite", conn, foo) +}