提交 639f55d7 authored 作者: mooncake's avatar mooncake

update

上级 a71424db
...@@ -4,6 +4,7 @@ package response ...@@ -4,6 +4,7 @@ package response
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"
...@@ -267,17 +268,17 @@ func Error(c *gin.Context, err error) { ...@@ -267,17 +268,17 @@ func Error(c *gin.Context, err error) {
c.Set(ctxutils.KeyRspCode, 0) c.Set(ctxutils.KeyRspCode, 0)
msg := "" msg := ""
if err != nil { if err != nil {
msg = err.Error() switch e := err.(type) {
if e, ok := err.(*xerror.Error); ok { case *xerror.BizError, *xerror.ParamError:
//if !errcode.IsSysDefinedError(xerr.Code()) { msg = e.Error()
// logger.Error(err.Error(), logger.Err(err), ctxutils.GinTraceIDField(c)) case *xerror.DBError, *xerror.NetError:
//} logger.Error(fmt.Sprintf("[response]%s", err.Error()), ctxutils.GinTraceIDField(c))
if e.Code() != errcode.InvalidParams.Code() { msg = "网络开小差了,请稍后再试~"
logger.Error(err.Error(), logger.Err(err), ctxutils.GinTraceIDField(c)) default:
} msg = e.Error()
} else { logger.Error(fmt.Sprintf("[response]%s", err.Error()), ctxutils.GinTraceIDField(c))
logger.Error(err.Error(), logger.Err(err), ctxutils.GinTraceIDField(c))
} }
} }
respJSONWith200(c, CustomErrorCode, msg) respJSONWith200(c, CustomErrorCode, msg)
} }
...@@ -8,16 +8,48 @@ import ( ...@@ -8,16 +8,48 @@ import (
// New 用于创建一个自定义文本错误信息的 error 对象,并包含堆栈信息。 // New 用于创建一个自定义文本错误信息的 error 对象,并包含堆栈信息。
func New(text string) error { func New(text string) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: text, text: text,
code: xcode.CodeDefault, code: xcode.CodeDefault,
} }
} }
func NewNetError(text string) error {
e := NetError{}
e.stack = callers()
e.text = text
e.code = xcode.CodeDefault
return &e
}
func NewDBError(text string) error {
e := DBError{}
e.stack = callers()
e.text = text
e.code = xcode.CodeDefault
return &e
}
func NewParamError(text string) error {
e := ParamError{}
e.stack = callers()
e.text = text
e.code = xcode.CodeDefault
return &e
}
func NewBizError(text string) error {
e := BizError{}
e.stack = callers()
e.text = text
e.code = xcode.CodeDefault
return &e
}
// NewC add code // NewC add code
func NewC(code int, text string) error { func NewC(code int, text string) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: text, text: text,
code: code, code: code,
...@@ -49,21 +81,21 @@ func Join(errs ...error) error { ...@@ -49,21 +81,21 @@ func Join(errs ...error) error {
// Newf 用于创建一个自定义文本错误带参数信息的 error 对象,并包含堆栈信息。 // Newf 用于创建一个自定义文本错误带参数信息的 error 对象,并包含堆栈信息。
func Newf(format string, args ...any) error { func Newf(format string, args ...any) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: xcode.CodeDefault, code: xcode.CodeDefault,
} }
} }
func Errorf(format string, args ...any) error { func Errorf(format string, args ...any) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: xcode.CodeDefault, code: xcode.CodeDefault,
} }
} }
func NewCf(code int, format string, args ...any) error { func NewCf(code int, format string, args ...any) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: code, code: code,
...@@ -73,7 +105,7 @@ func NewCf(code int, format string, args ...any) error { ...@@ -73,7 +105,7 @@ func NewCf(code int, format string, args ...any) error {
// NewSkip 用于创建一个自定义错误信息的 error 对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。高级功能,一般开发者很少用得到。 // NewSkip 用于创建一个自定义错误信息的 error 对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。高级功能,一般开发者很少用得到。
// 参数 `skip` 指定堆栈跳过的层数。 // 参数 `skip` 指定堆栈跳过的层数。
func NewSkip(skip int, text string) error { func NewSkip(skip int, text string) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: text, text: text,
code: xcode.CodeDefault, code: xcode.CodeDefault,
...@@ -81,7 +113,7 @@ func NewSkip(skip int, text string) error { ...@@ -81,7 +113,7 @@ func NewSkip(skip int, text string) error {
} }
func NewSkipC(code, skip int, text string) error { func NewSkipC(code, skip int, text string) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: text, text: text,
code: code, code: code,
...@@ -91,7 +123,7 @@ func NewSkipC(code, skip int, text string) error { ...@@ -91,7 +123,7 @@ func NewSkipC(code, skip int, text string) error {
// NewSkipf 用于创建一个自定义错误信息的error对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。 // NewSkipf 用于创建一个自定义错误信息的error对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。
// 参数 `skip` 指定堆栈跳过的层数。 // 参数 `skip` 指定堆栈跳过的层数。
func NewSkipf(skip int, format string, args ...any) error { func NewSkipf(skip int, format string, args ...any) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: xcode.CodeDefault, code: xcode.CodeDefault,
...@@ -99,7 +131,7 @@ func NewSkipf(skip int, format string, args ...any) error { ...@@ -99,7 +131,7 @@ func NewSkipf(skip int, format string, args ...any) error {
} }
func NewSkipCf(code, skip int, format string, args ...any) error { func NewSkipCf(code, skip int, format string, args ...any) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: code, code: code,
...@@ -112,7 +144,7 @@ func Wrap(err error, text string) error { ...@@ -112,7 +144,7 @@ func Wrap(err error, text string) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(), stack: callers(),
text: text, text: text,
...@@ -125,7 +157,7 @@ func Wrapf(err error, format string, args ...any) error { ...@@ -125,7 +157,7 @@ func Wrapf(err error, format string, args ...any) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
...@@ -138,7 +170,7 @@ func WrapSkip(skip int, err error, text string) error { ...@@ -138,7 +170,7 @@ func WrapSkip(skip int, err error, text string) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(skip), stack: callers(skip),
text: text, text: text,
...@@ -151,7 +183,7 @@ func WrapSkipf(skip int, err error, format string, args ...any) error { ...@@ -151,7 +183,7 @@ func WrapSkipf(skip int, err error, format string, args ...any) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(skip), stack: callers(skip),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
......
...@@ -9,7 +9,7 @@ import ( ...@@ -9,7 +9,7 @@ import (
// NewCode 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。 // NewCode 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。
func NewCode(code int, text ...string) error { func NewCode(code int, text ...string) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: strings.Join(text, separatorSpace), text: strings.Join(text, separatorSpace),
code: code, code: code,
...@@ -18,7 +18,7 @@ func NewCode(code int, text ...string) error { ...@@ -18,7 +18,7 @@ func NewCode(code int, text ...string) error {
// NewCodef 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。 // NewCodef 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。
func NewCodef(code int, format string, args ...any) error { func NewCodef(code int, format string, args ...any) error {
return &Error{ return &Err{
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: code, code: code,
...@@ -27,7 +27,7 @@ func NewCodef(code int, format string, args ...any) error { ...@@ -27,7 +27,7 @@ func NewCodef(code int, format string, args ...any) error {
// NewCodeSkip 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。 // NewCodeSkip 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。
func NewCodeSkip(code int, skip int, text ...string) error { func NewCodeSkip(code int, skip int, text ...string) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: strings.Join(text, separatorSpace), text: strings.Join(text, separatorSpace),
code: code, code: code,
...@@ -36,7 +36,7 @@ func NewCodeSkip(code int, skip int, text ...string) error { ...@@ -36,7 +36,7 @@ func NewCodeSkip(code int, skip int, text ...string) error {
// NewCodeSkipf 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。 // NewCodeSkipf 用于创建一个自定义错误信息的 error 对象,并包含堆栈信息,并增加错误码对象的输入。并且忽略部分堆栈信息(按照当前调用方法位置往上忽略)。
func NewCodeSkipf(code int, skip int, format string, args ...any) error { func NewCodeSkipf(code int, skip int, format string, args ...any) error {
return &Error{ return &Err{
stack: callers(skip), stack: callers(skip),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
code: code, code: code,
...@@ -48,7 +48,7 @@ func WrapCode(code int, err error, text ...string) error { ...@@ -48,7 +48,7 @@ func WrapCode(code int, err error, text ...string) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(), stack: callers(),
text: strings.Join(text, separatorSpace), text: strings.Join(text, separatorSpace),
...@@ -61,7 +61,7 @@ func WrapCodef(code int, err error, format string, args ...any) error { ...@@ -61,7 +61,7 @@ func WrapCodef(code int, err error, format string, args ...any) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(), stack: callers(),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
...@@ -74,7 +74,7 @@ func WrapCodeSkip(code int, skip int, err error, text ...string) error { ...@@ -74,7 +74,7 @@ func WrapCodeSkip(code int, skip int, err error, text ...string) error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(skip), stack: callers(skip),
text: strings.Join(text, separatorSpace), text: strings.Join(text, separatorSpace),
...@@ -87,7 +87,7 @@ func WrapCodeSkipf(code int, skip int, err error, format string, args ...any) er ...@@ -87,7 +87,7 @@ func WrapCodeSkipf(code int, skip int, err error, format string, args ...any) er
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: err, error: err,
stack: callers(skip), stack: callers(skip),
text: fmt.Sprintf(format, args...), text: fmt.Sprintf(format, args...),
......
...@@ -10,7 +10,7 @@ type Option struct { ...@@ -10,7 +10,7 @@ type Option struct {
// NewOption 用于自定义配置的错误对象创建。 // NewOption 用于自定义配置的错误对象创建。
func NewOption(option Option) error { func NewOption(option Option) error {
err := &Error{ err := &Err{
error: option.Error, error: option.Error,
text: option.Text, text: option.Text,
code: option.Code, code: option.Code,
......
...@@ -8,14 +8,30 @@ import ( ...@@ -8,14 +8,30 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
// Error 自定义错误对象。 // Err 自定义错误对象。
type Error struct { type Err struct {
error error // 包装错误。 error error // 包装错误。
stack stack // 堆栈数组,当创建或包装此错误时记录堆栈信息。 stack stack // 堆栈数组,当创建或包装此错误时记录堆栈信息。
text string // 创建错误时自定义错误文本。 text string // 创建错误时自定义错误文本。
code int // 如有必要,错误码。 code int // 如有必要,错误码。
} }
type NetError struct {
Err
}
type DBError struct {
Err
}
type ParamError struct {
Err
}
type BizError struct {
Err
}
const ( const (
// stackFilterKeyLocal 过滤当前错误模块路径的键。 // stackFilterKeyLocal 过滤当前错误模块路径的键。
stackFilterKeyLocal = "/xerrors/xerror" stackFilterKeyLocal = "/xerrors/xerror"
...@@ -33,7 +49,7 @@ func init() { ...@@ -33,7 +49,7 @@ func init() {
} }
// Error 实现错误的接口,它将所有错误返回为字符串。 // Error 实现错误的接口,它将所有错误返回为字符串。
func (err *Error) Error() string { func (err *Err) Error() string {
if err == nil { if err == nil {
return "" return ""
} }
...@@ -48,14 +64,14 @@ func (err *Error) Error() string { ...@@ -48,14 +64,14 @@ func (err *Error) Error() string {
} }
// Cause 获取根错误 error。 // Cause 获取根错误 error。
func (err *Error) Cause() error { func (err *Err) Cause() error {
if err == nil { if err == nil {
return nil return nil
} }
loop := err loop := err
for loop != nil { for loop != nil {
if loop.error != nil { if loop.error != nil {
if e, ok := loop.error.(*Error); ok { if e, ok := loop.error.(*Err); ok {
// 内部自定义错误。 // 内部自定义错误。
loop = e loop = e
} else if e, ok := loop.error.(ICause); ok { } else if e, ok := loop.error.(ICause); ok {
...@@ -76,11 +92,11 @@ func (err *Error) Cause() error { ...@@ -76,11 +92,11 @@ func (err *Error) Cause() error {
// Current 获取当前 error。 // Current 获取当前 error。
// 如果当前错误是 nil, 则返回 nil。 // 如果当前错误是 nil, 则返回 nil。
func (err *Error) Current() error { func (err *Err) Current() error {
if err == nil { if err == nil {
return nil return nil
} }
return &Error{ return &Err{
error: nil, error: nil,
stack: err.stack, stack: err.stack,
text: err.text, text: err.text,
...@@ -89,7 +105,7 @@ func (err *Error) Current() error { ...@@ -89,7 +105,7 @@ func (err *Error) Current() error {
} }
// Unwrap 获取下一层 error。 // Unwrap 获取下一层 error。
func (err *Error) Unwrap() error { func (err *Err) Unwrap() error {
if err == nil { if err == nil {
return nil return nil
} }
...@@ -98,7 +114,7 @@ func (err *Error) Unwrap() error { ...@@ -98,7 +114,7 @@ func (err *Error) Unwrap() error {
// Equal 错误对象比较。 // Equal 错误对象比较。
// 如果它们的 `code` 和 `text` 都相同,则认为错误相同。 // 如果它们的 `code` 和 `text` 都相同,则认为错误相同。
func (err *Error) Equal(target error) bool { func (err *Err) Equal(target error) bool {
if err.Error() == target.Error() { if err.Error() == target.Error() {
return true return true
} }
...@@ -112,7 +128,7 @@ func (err *Error) Equal(target error) bool { ...@@ -112,7 +128,7 @@ func (err *Error) Equal(target error) bool {
} }
// Is 当前错误 `err` 的链接错误中是否包含错误 `target`。 // Is 当前错误 `err` 的链接错误中是否包含错误 `target`。
func (err *Error) Is(target error) bool { func (err *Err) Is(target error) bool {
if Equal(err, target) { if Equal(err, target) {
return true return true
} }
......
...@@ -4,7 +4,7 @@ import "gitlab.wanzhuangkj.com/tush/xpkg/pkg/xerrors/xcode" ...@@ -4,7 +4,7 @@ import "gitlab.wanzhuangkj.com/tush/xpkg/pkg/xerrors/xcode"
// Code 获取错误码。 // Code 获取错误码。
// 如果没有错误代码,则返回 `xcode.CodeDefault`。 // 如果没有错误代码,则返回 `xcode.CodeDefault`。
func (err *Error) Code() int { func (err *Err) Code() int {
if err == nil { if err == nil {
return xcode.CodeDefault return xcode.CodeDefault
} }
...@@ -15,7 +15,7 @@ func (err *Error) Code() int { ...@@ -15,7 +15,7 @@ func (err *Error) Code() int {
} }
// SetCode 使用指定 `code` 更新内部 `code` 。 // SetCode 使用指定 `code` 更新内部 `code` 。
func (err *Error) SetCode(code int) { func (err *Err) SetCode(code int) {
if err == nil { if err == nil {
return return
} }
......
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
// %-v, %-s : 打印当前级别错误字符串; // %-v, %-s : 打印当前级别错误字符串;
// %+s : 打印完整堆栈错误列表; // %+s : 打印完整堆栈错误列表;
// %+v : 打印错误字符串和完整堆栈错误列表 // %+v : 打印错误字符串和完整堆栈错误列表
func (err *Error) Format(s fmt.State, verb rune) { func (err *Err) Format(s fmt.State, verb rune) {
switch verb { switch verb {
case 's', 'v': case 's', 'v':
switch { switch {
......
...@@ -2,6 +2,6 @@ package xerror ...@@ -2,6 +2,6 @@ package xerror
// MarshalJSON 实现 json.Marshal 接口。 // MarshalJSON 实现 json.Marshal 接口。
// 注:这里不要使用指针作为其接收器。 // 注:这里不要使用指针作为其接收器。
func (err Error) MarshalJSON() ([]byte, error) { func (err Err) MarshalJSON() ([]byte, error) {
return []byte(`"` + err.Error() + `"`), nil return []byte(`"` + err.Error() + `"`), nil
} }
...@@ -22,7 +22,7 @@ type stackLine struct { ...@@ -22,7 +22,7 @@ type stackLine struct {
} }
// Stack 以字符串形式返回错误堆栈信息。 // Stack 以字符串形式返回错误堆栈信息。
func (err *Error) Stack() string { func (err *Err) Stack() string {
if err == nil { if err == nil {
return "" return ""
} }
...@@ -40,7 +40,7 @@ func (err *Error) Stack() string { ...@@ -40,7 +40,7 @@ func (err *Error) Stack() string {
infos = append(infos, info) infos = append(infos, info)
loopLinesOfStackInfo(loop.stack, info) loopLinesOfStackInfo(loop.stack, info)
if loop.error != nil { if loop.error != nil {
if e, ok := loop.error.(*Error); ok { if e, ok := loop.error.(*Err); ok {
loop = e loop = e
} else { } else {
infos = append(infos, &stackInfo{ infos = append(infos, &stackInfo{
......
...@@ -221,7 +221,7 @@ func Test_SetCode(t *testing.T) { ...@@ -221,7 +221,7 @@ func Test_SetCode(t *testing.T) {
assert.Equal(t, xerror.Code(err), -1) assert.Equal(t, xerror.Code(err), -1)
assert.Equal(t, err.Error(), "123") assert.Equal(t, err.Error(), "123")
err.(*xerror.Error).SetCode(xcode.CodeValidationFailed) err.(*xerror.Err).SetCode(xcode.CodeValidationFailed)
assert.Equal(t, xerror.Code(err), xcode.CodeValidationFailed) assert.Equal(t, xerror.Code(err), xcode.CodeValidationFailed)
assert.Equal(t, err.Error(), "123") assert.Equal(t, err.Error(), "123")
} }
......
...@@ -2,7 +2,6 @@ package xcommon ...@@ -2,7 +2,6 @@ package xcommon
import ( import (
"context" "context"
"errors"
"net/http" "net/http"
"os" "os"
"reflect" "reflect"
...@@ -57,13 +56,14 @@ func (e *Controller) Bind(c *gin.Context, req any) error { ...@@ -57,13 +56,14 @@ func (e *Controller) Bind(c *gin.Context, req any) error {
if valid, ok := req.(IValid); ok { if valid, ok := req.(IValid); ok {
if err := valid.Valid(); err != nil { if err := valid.Valid(); err != nil {
return err return xerror.NewParamError(err.Error())
} }
} }
storePagination(req, reflectPagination(c)) storePagination(req, reflectPagination(c))
c.Set("reqbody", req) c.Set("reqbody", req)
return nil return nil
} }
...@@ -106,9 +106,9 @@ func zhError(err error) error { ...@@ -106,9 +106,9 @@ func zhError(err error) error {
strs = append(strs, zhStr) strs = append(strs, zhStr)
} }
if len(strs) > 0 { if len(strs) > 0 {
return errors.New(strings.Join(strs, ";")) return xerror.NewParamError(strings.Join(strs, ";"))
} else { } else {
return xerror.Join(errs) return xerror.NewParamError(xerror.Join(errs).Error())
} }
} }
return err return err
......
...@@ -67,7 +67,7 @@ func (x *ODao[T]) deleteCaches(ctx context.Context, ids []xsf.ID) error { ...@@ -67,7 +67,7 @@ func (x *ODao[T]) deleteCaches(ctx context.Context, ids []xsf.ID) error {
func (x *ODao[T]) TruncateTable(ctx context.Context) error { func (x *ODao[T]) TruncateTable(ctx context.Context) error {
var t T var t T
if err := x.DB().WithContext(ctx).Exec(fmt.Sprintf("truncate table `%s`", t.TableName())).Error; err != nil { if err := x.DB().WithContext(ctx).Exec(fmt.Sprintf("truncate table `%s`", t.TableName())).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
return nil return nil
} }
...@@ -96,7 +96,7 @@ func (x *ODao[T]) CreateSliceSilent(ctx context.Context, tbs []*T) error { ...@@ -96,7 +96,7 @@ func (x *ODao[T]) CreateSliceSilent(ctx context.Context, tbs []*T) error {
func (x *ODao[T]) CreateTx(ctx context.Context, tx *gorm.DB, tb *T) error { func (x *ODao[T]) CreateTx(ctx context.Context, tx *gorm.DB, tb *T) error {
if err := tx.WithContext(ctx).Create(tb).Error; err != nil { if err := tx.WithContext(ctx).Create(tb).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCache(ctx, (*tb).GetID()) _ = x.deleteCache(ctx, (*tb).GetID())
return nil return nil
...@@ -107,7 +107,7 @@ func (x *ODao[T]) CreateSliceInBatches(ctx context.Context, tbs []*T, batchSize ...@@ -107,7 +107,7 @@ func (x *ODao[T]) CreateSliceInBatches(ctx context.Context, tbs []*T, batchSize
return nil return nil
} }
if err := x.DB().WithContext(ctx).CreateInBatches(tbs, batchSize).Error; err != nil { if err := x.DB().WithContext(ctx).CreateInBatches(tbs, batchSize).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCaches(ctx, x.getIDs(tbs)) _ = x.deleteCaches(ctx, x.getIDs(tbs))
return nil return nil
...@@ -118,7 +118,7 @@ func (x *ODao[T]) CreateSliceTx(ctx context.Context, tx *gorm.DB, tbs []*T) erro ...@@ -118,7 +118,7 @@ func (x *ODao[T]) CreateSliceTx(ctx context.Context, tx *gorm.DB, tbs []*T) erro
return nil return nil
} }
if err := tx.WithContext(ctx).Create(tbs).Error; err != nil { if err := tx.WithContext(ctx).Create(tbs).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCaches(ctx, x.getIDs(tbs)) _ = x.deleteCaches(ctx, x.getIDs(tbs))
return nil return nil
...@@ -154,7 +154,7 @@ func (x *ODao[T]) DeleteByIDTx(ctx context.Context, tx *gorm.DB, id xsf.ID) erro ...@@ -154,7 +154,7 @@ func (x *ODao[T]) DeleteByIDTx(ctx context.Context, tx *gorm.DB, id xsf.ID) erro
} }
var tb T var tb T
if err := tx.WithContext(ctx).Where("id = ?", id).Delete(&tb).Error; err != nil { if err := tx.WithContext(ctx).Where("id = ?", id).Delete(&tb).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCache(ctx, id) _ = x.deleteCache(ctx, id)
return nil return nil
...@@ -166,7 +166,7 @@ func (x *ODao[T]) DeleteByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID) ...@@ -166,7 +166,7 @@ func (x *ODao[T]) DeleteByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID)
} }
var tb T var tb T
if err := tx.WithContext(ctx).Where("id IN (?)", ids).Delete(&tb).Error; err != nil { if err := tx.WithContext(ctx).Where("id IN (?)", ids).Delete(&tb).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCaches(ctx, ids) _ = x.deleteCaches(ctx, ids)
return nil return nil
...@@ -216,7 +216,7 @@ func (x *ODao[T]) updByIDTx(ctx context.Context, tx *gorm.DB, id xsf.ID, upd any ...@@ -216,7 +216,7 @@ func (x *ODao[T]) updByIDTx(ctx context.Context, tx *gorm.DB, id xsf.ID, upd any
} }
var table T var table T
if err := tx.WithContext(ctx).Model(&table).Where("id = ?", id).Updates(upd).Error; err != nil { if err := tx.WithContext(ctx).Model(&table).Where("id = ?", id).Updates(upd).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCache(ctx, id) _ = x.deleteCache(ctx, id)
return nil return nil
...@@ -264,7 +264,7 @@ func (x *ODao[T]) updByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID, upd ...@@ -264,7 +264,7 @@ func (x *ODao[T]) updByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID, upd
} }
var table T var table T
if err := tx.WithContext(ctx).Model(&table).Where("id IN (?)", ids).Updates(upd).Error; err != nil { if err := tx.WithContext(ctx).Model(&table).Where("id IN (?)", ids).Updates(upd).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
_ = x.deleteCaches(ctx, ids) _ = x.deleteCaches(ctx, ids)
return nil return nil
...@@ -272,7 +272,7 @@ func (x *ODao[T]) updByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID, upd ...@@ -272,7 +272,7 @@ func (x *ODao[T]) updByIDsTx(ctx context.Context, tx *gorm.DB, ids []xsf.ID, upd
func (x *ODao[T]) GetAll(ctx context.Context) (records []*T, err error) { func (x *ODao[T]) GetAll(ctx context.Context) (records []*T, err error) {
if err := x.DB().WithContext(ctx).Find(&records).Error; err != nil { if err := x.DB().WithContext(ctx).Find(&records).Error; err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return records, nil return records, nil
} }
...@@ -306,13 +306,13 @@ func (x *ODao[T]) Page(ctx context.Context, where IPageParams) (rs []*T, total i ...@@ -306,13 +306,13 @@ func (x *ODao[T]) Page(ctx context.Context, where IPageParams) (rs []*T, total i
condition = condition.Unscoped() condition = condition.Unscoped()
} }
if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil { if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil {
return rs, total, xerror.New(err.Error()) return rs, total, xerror.NewDBError(err.Error())
} }
if total == 0 { if total == 0 {
return rs, total, nil return rs, total, nil
} }
if err = condition.Limit(where.GetLimit()).Offset(where.GetOffset()).Find(&rs).Error; err != nil { if err = condition.Limit(where.GetLimit()).Offset(where.GetOffset()).Find(&rs).Error; err != nil {
return rs, total, xerror.New(err.Error()) return rs, total, xerror.NewDBError(err.Error())
} }
return rs, total, nil return rs, total, nil
} }
...@@ -323,14 +323,14 @@ func (x *ODao[T]) JPage(ctx context.Context, where IPageParams, result any, resu ...@@ -323,14 +323,14 @@ func (x *ODao[T]) JPage(ctx context.Context, where IPageParams, result any, resu
condition = condition.Unscoped() condition = condition.Unscoped()
} }
if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil { if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil {
return total, xerror.New(err.Error()) return total, xerror.NewDBError(err.Error())
} }
if total == 0 { if total == 0 {
return total, nil return total, nil
} }
fields := GetGormTags(resultType) fields := GetGormTags(resultType)
if err = condition.Select(strings.Join(fields, ",")).Limit(where.GetLimit()).Offset(where.GetOffset()).Scan(result).Error; err != nil { if err = condition.Select(strings.Join(fields, ",")).Limit(where.GetLimit()).Offset(where.GetOffset()).Scan(result).Error; err != nil {
return total, xerror.New(err.Error()) return total, xerror.NewDBError(err.Error())
} }
return total, nil return total, nil
} }
...@@ -341,14 +341,14 @@ func (x *ODao[T]) JList(ctx context.Context, where IListParams, result any, resu ...@@ -341,14 +341,14 @@ func (x *ODao[T]) JList(ctx context.Context, where IListParams, result any, resu
condition = condition.Unscoped() condition = condition.Unscoped()
} }
if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil { if err = condition.Limit(-1).Offset(-1).Count(&total).Error; err != nil {
return total, xerror.New(err.Error()) return total, xerror.NewDBError(err.Error())
} }
if total == 0 { if total == 0 {
return total, nil return total, nil
} }
fields := GetGormTags(resultType) fields := GetGormTags(resultType)
if err = condition.Select(strings.Join(fields, ",")).Scan(result).Error; err != nil { if err = condition.Select(strings.Join(fields, ",")).Scan(result).Error; err != nil {
return total, xerror.New(err.Error()) return total, xerror.NewDBError(err.Error())
} }
return total, nil return total, nil
} }
...@@ -361,7 +361,7 @@ func (x *ODao[T]) GetPageByColumns(ctx context.Context, params *query.Params) (r ...@@ -361,7 +361,7 @@ func (x *ODao[T]) GetPageByColumns(ctx context.Context, params *query.Params) (r
if params.Sort != OrderIgnoreCount { if params.Sort != OrderIgnoreCount {
var tb T var tb T
if err = x.DB().WithContext(ctx).Model(&tb).Where(queryStr, args...).Count(&total).Error; err != nil { if err = x.DB().WithContext(ctx).Model(&tb).Where(queryStr, args...).Count(&total).Error; err != nil {
return nil, 0, xerror.New(err.Error()) return nil, 0, xerror.NewDBError(err.Error())
} }
if total == 0 { if total == 0 {
return nil, total, nil return nil, total, nil
...@@ -369,7 +369,7 @@ func (x *ODao[T]) GetPageByColumns(ctx context.Context, params *query.Params) (r ...@@ -369,7 +369,7 @@ func (x *ODao[T]) GetPageByColumns(ctx context.Context, params *query.Params) (r
} }
order, limit, offset := params.ConvertToPage() order, limit, offset := params.ConvertToPage()
if err = x.DB().WithContext(ctx).Order(order).Limit(limit).Offset(offset).Where(queryStr, args...).Find(&rs).Error; err != nil { if err = x.DB().WithContext(ctx).Order(order).Limit(limit).Offset(offset).Where(queryStr, args...).Find(&rs).Error; err != nil {
return nil, 0, xerror.New(err.Error()) return nil, 0, xerror.NewDBError(err.Error())
} }
return rs, total, err return rs, total, err
} }
...@@ -380,7 +380,7 @@ func (x *ODao[T]) GetSliceByCondition(ctx context.Context, c *query.Conditions) ...@@ -380,7 +380,7 @@ func (x *ODao[T]) GetSliceByCondition(ctx context.Context, c *query.Conditions)
return nil, err return nil, err
} }
if err = x.DB().WithContext(ctx).Where(queryStr, args...).Find(&rs).Error; err != nil { if err = x.DB().WithContext(ctx).Where(queryStr, args...).Find(&rs).Error; err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return rs, nil return rs, nil
} }
...@@ -391,7 +391,7 @@ func (x *ODao[T]) GetSliceByLastID(ctx context.Context, lastID xsf.ID, limit int ...@@ -391,7 +391,7 @@ func (x *ODao[T]) GetSliceByLastID(ctx context.Context, lastID xsf.ID, limit int
} }
page := query.NewPage(0, limit, sort) page := query.NewPage(0, limit, sort)
if err = x.DB().WithContext(ctx).Order(page.Sort()).Limit(page.Limit()).Where("id < ?", lastID).Find(&rs).Error; err != nil { if err = x.DB().WithContext(ctx).Order(page.Sort()).Limit(page.Limit()).Where("id < ?", lastID).Find(&rs).Error; err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return rs, nil return rs, nil
} }
...@@ -401,14 +401,14 @@ func (x *ODao[T]) GetByWhere(ctx context.Context, query any, args ...any) (recor ...@@ -401,14 +401,14 @@ func (x *ODao[T]) GetByWhere(ctx context.Context, query any, args ...any) (recor
if xerror.Is(err, gorm.ErrRecordNotFound) { if xerror.Is(err, gorm.ErrRecordNotFound) {
return nil, nil return nil, nil
} }
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return record, nil return record, nil
} }
func (x *ODao[T]) QuerySliceTotal(ctx context.Context, where Query, total *int64) error { func (x *ODao[T]) QuerySliceTotal(ctx context.Context, where Query, total *int64) error {
if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(-1).Offset(-1).Count(total).Error; err != nil { if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(-1).Offset(-1).Count(total).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
return nil return nil
} }
...@@ -418,7 +418,7 @@ func (x *ODao[T]) GetSliceByWhere(ctx context.Context, query any, args ...any) ( ...@@ -418,7 +418,7 @@ func (x *ODao[T]) GetSliceByWhere(ctx context.Context, query any, args ...any) (
if xerror.Is(err, gorm.ErrRecordNotFound) { if xerror.Is(err, gorm.ErrRecordNotFound) {
return nil, nil return nil, nil
} }
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return records, nil return records, nil
} }
...@@ -431,7 +431,7 @@ func (x *ODao[T]) GetOrderSliceByWhere(ctx context.Context, order string, query ...@@ -431,7 +431,7 @@ func (x *ODao[T]) GetOrderSliceByWhere(ctx context.Context, order string, query
if xerror.Is(err, gorm.ErrRecordNotFound) { if xerror.Is(err, gorm.ErrRecordNotFound) {
return nil, nil return nil, nil
} }
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return records, nil return records, nil
} }
...@@ -441,7 +441,7 @@ func (x *ODao[T]) CountByWhere(ctx context.Context, where any) (count int64, err ...@@ -441,7 +441,7 @@ func (x *ODao[T]) CountByWhere(ctx context.Context, where any) (count int64, err
if xerror.Is(err, gorm.ErrRecordNotFound) { if xerror.Is(err, gorm.ErrRecordNotFound) {
return 0, nil return 0, nil
} }
return 0, xerror.New(err.Error()) return 0, xerror.NewDBError(err.Error())
} }
return count, nil return count, nil
} }
...@@ -455,7 +455,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error) ...@@ -455,7 +455,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error)
if xerror.Is(err, ErrRecordNotFound) { if xerror.Is(err, ErrRecordNotFound) {
return nil, nil return nil, nil
} }
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
return record, nil return record, nil
} }
...@@ -473,7 +473,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error) ...@@ -473,7 +473,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error)
} }
return nil, nil return nil, nil
} }
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
if err = x.Cache.Set(ctx, id, record, x.Cache.ExpireTime); err != nil { if err = x.Cache.Set(ctx, id, record, x.Cache.ExpireTime); err != nil {
logger.Warn("cache.Set error", logger.Err(err), logger.Any("id", id), ctxutils.CtxTraceIDField(ctx)) logger.Warn("cache.Set error", logger.Err(err), logger.Any("id", id), ctxutils.CtxTraceIDField(ctx))
...@@ -481,7 +481,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error) ...@@ -481,7 +481,7 @@ func (x *ODao[T]) GetByID(ctx context.Context, id xsf.ID) (record *T, err error)
return record, nil return record, nil
}) })
if err != nil { if err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
r, ok := val.(*T) r, ok := val.(*T)
if !ok { if !ok {
...@@ -502,7 +502,7 @@ func (x *ODao[T]) GetMapByIDs(ctx context.Context, ids []xsf.ID) (itemMap map[xs ...@@ -502,7 +502,7 @@ func (x *ODao[T]) GetMapByIDs(ctx context.Context, ids []xsf.ID) (itemMap map[xs
if x.Cache == nil { if x.Cache == nil {
var records = make([]*T, 0, len(ids)) var records = make([]*T, 0, len(ids))
if err := x.DB().WithContext(ctx).Where("id IN (?)", ids).Find(&records).Error; err != nil { if err := x.DB().WithContext(ctx).Where("id IN (?)", ids).Find(&records).Error; err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
itemMap = make(map[xsf.ID]*T) itemMap = make(map[xsf.ID]*T)
for _, record := range records { for _, record := range records {
...@@ -523,7 +523,7 @@ func (x *ODao[T]) GetMapByIDs(ctx context.Context, ids []xsf.ID) (itemMap map[xs ...@@ -523,7 +523,7 @@ func (x *ODao[T]) GetMapByIDs(ctx context.Context, ids []xsf.ID) (itemMap map[xs
if len(missedIDs) > 0 { if len(missedIDs) > 0 {
var records []*T var records []*T
if err = x.DB().WithContext(ctx).Where("id IN (?)", missedIDs).Find(&records).Error; err != nil { if err = x.DB().WithContext(ctx).Where("id IN (?)", missedIDs).Find(&records).Error; err != nil {
return nil, xerror.New(err.Error()) return nil, xerror.NewDBError(err.Error())
} }
var recordIDMap = make(map[xsf.ID]struct{}) var recordIDMap = make(map[xsf.ID]struct{})
if len(records) > 0 { if len(records) > 0 {
...@@ -556,15 +556,15 @@ func (x *ODao[T]) CalcCondition(ctx context.Context, where IPageParams, columns ...@@ -556,15 +556,15 @@ func (x *ODao[T]) CalcCondition(ctx context.Context, where IPageParams, columns
condition = condition.Unscoped() condition = condition.Unscoped()
} }
if err := condition.Order("").Scan(ret).Error; err != nil { if err := condition.Order("").Scan(ret).Error; err != nil {
return xerror.New(err.Error()) return xerror.NewDBError(err.Error())
} }
return nil return nil
} }
func (x *ODao[T]) Transaction(fc func(tx *gorm.DB) error, opts ...*sql.TxOptions) error { func (x *ODao[T]) Transaction(fc func(tx *gorm.DB) error, opts ...*sql.TxOptions) error {
if err := x.DB().Transaction(fc, opts...); err != nil { if err := x.DB().Transaction(fc, opts...); err != nil {
if _, ok := (err).(*xerror.Error); !ok { if _, ok := (err).(*xerror.Err); !ok {
err = xerror.New(err.Error()) err = xerror.NewDBError(err.Error())
} }
return err return err
} }
...@@ -574,7 +574,7 @@ func (x *ODao[T]) Transaction(fc func(tx *gorm.DB) error, opts ...*sql.TxOptions ...@@ -574,7 +574,7 @@ func (x *ODao[T]) Transaction(fc func(tx *gorm.DB) error, opts ...*sql.TxOptions
// GetTotal only total // GetTotal only total
func (x *ODao[T]) GetTotal(ctx context.Context, where Query) (total int64, err error) { func (x *ODao[T]) GetTotal(ctx context.Context, where Query) (total int64, err error) {
if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(-1).Offset(-1).Count(&total).Error; err != nil { if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(-1).Offset(-1).Count(&total).Error; err != nil {
return total, xerror.New(err.Error()) return total, xerror.NewDBError(err.Error())
} }
return total, nil return total, nil
} }
...@@ -582,7 +582,7 @@ func (x *ODao[T]) GetTotal(ctx context.Context, where Query) (total int64, err e ...@@ -582,7 +582,7 @@ func (x *ODao[T]) GetTotal(ctx context.Context, where Query) (total int64, err e
// QuerySlice no page no total // QuerySlice no page no total
func (x *ODao[T]) QuerySlice(ctx context.Context, where Query) (rs []*T, err error) { func (x *ODao[T]) QuerySlice(ctx context.Context, where Query) (rs []*T, err error) {
if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Find(&rs).Error; err != nil { if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Find(&rs).Error; err != nil {
return rs, xerror.New(err.Error()) return rs, xerror.NewDBError(err.Error())
} }
return rs, nil return rs, nil
} }
...@@ -590,7 +590,7 @@ func (x *ODao[T]) QuerySlice(ctx context.Context, where Query) (rs []*T, err err ...@@ -590,7 +590,7 @@ func (x *ODao[T]) QuerySlice(ctx context.Context, where Query) (rs []*T, err err
// QueryPageSlice only page // QueryPageSlice only page
func (x *ODao[T]) QueryPageSlice(ctx context.Context, where Query, limit, offset int) (rs []*T, err error) { func (x *ODao[T]) QueryPageSlice(ctx context.Context, where Query, limit, offset int) (rs []*T, err error) {
if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(limit).Offset(offset).Find(&rs).Error; err != nil { if err := x.DB().WithContext(ctx).Table(where.TableName()).Scopes(x.MakeCondition(where)).Limit(limit).Offset(offset).Find(&rs).Error; err != nil {
return rs, xerror.New(err.Error()) return rs, xerror.NewDBError(err.Error())
} }
return rs, nil return rs, nil
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论