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  }