This commit is contained in:
苏尹岚
2021-04-20 09:33:30 +08:00
parent 14f7fc7828
commit a75ed0f33c
18 changed files with 473 additions and 459 deletions

View File

@@ -8,7 +8,7 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/adapter/orm"
"github.com/astaxie/beego/client/orm"
)
const (
@@ -65,15 +65,15 @@ func GetDB() *DaoDB {
return &DaoDB{Db: orm.NewOrm()}
}
func Begin(db *DaoDB) (err error) {
func Begin(db *DaoDB) (txDB orm.TxOrmer, err error) {
if db.transactionLevel == 0 {
err = db.Db.Begin()
txDB, err = db.Db.Begin()
if err == nil {
db.startWatchTransaction()
}
}
db.transactionLevel++
return err
return txDB, err
}
func (db *DaoDB) startWatchTransaction() {
@@ -93,11 +93,11 @@ func (db *DaoDB) stopWatchTransaction() {
}
}
func Commit(db *DaoDB) (err error) {
func Commit(db *DaoDB, txDB orm.TxOrmer) (err error) {
if db.transactionLevel == 1 {
db.stopWatchTransaction()
err = db.Db.Commit()
err = txDB.Commit()
//err = db.Db.Commit()
db.transactionLevel = 0
} else if db.transactionLevel > 1 {
db.transactionLevel--
@@ -105,11 +105,11 @@ func Commit(db *DaoDB) (err error) {
return err
}
func Rollback(db *DaoDB) (err error) {
func Rollback(db *DaoDB, txDB orm.TxOrmer) (err error) {
if db.transactionLevel > 0 {
db.stopWatchTransaction()
err = db.Db.Rollback()
err = txDB.Rollback()
//err = db.Db.Rollback()
}
db.transactionLevel = 0
return err
@@ -139,6 +139,31 @@ func GetRow(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (er
return err
}
func GetRowTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
if txDB == nil {
return
}
if !useGetRowsWhenGetRow { // beego QueryRow有bug嵌入的struct不能正常绑定
err = txDB.Raw(sql, values).QueryRow(inPtr)
//err = db.Db.Raw(sql, values).QueryRow(inPtr)
} else {
typeInfo := reflect.TypeOf(inPtr)
if typeInfo.Kind() != reflect.Ptr {
return errors.New("inPtr must be ptr")
}
slice := reflect.New(reflect.SliceOf(typeInfo.Elem()))
if err = GetRowsTx(txDB, slice.Interface(), sql, values...); err == nil {
slice = slice.Elem()
if slice.Len() > 0 {
reflect.ValueOf(inPtr).Elem().Set(slice.Index(0))
} else {
return orm.ErrNoRows
}
}
}
return err
}
func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) {
if db == nil {
db = GetDB()
@@ -147,6 +172,15 @@ func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (e
return err
}
func GetRowsTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
if txDB == nil {
return
}
_, err = txDB.Raw(sql, values).QueryRows(inPtr)
//_, err = db.Db.Raw(sql, values).QueryRows(inPtr)
return err
}
func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) {
if db == nil {
db = GetDB()
@@ -178,6 +212,27 @@ func CreateEntity(db *DaoDB, item interface{}) (err error) {
return err
}
func UpdateEntityTx(txDB orm.TxOrmer, item interface{}, cols ...string) (num int64, err error) {
if txDB == nil {
return
}
num, err = txDB.Update(item, cols...)
if err != nil && !IsDuplicateError(err) {
globals.SugarLogger.Errorf("UpdateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
}
return num, err
}
func CreateEntityTx(txDB orm.TxOrmer, item interface{}) (err error) {
if txDB == nil {
return
}
if _, err = txDB.Insert(item); err != nil && !IsDuplicateError(err) {
globals.SugarLogger.Errorf("CreateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
}
return err
}
// InsertMulti执行成功后ID不会改写成正确的象Insert一样
func CreateMultiEntities(db *DaoDB, item interface{}) (err error) {
if db == nil {
@@ -230,3 +285,11 @@ func GetLastTotalRowCount(db *DaoDB) int {
}
return 0
}
func GetLastTotalRowCountTx(txDB orm.TxOrmer) int {
countInfo := &struct{ Ct int }{}
if err := GetRowTx(txDB, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
return countInfo.Ct
}
return 0
}