2023-09-04 17:31:51 +08:00
|
|
|
package sqlbase
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// ErrRetriesExceeded is returned when a transaction is retried more
|
|
|
|
// than the max allowed valued without a success.
|
|
|
|
ErrRetriesExceeded = errors.New("db tx retries exceeded")
|
|
|
|
)
|
|
|
|
|
|
|
|
// MapSQLError attempts to interpret a given error as a database agnostic SQL
|
|
|
|
// error.
|
|
|
|
func MapSQLError(err error) error {
|
|
|
|
// Attempt to interpret the error as a sqlite error.
|
2023-09-05 18:20:04 -07:00
|
|
|
if sqliteErr := parseSqliteError(err); sqliteErr != nil {
|
|
|
|
return sqliteErr
|
2023-09-04 17:31:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Attempt to interpret the error as a postgres error.
|
2023-09-05 18:20:04 -07:00
|
|
|
if postgresErr := parsePostgresError(err); postgresErr != nil {
|
|
|
|
return postgresErr
|
2023-09-04 17:31:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return original error if it could not be classified as a database
|
|
|
|
// specific error.
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// ErrSQLUniqueConstraintViolation is an error type which represents a database
|
|
|
|
// agnostic SQL unique constraint violation.
|
|
|
|
type ErrSQLUniqueConstraintViolation struct {
|
|
|
|
DBError error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e ErrSQLUniqueConstraintViolation) Error() string {
|
|
|
|
return fmt.Sprintf("sql unique constraint violation: %v", e.DBError)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ErrSerializationError is an error type which represents a database agnostic
|
|
|
|
// error that a transaction couldn't be serialized with other concurrent db
|
|
|
|
// transactions.
|
|
|
|
type ErrSerializationError struct {
|
|
|
|
DBError error
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unwrap returns the wrapped error.
|
|
|
|
func (e ErrSerializationError) Unwrap() error {
|
|
|
|
return e.DBError
|
|
|
|
}
|
|
|
|
|
|
|
|
// Error returns the error message.
|
|
|
|
func (e ErrSerializationError) Error() string {
|
|
|
|
return e.DBError.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsSerializationError returns true if the given error is a serialization
|
|
|
|
// error.
|
|
|
|
func IsSerializationError(err error) bool {
|
|
|
|
var serializationError *ErrSerializationError
|
|
|
|
return errors.As(err, &serializationError)
|
|
|
|
}
|