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