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  }