mydb/internal/sqladapter/sqladapter.go
2023-09-18 15:15:42 +08:00

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
}