mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-11-22 19:56:39 +00:00
[chore]: Bump github.com/jackc/pgx/v5 from 5.5.1 to 5.5.2 (#2532)
Bumps [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) from 5.5.1 to 5.5.2. - [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v5.5.1...v5.5.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
parent
b70ec68499
commit
637a57f2de
2
go.mod
2
go.mod
|
@ -34,7 +34,7 @@ require (
|
||||||
github.com/gorilla/feeds v1.1.2
|
github.com/gorilla/feeds v1.1.2
|
||||||
github.com/gorilla/websocket v1.5.1
|
github.com/gorilla/websocket v1.5.1
|
||||||
github.com/h2non/filetype v1.1.3
|
github.com/h2non/filetype v1.1.3
|
||||||
github.com/jackc/pgx/v5 v5.5.1
|
github.com/jackc/pgx/v5 v5.5.2
|
||||||
github.com/microcosm-cc/bluemonday v1.0.26
|
github.com/microcosm-cc/bluemonday v1.0.26
|
||||||
github.com/miekg/dns v1.1.57
|
github.com/miekg/dns v1.1.57
|
||||||
github.com/minio/minio-go/v7 v7.0.66
|
github.com/minio/minio-go/v7 v7.0.66
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -346,8 +346,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI
|
||||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||||
github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI=
|
github.com/jackc/pgx/v5 v5.5.2 h1:iLlpgp4Cp/gC9Xuscl7lFL1PhhW+ZLtXZcrfCt4C3tA=
|
||||||
github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
|
github.com/jackc/pgx/v5 v5.5.2/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
|
||||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
||||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
|
11
vendor/github.com/jackc/pgx/v5/CHANGELOG.md
generated
vendored
11
vendor/github.com/jackc/pgx/v5/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,14 @@
|
||||||
|
# 5.5.2 (January 13, 2024)
|
||||||
|
|
||||||
|
* Allow NamedArgs to start with underscore
|
||||||
|
* pgproto3: Maximum message body length support (jeremy.spriet)
|
||||||
|
* Upgrade golang.org/x/crypto to v0.17.0
|
||||||
|
* Add snake_case support to RowToStructByName (Tikhon Fedulov)
|
||||||
|
* Fix: update description cache after exec prepare (James Hartig)
|
||||||
|
* Fix: pipeline checks if it is closed (James Hartig and Ryan Fowler)
|
||||||
|
* Fix: normalize timeout / context errors during TLS startup (Samuel Stauffer)
|
||||||
|
* Add OnPgError for easier centralized error handling (James Hartig)
|
||||||
|
|
||||||
# 5.5.1 (December 9, 2023)
|
# 5.5.1 (December 9, 2023)
|
||||||
|
|
||||||
* Add CopyFromFunc helper function. (robford)
|
* Add CopyFromFunc helper function. (robford)
|
||||||
|
|
1
vendor/github.com/jackc/pgx/v5/conn.go
generated
vendored
1
vendor/github.com/jackc/pgx/v5/conn.go
generated
vendored
|
@ -513,6 +513,7 @@ func (c *Conn) exec(ctx context.Context, sql string, arguments ...any) (commandT
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return pgconn.CommandTag{}, err
|
return pgconn.CommandTag{}, err
|
||||||
}
|
}
|
||||||
|
c.descriptionCache.Put(sd)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.execParams(ctx, sd, arguments)
|
return c.execParams(ctx, sd, arguments)
|
||||||
|
|
2
vendor/github.com/jackc/pgx/v5/doc.go
generated
vendored
2
vendor/github.com/jackc/pgx/v5/doc.go
generated
vendored
|
@ -187,7 +187,7 @@
|
||||||
|
|
||||||
PgBouncer
|
PgBouncer
|
||||||
|
|
||||||
By default pgx automatically uses prepared statements. Prepared statements are incompaptible with PgBouncer. This can be
|
By default pgx automatically uses prepared statements. Prepared statements are incompatible with PgBouncer. This can be
|
||||||
disabled by setting a different QueryExecMode in ConnConfig.DefaultQueryExecMode.
|
disabled by setting a different QueryExecMode in ConnConfig.DefaultQueryExecMode.
|
||||||
*/
|
*/
|
||||||
package pgx
|
package pgx
|
||||||
|
|
8
vendor/github.com/jackc/pgx/v5/large_objects.go
generated
vendored
8
vendor/github.com/jackc/pgx/v5/large_objects.go
generated
vendored
|
@ -67,6 +67,10 @@ type LargeObject struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write writes p to the large object and returns the number of bytes written and an error if not all of p was written.
|
// Write writes p to the large object and returns the number of bytes written and an error if not all of p was written.
|
||||||
|
//
|
||||||
|
// Write is implemented with a single call to lowrite. The PostgreSQL wire protocol has a limit of 1 GB - 1 per message.
|
||||||
|
// See definition of PQ_LARGE_MESSAGE_LIMIT in the PostgreSQL source code. To allow for the other data in the message,
|
||||||
|
// len(p) should be no larger than 1 GB - 1 KB.
|
||||||
func (o *LargeObject) Write(p []byte) (int, error) {
|
func (o *LargeObject) Write(p []byte) (int, error) {
|
||||||
var n int
|
var n int
|
||||||
err := o.tx.QueryRow(o.ctx, "select lowrite($1, $2)", o.fd, p).Scan(&n)
|
err := o.tx.QueryRow(o.ctx, "select lowrite($1, $2)", o.fd, p).Scan(&n)
|
||||||
|
@ -82,6 +86,10 @@ func (o *LargeObject) Write(p []byte) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read reads up to len(p) bytes into p returning the number of bytes read.
|
// Read reads up to len(p) bytes into p returning the number of bytes read.
|
||||||
|
//
|
||||||
|
// Read is implemented with a single call to loread. PostgreSQL internally allocates a single buffer for the response.
|
||||||
|
// The largest buffer PostgreSQL will allocate is 1 GB - 1. See definition of MaxAllocSize in the PostgreSQL source
|
||||||
|
// code. To allow for the other data in the message, len(p) should be no larger than 1 GB - 1 KB.
|
||||||
func (o *LargeObject) Read(p []byte) (int, error) {
|
func (o *LargeObject) Read(p []byte) (int, error) {
|
||||||
var res []byte
|
var res []byte
|
||||||
err := o.tx.QueryRow(o.ctx, "select loread($1, $2)", o.fd, len(p)).Scan(&res)
|
err := o.tx.QueryRow(o.ctx, "select loread($1, $2)", o.fd, len(p)).Scan(&res)
|
||||||
|
|
5
vendor/github.com/jackc/pgx/v5/named_args.go
generated
vendored
5
vendor/github.com/jackc/pgx/v5/named_args.go
generated
vendored
|
@ -14,6 +14,9 @@
|
||||||
//
|
//
|
||||||
// conn.Query(ctx, "select * from widgets where foo = @foo and bar = @bar", pgx.NamedArgs{"foo": 1, "bar": 2})
|
// conn.Query(ctx, "select * from widgets where foo = @foo and bar = @bar", pgx.NamedArgs{"foo": 1, "bar": 2})
|
||||||
// conn.Query(ctx, "select * from widgets where foo = $1 and bar = $2", 1, 2)
|
// conn.Query(ctx, "select * from widgets where foo = $1 and bar = $2", 1, 2)
|
||||||
|
//
|
||||||
|
// Named placeholders are case sensitive and must start with a letter or underscore. Subsequent characters can be
|
||||||
|
// letters, numbers, or underscores.
|
||||||
type NamedArgs map[string]any
|
type NamedArgs map[string]any
|
||||||
|
|
||||||
// RewriteQuery implements the QueryRewriter interface.
|
// RewriteQuery implements the QueryRewriter interface.
|
||||||
|
@ -80,7 +83,7 @@ func rawState(l *sqlLexer) stateFn {
|
||||||
return doubleQuoteState
|
return doubleQuoteState
|
||||||
case '@':
|
case '@':
|
||||||
nextRune, _ := utf8.DecodeRuneInString(l.src[l.pos:])
|
nextRune, _ := utf8.DecodeRuneInString(l.src[l.pos:])
|
||||||
if isLetter(nextRune) {
|
if isLetter(nextRune) || nextRune == '_' {
|
||||||
if l.pos-l.start > 0 {
|
if l.pos-l.start > 0 {
|
||||||
l.parts = append(l.parts, l.src[l.start:l.pos-width])
|
l.parts = append(l.parts, l.src[l.start:l.pos-width])
|
||||||
}
|
}
|
||||||
|
|
26
vendor/github.com/jackc/pgx/v5/pgconn/config.go
generated
vendored
26
vendor/github.com/jackc/pgx/v5/pgconn/config.go
generated
vendored
|
@ -60,6 +60,11 @@ type Config struct {
|
||||||
// OnNotification is a callback function called when a notification from the LISTEN/NOTIFY system is received.
|
// OnNotification is a callback function called when a notification from the LISTEN/NOTIFY system is received.
|
||||||
OnNotification NotificationHandler
|
OnNotification NotificationHandler
|
||||||
|
|
||||||
|
// OnPgError is a callback function called when a Postgres error is received by the server. The default handler will close
|
||||||
|
// the connection on any FATAL errors. If you override this handler you should call the previously set handler or ensure
|
||||||
|
// that you close on FATAL errors by returning false.
|
||||||
|
OnPgError PgErrorHandler
|
||||||
|
|
||||||
createdByParseConfig bool // Used to enforce created by ParseConfig rule.
|
createdByParseConfig bool // Used to enforce created by ParseConfig rule.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,12 +237,12 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
if strings.HasPrefix(connString, "postgres://") || strings.HasPrefix(connString, "postgresql://") {
|
if strings.HasPrefix(connString, "postgres://") || strings.HasPrefix(connString, "postgresql://") {
|
||||||
connStringSettings, err = parseURLSettings(connString)
|
connStringSettings, err = parseURLSettings(connString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "failed to parse as URL", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "failed to parse as URL", err: err}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
connStringSettings, err = parseDSNSettings(connString)
|
connStringSettings, err = parseDSNSettings(connString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "failed to parse as DSN", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "failed to parse as DSN", err: err}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -246,7 +251,7 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
if service, present := settings["service"]; present {
|
if service, present := settings["service"]; present {
|
||||||
serviceSettings, err := parseServiceSettings(settings["servicefile"], service)
|
serviceSettings, err := parseServiceSettings(settings["servicefile"], service)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "failed to read service", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "failed to read service", err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = mergeSettings(defaultSettings, envSettings, serviceSettings, connStringSettings)
|
settings = mergeSettings(defaultSettings, envSettings, serviceSettings, connStringSettings)
|
||||||
|
@ -261,12 +266,19 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
BuildFrontend: func(r io.Reader, w io.Writer) *pgproto3.Frontend {
|
BuildFrontend: func(r io.Reader, w io.Writer) *pgproto3.Frontend {
|
||||||
return pgproto3.NewFrontend(r, w)
|
return pgproto3.NewFrontend(r, w)
|
||||||
},
|
},
|
||||||
|
OnPgError: func(_ *PgConn, pgErr *PgError) bool {
|
||||||
|
// we want to automatically close any fatal errors
|
||||||
|
if strings.EqualFold(pgErr.Severity, "FATAL") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if connectTimeoutSetting, present := settings["connect_timeout"]; present {
|
if connectTimeoutSetting, present := settings["connect_timeout"]; present {
|
||||||
connectTimeout, err := parseConnectTimeoutSetting(connectTimeoutSetting)
|
connectTimeout, err := parseConnectTimeoutSetting(connectTimeoutSetting)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "invalid connect_timeout", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "invalid connect_timeout", err: err}
|
||||||
}
|
}
|
||||||
config.ConnectTimeout = connectTimeout
|
config.ConnectTimeout = connectTimeout
|
||||||
config.DialFunc = makeConnectTimeoutDialFunc(connectTimeout)
|
config.DialFunc = makeConnectTimeoutDialFunc(connectTimeout)
|
||||||
|
@ -328,7 +340,7 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
|
|
||||||
port, err := parsePort(portStr)
|
port, err := parsePort(portStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "invalid port", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "invalid port", err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
var tlsConfigs []*tls.Config
|
var tlsConfigs []*tls.Config
|
||||||
|
@ -340,7 +352,7 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
var err error
|
var err error
|
||||||
tlsConfigs, err = configTLS(settings, host, options)
|
tlsConfigs, err = configTLS(settings, host, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &parseConfigError{connString: connString, msg: "failed to configure TLS", err: err}
|
return nil, &ParseConfigError{ConnString: connString, msg: "failed to configure TLS", err: err}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,7 +396,7 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con
|
||||||
case "any":
|
case "any":
|
||||||
// do nothing
|
// do nothing
|
||||||
default:
|
default:
|
||||||
return nil, &parseConfigError{connString: connString, msg: fmt.Sprintf("unknown target_session_attrs value: %v", tsa)}
|
return nil, &ParseConfigError{ConnString: connString, msg: fmt.Sprintf("unknown target_session_attrs value: %v", tsa)}
|
||||||
}
|
}
|
||||||
|
|
||||||
return config, nil
|
return config, nil
|
||||||
|
|
30
vendor/github.com/jackc/pgx/v5/pgconn/errors.go
generated
vendored
30
vendor/github.com/jackc/pgx/v5/pgconn/errors.go
generated
vendored
|
@ -57,22 +57,23 @@ func (pe *PgError) SQLState() string {
|
||||||
return pe.Code
|
return pe.Code
|
||||||
}
|
}
|
||||||
|
|
||||||
type connectError struct {
|
// ConnectError is the error returned when a connection attempt fails.
|
||||||
config *Config
|
type ConnectError struct {
|
||||||
|
Config *Config // The configuration that was used in the connection attempt.
|
||||||
msg string
|
msg string
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *connectError) Error() string {
|
func (e *ConnectError) Error() string {
|
||||||
sb := &strings.Builder{}
|
sb := &strings.Builder{}
|
||||||
fmt.Fprintf(sb, "failed to connect to `host=%s user=%s database=%s`: %s", e.config.Host, e.config.User, e.config.Database, e.msg)
|
fmt.Fprintf(sb, "failed to connect to `host=%s user=%s database=%s`: %s", e.Config.Host, e.Config.User, e.Config.Database, e.msg)
|
||||||
if e.err != nil {
|
if e.err != nil {
|
||||||
fmt.Fprintf(sb, " (%s)", e.err.Error())
|
fmt.Fprintf(sb, " (%s)", e.err.Error())
|
||||||
}
|
}
|
||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *connectError) Unwrap() error {
|
func (e *ConnectError) Unwrap() error {
|
||||||
return e.err
|
return e.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,33 +89,38 @@ func (e *connLockError) Error() string {
|
||||||
return e.status
|
return e.status
|
||||||
}
|
}
|
||||||
|
|
||||||
type parseConfigError struct {
|
// ParseConfigError is the error returned when a connection string cannot be parsed.
|
||||||
connString string
|
type ParseConfigError struct {
|
||||||
|
ConnString string // The connection string that could not be parsed.
|
||||||
msg string
|
msg string
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *parseConfigError) Error() string {
|
func (e *ParseConfigError) Error() string {
|
||||||
connString := redactPW(e.connString)
|
// Now that ParseConfigError is public and ConnString is available to the developer, perhaps it would be better only
|
||||||
|
// return a static string. That would ensure that the error message cannot leak a password. The ConnString field would
|
||||||
|
// allow access to the original string if desired and Unwrap would allow access to the underlying error.
|
||||||
|
connString := redactPW(e.ConnString)
|
||||||
if e.err == nil {
|
if e.err == nil {
|
||||||
return fmt.Sprintf("cannot parse `%s`: %s", connString, e.msg)
|
return fmt.Sprintf("cannot parse `%s`: %s", connString, e.msg)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("cannot parse `%s`: %s (%s)", connString, e.msg, e.err.Error())
|
return fmt.Sprintf("cannot parse `%s`: %s (%s)", connString, e.msg, e.err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *parseConfigError) Unwrap() error {
|
func (e *ParseConfigError) Unwrap() error {
|
||||||
return e.err
|
return e.err
|
||||||
}
|
}
|
||||||
|
|
||||||
func normalizeTimeoutError(ctx context.Context, err error) error {
|
func normalizeTimeoutError(ctx context.Context, err error) error {
|
||||||
if err, ok := err.(net.Error); ok && err.Timeout() {
|
var netErr net.Error
|
||||||
|
if errors.As(err, &netErr) && netErr.Timeout() {
|
||||||
if ctx.Err() == context.Canceled {
|
if ctx.Err() == context.Canceled {
|
||||||
// Since the timeout was caused by a context cancellation, the actual error is context.Canceled not the timeout error.
|
// Since the timeout was caused by a context cancellation, the actual error is context.Canceled not the timeout error.
|
||||||
return context.Canceled
|
return context.Canceled
|
||||||
} else if ctx.Err() == context.DeadlineExceeded {
|
} else if ctx.Err() == context.DeadlineExceeded {
|
||||||
return &errTimeout{err: ctx.Err()}
|
return &errTimeout{err: ctx.Err()}
|
||||||
} else {
|
} else {
|
||||||
return &errTimeout{err: err}
|
return &errTimeout{err: netErr}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
67
vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go
generated
vendored
67
vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go
generated
vendored
|
@ -52,6 +52,12 @@ type Notification struct {
|
||||||
// BuildFrontendFunc is a function that can be used to create Frontend implementation for connection.
|
// BuildFrontendFunc is a function that can be used to create Frontend implementation for connection.
|
||||||
type BuildFrontendFunc func(r io.Reader, w io.Writer) *pgproto3.Frontend
|
type BuildFrontendFunc func(r io.Reader, w io.Writer) *pgproto3.Frontend
|
||||||
|
|
||||||
|
// PgErrorHandler is a function that handles errors returned from Postgres. This function must return true to keep
|
||||||
|
// the connection open. Returning false will cause the connection to be closed immediately. You should return
|
||||||
|
// false on any FATAL-severity errors. This will not receive network errors. The *PgConn is provided so the handler is
|
||||||
|
// aware of the origin of the error, but it must not invoke any query method.
|
||||||
|
type PgErrorHandler func(*PgConn, *PgError) bool
|
||||||
|
|
||||||
// NoticeHandler is a function that can handle notices received from the PostgreSQL server. Notices can be received at
|
// NoticeHandler is a function that can handle notices received from the PostgreSQL server. Notices can be received at
|
||||||
// any time, usually during handling of a query response. The *PgConn is provided so the handler is aware of the origin
|
// any time, usually during handling of a query response. The *PgConn is provided so the handler is aware of the origin
|
||||||
// of the notice, but it must not invoke any query method. Be aware that this is distinct from LISTEN/NOTIFY
|
// of the notice, but it must not invoke any query method. Be aware that this is distinct from LISTEN/NOTIFY
|
||||||
|
@ -146,11 +152,11 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er
|
||||||
ctx := octx
|
ctx := octx
|
||||||
fallbackConfigs, err = expandWithIPs(ctx, config.LookupFunc, fallbackConfigs)
|
fallbackConfigs, err = expandWithIPs(ctx, config.LookupFunc, fallbackConfigs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &connectError{config: config, msg: "hostname resolving error", err: err}
|
return nil, &ConnectError{Config: config, msg: "hostname resolving error", err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(fallbackConfigs) == 0 {
|
if len(fallbackConfigs) == 0 {
|
||||||
return nil, &connectError{config: config, msg: "hostname resolving error", err: errors.New("ip addr wasn't found")}
|
return nil, &ConnectError{Config: config, msg: "hostname resolving error", err: errors.New("ip addr wasn't found")}
|
||||||
}
|
}
|
||||||
|
|
||||||
foundBestServer := false
|
foundBestServer := false
|
||||||
|
@ -172,7 +178,7 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er
|
||||||
foundBestServer = true
|
foundBestServer = true
|
||||||
break
|
break
|
||||||
} else if pgerr, ok := err.(*PgError); ok {
|
} else if pgerr, ok := err.(*PgError); ok {
|
||||||
err = &connectError{config: config, msg: "server error", err: pgerr}
|
err = &ConnectError{Config: config, msg: "server error", err: pgerr}
|
||||||
const ERRCODE_INVALID_PASSWORD = "28P01" // wrong password
|
const ERRCODE_INVALID_PASSWORD = "28P01" // wrong password
|
||||||
const ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION = "28000" // wrong password or bad pg_hba.conf settings
|
const ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION = "28000" // wrong password or bad pg_hba.conf settings
|
||||||
const ERRCODE_INVALID_CATALOG_NAME = "3D000" // db does not exist
|
const ERRCODE_INVALID_CATALOG_NAME = "3D000" // db does not exist
|
||||||
|
@ -183,7 +189,7 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er
|
||||||
pgerr.Code == ERRCODE_INSUFFICIENT_PRIVILEGE {
|
pgerr.Code == ERRCODE_INSUFFICIENT_PRIVILEGE {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
} else if cerr, ok := err.(*connectError); ok {
|
} else if cerr, ok := err.(*ConnectError); ok {
|
||||||
if _, ok := cerr.err.(*NotPreferredError); ok {
|
if _, ok := cerr.err.(*NotPreferredError); ok {
|
||||||
fallbackConfig = fc
|
fallbackConfig = fc
|
||||||
}
|
}
|
||||||
|
@ -193,7 +199,7 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er
|
||||||
if !foundBestServer && fallbackConfig != nil {
|
if !foundBestServer && fallbackConfig != nil {
|
||||||
pgConn, err = connect(ctx, config, fallbackConfig, true)
|
pgConn, err = connect(ctx, config, fallbackConfig, true)
|
||||||
if pgerr, ok := err.(*PgError); ok {
|
if pgerr, ok := err.(*PgError); ok {
|
||||||
err = &connectError{config: config, msg: "server error", err: pgerr}
|
err = &ConnectError{Config: config, msg: "server error", err: pgerr}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +211,7 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er
|
||||||
err := config.AfterConnect(ctx, pgConn)
|
err := config.AfterConnect(ctx, pgConn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "AfterConnect error", err: err}
|
return nil, &ConnectError{Config: config, msg: "AfterConnect error", err: err}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +283,7 @@ func connect(ctx context.Context, config *Config, fallbackConfig *FallbackConfig
|
||||||
network, address := NetworkAddress(fallbackConfig.Host, fallbackConfig.Port)
|
network, address := NetworkAddress(fallbackConfig.Host, fallbackConfig.Port)
|
||||||
netConn, err := config.DialFunc(ctx, network, address)
|
netConn, err := config.DialFunc(ctx, network, address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &connectError{config: config, msg: "dial error", err: normalizeTimeoutError(ctx, err)}
|
return nil, &ConnectError{Config: config, msg: "dial error", err: normalizeTimeoutError(ctx, err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
pgConn.conn = netConn
|
pgConn.conn = netConn
|
||||||
|
@ -289,7 +295,7 @@ func connect(ctx context.Context, config *Config, fallbackConfig *FallbackConfig
|
||||||
pgConn.contextWatcher.Unwatch() // Always unwatch `netConn` after TLS.
|
pgConn.contextWatcher.Unwatch() // Always unwatch `netConn` after TLS.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
netConn.Close()
|
netConn.Close()
|
||||||
return nil, &connectError{config: config, msg: "tls error", err: err}
|
return nil, &ConnectError{Config: config, msg: "tls error", err: normalizeTimeoutError(ctx, err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
pgConn.conn = nbTLSConn
|
pgConn.conn = nbTLSConn
|
||||||
|
@ -330,7 +336,7 @@ func() {
|
||||||
pgConn.frontend.Send(&startupMsg)
|
pgConn.frontend.Send(&startupMsg)
|
||||||
if err := pgConn.flushWithPotentialWriteReadDeadlock(); err != nil {
|
if err := pgConn.flushWithPotentialWriteReadDeadlock(); err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "failed to write startup message", err: normalizeTimeoutError(ctx, err)}
|
return nil, &ConnectError{Config: config, msg: "failed to write startup message", err: normalizeTimeoutError(ctx, err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
@ -340,7 +346,7 @@ func() {
|
||||||
if err, ok := err.(*PgError); ok {
|
if err, ok := err.(*PgError); ok {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return nil, &connectError{config: config, msg: "failed to receive message", err: normalizeTimeoutError(ctx, err)}
|
return nil, &ConnectError{Config: config, msg: "failed to receive message", err: normalizeTimeoutError(ctx, err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch msg := msg.(type) {
|
switch msg := msg.(type) {
|
||||||
|
@ -353,26 +359,26 @@ func() {
|
||||||
err = pgConn.txPasswordMessage(pgConn.config.Password)
|
err = pgConn.txPasswordMessage(pgConn.config.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "failed to write password message", err: err}
|
return nil, &ConnectError{Config: config, msg: "failed to write password message", err: err}
|
||||||
}
|
}
|
||||||
case *pgproto3.AuthenticationMD5Password:
|
case *pgproto3.AuthenticationMD5Password:
|
||||||
digestedPassword := "md5" + hexMD5(hexMD5(pgConn.config.Password+pgConn.config.User)+string(msg.Salt[:]))
|
digestedPassword := "md5" + hexMD5(hexMD5(pgConn.config.Password+pgConn.config.User)+string(msg.Salt[:]))
|
||||||
err = pgConn.txPasswordMessage(digestedPassword)
|
err = pgConn.txPasswordMessage(digestedPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "failed to write password message", err: err}
|
return nil, &ConnectError{Config: config, msg: "failed to write password message", err: err}
|
||||||
}
|
}
|
||||||
case *pgproto3.AuthenticationSASL:
|
case *pgproto3.AuthenticationSASL:
|
||||||
err = pgConn.scramAuth(msg.AuthMechanisms)
|
err = pgConn.scramAuth(msg.AuthMechanisms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "failed SASL auth", err: err}
|
return nil, &ConnectError{Config: config, msg: "failed SASL auth", err: err}
|
||||||
}
|
}
|
||||||
case *pgproto3.AuthenticationGSS:
|
case *pgproto3.AuthenticationGSS:
|
||||||
err = pgConn.gssAuth()
|
err = pgConn.gssAuth()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "failed GSS auth", err: err}
|
return nil, &ConnectError{Config: config, msg: "failed GSS auth", err: err}
|
||||||
}
|
}
|
||||||
case *pgproto3.ReadyForQuery:
|
case *pgproto3.ReadyForQuery:
|
||||||
pgConn.status = connStatusIdle
|
pgConn.status = connStatusIdle
|
||||||
|
@ -390,7 +396,7 @@ func() {
|
||||||
return pgConn, nil
|
return pgConn, nil
|
||||||
}
|
}
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "ValidateConnect failed", err: err}
|
return nil, &ConnectError{Config: config, msg: "ValidateConnect failed", err: err}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pgConn, nil
|
return pgConn, nil
|
||||||
|
@ -401,7 +407,7 @@ func() {
|
||||||
return nil, ErrorResponseToPgError(msg)
|
return nil, ErrorResponseToPgError(msg)
|
||||||
default:
|
default:
|
||||||
pgConn.conn.Close()
|
pgConn.conn.Close()
|
||||||
return nil, &connectError{config: config, msg: "received unexpected message", err: err}
|
return nil, &ConnectError{Config: config, msg: "received unexpected message", err: err}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -547,11 +553,12 @@ func (pgConn *PgConn) receiveMessage() (pgproto3.BackendMessage, error) {
|
||||||
case *pgproto3.ParameterStatus:
|
case *pgproto3.ParameterStatus:
|
||||||
pgConn.parameterStatuses[msg.Name] = msg.Value
|
pgConn.parameterStatuses[msg.Name] = msg.Value
|
||||||
case *pgproto3.ErrorResponse:
|
case *pgproto3.ErrorResponse:
|
||||||
if msg.Severity == "FATAL" {
|
err := ErrorResponseToPgError(msg)
|
||||||
|
if pgConn.config.OnPgError != nil && !pgConn.config.OnPgError(pgConn, err) {
|
||||||
pgConn.status = connStatusClosed
|
pgConn.status = connStatusClosed
|
||||||
pgConn.conn.Close() // Ignore error as the connection is already broken and there is already an error to return.
|
pgConn.conn.Close() // Ignore error as the connection is already broken and there is already an error to return.
|
||||||
close(pgConn.cleanupDone)
|
close(pgConn.cleanupDone)
|
||||||
return nil, ErrorResponseToPgError(msg)
|
return nil, err
|
||||||
}
|
}
|
||||||
case *pgproto3.NoticeResponse:
|
case *pgproto3.NoticeResponse:
|
||||||
if pgConn.config.OnNotice != nil {
|
if pgConn.config.OnNotice != nil {
|
||||||
|
@ -2046,6 +2053,13 @@ func (p *Pipeline) Flush() error {
|
||||||
|
|
||||||
// Sync establishes a synchronization point and flushes the queued requests.
|
// Sync establishes a synchronization point and flushes the queued requests.
|
||||||
func (p *Pipeline) Sync() error {
|
func (p *Pipeline) Sync() error {
|
||||||
|
if p.closed {
|
||||||
|
if p.err != nil {
|
||||||
|
return p.err
|
||||||
|
}
|
||||||
|
return errors.New("pipeline closed")
|
||||||
|
}
|
||||||
|
|
||||||
p.conn.frontend.SendSync(&pgproto3.Sync{})
|
p.conn.frontend.SendSync(&pgproto3.Sync{})
|
||||||
err := p.Flush()
|
err := p.Flush()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2062,10 +2076,21 @@ func (p *Pipeline) Sync() error {
|
||||||
// *PipelineSync. If an ErrorResponse is received from the server, results will be nil and err will be a *PgError. If no
|
// *PipelineSync. If an ErrorResponse is received from the server, results will be nil and err will be a *PgError. If no
|
||||||
// results are available, results and err will both be nil.
|
// results are available, results and err will both be nil.
|
||||||
func (p *Pipeline) GetResults() (results any, err error) {
|
func (p *Pipeline) GetResults() (results any, err error) {
|
||||||
|
if p.closed {
|
||||||
|
if p.err != nil {
|
||||||
|
return nil, p.err
|
||||||
|
}
|
||||||
|
return nil, errors.New("pipeline closed")
|
||||||
|
}
|
||||||
|
|
||||||
if p.expectedReadyForQueryCount == 0 {
|
if p.expectedReadyForQueryCount == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return p.getResults()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pipeline) getResults() (results any, err error) {
|
||||||
for {
|
for {
|
||||||
msg, err := p.conn.receiveMessage()
|
msg, err := p.conn.receiveMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2092,7 +2117,8 @@ func (p *Pipeline) GetResults() (results any, err error) {
|
||||||
case *pgproto3.ParseComplete:
|
case *pgproto3.ParseComplete:
|
||||||
peekedMsg, err := p.conn.peekMessage()
|
peekedMsg, err := p.conn.peekMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
p.conn.asyncClose()
|
||||||
|
return nil, normalizeTimeoutError(p.ctx, err)
|
||||||
}
|
}
|
||||||
if _, ok := peekedMsg.(*pgproto3.ParameterDescription); ok {
|
if _, ok := peekedMsg.(*pgproto3.ParameterDescription); ok {
|
||||||
return p.getResultsPrepare()
|
return p.getResultsPrepare()
|
||||||
|
@ -2152,6 +2178,7 @@ func (p *Pipeline) Close() error {
|
||||||
if p.closed {
|
if p.closed {
|
||||||
return p.err
|
return p.err
|
||||||
}
|
}
|
||||||
|
|
||||||
p.closed = true
|
p.closed = true
|
||||||
|
|
||||||
if p.pendingSync {
|
if p.pendingSync {
|
||||||
|
@ -2164,7 +2191,7 @@ func (p *Pipeline) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for p.expectedReadyForQueryCount > 0 {
|
for p.expectedReadyForQueryCount > 0 {
|
||||||
_, err := p.GetResults()
|
_, err := p.getResults()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.err = err
|
p.err = err
|
||||||
var pgErr *PgError
|
var pgErr *PgError
|
||||||
|
|
13
vendor/github.com/jackc/pgx/v5/pgproto3/backend.go
generated
vendored
13
vendor/github.com/jackc/pgx/v5/pgproto3/backend.go
generated
vendored
|
@ -38,6 +38,7 @@ functionCall FunctionCall
|
||||||
terminate Terminate
|
terminate Terminate
|
||||||
|
|
||||||
bodyLen int
|
bodyLen int
|
||||||
|
maxBodyLen int // maxBodyLen is the maximum length of a message body in octets. If a message body exceeds this length, Receive will return an error.
|
||||||
msgType byte
|
msgType byte
|
||||||
partialMsg bool
|
partialMsg bool
|
||||||
authType uint32
|
authType uint32
|
||||||
|
@ -158,6 +159,9 @@ func (b *Backend) Receive() (FrontendMessage, error) {
|
||||||
|
|
||||||
b.msgType = header[0]
|
b.msgType = header[0]
|
||||||
b.bodyLen = int(binary.BigEndian.Uint32(header[1:])) - 4
|
b.bodyLen = int(binary.BigEndian.Uint32(header[1:])) - 4
|
||||||
|
if b.maxBodyLen > 0 && b.bodyLen > b.maxBodyLen {
|
||||||
|
return nil, &ExceededMaxBodyLenErr{b.maxBodyLen, b.bodyLen}
|
||||||
|
}
|
||||||
b.partialMsg = true
|
b.partialMsg = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,3 +264,12 @@ func (b *Backend) SetAuthType(authType uint32) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetMaxBodyLen sets the maximum length of a message body in octets. If a message body exceeds this length, Receive will return
|
||||||
|
// an error. This is useful for protecting against malicious clients that send large messages with the intent of
|
||||||
|
// causing memory exhaustion.
|
||||||
|
// The default value is 0.
|
||||||
|
// If maxBodyLen is 0, then no maximum is enforced.
|
||||||
|
func (b *Backend) SetMaxBodyLen(maxBodyLen int) {
|
||||||
|
b.maxBodyLen = maxBodyLen
|
||||||
|
}
|
||||||
|
|
9
vendor/github.com/jackc/pgx/v5/pgproto3/pgproto3.go
generated
vendored
9
vendor/github.com/jackc/pgx/v5/pgproto3/pgproto3.go
generated
vendored
|
@ -70,6 +70,15 @@ func (e *writeError) Unwrap() error {
|
||||||
return e.err
|
return e.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExceededMaxBodyLenErr struct {
|
||||||
|
MaxExpectedBodyLen int
|
||||||
|
ActualBodyLen int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ExceededMaxBodyLenErr) Error() string {
|
||||||
|
return fmt.Sprintf("invalid body length: expected at most %d, but got %d", e.MaxExpectedBodyLen, e.ActualBodyLen)
|
||||||
|
}
|
||||||
|
|
||||||
// getValueFromJSON gets the value from a protocol message representation in JSON.
|
// getValueFromJSON gets the value from a protocol message representation in JSON.
|
||||||
func getValueFromJSON(v map[string]string) ([]byte, error) {
|
func getValueFromJSON(v map[string]string) ([]byte, error) {
|
||||||
if v == nil {
|
if v == nil {
|
||||||
|
|
7
vendor/github.com/jackc/pgx/v5/rows.go
generated
vendored
7
vendor/github.com/jackc/pgx/v5/rows.go
generated
vendored
|
@ -667,7 +667,12 @@ func (rs *namedStructRowScanner) ScanRow(rows Rows) error {
|
||||||
func fieldPosByName(fldDescs []pgconn.FieldDescription, field string) (i int) {
|
func fieldPosByName(fldDescs []pgconn.FieldDescription, field string) (i int) {
|
||||||
i = -1
|
i = -1
|
||||||
for i, desc := range fldDescs {
|
for i, desc := range fldDescs {
|
||||||
if strings.EqualFold(desc.Name, field) {
|
|
||||||
|
// Snake case support.
|
||||||
|
field = strings.ReplaceAll(field, "_", "")
|
||||||
|
descName := strings.ReplaceAll(desc.Name, "_", "")
|
||||||
|
|
||||||
|
if strings.EqualFold(descName, field) {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
vendor/github.com/jackc/pgx/v5/stdlib/sql.go
generated
vendored
5
vendor/github.com/jackc/pgx/v5/stdlib/sql.go
generated
vendored
|
@ -21,10 +21,7 @@
|
||||||
// return err
|
// return err
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// db, err := stdlib.OpenDBFromPool(pool)
|
// db := stdlib.OpenDBFromPool(pool)
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// Or a pgx.ConnConfig can be used to set configuration not accessible via connection string. In this case the
|
// Or a pgx.ConnConfig can be used to set configuration not accessible via connection string. In this case the
|
||||||
// pgx.ConnConfig must first be registered with the driver. This registration returns a connection string which is used
|
// pgx.ConnConfig must first be registered with the driver. This registration returns a connection string which is used
|
||||||
|
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
|
@ -322,7 +322,7 @@ github.com/jackc/pgpassfile
|
||||||
# github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
|
# github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/jackc/pgservicefile
|
github.com/jackc/pgservicefile
|
||||||
# github.com/jackc/pgx/v5 v5.5.1
|
# github.com/jackc/pgx/v5 v5.5.2
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
github.com/jackc/pgx/v5
|
github.com/jackc/pgx/v5
|
||||||
github.com/jackc/pgx/v5/internal/anynil
|
github.com/jackc/pgx/v5/internal/anynil
|
||||||
|
|
Loading…
Reference in a new issue