sqlite conn string ok

main
Bel LaPointe 2025-12-11 10:11:35 -07:00
parent 5f39cdad19
commit 352d8e1fbc
3 changed files with 86 additions and 44 deletions

View File

@ -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)
}

71
src/with/sql.go Normal file
View File

@ -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)
}

14
src/with/sqlite.go Normal file
View File

@ -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)
}