Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package dbtyp

import (
"context"
"database/sql"

"github.com/winebarrel/dbtyp/iface"
)

var _ iface.DB = &DB[struct{}]{}

type DB[T any] struct {
*sql.DB
}

// Type converter

func (v *DB[T]) ExecQueryer() *ExecQueryer[T] {
return &ExecQueryer[T]{i: v}
}

func (v *DB[T]) Execer() *Execer[T] {
return &Execer[T]{i: v}
}

func (v *DB[T]) Queryer() *Queryer[T] {
return &Queryer[T]{i: v}
}

// Typed begin

func (v *DB[T]) BeginT() (*Tx[T], error) {
tx, err := v.Begin()

if err != nil {
return nil, err
}

return &Tx[T]{Tx: tx}, nil
}

func (v *DB[T]) BeginTxT(ctx context.Context, opts *sql.TxOptions) (*Tx[T], error) {
tx, err := v.BeginTx(ctx, opts)

if err != nil {
return nil, err
}

return &Tx[T]{Tx: tx}, nil
}

// Typed prepare

func (v *DB[T]) PrepareT(query string) (*Stmt[T], error) {
stmt, err := v.Prepare(query)

if err != nil {
return nil, err
}

return &Stmt[T]{Stmt: stmt}, nil
}

func (v *DB[T]) PrepareContextT(ctx context.Context, query string) (*Stmt[T], error) {
stmt, err := v.PrepareContext(ctx, query)

if err != nil {
return nil, err
}

return &Stmt[T]{Stmt: stmt}, nil
}
50 changes: 50 additions & 0 deletions exec_queryer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package dbtyp

import (
"context"
"database/sql"

"github.com/winebarrel/dbtyp/iface"
)

var _ iface.ExecQueryer = &ExecQueryer[struct{}]{}

type ExecQueryer[T any] struct {
i iface.ExecQueryer
}

// Interface implement

func (v *ExecQueryer[T]) Exec(query string, args ...any) (sql.Result, error) {
return v.i.Exec(query, args...)
}

func (v *ExecQueryer[T]) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error) {
return v.i.ExecContext(ctx, query, args...)
}

func (v *ExecQueryer[T]) Query(query string, args ...any) (*sql.Rows, error) {
return v.i.Query(query, args...)
}

func (v *ExecQueryer[T]) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) {
return v.i.QueryContext(ctx, query, args...)
}

func (v *ExecQueryer[T]) QueryRow(query string, args ...any) *sql.Row {
return v.i.QueryRow(query, args...)
}

func (v *ExecQueryer[T]) QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row {
return v.i.QueryRowContext(ctx, query, args...)
}

// Type converter

func (v *ExecQueryer[T]) Execer() *Execer[T] {
return &Execer[T]{i: v.i}
}

func (v *ExecQueryer[T]) Queryer() *Queryer[T] {
return &Queryer[T]{i: v.i}
}
24 changes: 24 additions & 0 deletions execer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dbtyp

import (
"context"
"database/sql"

"github.com/winebarrel/dbtyp/iface"
)

var _ iface.Execer = &Execer[struct{}]{}

type Execer[T any] struct {
i iface.Execer
}

// Interface implement

func (v *Execer[T]) Exec(query string, args ...any) (sql.Result, error) {
return v.i.Exec(query, args...)
}

func (v *Execer[T]) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error) {
return v.i.ExecContext(ctx, query, args...)
}
33 changes: 33 additions & 0 deletions iface/db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package iface

import (
"context"
"database/sql"
"database/sql/driver"
"time"
)

var _ DB = &sql.DB{}

type DB interface {
Begin() (*sql.Tx, error)
BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error)
Close() error
Conn(ctx context.Context) (*sql.Conn, error)
Driver() driver.Driver
Exec(query string, args ...any) (sql.Result, error)
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
Ping() error
PingContext(ctx context.Context) error
Prepare(query string) (*sql.Stmt, error)
PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
Query(query string, args ...any) (*sql.Rows, error)
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
QueryRow(query string, args ...any) *sql.Row
QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
SetConnMaxIdleTime(d time.Duration)
SetConnMaxLifetime(d time.Duration)
SetMaxIdleConns(n int)
SetMaxOpenConns(n int)
Stats() sql.DBStats
}
13 changes: 13 additions & 0 deletions iface/exec_queryer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package iface

import (
"database/sql"
)

var _ ExecQueryer = &sql.DB{}
var _ ExecQueryer = &sql.Tx{}

type ExecQueryer interface {
Execer
Queryer
}
14 changes: 14 additions & 0 deletions iface/execer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package iface

import (
"context"
"database/sql"
)

var _ Execer = &sql.DB{}
var _ Execer = &sql.Tx{}

type Execer interface {
Exec(query string, args ...any) (sql.Result, error)
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
}
88 changes: 0 additions & 88 deletions iface/iface.go

This file was deleted.

16 changes: 16 additions & 0 deletions iface/queryer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package iface

import (
"context"
"database/sql"
)

var _ Queryer = &sql.DB{}
var _ Queryer = &sql.Tx{}

type Queryer interface {
Query(query string, args ...any) (*sql.Rows, error)
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
QueryRow(query string, args ...any) *sql.Row
QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
}
18 changes: 18 additions & 0 deletions iface/stmt.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package iface

import (
"context"
"database/sql"
)

var _ Stmt = &sql.Stmt{}

type Stmt interface {
Close() error
Exec(args ...any) (sql.Result, error)
ExecContext(ctx context.Context, args ...any) (sql.Result, error)
Query(args ...any) (*sql.Rows, error)
QueryContext(ctx context.Context, args ...any) (*sql.Rows, error)
QueryRow(args ...any) *sql.Row
QueryRowContext(ctx context.Context, args ...any) *sql.Row
}
23 changes: 23 additions & 0 deletions iface/tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package iface

import (
"context"
"database/sql"
)

var _ Tx = &sql.Tx{}

type Tx interface {
Commit() error
Exec(query string, args ...any) (sql.Result, error)
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
Prepare(query string) (*sql.Stmt, error)
PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
Query(query string, args ...any) (*sql.Rows, error)
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
QueryRow(query string, args ...any) *sql.Row
QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
Rollback() error
Stmt(stmt *sql.Stmt) *sql.Stmt
StmtContext(ctx context.Context, stmt *sql.Stmt) *sql.Stmt
}
32 changes: 32 additions & 0 deletions queryer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package dbtyp

import (
"context"
"database/sql"

"github.com/winebarrel/dbtyp/iface"
)

var _ iface.Queryer = &Queryer[struct{}]{}

type Queryer[T any] struct {
i iface.Queryer
}

// Interface implement

func (v *Queryer[T]) Query(query string, args ...any) (*sql.Rows, error) {
return v.i.Query(query, args...)
}

func (v *Queryer[T]) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) {
return v.i.QueryContext(ctx, query, args...)
}

func (v *Queryer[T]) QueryRow(query string, args ...any) *sql.Row {
return v.i.QueryRow(query, args...)
}

func (v *Queryer[T]) QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row {
return v.i.QueryRowContext(ctx, query, args...)
}
Loading
Loading