Raw
 1package storage
 2
 3import (
 4	"errors"
 5	"fmt"
 6
 7	"modernc.org/sqlite"
 8)
 9
10var (
11	ErrInvalid       = errors.New("storage: invalid input")
12	ErrNotFound      = errors.New("storage: not found")
13	ErrConflict      = errors.New("storage: conflict")
14	ErrUIDExhausted  = errors.New("storage: uid range exhausted")
15	ErrGIDExhausted  = errors.New("storage: gid range exhausted")
16	ErrSchemaTooNew  = errors.New("storage: schema newer than binary")
17	ErrSchemaInvalid = errors.New("storage: schema invalid")
18	ErrBusy          = errors.New("storage: database busy")
19	ErrLocked        = errors.New("storage: database locked")
20	ErrClosed        = errors.New("storage: closed")
21)
22
23func invalid(operation string, err error) error {
24	return fmt.Errorf("%s: %w: %v", operation, ErrInvalid, err)
25}
26
27func classify(operation string, err error) error {
28	if err == nil {
29		return nil
30	}
31	var sqliteErr *sqlite.Error
32	if errors.As(err, &sqliteErr) {
33		switch sqliteErr.Code() & 0xff {
34		case 5:
35			return fmt.Errorf("%s: %w: %w", operation, ErrBusy, err)
36		case 6:
37			return fmt.Errorf("%s: %w: %w", operation, ErrLocked, err)
38		case 19:
39			return fmt.Errorf("%s: %w: %w", operation, ErrConflict, err)
40		}
41	}
42	return fmt.Errorf("%s: %w", operation, err)
43}