github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/sqlx/errors.go (about)

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