github.com/kunlun-qilian/sqlx/v3@v3.0.0/errors.go (about) 1 package sqlx 2 3 import ( 4 "fmt" 5 ) 6 7 func NewSqlError(tpe sqlErrType, msg string) *SqlError { 8 return &SqlError{ 9 Type: tpe, 10 Msg: msg, 11 } 12 } 13 14 type SqlError struct { 15 Type sqlErrType 16 Msg string 17 } 18 19 func (e *SqlError) Error() string { 20 return fmt.Sprintf("Sqlx [%s] %s", e.Type, e.Msg) 21 } 22 23 type sqlErrType string 24 25 var ( 26 sqlErrTypeNotFound sqlErrType = "NotFound" 27 sqlErrTypeConflict sqlErrType = "Conflict" 28 ) 29 30 var DuplicateEntryErrNumber uint16 = 1062 31 32 func DBErr(err error) *dbErr { 33 return &dbErr{ 34 err: err, 35 } 36 } 37 38 type dbErr struct { 39 err error 40 41 errDefault error 42 errNotFound error 43 errConflict error 44 } 45 46 func (r dbErr) WithNotFound(err error) *dbErr { 47 r.errNotFound = err 48 return &r 49 } 50 51 func (r dbErr) WithDefault(err error) *dbErr { 52 r.errDefault = err 53 return &r 54 } 55 56 func (r dbErr) WithConflict(err error) *dbErr { 57 r.errConflict = err 58 return &r 59 } 60 61 func (r *dbErr) IsNotFound() bool { 62 if sqlErr, ok := UnwrapAll(r.err).(*SqlError); ok { 63 return sqlErr.Type == sqlErrTypeNotFound 64 } 65 return false 66 } 67 68 func (r *dbErr) IsConflict() bool { 69 if sqlErr, ok := UnwrapAll(r.err).(*SqlError); ok { 70 return sqlErr.Type == sqlErrTypeConflict 71 } 72 return false 73 } 74 75 func (r *dbErr) Err() error { 76 if r.err == nil { 77 return nil 78 } 79 if sqlErr, ok := UnwrapAll(r.err).(*SqlError); ok { 80 switch sqlErr.Type { 81 case sqlErrTypeNotFound: 82 if r.errNotFound != nil { 83 return r.errNotFound 84 } 85 case sqlErrTypeConflict: 86 if r.errConflict != nil { 87 return r.errConflict 88 } 89 } 90 if r.errDefault != nil { 91 return r.errDefault 92 } 93 } 94 return r.err 95 }