sql-builder/db/db.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
}