github.com/jackc/pgx/v5@v5.5.5/pgxpool/rows.go (about) 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 }