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}