返回 DeepSeek-Reasonix
read_errors.go
根目录 / internal / sessioncatalog / read_errors.go
1 package sessioncatalog
2
3 import (
4 "context"
5 "database/sql"
6 )
7
8 // Observe corruption at the shared metadata reader, including Scan/Err where
9 // SQLite can report a damaged page after QueryContext has already succeeded.
10 type catalogReader struct {
11 owner *Catalog
12 source queryReader
13 }
14 type catalogRow struct {
15 owner *Catalog
16 row *sql.Row
17 err error
18 }
19 type catalogRows struct {
20 *sql.Rows
21 owner *Catalog
22 }
23
24 func (r catalogReader) QueryRowContext(ctx context.Context, query string, args ...any) *catalogRow {
25 if err := r.owner.readable(); err != nil {
26 return &catalogRow{owner: r.owner, err: err}
27 }
28 return &catalogRow{owner: r.owner, row: r.source.QueryRowContext(ctx, query, args...)}
29 }
30
31 func (r *catalogRow) Scan(dest ...any) error {
32 if err := r.owner.readable(); err != nil {
33 return err
34 }
35 if r.err != nil {
36 return r.err
37 }
38 err := r.row.Scan(dest...)
39 r.owner.observeDatabaseError(err)
40 return err
41 }
42
43 func (r catalogReader) QueryContext(ctx context.Context, query string, args ...any) (*catalogRows, error) {
44 if err := r.owner.readable(); err != nil {
45 return nil, err
46 }
47 rows, err := r.source.QueryContext(ctx, query, args...)
48 if err != nil {
49 r.owner.observeDatabaseError(err)
50 return nil, err
51 }
52 return &catalogRows{rows, r.owner}, nil
53 }
54
55 func (r *catalogRows) Scan(dest ...any) error {
56 if err := r.owner.readable(); err != nil {
57 return err
58 }
59 err := r.Rows.Scan(dest...)
60 r.owner.observeDatabaseError(err)
61 return err
62 }
63
64 func (r *catalogRows) Err() error {
65 if err := r.owner.readable(); err != nil {
66 return err
67 }
68 err := r.Rows.Err()
69 r.owner.observeDatabaseError(err)
70 return err
71 }
72
73 func (r *catalogRows) Next() bool {
74 return r.owner.readable() == nil && r.Rows.Next()
75 }
76
77 func (r *catalogRows) Close() error {
78 err := r.Rows.Close()
79 r.owner.observeDatabaseError(err)
80 return err
81 }
82
82 lines GO