sysProductModel.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package product
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "github.com/zeromicro/go-zero/core/stores/cache"
  8. "github.com/zeromicro/go-zero/core/stores/sqlx"
  9. )
  10. var ErrUpdateConflict = errors.New("update conflict: data has been modified by another operation")
  11. var _ SysProductModel = (*customSysProductModel)(nil)
  12. type (
  13. SysProductModel interface {
  14. sysProductModel
  15. FindList(ctx context.Context, page, pageSize int64) ([]*SysProduct, int64, error)
  16. UpdateWithOptLock(ctx context.Context, data *SysProduct, expectedUpdateTime int64) error
  17. }
  18. customSysProductModel struct {
  19. *defaultSysProductModel
  20. }
  21. )
  22. func NewSysProductModel(conn sqlx.SqlConn, c cache.CacheConf, cachePrefix string, opts ...cache.Option) SysProductModel {
  23. return &customSysProductModel{
  24. defaultSysProductModel: newSysProductModel(conn, c, cachePrefix, opts...),
  25. }
  26. }
  27. func (m *customSysProductModel) UpdateWithOptLock(ctx context.Context, data *SysProduct, expectedUpdateTime int64) error {
  28. sysProductIdKey := fmt.Sprintf("%s%v", cacheSysProductIdPrefix, data.Id)
  29. sysProductAppKeyKey := fmt.Sprintf("%s%v", cacheSysProductAppKeyPrefix, data.AppKey)
  30. sysProductCodeKey := fmt.Sprintf("%s%v", cacheSysProductCodePrefix, data.Code)
  31. res, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (sql.Result, error) {
  32. query := fmt.Sprintf("UPDATE %s SET `name`=?, `remark`=?, `status`=?, `updateTime`=? WHERE `id`=? AND `updateTime`=?", m.table)
  33. return conn.ExecCtx(ctx, query, data.Name, data.Remark, data.Status, data.UpdateTime, data.Id, expectedUpdateTime)
  34. }, sysProductIdKey, sysProductAppKeyKey, sysProductCodeKey)
  35. if err != nil {
  36. return err
  37. }
  38. affected, _ := res.RowsAffected()
  39. if affected == 0 {
  40. return ErrUpdateConflict
  41. }
  42. return nil
  43. }
  44. func (m *customSysProductModel) FindList(ctx context.Context, page, pageSize int64) ([]*SysProduct, int64, error) {
  45. var total int64
  46. countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", m.table)
  47. if err := m.QueryRowNoCacheCtx(ctx, &total, countQuery); err != nil {
  48. return nil, 0, err
  49. }
  50. var list []*SysProduct
  51. query := fmt.Sprintf("SELECT %s FROM %s ORDER BY id DESC LIMIT ?,?", sysProductRows, m.table)
  52. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, (page-1)*pageSize, pageSize); err != nil {
  53. return nil, 0, err
  54. }
  55. return list, total, nil
  56. }