63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
// Package sqladapter provides common logic for SQL adapters.
|
|
package sqladapter
|
|
|
|
import (
|
|
"database/sql"
|
|
"database/sql/driver"
|
|
|
|
"git.hexq.cn/tiglog/mydb"
|
|
"git.hexq.cn/tiglog/mydb/internal/sqlbuilder"
|
|
)
|
|
|
|
// IsKeyValue reports whether v is a valid value for a primary key that can be
|
|
// used with Find(pKey).
|
|
func IsKeyValue(v interface{}) bool {
|
|
if v == nil {
|
|
return true
|
|
}
|
|
switch v.(type) {
|
|
case int64, int, uint, uint64,
|
|
[]int64, []int, []uint, []uint64,
|
|
[]byte, []string,
|
|
[]interface{},
|
|
driver.Valuer:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
type sqlAdapterWrapper struct {
|
|
adapter AdapterSession
|
|
}
|
|
|
|
func (w *sqlAdapterWrapper) OpenDSN(dsn mydb.ConnectionURL) (mydb.Session, error) {
|
|
sess := NewSession(dsn, w.adapter)
|
|
if err := sess.Open(); err != nil {
|
|
return nil, err
|
|
}
|
|
return sess, nil
|
|
}
|
|
|
|
func (w *sqlAdapterWrapper) NewTx(sqlTx *sql.Tx) (sqlbuilder.Tx, error) {
|
|
tx, err := NewTx(w.adapter, sqlTx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return tx, nil
|
|
}
|
|
|
|
func (w *sqlAdapterWrapper) New(sqlDB *sql.DB) (mydb.Session, error) {
|
|
sess := NewSession(nil, w.adapter)
|
|
if err := sess.BindDB(sqlDB); err != nil {
|
|
return nil, err
|
|
}
|
|
return sess, nil
|
|
}
|
|
|
|
// RegisterAdapter registers a new SQL adapter.
|
|
func RegisterAdapter(name string, adapter AdapterSession) sqlbuilder.Adapter {
|
|
z := &sqlAdapterWrapper{adapter}
|
|
mydb.RegisterAdapter(name, sqlbuilder.NewCompatAdapter(z))
|
|
return z
|
|
}
|