...
1 package pgxpool
2
3 import (
4 "github.com/jackc/pgx/v5"
5 "github.com/jackc/pgx/v5/pgconn"
6 )
7
8 type errRows struct {
9 err error
10 }
11
12 func (errRows) Close() {}
13 func (e errRows) Err() error { return e.err }
14 func (errRows) CommandTag() pgconn.CommandTag { return pgconn.CommandTag{} }
15 func (errRows) FieldDescriptions() []pgconn.FieldDescription { return nil }
16 func (errRows) Next() bool { return false }
17 func (e errRows) Scan(dest ...any) error { return e.err }
18 func (e errRows) Values() ([]any, error) { return nil, e.err }
19 func (e errRows) RawValues() [][]byte { return nil }
20 func (e errRows) Conn() *pgx.Conn { return nil }
21
22 type errRow struct {
23 err error
24 }
25
26 func (e errRow) Scan(dest ...any) error { return e.err }
27
28 type poolRows struct {
29 r pgx.Rows
30 c *Conn
31 err error
32 }
33
34 func (rows *poolRows) Close() {
35 rows.r.Close()
36 if rows.c != nil {
37 rows.c.Release()
38 rows.c = nil
39 }
40 }
41
42 func (rows *poolRows) Err() error {
43 if rows.err != nil {
44 return rows.err
45 }
46 return rows.r.Err()
47 }
48
49 func (rows *poolRows) CommandTag() pgconn.CommandTag {
50 return rows.r.CommandTag()
51 }
52
53 func (rows *poolRows) FieldDescriptions() []pgconn.FieldDescription {
54 return rows.r.FieldDescriptions()
55 }
56
57 func (rows *poolRows) Next() bool {
58 if rows.err != nil {
59 return false
60 }
61
62 n := rows.r.Next()
63 if !n {
64 rows.Close()
65 }
66 return n
67 }
68
69 func (rows *poolRows) Scan(dest ...any) error {
70 err := rows.r.Scan(dest...)
71 if err != nil {
72 rows.Close()
73 }
74 return err
75 }
76
77 func (rows *poolRows) Values() ([]any, error) {
78 values, err := rows.r.Values()
79 if err != nil {
80 rows.Close()
81 }
82 return values, err
83 }
84
85 func (rows *poolRows) RawValues() [][]byte {
86 return rows.r.RawValues()
87 }
88
89 func (rows *poolRows) Conn() *pgx.Conn {
90 return rows.r.Conn()
91 }
92
93 type poolRow struct {
94 r pgx.Row
95 c *Conn
96 err error
97 }
98
99 func (row *poolRow) Scan(dest ...any) error {
100 if row.err != nil {
101 return row.err
102 }
103
104 panicked := true
105 defer func() {
106 if panicked && row.c != nil {
107 row.c.Release()
108 }
109 }()
110 err := row.r.Scan(dest...)
111 panicked = false
112 if row.c != nil {
113 row.c.Release()
114 }
115 return err
116 }
117
View as plain text