82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.botann.com/lijun/sql-builder/util"
|
|
"git.botann.com/tinycs/boomerang/tydb"
|
|
"git.botann.com/tinycs/boomerang/tyoracle"
|
|
"git.botann.com/tinycs/boomerang/tytaos"
|
|
)
|
|
|
|
type SqlConnector[T tydb.QOneRowRst | tytaos.QOneRowRst | tyoracle.QOneRowRst | int] interface {
|
|
QueryEx(sql string, data interface{}, args ...interface{}) error
|
|
QueryRow(sql string, data interface{}, args ...interface{}) (error, T)
|
|
DDL(sql string) error
|
|
}
|
|
|
|
type SqlBuilder[T tydb.QOneRowRst | tytaos.QOneRowRst | tyoracle.QOneRowRst | int] struct {
|
|
Connector SqlConnector[T]
|
|
Driver string
|
|
Sql string
|
|
Opts Options
|
|
}
|
|
|
|
type Options struct {
|
|
util.Page
|
|
selects []string
|
|
Conditions []string
|
|
Args []interface{} // condition的参数
|
|
groups []string
|
|
orders []string
|
|
partitions []string // tdengine专用
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) Clear() {
|
|
s.Sql = ""
|
|
s.Opts = Options{}
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) SetSchema(schema string) error {
|
|
if s.Driver == util.DriverOracle {
|
|
err := s.Connector.DDL(fmt.Sprintf("ALTER SESSION SET CURRENT_SCHEMA = %s", schema))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
return fmt.Errorf("only support oracle")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) SetDriver(driver string) {
|
|
s.Driver = driver
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) FindBySql(data interface{}) error {
|
|
sqls := s.buildSql()
|
|
return s.Connector.QueryEx(sqls, data, s.Opts.Args...)
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) FindOneBySql(data interface{}) error {
|
|
sqls := s.buildSql()
|
|
err, _ := s.Connector.QueryRow(sqls, data, s.Opts.Args...)
|
|
return err
|
|
}
|
|
|
|
func (s *SqlBuilder[T]) PaginateBySql(data interface{}, page util.Page) error {
|
|
var err error
|
|
var total int
|
|
s.Opts.Page = page
|
|
sqls := s.buildSql()
|
|
count_sql := s.buildCountSql(sqls)
|
|
paginage_sql := s.buildPaginateSql(sqls)
|
|
err, _ = s.Connector.QueryRow(count_sql, &total, s.Opts.Args...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.Opts.Page.SetTotal(total)
|
|
err = s.Connector.QueryEx(paginage_sql, data, s.Opts.Args...)
|
|
return err
|
|
}
|