1package db23import (4 "database/sql"5 "errors"67 "github.com/lib/pq"8 sqlite "modernc.org/sqlite"9 sqlitelib "modernc.org/sqlite/lib"10)1112var (13 // ErrDuplicateKey is a constraint violation error.14 ErrDuplicateKey = errors.New("duplicate key value violates table constraint")1516 // ErrRecordNotFound is returned when a record is not found.17 ErrRecordNotFound = sql.ErrNoRows18)1920// WrapError is a convenient function that unite various database driver21// errors to consistent errors.22func WrapError(err error) error {23 if err != nil {24 if errors.Is(err, sql.ErrNoRows) {25 return ErrRecordNotFound26 }2728 // Handle sqlite constraint error.29 if liteErr, ok := err.(*sqlite.Error); ok {30 code := liteErr.Code()31 if code == sqlitelib.SQLITE_CONSTRAINT_PRIMARYKEY ||32 code == sqlitelib.SQLITE_CONSTRAINT_FOREIGNKEY ||33 code == sqlitelib.SQLITE_CONSTRAINT_UNIQUE {34 return ErrDuplicateKey35 }36 }3738 // Handle postgres constraint error.39 if pgErr, ok := err.(*pq.Error); ok {40 if pgErr.Code == "23505" ||41 pgErr.Code == "23503" ||42 pgErr.Code == "23514" {43 return ErrDuplicateKey44 }45 }46 }47 return err48}