1package pgxpool
2
3import (
4	"github.com/jackc/pgconn"
5	"github.com/jackc/pgproto3/v2"
6	"github.com/jackc/pgx/v4"
7)
8
9type errRows struct {
10	err error
11}
12
13func (errRows) Close()                                         {}
14func (e errRows) Err() error                                   { return e.err }
15func (errRows) CommandTag() pgconn.CommandTag                  { return nil }
16func (errRows) FieldDescriptions() []pgproto3.FieldDescription { return nil }
17func (errRows) Next() bool                                     { return false }
18func (e errRows) Scan(dest ...interface{}) error               { return e.err }
19func (e errRows) Values() ([]interface{}, error)               { return nil, e.err }
20func (e errRows) RawValues() [][]byte                          { return nil }
21
22type errRow struct {
23	err error
24}
25
26func (e errRow) Scan(dest ...interface{}) error { return e.err }
27
28type poolRows struct {
29	r   pgx.Rows
30	c   *Conn
31	err error
32}
33
34func (rows *poolRows) Close() {
35	rows.r.Close()
36	if rows.c != nil {
37		rows.c.Release()
38		rows.c = nil
39	}
40}
41
42func (rows *poolRows) Err() error {
43	if rows.err != nil {
44		return rows.err
45	}
46	return rows.r.Err()
47}
48
49func (rows *poolRows) CommandTag() pgconn.CommandTag {
50	return rows.r.CommandTag()
51}
52
53func (rows *poolRows) FieldDescriptions() []pgproto3.FieldDescription {
54	return rows.r.FieldDescriptions()
55}
56
57func (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
69func (rows *poolRows) Scan(dest ...interface{}) error {
70	err := rows.r.Scan(dest...)
71	if err != nil {
72		rows.Close()
73	}
74	return err
75}
76
77func (rows *poolRows) Values() ([]interface{}, error) {
78	values, err := rows.r.Values()
79	if err != nil {
80		rows.Close()
81	}
82	return values, err
83}
84
85func (rows *poolRows) RawValues() [][]byte {
86	return rows.r.RawValues()
87}
88
89type poolRow struct {
90	r   pgx.Row
91	c   *Conn
92	err error
93}
94
95func (row *poolRow) Scan(dest ...interface{}) error {
96	if row.err != nil {
97		return row.err
98	}
99
100	err := row.r.Scan(dest...)
101	if row.c != nil {
102		row.c.Release()
103	}
104	return err
105}
106