diff --git a/internal/sqladapter/database.go b/internal/sqladapter/database.go index 3d2cb99a1ef4b8cce82a8e3448521c624644b810..f6f4750b5d1698794593c1a3bb687a0573a45a03 100644 --- a/internal/sqladapter/database.go +++ b/internal/sqladapter/database.go @@ -154,7 +154,10 @@ func (d *database) BindSession(sess *sql.DB) error { // Ping checks whether a connection to the database is still alive by pinging // it func (d *database) Ping() error { - return d.sess.Ping() + if d.sess != nil { + return d.sess.Ping() + } + return nil } // ClearCache removes all caches. diff --git a/postgresql/database.go b/postgresql/database.go index 4a1bb16c204f6f762a9538584663d8ef14876e9a..c2f3d774e096cf5018a09e6867b22cb4544af02a 100644 --- a/postgresql/database.go +++ b/postgresql/database.go @@ -26,11 +26,12 @@ import ( "database/sql" + "fmt" _ "github.com/lib/pq" // PostgreSQL driver. "upper.io/db.v2" + "upper.io/db.v2/internal/sqladapter" "upper.io/db.v2/sqlbuilder" "upper.io/db.v2/sqlbuilder/exql" - "upper.io/db.v2/internal/sqladapter" ) // Database represents a SQL database. @@ -39,6 +40,7 @@ type Database interface { builder.Builder NewTransaction() (Tx, error) + With(interface{}) (Database, error) } // database is the actual implementation of Database @@ -62,6 +64,28 @@ func newDatabase(settings db.ConnectionURL) (*database, error) { return d, nil } +func (d *database) With(sess interface{}) (Database, error) { + clone, err := newDatabase(d.connURL) + if err != nil { + return nil, err + } + + switch t := sess.(type) { + case *sql.DB: + if err := clone.BindSession(t); err != nil { + return nil, err + } + case *sql.Tx: + if err := clone.BindTx(t); err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("Unknown session type %T", t) + } + + return clone, nil +} + // Open stablishes a new connection to a SQL server. func Open(settings db.ConnectionURL) (Database, error) { d, err := newDatabase(settings) diff --git a/postgresql/tx.go b/postgresql/tx.go index f22315a8d1613272c44795eb31b488a45ca2875c..4a5a70b01aaf2f86f5254887d207d6a0075e7a2a 100644 --- a/postgresql/tx.go +++ b/postgresql/tx.go @@ -22,6 +22,8 @@ package postgresql import ( + "fmt" + "upper.io/db.v2" "upper.io/db.v2/internal/sqladapter" ) @@ -45,3 +47,7 @@ var ( func (t *tx) NewTransaction() (Tx, error) { return t, db.ErrAlreadyWithinTransaction } + +func (t *tx) With(interface{}) (Database, error) { + return nil, fmt.Errorf("Not implemented.") +}