github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/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 sqlErrTypeInvalidSql sqlErrType = "InvalidSql" 27 sqlErrTypeInvalidScanTarget sqlErrType = "InvalidScanTarget" 28 sqlErrTypeNotFound sqlErrType = "NotFound" 29 sqlErrTypeSelectShouldOne sqlErrType = "SelectShouldOne" 30 sqlErrTypeConflict sqlErrType = "Conflict" 31 ) 32 33 var DuplicateEntryErrNumber uint16 = 1062 34 35 func DBErr(err error) *dbErr { 36 return &dbErr{ 37 err: err, 38 } 39 } 40 41 type dbErr struct { 42 err error 43 44 errDefault error 45 errNotFound error 46 errConflict error 47 } 48 49 func (r dbErr) WithNotFound(err error) *dbErr { 50 r.errNotFound = err 51 return &r 52 } 53 54 func (r dbErr) WithDefault(err error) *dbErr { 55 r.errDefault = err 56 return &r 57 } 58 59 func (r dbErr) WithConflict(err error) *dbErr { 60 r.errConflict = err 61 return &r 62 } 63 64 func (r *dbErr) IsNotFound() bool { 65 if sqlErr, ok := r.err.(*SqlError); ok { 66 return sqlErr.Type == sqlErrTypeNotFound 67 } 68 return false 69 } 70 71 func (r *dbErr) IsConflict() bool { 72 if sqlErr, ok := r.err.(*SqlError); ok { 73 return sqlErr.Type == sqlErrTypeConflict 74 } 75 return false 76 } 77 78 func (r *dbErr) Err() error { 79 if r.err == nil { 80 return nil 81 } 82 if sqlErr, ok := r.err.(*SqlError); ok { 83 switch sqlErr.Type { 84 case sqlErrTypeNotFound: 85 if r.errNotFound != nil { 86 return r.errNotFound 87 } 88 case sqlErrTypeConflict: 89 if r.errConflict != nil { 90 return r.errConflict 91 } 92 } 93 if r.errDefault != nil { 94 return r.errDefault 95 } 96 } 97 return r.err 98 }