123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package model
- import (
- "context"
- "gorm.io/gorm"
- iContext "gxt-api-frame/app/context"
- "gxt-api-frame/app/schema"
- )
- // TransFunc 定义事务执行函数
- type TransFunc func(context.Context) error
- // ExecTrans 执行事务
- func ExecTrans(ctx context.Context, db *gorm.DB, fn TransFunc) error {
- if _, ok := iContext.FromTrans(ctx); ok {
- return fn(ctx)
- }
- transModel := NewTrans(db)
- trans, err := transModel.Begin(ctx)
- if err != nil {
- return err
- }
- defer func() {
- if r := recover(); r != nil {
- _ = transModel.Rollback(ctx, trans)
- panic(r)
- }
- }()
- ctx = iContext.NewTrans(ctx, trans)
- err = fn(ctx)
- if err != nil {
- _ = transModel.Rollback(ctx, trans)
- return err
- }
- return transModel.Commit(ctx, trans)
- }
- // ExecTransWithLock 执行事务(加锁)
- func ExecTransWithLock(ctx context.Context, db *gorm.DB, fn TransFunc) error {
- if !iContext.FromTransLock(ctx) {
- ctx = iContext.NewTransLock(ctx)
- }
- return ExecTrans(ctx, db, fn)
- }
- // WrapPageQuery 包装带有分页的查询
- func WrapPageQuery(ctx context.Context, db *gorm.DB, pp *schema.PaginationParam, out interface{}) (*schema.PaginationResult, error) {
- if pp != nil {
- total, err := FindPage(ctx, db, pp.PageIndex, pp.PageSize, out)
- if err != nil {
- return nil, err
- }
- return &schema.PaginationResult{
- Total: total,
- }, nil
- }
- result := db.Find(out)
- return nil, result.Error
- }
- // FindPage 查询分页数据
- func FindPage(ctx context.Context, db *gorm.DB, pageIndex, pageSize int, out interface{}) (int, error) {
- selectTmp := db.Statement.Clauses["SELECT"]
- var count int64
- result := db.Count(&count)
- db.Statement.Clauses["SELECT"] = selectTmp
- if err := result.Error; err != nil {
- return 0, err
- } else if count == 0 {
- return 0, nil
- }
- // 如果分页大小小于0或者分页索引小于0,则不查询数据
- if pageSize < 0 || pageIndex < 0 {
- return int(count), nil
- }
- if pageIndex > 0 && pageSize > 0 {
- db = db.Offset((pageIndex - 1) * pageSize)
- }
- if pageSize > 0 {
- db = db.Limit(pageSize)
- }
- result = db.Find(out)
- if err := result.Error; err != nil {
- return 0, err
- }
- return int(count), nil
- }
- // FindOne 查询单条数据
- func FindOne(ctx context.Context, db *gorm.DB, out interface{}) (bool, error) {
- result := db.First(out)
- if err := result.Error; err != nil {
- if err == gorm.ErrRecordNotFound {
- return false, nil
- }
- return false, err
- }
- return true, nil
- }
- // Check 检查数据是否存在
- func Check(ctx context.Context, db *gorm.DB) (bool, error) {
- var count int64
- result := db.Count(&count)
- if err := result.Error; err != nil {
- return false, err
- }
- return count > 0, nil
- }
- const maxNumberOfBatchParameters = 65535
- // OwnDb 实例化DB
- type OwnDb struct {
- *gorm.DB
- }
|