summaryrefslogtreecommitdiff
path: root/vendor/github.com/jackc
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jackc')
-rw-r--r--vendor/github.com/jackc/chunkreader/v2/.travis.yml9
-rw-r--r--vendor/github.com/jackc/chunkreader/v2/LICENSE22
-rw-r--r--vendor/github.com/jackc/chunkreader/v2/README.md8
-rw-r--r--vendor/github.com/jackc/chunkreader/v2/chunkreader.go104
-rw-r--r--vendor/github.com/jackc/pgconn/.gitignore3
-rw-r--r--vendor/github.com/jackc/pgconn/CHANGELOG.md167
-rw-r--r--vendor/github.com/jackc/pgconn/LICENSE22
-rw-r--r--vendor/github.com/jackc/pgconn/README.md62
-rw-r--r--vendor/github.com/jackc/pgconn/auth_scram.go270
-rw-r--r--vendor/github.com/jackc/pgconn/config.go905
-rw-r--r--vendor/github.com/jackc/pgconn/defaults.go65
-rw-r--r--vendor/github.com/jackc/pgconn/defaults_windows.go59
-rw-r--r--vendor/github.com/jackc/pgconn/doc.go29
-rw-r--r--vendor/github.com/jackc/pgconn/errors.go238
-rw-r--r--vendor/github.com/jackc/pgconn/internal/ctxwatch/context_watcher.go73
-rw-r--r--vendor/github.com/jackc/pgconn/krb5.go99
-rw-r--r--vendor/github.com/jackc/pgconn/pgconn.go1774
-rw-r--r--vendor/github.com/jackc/pgio/.travis.yml9
-rw-r--r--vendor/github.com/jackc/pgio/LICENSE22
-rw-r--r--vendor/github.com/jackc/pgio/README.md11
-rw-r--r--vendor/github.com/jackc/pgio/doc.go6
-rw-r--r--vendor/github.com/jackc/pgio/write.go40
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/.travis.yml9
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/LICENSE22
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/README.md18
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_cleartext_password.go52
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_gss.go58
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_gss_continue.go67
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_md5_password.go77
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_ok.go52
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_sasl.go75
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_sasl_continue.go81
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/authentication_sasl_final.go81
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/backend.go213
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/backend_key_data.go51
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/big_endian.go37
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/bind.go216
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/bind_complete.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/cancel_request.go58
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/chunkreader.go19
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/close.go89
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/close_complete.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/command_complete.go71
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_both_response.go95
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_data.go62
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_done.go38
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_fail.go53
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_in_response.go96
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/copy_out_response.go96
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/data_row.go142
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/describe.go88
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/doc.go4
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/empty_query_response.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/error_response.go334
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/execute.go65
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/flush.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/frontend.go206
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/function_call.go94
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/function_call_response.go101
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/gss_enc_request.go49
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/gss_response.go48
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/no_data.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/notice_response.go17
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/notification_response.go73
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/parameter_description.go66
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/parameter_status.go66
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/parse.go88
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/parse_complete.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/password_message.go54
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/pgproto3.go65
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/portal_suspended.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/query.go50
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/ready_for_query.go61
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/row_description.go165
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/sasl_initial_response.go87
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/sasl_response.go54
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/ssl_request.go49
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/startup_message.go96
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/sync.go34
-rw-r--r--vendor/github.com/jackc/pgproto3/v2/terminate.go34
80 files changed, 0 insertions, 8211 deletions
diff --git a/vendor/github.com/jackc/chunkreader/v2/.travis.yml b/vendor/github.com/jackc/chunkreader/v2/.travis.yml
deleted file mode 100644
index e176228e8..000000000
--- a/vendor/github.com/jackc/chunkreader/v2/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-
-go:
- - 1.x
- - tip
-
-matrix:
- allow_failures:
- - go: tip
diff --git a/vendor/github.com/jackc/chunkreader/v2/LICENSE b/vendor/github.com/jackc/chunkreader/v2/LICENSE
deleted file mode 100644
index c1c4f50fc..000000000
--- a/vendor/github.com/jackc/chunkreader/v2/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2019 Jack Christensen
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/jackc/chunkreader/v2/README.md b/vendor/github.com/jackc/chunkreader/v2/README.md
deleted file mode 100644
index 01209bfa2..000000000
--- a/vendor/github.com/jackc/chunkreader/v2/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-[![](https://godoc.org/github.com/jackc/chunkreader?status.svg)](https://godoc.org/github.com/jackc/chunkreader)
-[![Build Status](https://travis-ci.org/jackc/chunkreader.svg)](https://travis-ci.org/jackc/chunkreader)
-
-# chunkreader
-
-Package chunkreader provides an io.Reader wrapper that minimizes IO reads and memory allocations.
-
-Extracted from original implementation in https://github.com/jackc/pgx.
diff --git a/vendor/github.com/jackc/chunkreader/v2/chunkreader.go b/vendor/github.com/jackc/chunkreader/v2/chunkreader.go
deleted file mode 100644
index afea1c520..000000000
--- a/vendor/github.com/jackc/chunkreader/v2/chunkreader.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Package chunkreader provides an io.Reader wrapper that minimizes IO reads and memory allocations.
-package chunkreader
-
-import (
- "io"
-)
-
-// ChunkReader is a io.Reader wrapper that minimizes IO reads and memory allocations. It allocates memory in chunks and
-// will read as much as will fit in the current buffer in a single call regardless of how large a read is actually
-// requested. The memory returned via Next is owned by the caller. This avoids the need for an additional copy.
-//
-// The downside of this approach is that a large buffer can be pinned in memory even if only a small slice is
-// referenced. For example, an entire 4096 byte block could be pinned in memory by even a 1 byte slice. In these rare
-// cases it would be advantageous to copy the bytes to another slice.
-type ChunkReader struct {
- r io.Reader
-
- buf []byte
- rp, wp int // buf read position and write position
-
- config Config
-}
-
-// Config contains configuration parameters for ChunkReader.
-type Config struct {
- MinBufLen int // Minimum buffer length
-}
-
-// New creates and returns a new ChunkReader for r with default configuration.
-func New(r io.Reader) *ChunkReader {
- cr, err := NewConfig(r, Config{})
- if err != nil {
- panic("default config can't be bad")
- }
-
- return cr
-}
-
-// NewConfig creates and a new ChunkReader for r configured by config.
-func NewConfig(r io.Reader, config Config) (*ChunkReader, error) {
- if config.MinBufLen == 0 {
- // By historical reasons Postgres currently has 8KB send buffer inside,
- // so here we want to have at least the same size buffer.
- // @see https://github.com/postgres/postgres/blob/249d64999615802752940e017ee5166e726bc7cd/src/backend/libpq/pqcomm.c#L134
- // @see https://www.postgresql.org/message-id/0cdc5485-cb3c-5e16-4a46-e3b2f7a41322%40ya.ru
- config.MinBufLen = 8192
- }
-
- return &ChunkReader{
- r: r,
- buf: make([]byte, config.MinBufLen),
- config: config,
- }, nil
-}
-
-// Next returns buf filled with the next n bytes. The caller gains ownership of buf. It is not necessary to make a copy
-// of buf. If an error occurs, buf will be nil.
-func (r *ChunkReader) Next(n int) (buf []byte, err error) {
- // n bytes already in buf
- if (r.wp - r.rp) >= n {
- buf = r.buf[r.rp : r.rp+n]
- r.rp += n
- return buf, err
- }
-
- // available space in buf is less than n
- if len(r.buf) < n {
- r.copyBufContents(r.newBuf(n))
- }
-
- // buf is large enough, but need to shift filled area to start to make enough contiguous space
- minReadCount := n - (r.wp - r.rp)
- if (len(r.buf) - r.wp) < minReadCount {
- newBuf := r.newBuf(n)
- r.copyBufContents(newBuf)
- }
-
- if err := r.appendAtLeast(minReadCount); err != nil {
- return nil, err
- }
-
- buf = r.buf[r.rp : r.rp+n]
- r.rp += n
- return buf, nil
-}
-
-func (r *ChunkReader) appendAtLeast(fillLen int) error {
- n, err := io.ReadAtLeast(r.r, r.buf[r.wp:], fillLen)
- r.wp += n
- return err
-}
-
-func (r *ChunkReader) newBuf(size int) []byte {
- if size < r.config.MinBufLen {
- size = r.config.MinBufLen
- }
- return make([]byte, size)
-}
-
-func (r *ChunkReader) copyBufContents(dest []byte) {
- r.wp = copy(dest, r.buf[r.rp:r.wp])
- r.rp = 0
- r.buf = dest
-}
diff --git a/vendor/github.com/jackc/pgconn/.gitignore b/vendor/github.com/jackc/pgconn/.gitignore
deleted file mode 100644
index e980f5555..000000000
--- a/vendor/github.com/jackc/pgconn/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.envrc
-vendor/
-.vscode
diff --git a/vendor/github.com/jackc/pgconn/CHANGELOG.md b/vendor/github.com/jackc/pgconn/CHANGELOG.md
deleted file mode 100644
index 36dcdae9a..000000000
--- a/vendor/github.com/jackc/pgconn/CHANGELOG.md
+++ /dev/null
@@ -1,167 +0,0 @@
-# 1.14.1 (July 19, 2023)
-
-* Fix: Enable failover efforts when pg_hba.conf disallows non-ssl connections (Brandon Kauffman)
-* Fix: connect_timeout is not obeyed for sslmode=allow|prefer (smaher-edb)
-* Optimize redundant pgpass parsing in case password is explicitly set (Aleksandr Alekseev)
-
-# 1.14.0 (February 11, 2023)
-
-* Fix: each connection attempt to new node gets own timeout (Nathan Giardina)
-* Set SNI for SSL connections (Stas Kelvich)
-* Fix: CopyFrom I/O race (Tommy Reilly)
-* Minor dependency upgrades
-
-# 1.13.0 (August 6, 2022)
-
-* Add sslpassword support (Eric McCormack and yun.xu)
-* Add prefer-standby target_session_attrs support (sergey.bashilov)
-* Fix GSS ErrorResponse handling (Oliver Tan)
-
-# 1.12.1 (May 7, 2022)
-
-* Fix: setting krbspn and krbsrvname in connection string (sireax)
-* Add support for Unix sockets on Windows (Eno Compton)
-* Stop ignoring ErrorResponse during SCRAM auth (Rafi Shamim)
-
-# 1.12.0 (April 21, 2022)
-
-* Add pluggable GSSAPI support (Oliver Tan)
-* Fix: Consider any "0A000" error a possible cached plan changed error due to locale
-* Better match psql fallback behavior with multiple hosts
-
-# 1.11.0 (February 7, 2022)
-
-* Support port in ip from LookupFunc to override config (James Hartig)
-* Fix TLS connection timeout (Blake Embrey)
-* Add support for read-only, primary, standby, prefer-standby target_session_attributes (Oscar)
-* Fix connect when receiving NoticeResponse
-
-# 1.10.1 (November 20, 2021)
-
-* Close without waiting for response (Kei Kamikawa)
-* Save waiting for network round-trip in CopyFrom (Rueian)
-* Fix concurrency issue with ContextWatcher
-* LRU.Get always checks context for cancellation / expiration (Georges Varouchas)
-
-# 1.10.0 (July 24, 2021)
-
-* net.Timeout errors are no longer returned when a query is canceled via context. A wrapped context error is returned.
-
-# 1.9.0 (July 10, 2021)
-
-* pgconn.Timeout only is true for errors originating in pgconn (Michael Darr)
-* Add defaults for sslcert, sslkey, and sslrootcert (Joshua Brindle)
-* Solve issue with 'sslmode=verify-full' when there are multiple hosts (mgoddard)
-* Fix default host when parsing URL without host but with port
-* Allow dbname query parameter in URL conn string
-* Update underlying dependencies
-
-# 1.8.1 (March 25, 2021)
-
-* Better connection string sanitization (ip.novikov)
-* Use proper pgpass location on Windows (Moshe Katz)
-* Use errors instead of golang.org/x/xerrors
-* Resume fallback on server error in Connect (Andrey Borodin)
-
-# 1.8.0 (December 3, 2020)
-
-* Add StatementErrored method to stmtcache.Cache. This allows the cache to purge invalidated prepared statements. (Ethan Pailes)
-
-# 1.7.2 (November 3, 2020)
-
-* Fix data value slices into work buffer with capacities larger than length.
-
-# 1.7.1 (October 31, 2020)
-
-* Do not asyncClose after receiving FATAL error from PostgreSQL server
-
-# 1.7.0 (September 26, 2020)
-
-* Exec(Params|Prepared) return ResultReader with FieldDescriptions loaded
-* Add ReceiveResults (Sebastiaan Mannem)
-* Fix parsing DSN connection with bad backslash
-* Add PgConn.CleanupDone so connection pools can determine when async close is complete
-
-# 1.6.4 (July 29, 2020)
-
-* Fix deadlock on error after CommandComplete but before ReadyForQuery
-* Fix panic on parsing DSN with trailing '='
-
-# 1.6.3 (July 22, 2020)
-
-* Fix error message after AppendCertsFromPEM failure (vahid-sohrabloo)
-
-# 1.6.2 (July 14, 2020)
-
-* Update pgservicefile library
-
-# 1.6.1 (June 27, 2020)
-
-* Update golang.org/x/crypto to latest
-* Update golang.org/x/text to 0.3.3
-* Fix error handling for bad PGSERVICE definition
-* Redact passwords in ParseConfig errors (Lukas Vogel)
-
-# 1.6.0 (June 6, 2020)
-
-* Fix panic when closing conn during cancellable query
-* Fix behavior of sslmode=require with sslrootcert present (Petr Jediný)
-* Fix field descriptions available after command concluded (Tobias Salzmann)
-* Support connect_timeout (georgysavva)
-* Handle IPv6 in connection URLs (Lukas Vogel)
-* Fix ValidateConnect with cancelable context
-* Improve CopyFrom performance
-* Add Config.Copy (georgysavva)
-
-# 1.5.0 (March 30, 2020)
-
-* Update golang.org/x/crypto for security fix
-* Implement "verify-ca" SSL mode (Greg Curtis)
-
-# 1.4.0 (March 7, 2020)
-
-* Fix ExecParams and ExecPrepared handling of empty query.
-* Support reading config from PostgreSQL service files.
-
-# 1.3.2 (February 14, 2020)
-
-* Update chunkreader to v2.0.1 for optimized default buffer size.
-
-# 1.3.1 (February 5, 2020)
-
-* Fix CopyFrom deadlock when multiple NoticeResponse received during copy
-
-# 1.3.0 (January 23, 2020)
-
-* Add Hijack and Construct.
-* Update pgproto3 to v2.0.1.
-
-# 1.2.1 (January 13, 2020)
-
-* Fix data race in context cancellation introduced in v1.2.0.
-
-# 1.2.0 (January 11, 2020)
-
-## Features
-
-* Add Insert(), Update(), Delete(), and Select() statement type query methods to CommandTag.
-* Add PgError.SQLState method. This could be used for compatibility with other drivers and databases.
-
-## Performance
-
-* Improve performance when context.Background() is used. (bakape)
-* CommandTag.RowsAffected is faster and does not allocate.
-
-## Fixes
-
-* Try to cancel any in-progress query when a conn is closed by ctx cancel.
-* Handle NoticeResponse during CopyFrom.
-* Ignore errors sending Terminate message while closing connection. This mimics the behavior of libpq PGfinish.
-
-# 1.1.0 (October 12, 2019)
-
-* Add PgConn.IsBusy() method.
-
-# 1.0.1 (September 19, 2019)
-
-* Fix statement cache not properly cleaning discarded statements.
diff --git a/vendor/github.com/jackc/pgconn/LICENSE b/vendor/github.com/jackc/pgconn/LICENSE
deleted file mode 100644
index aebadd6c4..000000000
--- a/vendor/github.com/jackc/pgconn/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2019-2021 Jack Christensen
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/jackc/pgconn/README.md b/vendor/github.com/jackc/pgconn/README.md
deleted file mode 100644
index 9af04fe74..000000000
--- a/vendor/github.com/jackc/pgconn/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-[![](https://godoc.org/github.com/jackc/pgconn?status.svg)](https://godoc.org/github.com/jackc/pgconn)
-![CI](https://github.com/jackc/pgconn/workflows/CI/badge.svg)
-
----
-
-This version is used with pgx `v4`. In pgx `v5` it is part of the https://github.com/jackc/pgx repository.
-
----
-
-# pgconn
-
-Package pgconn is a low-level PostgreSQL database driver. It operates at nearly the same level as the C library libpq.
-It is primarily intended to serve as the foundation for higher level libraries such as https://github.com/jackc/pgx.
-Applications should handle normal queries with a higher level library and only use pgconn directly when required for
-low-level access to PostgreSQL functionality.
-
-## Example Usage
-
-```go
-pgConn, err := pgconn.Connect(context.Background(), os.Getenv("DATABASE_URL"))
-if err != nil {
- log.Fatalln("pgconn failed to connect:", err)
-}
-defer pgConn.Close(context.Background())
-
-result := pgConn.ExecParams(context.Background(), "SELECT email FROM users WHERE id=$1", [][]byte{[]byte("123")}, nil, nil, nil)
-for result.NextRow() {
- fmt.Println("User 123 has email:", string(result.Values()[0]))
-}
-_, err = result.Close()
-if err != nil {
- log.Fatalln("failed reading result:", err)
-}
-```
-
-## Testing
-
-The pgconn tests require a PostgreSQL database. It will connect to the database specified in the `PGX_TEST_CONN_STRING`
-environment variable. The `PGX_TEST_CONN_STRING` environment variable can be a URL or DSN. In addition, the standard `PG*`
-environment variables will be respected. Consider using [direnv](https://github.com/direnv/direnv) to simplify
-environment variable handling.
-
-### Example Test Environment
-
-Connect to your PostgreSQL server and run:
-
-```
-create database pgx_test;
-```
-
-Now you can run the tests:
-
-```bash
-PGX_TEST_CONN_STRING="host=/var/run/postgresql dbname=pgx_test" go test ./...
-```
-
-### Connection and Authentication Tests
-
-Pgconn supports multiple connection types and means of authentication. These tests are optional. They
-will only run if the appropriate environment variable is set. Run `go test -v | grep SKIP` to see if any tests are being
-skipped. Most developers will not need to enable these tests. See `ci/setup_test.bash` for an example set up if you need change
-authentication code.
diff --git a/vendor/github.com/jackc/pgconn/auth_scram.go b/vendor/github.com/jackc/pgconn/auth_scram.go
deleted file mode 100644
index d8d711163..000000000
--- a/vendor/github.com/jackc/pgconn/auth_scram.go
+++ /dev/null
@@ -1,270 +0,0 @@
-// SCRAM-SHA-256 authentication
-//
-// Resources:
-// https://tools.ietf.org/html/rfc5802
-// https://tools.ietf.org/html/rfc8265
-// https://www.postgresql.org/docs/current/sasl-authentication.html
-//
-// Inspiration drawn from other implementations:
-// https://github.com/lib/pq/pull/608
-// https://github.com/lib/pq/pull/788
-// https://github.com/lib/pq/pull/833
-
-package pgconn
-
-import (
- "bytes"
- "crypto/hmac"
- "crypto/rand"
- "crypto/sha256"
- "encoding/base64"
- "errors"
- "fmt"
- "strconv"
-
- "github.com/jackc/pgproto3/v2"
- "golang.org/x/crypto/pbkdf2"
- "golang.org/x/text/secure/precis"
-)
-
-const clientNonceLen = 18
-
-// Perform SCRAM authentication.
-func (c *PgConn) scramAuth(serverAuthMechanisms []string) error {
- sc, err := newScramClient(serverAuthMechanisms, c.config.Password)
- if err != nil {
- return err
- }
-
- // Send client-first-message in a SASLInitialResponse
- saslInitialResponse := &pgproto3.SASLInitialResponse{
- AuthMechanism: "SCRAM-SHA-256",
- Data: sc.clientFirstMessage(),
- }
- _, err = c.conn.Write(saslInitialResponse.Encode(nil))
- if err != nil {
- return err
- }
-
- // Receive server-first-message payload in a AuthenticationSASLContinue.
- saslContinue, err := c.rxSASLContinue()
- if err != nil {
- return err
- }
- err = sc.recvServerFirstMessage(saslContinue.Data)
- if err != nil {
- return err
- }
-
- // Send client-final-message in a SASLResponse
- saslResponse := &pgproto3.SASLResponse{
- Data: []byte(sc.clientFinalMessage()),
- }
- _, err = c.conn.Write(saslResponse.Encode(nil))
- if err != nil {
- return err
- }
-
- // Receive server-final-message payload in a AuthenticationSASLFinal.
- saslFinal, err := c.rxSASLFinal()
- if err != nil {
- return err
- }
- return sc.recvServerFinalMessage(saslFinal.Data)
-}
-
-func (c *PgConn) rxSASLContinue() (*pgproto3.AuthenticationSASLContinue, error) {
- msg, err := c.receiveMessage()
- if err != nil {
- return nil, err
- }
- switch m := msg.(type) {
- case *pgproto3.AuthenticationSASLContinue:
- return m, nil
- case *pgproto3.ErrorResponse:
- return nil, ErrorResponseToPgError(m)
- }
-
- return nil, fmt.Errorf("expected AuthenticationSASLContinue message but received unexpected message %T", msg)
-}
-
-func (c *PgConn) rxSASLFinal() (*pgproto3.AuthenticationSASLFinal, error) {
- msg, err := c.receiveMessage()
- if err != nil {
- return nil, err
- }
- switch m := msg.(type) {
- case *pgproto3.AuthenticationSASLFinal:
- return m, nil
- case *pgproto3.ErrorResponse:
- return nil, ErrorResponseToPgError(m)
- }
-
- return nil, fmt.Errorf("expected AuthenticationSASLFinal message but received unexpected message %T", msg)
-}
-
-type scramClient struct {
- serverAuthMechanisms []string
- password []byte
- clientNonce []byte
-
- clientFirstMessageBare []byte
-
- serverFirstMessage []byte
- clientAndServerNonce []byte
- salt []byte
- iterations int
-
- saltedPassword []byte
- authMessage []byte
-}
-
-func newScramClient(serverAuthMechanisms []string, password string) (*scramClient, error) {
- sc := &scramClient{
- serverAuthMechanisms: serverAuthMechanisms,
- }
-
- // Ensure server supports SCRAM-SHA-256
- hasScramSHA256 := false
- for _, mech := range sc.serverAuthMechanisms {
- if mech == "SCRAM-SHA-256" {
- hasScramSHA256 = true
- break
- }
- }
- if !hasScramSHA256 {
- return nil, errors.New("server does not support SCRAM-SHA-256")
- }
-
- // precis.OpaqueString is equivalent to SASLprep for password.
- var err error
- sc.password, err = precis.OpaqueString.Bytes([]byte(password))
- if err != nil {
- // PostgreSQL allows passwords invalid according to SCRAM / SASLprep.
- sc.password = []byte(password)
- }
-
- buf := make([]byte, clientNonceLen)
- _, err = rand.Read(buf)
- if err != nil {
- return nil, err
- }
- sc.clientNonce = make([]byte, base64.RawStdEncoding.EncodedLen(len(buf)))
- base64.RawStdEncoding.Encode(sc.clientNonce, buf)
-
- return sc, nil
-}
-
-func (sc *scramClient) clientFirstMessage() []byte {
- sc.clientFirstMessageBare = []byte(fmt.Sprintf("n=,r=%s", sc.clientNonce))
- return []byte(fmt.Sprintf("n,,%s", sc.clientFirstMessageBare))
-}
-
-func (sc *scramClient) recvServerFirstMessage(serverFirstMessage []byte) error {
- sc.serverFirstMessage = serverFirstMessage
- buf := serverFirstMessage
- if !bytes.HasPrefix(buf, []byte("r=")) {
- return errors.New("invalid SCRAM server-first-message received from server: did not include r=")
- }
- buf = buf[2:]
-
- idx := bytes.IndexByte(buf, ',')
- if idx == -1 {
- return errors.New("invalid SCRAM server-first-message received from server: did not include s=")
- }
- sc.clientAndServerNonce = buf[:idx]
- buf = buf[idx+1:]
-
- if !bytes.HasPrefix(buf, []byte("s=")) {
- return errors.New("invalid SCRAM server-first-message received from server: did not include s=")
- }
- buf = buf[2:]
-
- idx = bytes.IndexByte(buf, ',')
- if idx == -1 {
- return errors.New("invalid SCRAM server-first-message received from server: did not include i=")
- }
- saltStr := buf[:idx]
- buf = buf[idx+1:]
-
- if !bytes.HasPrefix(buf, []byte("i=")) {
- return errors.New("invalid SCRAM server-first-message received from server: did not include i=")
- }
- buf = buf[2:]
- iterationsStr := buf
-
- var err error
- sc.salt, err = base64.StdEncoding.DecodeString(string(saltStr))
- if err != nil {
- return fmt.Errorf("invalid SCRAM salt received from server: %w", err)
- }
-
- sc.iterations, err = strconv.Atoi(string(iterationsStr))
- if err != nil || sc.iterations <= 0 {
- return fmt.Errorf("invalid SCRAM iteration count received from server: %w", err)
- }
-
- if !bytes.HasPrefix(sc.clientAndServerNonce, sc.clientNonce) {
- return errors.New("invalid SCRAM nonce: did not start with client nonce")
- }
-
- if len(sc.clientAndServerNonce) <= len(sc.clientNonce) {
- return errors.New("invalid SCRAM nonce: did not include server nonce")
- }
-
- return nil
-}
-
-func (sc *scramClient) clientFinalMessage() string {
- clientFinalMessageWithoutProof := []byte(fmt.Sprintf("c=biws,r=%s", sc.clientAndServerNonce))
-
- sc.saltedPassword = pbkdf2.Key([]byte(sc.password), sc.salt, sc.iterations, 32, sha256.New)
- sc.authMessage = bytes.Join([][]byte{sc.clientFirstMessageBare, sc.serverFirstMessage, clientFinalMessageWithoutProof}, []byte(","))
-
- clientProof := computeClientProof(sc.saltedPassword, sc.authMessage)
-
- return fmt.Sprintf("%s,p=%s", clientFinalMessageWithoutProof, clientProof)
-}
-
-func (sc *scramClient) recvServerFinalMessage(serverFinalMessage []byte) error {
- if !bytes.HasPrefix(serverFinalMessage, []byte("v=")) {
- return errors.New("invalid SCRAM server-final-message received from server")
- }
-
- serverSignature := serverFinalMessage[2:]
-
- if !hmac.Equal(serverSignature, computeServerSignature(sc.saltedPassword, sc.authMessage)) {
- return errors.New("invalid SCRAM ServerSignature received from server")
- }
-
- return nil
-}
-
-func computeHMAC(key, msg []byte) []byte {
- mac := hmac.New(sha256.New, key)
- mac.Write(msg)
- return mac.Sum(nil)
-}
-
-func computeClientProof(saltedPassword, authMessage []byte) []byte {
- clientKey := computeHMAC(saltedPassword, []byte("Client Key"))
- storedKey := sha256.Sum256(clientKey)
- clientSignature := computeHMAC(storedKey[:], authMessage)
-
- clientProof := make([]byte, len(clientSignature))
- for i := 0; i < len(clientSignature); i++ {
- clientProof[i] = clientKey[i] ^ clientSignature[i]
- }
-
- buf := make([]byte, base64.StdEncoding.EncodedLen(len(clientProof)))
- base64.StdEncoding.Encode(buf, clientProof)
- return buf
-}
-
-func computeServerSignature(saltedPassword []byte, authMessage []byte) []byte {
- serverKey := computeHMAC(saltedPassword, []byte("Server Key"))
- serverSignature := computeHMAC(serverKey, authMessage)
- buf := make([]byte, base64.StdEncoding.EncodedLen(len(serverSignature)))
- base64.StdEncoding.Encode(buf, serverSignature)
- return buf
-}
diff --git a/vendor/github.com/jackc/pgconn/config.go b/vendor/github.com/jackc/pgconn/config.go
deleted file mode 100644
index 36b74c4a3..000000000
--- a/vendor/github.com/jackc/pgconn/config.go
+++ /dev/null
@@ -1,905 +0,0 @@
-package pgconn
-
-import (
- "context"
- "crypto/tls"
- "crypto/x509"
- "encoding/pem"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "math"
- "net"
- "net/url"
- "os"
- "path/filepath"
- "strconv"
- "strings"
- "time"
-
- "github.com/jackc/chunkreader/v2"
- "github.com/jackc/pgpassfile"
- "github.com/jackc/pgproto3/v2"
- "github.com/jackc/pgservicefile"
-)
-
-type AfterConnectFunc func(ctx context.Context, pgconn *PgConn) error
-type ValidateConnectFunc func(ctx context.Context, pgconn *PgConn) error
-type GetSSLPasswordFunc func(ctx context.Context) string
-
-// Config is the settings used to establish a connection to a PostgreSQL server. It must be created by ParseConfig. A
-// manually initialized Config will cause ConnectConfig to panic.
-type Config struct {
- Host string // host (e.g. localhost) or absolute path to unix domain socket directory (e.g. /private/tmp)
- Port uint16
- Database string
- User string
- Password string
- TLSConfig *tls.Config // nil disables TLS
- ConnectTimeout time.Duration
- DialFunc DialFunc // e.g. net.Dialer.DialContext
- LookupFunc LookupFunc // e.g. net.Resolver.LookupHost
- BuildFrontend BuildFrontendFunc
- RuntimeParams map[string]string // Run-time parameters to set on connection as session default values (e.g. search_path or application_name)
-
- KerberosSrvName string
- KerberosSpn string
- Fallbacks []*FallbackConfig
-
- // ValidateConnect is called during a connection attempt after a successful authentication with the PostgreSQL server.
- // It can be used to validate that the server is acceptable. If this returns an error the connection is closed and the next
- // fallback config is tried. This allows implementing high availability behavior such as libpq does with target_session_attrs.
- ValidateConnect ValidateConnectFunc
-
- // AfterConnect is called after ValidateConnect. It can be used to set up the connection (e.g. Set session variables
- // or prepare statements). If this returns an error the connection attempt fails.
- AfterConnect AfterConnectFunc
-
- // OnNotice is a callback function called when a notice response is received.
- OnNotice NoticeHandler
-
- // OnNotification is a callback function called when a notification from the LISTEN/NOTIFY system is received.
- OnNotification NotificationHandler
-
- createdByParseConfig bool // Used to enforce created by ParseConfig rule.
-}
-
-// ParseConfigOptions contains options that control how a config is built such as getsslpassword.
-type ParseConfigOptions struct {
- // GetSSLPassword gets the password to decrypt a SSL client certificate. This is analogous to the the libpq function
- // PQsetSSLKeyPassHook_OpenSSL.
- GetSSLPassword GetSSLPasswordFunc
-}
-
-// Copy returns a deep copy of the config that is safe to use and modify.
-// The only exception is the TLSConfig field:
-// according to the tls.Config docs it must not be modified after creation.
-func (c *Config) Copy() *Config {
- newConf := new(Config)
- *newConf = *c
- if newConf.TLSConfig != nil {
- newConf.TLSConfig = c.TLSConfig.Clone()
- }
- if newConf.RuntimeParams != nil {
- newConf.RuntimeParams = make(map[string]string, len(c.RuntimeParams))
- for k, v := range c.RuntimeParams {
- newConf.RuntimeParams[k] = v
- }
- }
- if newConf.Fallbacks != nil {
- newConf.Fallbacks = make([]*FallbackConfig, len(c.Fallbacks))
- for i, fallback := range c.Fallbacks {
- newFallback := new(FallbackConfig)
- *newFallback = *fallback
- if newFallback.TLSConfig != nil {
- newFallback.TLSConfig = fallback.TLSConfig.Clone()
- }
- newConf.Fallbacks[i] = newFallback
- }
- }
- return newConf
-}
-
-// FallbackConfig is additional settings to attempt a connection with when the primary Config fails to establish a
-// network connection. It is used for TLS fallback such as sslmode=prefer and high availability (HA) connections.
-type FallbackConfig struct {
- Host string // host (e.g. localhost) or path to unix domain socket directory (e.g. /private/tmp)
- Port uint16
- TLSConfig *tls.Config // nil disables TLS
-}
-
-// isAbsolutePath checks if the provided value is an absolute path either
-// beginning with a forward slash (as on Linux-based systems) or with a capital
-// letter A-Z followed by a colon and a backslash, e.g., "C:\", (as on Windows).
-func isAbsolutePath(path string) bool {
- isWindowsPath := func(p string) bool {
- if len(p) < 3 {
- return false
- }
- drive := p[0]
- colon := p[1]
- backslash := p[2]
- if drive >= 'A' && drive <= 'Z' && colon == ':' && backslash == '\\' {
- return true
- }
- return false
- }
- return strings.HasPrefix(path, "/") || isWindowsPath(path)
-}
-
-// NetworkAddress converts a PostgreSQL host and port into network and address suitable for use with
-// net.Dial.
-func NetworkAddress(host string, port uint16) (network, address string) {
- if isAbsolutePath(host) {
- network = "unix"
- address = filepath.Join(host, ".s.PGSQL.") + strconv.FormatInt(int64(port), 10)
- } else {
- network = "tcp"
- address = net.JoinHostPort(host, strconv.Itoa(int(port)))
- }
- return network, address
-}
-
-// ParseConfig builds a *Config from connString with similar behavior to the PostgreSQL standard C library libpq. It
-// uses the same defaults as libpq (e.g. port=5432) and understands most PG* environment variables. ParseConfig closely
-// matches the parsing behavior of libpq. connString may either be in URL format or keyword = value format (DSN style).
-// See https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING for details. connString also may be
-// empty to only read from the environment. If a password is not supplied it will attempt to read the .pgpass file.
-//
-// # Example DSN
-// user=jack password=secret host=pg.example.com port=5432 dbname=mydb sslmode=verify-ca
-//
-// # Example URL
-// postgres://jack:secret@pg.example.com:5432/mydb?sslmode=verify-ca
-//
-// The returned *Config may be modified. However, it is strongly recommended that any configuration that can be done
-// through the connection string be done there. In particular the fields Host, Port, TLSConfig, and Fallbacks can be
-// interdependent (e.g. TLSConfig needs knowledge of the host to validate the server certificate). These fields should
-// not be modified individually. They should all be modified or all left unchanged.
-//
-// ParseConfig supports specifying multiple hosts in similar manner to libpq. Host and port may include comma separated
-// values that will be tried in order. This can be used as part of a high availability system. See
-// https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-MULTIPLE-HOSTS for more information.
-//
-// # Example URL
-// postgres://jack:secret@foo.example.com:5432,bar.example.com:5432/mydb
-//
-// ParseConfig currently recognizes the following environment variable and their parameter key word equivalents passed
-// via database URL or DSN:
-//
-// PGHOST
-// PGPORT
-// PGDATABASE
-// PGUSER
-// PGPASSWORD
-// PGPASSFILE
-// PGSERVICE
-// PGSERVICEFILE
-// PGSSLMODE
-// PGSSLCERT
-// PGSSLKEY
-// PGSSLROOTCERT
-// PGSSLPASSWORD
-// PGAPPNAME
-// PGCONNECT_TIMEOUT
-// PGTARGETSESSIONATTRS
-//
-// See http://www.postgresql.org/docs/11/static/libpq-envars.html for details on the meaning of environment variables.
-//
-// See https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-PARAMKEYWORDS for parameter key word names. They are
-// usually but not always the environment variable name downcased and without the "PG" prefix.
-//
-// Important Security Notes:
-//
-// ParseConfig tries to match libpq behavior with regard to PGSSLMODE. This includes defaulting to "prefer" behavior if
-// not set.
-//
-// See http://www.postgresql.org/docs/11/static/libpq-ssl.html#LIBPQ-SSL-PROTECTION for details on what level of
-// security each sslmode provides.
-//
-// The sslmode "prefer" (the default), sslmode "allow", and multiple hosts are implemented via the Fallbacks field of
-// the Config struct. If TLSConfig is manually changed it will not affect the fallbacks. For example, in the case of
-// sslmode "prefer" this means it will first try the main Config settings which use TLS, then it will try the fallback
-// which does not use TLS. This can lead to an unexpected unencrypted connection if the main TLS config is manually
-// changed later but the unencrypted fallback is present. Ensure there are no stale fallbacks when manually setting
-// TLSConfig.
-//
-// Other known differences with libpq:
-//
-// When multiple hosts are specified, libpq allows them to have different passwords set via the .pgpass file. pgconn
-// does not.
-//
-// In addition, ParseConfig accepts the following options:
-//
-// min_read_buffer_size
-// The minimum size of the internal read buffer. Default 8192.
-// servicefile
-// libpq only reads servicefile from the PGSERVICEFILE environment variable. ParseConfig accepts servicefile as a
-// part of the connection string.
-func ParseConfig(connString string) (*Config, error) {
- var parseConfigOptions ParseConfigOptions
- return ParseConfigWithOptions(connString, parseConfigOptions)
-}
-
-// ParseConfigWithOptions builds a *Config from connString and options with similar behavior to the PostgreSQL standard
-// C library libpq. options contains settings that cannot be specified in a connString such as providing a function to
-// get the SSL password.
-func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Config, error) {
- defaultSettings := defaultSettings()
- envSettings := parseEnvSettings()
-
- connStringSettings := make(map[string]string)
- if connString != "" {
- var err error
- // connString may be a database URL or a DSN
- if strings.HasPrefix(connString, "postgres://") || strings.HasPrefix(connString, "postgresql://") {
- connStringSettings, err = parseURLSettings(connString)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "failed to parse as URL", err: err}
- }
- } else {
- connStringSettings, err = parseDSNSettings(connString)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "failed to parse as DSN", err: err}
- }
- }
- }
-
- settings := mergeSettings(defaultSettings, envSettings, connStringSettings)
- if service, present := settings["service"]; present {
- serviceSettings, err := parseServiceSettings(settings["servicefile"], service)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "failed to read service", err: err}
- }
-
- settings = mergeSettings(defaultSettings, envSettings, serviceSettings, connStringSettings)
- }
-
- minReadBufferSize, err := strconv.ParseInt(settings["min_read_buffer_size"], 10, 32)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "cannot parse min_read_buffer_size", err: err}
- }
-
- config := &Config{
- createdByParseConfig: true,
- Database: settings["database"],
- User: settings["user"],
- Password: settings["password"],
- RuntimeParams: make(map[string]string),
- BuildFrontend: makeDefaultBuildFrontendFunc(int(minReadBufferSize)),
- }
-
- if connectTimeoutSetting, present := settings["connect_timeout"]; present {
- connectTimeout, err := parseConnectTimeoutSetting(connectTimeoutSetting)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "invalid connect_timeout", err: err}
- }
- config.ConnectTimeout = connectTimeout
- config.DialFunc = makeConnectTimeoutDialFunc(connectTimeout)
- } else {
- defaultDialer := makeDefaultDialer()
- config.DialFunc = defaultDialer.DialContext
- }
-
- config.LookupFunc = makeDefaultResolver().LookupHost
-
- notRuntimeParams := map[string]struct{}{
- "host": {},
- "port": {},
- "database": {},
- "user": {},
- "password": {},
- "passfile": {},
- "connect_timeout": {},
- "sslmode": {},
- "sslkey": {},
- "sslcert": {},
- "sslrootcert": {},
- "sslpassword": {},
- "sslsni": {},
- "krbspn": {},
- "krbsrvname": {},
- "target_session_attrs": {},
- "min_read_buffer_size": {},
- "service": {},
- "servicefile": {},
- }
-
- // Adding kerberos configuration
- if _, present := settings["krbsrvname"]; present {
- config.KerberosSrvName = settings["krbsrvname"]
- }
- if _, present := settings["krbspn"]; present {
- config.KerberosSpn = settings["krbspn"]
- }
-
- for k, v := range settings {
- if _, present := notRuntimeParams[k]; present {
- continue
- }
- config.RuntimeParams[k] = v
- }
-
- fallbacks := []*FallbackConfig{}
-
- hosts := strings.Split(settings["host"], ",")
- ports := strings.Split(settings["port"], ",")
-
- for i, host := range hosts {
- var portStr string
- if i < len(ports) {
- portStr = ports[i]
- } else {
- portStr = ports[0]
- }
-
- port, err := parsePort(portStr)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "invalid port", err: err}
- }
-
- var tlsConfigs []*tls.Config
-
- // Ignore TLS settings if Unix domain socket like libpq
- if network, _ := NetworkAddress(host, port); network == "unix" {
- tlsConfigs = append(tlsConfigs, nil)
- } else {
- var err error
- tlsConfigs, err = configTLS(settings, host, options)
- if err != nil {
- return nil, &parseConfigError{connString: connString, msg: "failed to configure TLS", err: err}
- }
- }
-
- for _, tlsConfig := range tlsConfigs {
- fallbacks = append(fallbacks, &FallbackConfig{
- Host: host,
- Port: port,
- TLSConfig: tlsConfig,
- })
- }
- }
-
- config.Host = fallbacks[0].Host
- config.Port = fallbacks[0].Port
- config.TLSConfig = fallbacks[0].TLSConfig
- config.Fallbacks = fallbacks[1:]
-
- if config.Password == "" {
- passfile, err := pgpassfile.ReadPassfile(settings["passfile"])
- if err == nil {
- host := config.Host
- if network, _ := NetworkAddress(config.Host, config.Port); network == "unix" {
- host = "localhost"
- }
-
- config.Password = passfile.FindPassword(host, strconv.Itoa(int(config.Port)), config.Database, config.User)
- }
- }
-
- switch tsa := settings["target_session_attrs"]; tsa {
- case "read-write":
- config.ValidateConnect = ValidateConnectTargetSessionAttrsReadWrite
- case "read-only":
- config.ValidateConnect = ValidateConnectTargetSessionAttrsReadOnly
- case "primary":
- config.ValidateConnect = ValidateConnectTargetSessionAttrsPrimary
- case "standby":
- config.ValidateConnect = ValidateConnectTargetSessionAttrsStandby
- case "prefer-standby":
- config.ValidateConnect = ValidateConnectTargetSessionAttrsPreferStandby
- case "any":
- // do nothing
- default:
- return nil, &parseConfigError{connString: connString, msg: fmt.Sprintf("unknown target_session_attrs value: %v", tsa)}
- }
-
- return config, nil
-}
-
-func mergeSettings(settingSets ...map[string]string) map[string]string {
- settings := make(map[string]string)
-
- for _, s2 := range settingSets {
- for k, v := range s2 {
- settings[k] = v
- }
- }
-
- return settings
-}
-
-func parseEnvSettings() map[string]string {
- settings := make(map[string]string)
-
- nameMap := map[string]string{
- "PGHOST": "host",
- "PGPORT": "port",
- "PGDATABASE": "database",
- "PGUSER": "user",
- "PGPASSWORD": "password",
- "PGPASSFILE": "passfile",
- "PGAPPNAME": "application_name",
- "PGCONNECT_TIMEOUT": "connect_timeout",
- "PGSSLMODE": "sslmode",
- "PGSSLKEY": "sslkey",
- "PGSSLCERT": "sslcert",
- "PGSSLSNI": "sslsni",
- "PGSSLROOTCERT": "sslrootcert",
- "PGSSLPASSWORD": "sslpassword",
- "PGTARGETSESSIONATTRS": "target_session_attrs",
- "PGSERVICE": "service",
- "PGSERVICEFILE": "servicefile",
- }
-
- for envname, realname := range nameMap {
- value := os.Getenv(envname)
- if value != "" {
- settings[realname] = value
- }
- }
-
- return settings
-}
-
-func parseURLSettings(connString string) (map[string]string, error) {
- settings := make(map[string]string)
-
- url, err := url.Parse(connString)
- if err != nil {
- return nil, err
- }
-
- if url.User != nil {
- settings["user"] = url.User.Username()
- if password, present := url.User.Password(); present {
- settings["password"] = password
- }
- }
-
- // Handle multiple host:port's in url.Host by splitting them into host,host,host and port,port,port.
- var hosts []string
- var ports []string
- for _, host := range strings.Split(url.Host, ",") {
- if host == "" {
- continue
- }
- if isIPOnly(host) {
- hosts = append(hosts, strings.Trim(host, "[]"))
- continue
- }
- h, p, err := net.SplitHostPort(host)
- if err != nil {
- return nil, fmt.Errorf("failed to split host:port in '%s', err: %w", host, err)
- }
- if h != "" {
- hosts = append(hosts, h)
- }
- if p != "" {
- ports = append(ports, p)
- }
- }
- if len(hosts) > 0 {
- settings["host"] = strings.Join(hosts, ",")
- }
- if len(ports) > 0 {
- settings["port"] = strings.Join(ports, ",")
- }
-
- database := strings.TrimLeft(url.Path, "/")
- if database != "" {
- settings["database"] = database
- }
-
- nameMap := map[string]string{
- "dbname": "database",
- }
-
- for k, v := range url.Query() {
- if k2, present := nameMap[k]; present {
- k = k2
- }
-
- settings[k] = v[0]
- }
-
- return settings, nil
-}
-
-func isIPOnly(host string) bool {
- return net.ParseIP(strings.Trim(host, "[]")) != nil || !strings.Contains(host, ":")
-}
-
-var asciiSpace = [256]uint8{'\t': 1, '\n': 1, '\v': 1, '\f': 1, '\r': 1, ' ': 1}
-
-func parseDSNSettings(s string) (map[string]string, error) {
- settings := make(map[string]string)
-
- nameMap := map[string]string{
- "dbname": "database",
- }
-
- for len(s) > 0 {
- var key, val string
- eqIdx := strings.IndexRune(s, '=')
- if eqIdx < 0 {
- return nil, errors.New("invalid dsn")
- }
-
- key = strings.Trim(s[:eqIdx], " \t\n\r\v\f")
- s = strings.TrimLeft(s[eqIdx+1:], " \t\n\r\v\f")
- if len(s) == 0 {
- } else if s[0] != '\'' {
- end := 0
- for ; end < len(s); end++ {
- if asciiSpace[s[end]] == 1 {
- break
- }
- if s[end] == '\\' {
- end++
- if end == len(s) {
- return nil, errors.New("invalid backslash")
- }
- }
- }
- val = strings.Replace(strings.Replace(s[:end], "\\\\", "\\", -1), "\\'", "'", -1)
- if end == len(s) {
- s = ""
- } else {
- s = s[end+1:]
- }
- } else { // quoted string
- s = s[1:]
- end := 0
- for ; end < len(s); end++ {
- if s[end] == '\'' {
- break
- }
- if s[end] == '\\' {
- end++
- }
- }
- if end == len(s) {
- return nil, errors.New("unterminated quoted string in connection info string")
- }
- val = strings.Replace(strings.Replace(s[:end], "\\\\", "\\", -1), "\\'", "'", -1)
- if end == len(s) {
- s = ""
- } else {
- s = s[end+1:]
- }
- }
-
- if k, ok := nameMap[key]; ok {
- key = k
- }
-
- if key == "" {
- return nil, errors.New("invalid dsn")
- }
-
- settings[key] = val
- }
-
- return settings, nil
-}
-
-func parseServiceSettings(servicefilePath, serviceName string) (map[string]string, error) {
- servicefile, err := pgservicefile.ReadServicefile(servicefilePath)
- if err != nil {
- return nil, fmt.Errorf("failed to read service file: %v", servicefilePath)
- }
-
- service, err := servicefile.GetService(serviceName)
- if err != nil {
- return nil, fmt.Errorf("unable to find service: %v", serviceName)
- }
-
- nameMap := map[string]string{
- "dbname": "database",
- }
-
- settings := make(map[string]string, len(service.Settings))
- for k, v := range service.Settings {
- if k2, present := nameMap[k]; present {
- k = k2
- }
- settings[k] = v
- }
-
- return settings, nil
-}
-
-// configTLS uses libpq's TLS parameters to construct []*tls.Config. It is
-// necessary to allow returning multiple TLS configs as sslmode "allow" and
-// "prefer" allow fallback.
-func configTLS(settings map[string]string, thisHost string, parseConfigOptions ParseConfigOptions) ([]*tls.Config, error) {
- host := thisHost
- sslmode := settings["sslmode"]
- sslrootcert := settings["sslrootcert"]
- sslcert := settings["sslcert"]
- sslkey := settings["sslkey"]
- sslpassword := settings["sslpassword"]
- sslsni := settings["sslsni"]
-
- // Match libpq default behavior
- if sslmode == "" {
- sslmode = "prefer"
- }
- if sslsni == "" {
- sslsni = "1"
- }
-
- tlsConfig := &tls.Config{}
-
- switch sslmode {
- case "disable":
- return []*tls.Config{nil}, nil
- case "allow", "prefer":
- tlsConfig.InsecureSkipVerify = true
- case "require":
- // According to PostgreSQL documentation, if a root CA file exists,
- // the behavior of sslmode=require should be the same as that of verify-ca
- //
- // See https://www.postgresql.org/docs/12/libpq-ssl.html
- if sslrootcert != "" {
- goto nextCase
- }
- tlsConfig.InsecureSkipVerify = true
- break
- nextCase:
- fallthrough
- case "verify-ca":
- // Don't perform the default certificate verification because it
- // will verify the hostname. Instead, verify the server's
- // certificate chain ourselves in VerifyPeerCertificate and
- // ignore the server name. This emulates libpq's verify-ca
- // behavior.
- //
- // See https://github.com/golang/go/issues/21971#issuecomment-332693931
- // and https://pkg.go.dev/crypto/tls?tab=doc#example-Config-VerifyPeerCertificate
- // for more info.
- tlsConfig.InsecureSkipVerify = true
- tlsConfig.VerifyPeerCertificate = func(certificates [][]byte, _ [][]*x509.Certificate) error {
- certs := make([]*x509.Certificate, len(certificates))
- for i, asn1Data := range certificates {
- cert, err := x509.ParseCertificate(asn1Data)
- if err != nil {
- return errors.New("failed to parse certificate from server: " + err.Error())
- }
- certs[i] = cert
- }
-
- // Leave DNSName empty to skip hostname verification.
- opts := x509.VerifyOptions{
- Roots: tlsConfig.RootCAs,
- Intermediates: x509.NewCertPool(),
- }
- // Skip the first cert because it's the leaf. All others
- // are intermediates.
- for _, cert := range certs[1:] {
- opts.Intermediates.AddCert(cert)
- }
- _, err := certs[0].Verify(opts)
- return err
- }
- case "verify-full":
- tlsConfig.ServerName = host
- default:
- return nil, errors.New("sslmode is invalid")
- }
-
- if sslrootcert != "" {
- caCertPool := x509.NewCertPool()
-
- caPath := sslrootcert
- caCert, err := ioutil.ReadFile(caPath)
- if err != nil {
- return nil, fmt.Errorf("unable to read CA file: %w", err)
- }
-
- if !caCertPool.AppendCertsFromPEM(caCert) {
- return nil, errors.New("unable to add CA to cert pool")
- }
-
- tlsConfig.RootCAs = caCertPool
- tlsConfig.ClientCAs = caCertPool
- }
-
- if (sslcert != "" && sslkey == "") || (sslcert == "" && sslkey != "") {
- return nil, errors.New(`both "sslcert" and "sslkey" are required`)
- }
-
- if sslcert != "" && sslkey != "" {
- buf, err := ioutil.ReadFile(sslkey)
- if err != nil {
- return nil, fmt.Errorf("unable to read sslkey: %w", err)
- }
- block, _ := pem.Decode(buf)
- var pemKey []byte
- var decryptedKey []byte
- var decryptedError error
- // If PEM is encrypted, attempt to decrypt using pass phrase
- if x509.IsEncryptedPEMBlock(block) {
- // Attempt decryption with pass phrase
- // NOTE: only supports RSA (PKCS#1)
- if sslpassword != "" {
- decryptedKey, decryptedError = x509.DecryptPEMBlock(block, []byte(sslpassword))
- }
- //if sslpassword not provided or has decryption error when use it
- //try to find sslpassword with callback function
- if sslpassword == "" || decryptedError != nil {
- if parseConfigOptions.GetSSLPassword != nil {
- sslpassword = parseConfigOptions.GetSSLPassword(context.Background())
- }
- if sslpassword == "" {
- return nil, fmt.Errorf("unable to find sslpassword")
- }
- }
- decryptedKey, decryptedError = x509.DecryptPEMBlock(block, []byte(sslpassword))
- // Should we also provide warning for PKCS#1 needed?
- if decryptedError != nil {
- return nil, fmt.Errorf("unable to decrypt key: %w", err)
- }
-
- pemBytes := pem.Block{
- Type: "RSA PRIVATE KEY",
- Bytes: decryptedKey,
- }
- pemKey = pem.EncodeToMemory(&pemBytes)
- } else {
- pemKey = pem.EncodeToMemory(block)
- }
- certfile, err := ioutil.ReadFile(sslcert)
- if err != nil {
- return nil, fmt.Errorf("unable to read cert: %w", err)
- }
- cert, err := tls.X509KeyPair(certfile, pemKey)
- if err != nil {
- return nil, fmt.Errorf("unable to load cert: %w", err)
- }
- tlsConfig.Certificates = []tls.Certificate{cert}
- }
-
- // Set Server Name Indication (SNI), if enabled by connection parameters.
- // Per RFC 6066, do not set it if the host is a literal IP address (IPv4
- // or IPv6).
- if sslsni == "1" && net.ParseIP(host) == nil {
- tlsConfig.ServerName = host
- }
-
- switch sslmode {
- case "allow":
- return []*tls.Config{nil, tlsConfig}, nil
- case "prefer":
- return []*tls.Config{tlsConfig, nil}, nil
- case "require", "verify-ca", "verify-full":
- return []*tls.Config{tlsConfig}, nil
- default:
- panic("BUG: bad sslmode should already have been caught")
- }
-}
-
-func parsePort(s string) (uint16, error) {
- port, err := strconv.ParseUint(s, 10, 16)
- if err != nil {
- return 0, err
- }
- if port < 1 || port > math.MaxUint16 {
- return 0, errors.New("outside range")
- }
- return uint16(port), nil
-}
-
-func makeDefaultDialer() *net.Dialer {
- return &net.Dialer{KeepAlive: 5 * time.Minute}
-}
-
-func makeDefaultResolver() *net.Resolver {
- return net.DefaultResolver
-}
-
-func makeDefaultBuildFrontendFunc(minBufferLen int) BuildFrontendFunc {
- return func(r io.Reader, w io.Writer) Frontend {
- cr, err := chunkreader.NewConfig(r, chunkreader.Config{MinBufLen: minBufferLen})
- if err != nil {
- panic(fmt.Sprintf("BUG: chunkreader.NewConfig failed: %v", err))
- }
- frontend := pgproto3.NewFrontend(cr, w)
-
- return frontend
- }
-}
-
-func parseConnectTimeoutSetting(s string) (time.Duration, error) {
- timeout, err := strconv.ParseInt(s, 10, 64)
- if err != nil {
- return 0, err
- }
- if timeout < 0 {
- return 0, errors.New("negative timeout")
- }
- return time.Duration(timeout) * time.Second, nil
-}
-
-func makeConnectTimeoutDialFunc(timeout time.Duration) DialFunc {
- d := makeDefaultDialer()
- d.Timeout = timeout
- return d.DialContext
-}
-
-// ValidateConnectTargetSessionAttrsReadWrite is an ValidateConnectFunc that implements libpq compatible
-// target_session_attrs=read-write.
-func ValidateConnectTargetSessionAttrsReadWrite(ctx context.Context, pgConn *PgConn) error {
- result := pgConn.ExecParams(ctx, "show transaction_read_only", nil, nil, nil, nil).Read()
- if result.Err != nil {
- return result.Err
- }
-
- if string(result.Rows[0][0]) == "on" {
- return errors.New("read only connection")
- }
-
- return nil
-}
-
-// ValidateConnectTargetSessionAttrsReadOnly is an ValidateConnectFunc that implements libpq compatible
-// target_session_attrs=read-only.
-func ValidateConnectTargetSessionAttrsReadOnly(ctx context.Context, pgConn *PgConn) error {
- result := pgConn.ExecParams(ctx, "show transaction_read_only", nil, nil, nil, nil).Read()
- if result.Err != nil {
- return result.Err
- }
-
- if string(result.Rows[0][0]) != "on" {
- return errors.New("connection is not read only")
- }
-
- return nil
-}
-
-// ValidateConnectTargetSessionAttrsStandby is an ValidateConnectFunc that implements libpq compatible
-// target_session_attrs=standby.
-func ValidateConnectTargetSessionAttrsStandby(ctx context.Context, pgConn *PgConn) error {
- result := pgConn.ExecParams(ctx, "select pg_is_in_recovery()", nil, nil, nil, nil).Read()
- if result.Err != nil {
- return result.Err
- }
-
- if string(result.Rows[0][0]) != "t" {
- return errors.New("server is not in hot standby mode")
- }
-
- return nil
-}
-
-// ValidateConnectTargetSessionAttrsPrimary is an ValidateConnectFunc that implements libpq compatible
-// target_session_attrs=primary.
-func ValidateConnectTargetSessionAttrsPrimary(ctx context.Context, pgConn *PgConn) error {
- result := pgConn.ExecParams(ctx, "select pg_is_in_recovery()", nil, nil, nil, nil).Read()
- if result.Err != nil {
- return result.Err
- }
-
- if string(result.Rows[0][0]) == "t" {
- return errors.New("server is in standby mode")
- }
-
- return nil
-}
-
-// ValidateConnectTargetSessionAttrsPreferStandby is an ValidateConnectFunc that implements libpq compatible
-// target_session_attrs=prefer-standby.
-func ValidateConnectTargetSessionAttrsPreferStandby(ctx context.Context, pgConn *PgConn) error {
- result := pgConn.ExecParams(ctx, "select pg_is_in_recovery()", nil, nil, nil, nil).Read()
- if result.Err != nil {
- return result.Err
- }
-
- if string(result.Rows[0][0]) != "t" {
- return &NotPreferredError{err: errors.New("server is not in hot standby mode")}
- }
-
- return nil
-}
diff --git a/vendor/github.com/jackc/pgconn/defaults.go b/vendor/github.com/jackc/pgconn/defaults.go
deleted file mode 100644
index c7209fdd3..000000000
--- a/vendor/github.com/jackc/pgconn/defaults.go
+++ /dev/null
@@ -1,65 +0,0 @@
-//go:build !windows
-// +build !windows
-
-package pgconn
-
-import (
- "os"
- "os/user"
- "path/filepath"
-)
-
-func defaultSettings() map[string]string {
- settings := make(map[string]string)
-
- settings["host"] = defaultHost()
- settings["port"] = "5432"
-
- // Default to the OS user name. Purposely ignoring err getting user name from
- // OS. The client application will simply have to specify the user in that
- // case (which they typically will be doing anyway).
- user, err := user.Current()
- if err == nil {
- settings["user"] = user.Username
- settings["passfile"] = filepath.Join(user.HomeDir, ".pgpass")
- settings["servicefile"] = filepath.Join(user.HomeDir, ".pg_service.conf")
- sslcert := filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt")
- sslkey := filepath.Join(user.HomeDir, ".postgresql", "postgresql.key")
- if _, err := os.Stat(sslcert); err == nil {
- if _, err := os.Stat(sslkey); err == nil {
- // Both the cert and key must be present to use them, or do not use either
- settings["sslcert"] = sslcert
- settings["sslkey"] = sslkey
- }
- }
- sslrootcert := filepath.Join(user.HomeDir, ".postgresql", "root.crt")
- if _, err := os.Stat(sslrootcert); err == nil {
- settings["sslrootcert"] = sslrootcert
- }
- }
-
- settings["target_session_attrs"] = "any"
-
- settings["min_read_buffer_size"] = "8192"
-
- return settings
-}
-
-// defaultHost attempts to mimic libpq's default host. libpq uses the default unix socket location on *nix and localhost
-// on Windows. The default socket location is compiled into libpq. Since pgx does not have access to that default it
-// checks the existence of common locations.
-func defaultHost() string {
- candidatePaths := []string{
- "/var/run/postgresql", // Debian
- "/private/tmp", // OSX - homebrew
- "/tmp", // standard PostgreSQL
- }
-
- for _, path := range candidatePaths {
- if _, err := os.Stat(path); err == nil {
- return path
- }
- }
-
- return "localhost"
-}
diff --git a/vendor/github.com/jackc/pgconn/defaults_windows.go b/vendor/github.com/jackc/pgconn/defaults_windows.go
deleted file mode 100644
index 71eb77dba..000000000
--- a/vendor/github.com/jackc/pgconn/defaults_windows.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package pgconn
-
-import (
- "os"
- "os/user"
- "path/filepath"
- "strings"
-)
-
-func defaultSettings() map[string]string {
- settings := make(map[string]string)
-
- settings["host"] = defaultHost()
- settings["port"] = "5432"
-
- // Default to the OS user name. Purposely ignoring err getting user name from
- // OS. The client application will simply have to specify the user in that
- // case (which they typically will be doing anyway).
- user, err := user.Current()
- appData := os.Getenv("APPDATA")
- if err == nil {
- // Windows gives us the username here as `DOMAIN\user` or `LOCALPCNAME\user`,
- // but the libpq default is just the `user` portion, so we strip off the first part.
- username := user.Username
- if strings.Contains(username, "\\") {
- username = username[strings.LastIndex(username, "\\")+1:]
- }
-
- settings["user"] = username
- settings["passfile"] = filepath.Join(appData, "postgresql", "pgpass.conf")
- settings["servicefile"] = filepath.Join(user.HomeDir, ".pg_service.conf")
- sslcert := filepath.Join(appData, "postgresql", "postgresql.crt")
- sslkey := filepath.Join(appData, "postgresql", "postgresql.key")
- if _, err := os.Stat(sslcert); err == nil {
- if _, err := os.Stat(sslkey); err == nil {
- // Both the cert and key must be present to use them, or do not use either
- settings["sslcert"] = sslcert
- settings["sslkey"] = sslkey
- }
- }
- sslrootcert := filepath.Join(appData, "postgresql", "root.crt")
- if _, err := os.Stat(sslrootcert); err == nil {
- settings["sslrootcert"] = sslrootcert
- }
- }
-
- settings["target_session_attrs"] = "any"
-
- settings["min_read_buffer_size"] = "8192"
-
- return settings
-}
-
-// defaultHost attempts to mimic libpq's default host. libpq uses the default unix socket location on *nix and localhost
-// on Windows. The default socket location is compiled into libpq. Since pgx does not have access to that default it
-// checks the existence of common locations.
-func defaultHost() string {
- return "localhost"
-}
diff --git a/vendor/github.com/jackc/pgconn/doc.go b/vendor/github.com/jackc/pgconn/doc.go
deleted file mode 100644
index cde58cd89..000000000
--- a/vendor/github.com/jackc/pgconn/doc.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Package pgconn is a low-level PostgreSQL database driver.
-/*
-pgconn provides lower level access to a PostgreSQL connection than a database/sql or pgx connection. It operates at
-nearly the same level is the C library libpq.
-
-Establishing a Connection
-
-Use Connect to establish a connection. It accepts a connection string in URL or DSN and will read the environment for
-libpq style environment variables.
-
-Executing a Query
-
-ExecParams and ExecPrepared execute a single query. They return readers that iterate over each row. The Read method
-reads all rows into memory.
-
-Executing Multiple Queries in a Single Round Trip
-
-Exec and ExecBatch can execute multiple queries in a single round trip. They return readers that iterate over each query
-result. The ReadAll method reads all query results into memory.
-
-Context Support
-
-All potentially blocking operations take a context.Context. If a context is canceled while the method is in progress the
-method immediately returns. In most circumstances, this will close the underlying connection.
-
-The CancelRequest method may be used to request the PostgreSQL server cancel an in-progress query without forcing the
-client to abort.
-*/
-package pgconn
diff --git a/vendor/github.com/jackc/pgconn/errors.go b/vendor/github.com/jackc/pgconn/errors.go
deleted file mode 100644
index 66d35584a..000000000
--- a/vendor/github.com/jackc/pgconn/errors.go
+++ /dev/null
@@ -1,238 +0,0 @@
-package pgconn
-
-import (
- "context"
- "errors"
- "fmt"
- "net"
- "net/url"
- "regexp"
- "strings"
-)
-
-// SafeToRetry checks if the err is guaranteed to have occurred before sending any data to the server.
-func SafeToRetry(err error) bool {
- if e, ok := err.(interface{ SafeToRetry() bool }); ok {
- return e.SafeToRetry()
- }
- return false
-}
-
-// Timeout checks if err was was caused by a timeout. To be specific, it is true if err was caused within pgconn by a
-// context.Canceled, context.DeadlineExceeded or an implementer of net.Error where Timeout() is true.
-func Timeout(err error) bool {
- var timeoutErr *errTimeout
- return errors.As(err, &timeoutErr)
-}
-
-// PgError represents an error reported by the PostgreSQL server. See
-// http://www.postgresql.org/docs/11/static/protocol-error-fields.html for
-// detailed field description.
-type PgError struct {
- Severity string
- Code string
- Message string
- Detail string
- Hint string
- Position int32
- InternalPosition int32
- InternalQuery string
- Where string
- SchemaName string
- TableName string
- ColumnName string
- DataTypeName string
- ConstraintName string
- File string
- Line int32
- Routine string
-}
-
-func (pe *PgError) Error() string {
- return pe.Severity + ": " + pe.Message + " (SQLSTATE " + pe.Code + ")"
-}
-
-// SQLState returns the SQLState of the error.
-func (pe *PgError) SQLState() string {
- return pe.Code
-}
-
-type connectError struct {
- config *Config
- msg string
- err error
-}
-
-func (e *connectError) Error() string {
- 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)
- if e.err != nil {
- fmt.Fprintf(sb, " (%s)", e.err.Error())
- }
- return sb.String()
-}
-
-func (e *connectError) Unwrap() error {
- return e.err
-}
-
-type connLockError struct {
- status string
-}
-
-func (e *connLockError) SafeToRetry() bool {
- return true // a lock failure by definition happens before the connection is used.
-}
-
-func (e *connLockError) Error() string {
- return e.status
-}
-
-type parseConfigError struct {
- connString string
- msg string
- err error
-}
-
-func (e *parseConfigError) Error() string {
- connString := redactPW(e.connString)
- if e.err == nil {
- return fmt.Sprintf("cannot parse `%s`: %s", connString, e.msg)
- }
- return fmt.Sprintf("cannot parse `%s`: %s (%s)", connString, e.msg, e.err.Error())
-}
-
-func (e *parseConfigError) Unwrap() error {
- return e.err
-}
-
-// preferContextOverNetTimeoutError returns ctx.Err() if ctx.Err() is present and err is a net.Error with Timeout() ==
-// true. Otherwise returns err.
-func preferContextOverNetTimeoutError(ctx context.Context, err error) error {
- if err, ok := err.(net.Error); ok && err.Timeout() && ctx.Err() != nil {
- return &errTimeout{err: ctx.Err()}
- }
- return err
-}
-
-type pgconnError struct {
- msg string
- err error
- safeToRetry bool
-}
-
-func (e *pgconnError) Error() string {
- if e.msg == "" {
- return e.err.Error()
- }
- if e.err == nil {
- return e.msg
- }
- return fmt.Sprintf("%s: %s", e.msg, e.err.Error())
-}
-
-func (e *pgconnError) SafeToRetry() bool {
- return e.safeToRetry
-}
-
-func (e *pgconnError) Unwrap() error {
- return e.err
-}
-
-// errTimeout occurs when an error was caused by a timeout. Specifically, it wraps an error which is
-// context.Canceled, context.DeadlineExceeded, or an implementer of net.Error where Timeout() is true.
-type errTimeout struct {
- err error
-}
-
-func (e *errTimeout) Error() string {
- return fmt.Sprintf("timeout: %s", e.err.Error())
-}
-
-func (e *errTimeout) SafeToRetry() bool {
- return SafeToRetry(e.err)
-}
-
-func (e *errTimeout) Unwrap() error {
- return e.err
-}
-
-type contextAlreadyDoneError struct {
- err error
-}
-
-func (e *contextAlreadyDoneError) Error() string {
- return fmt.Sprintf("context already done: %s", e.err.Error())
-}
-
-func (e *contextAlreadyDoneError) SafeToRetry() bool {
- return true
-}
-
-func (e *contextAlreadyDoneError) Unwrap() error {
- return e.err
-}
-
-// newContextAlreadyDoneError double-wraps a context error in `contextAlreadyDoneError` and `errTimeout`.
-func newContextAlreadyDoneError(ctx context.Context) (err error) {
- return &errTimeout{&contextAlreadyDoneError{err: ctx.Err()}}
-}
-
-type writeError struct {
- err error
- safeToRetry bool
-}
-
-func (e *writeError) Error() string {
- return fmt.Sprintf("write failed: %s", e.err.Error())
-}
-
-func (e *writeError) SafeToRetry() bool {
- return e.safeToRetry
-}
-
-func (e *writeError) Unwrap() error {
- return e.err
-}
-
-func redactPW(connString string) string {
- if strings.HasPrefix(connString, "postgres://") || strings.HasPrefix(connString, "postgresql://") {
- if u, err := url.Parse(connString); err == nil {
- return redactURL(u)
- }
- }
- quotedDSN := regexp.MustCompile(`password='[^']*'`)
- connString = quotedDSN.ReplaceAllLiteralString(connString, "password=xxxxx")
- plainDSN := regexp.MustCompile(`password=[^ ]*`)
- connString = plainDSN.ReplaceAllLiteralString(connString, "password=xxxxx")
- brokenURL := regexp.MustCompile(`:[^:@]+?@`)
- connString = brokenURL.ReplaceAllLiteralString(connString, ":xxxxxx@")
- return connString
-}
-
-func redactURL(u *url.URL) string {
- if u == nil {
- return ""
- }
- if _, pwSet := u.User.Password(); pwSet {
- u.User = url.UserPassword(u.User.Username(), "xxxxx")
- }
- return u.String()
-}
-
-type NotPreferredError struct {
- err error
- safeToRetry bool
-}
-
-func (e *NotPreferredError) Error() string {
- return fmt.Sprintf("standby server not found: %s", e.err.Error())
-}
-
-func (e *NotPreferredError) SafeToRetry() bool {
- return e.safeToRetry
-}
-
-func (e *NotPreferredError) Unwrap() error {
- return e.err
-}
diff --git a/vendor/github.com/jackc/pgconn/internal/ctxwatch/context_watcher.go b/vendor/github.com/jackc/pgconn/internal/ctxwatch/context_watcher.go
deleted file mode 100644
index b39cb3ee5..000000000
--- a/vendor/github.com/jackc/pgconn/internal/ctxwatch/context_watcher.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package ctxwatch
-
-import (
- "context"
- "sync"
-)
-
-// ContextWatcher watches a context and performs an action when the context is canceled. It can watch one context at a
-// time.
-type ContextWatcher struct {
- onCancel func()
- onUnwatchAfterCancel func()
- unwatchChan chan struct{}
-
- lock sync.Mutex
- watchInProgress bool
- onCancelWasCalled bool
-}
-
-// NewContextWatcher returns a ContextWatcher. onCancel will be called when a watched context is canceled.
-// OnUnwatchAfterCancel will be called when Unwatch is called and the watched context had already been canceled and
-// onCancel called.
-func NewContextWatcher(onCancel func(), onUnwatchAfterCancel func()) *ContextWatcher {
- cw := &ContextWatcher{
- onCancel: onCancel,
- onUnwatchAfterCancel: onUnwatchAfterCancel,
- unwatchChan: make(chan struct{}),
- }
-
- return cw
-}
-
-// Watch starts watching ctx. If ctx is canceled then the onCancel function passed to NewContextWatcher will be called.
-func (cw *ContextWatcher) Watch(ctx context.Context) {
- cw.lock.Lock()
- defer cw.lock.Unlock()
-
- if cw.watchInProgress {
- panic("Watch already in progress")
- }
-
- cw.onCancelWasCalled = false
-
- if ctx.Done() != nil {
- cw.watchInProgress = true
- go func() {
- select {
- case <-ctx.Done():
- cw.onCancel()
- cw.onCancelWasCalled = true
- <-cw.unwatchChan
- case <-cw.unwatchChan:
- }
- }()
- } else {
- cw.watchInProgress = false
- }
-}
-
-// Unwatch stops watching the previously watched context. If the onCancel function passed to NewContextWatcher was
-// called then onUnwatchAfterCancel will also be called.
-func (cw *ContextWatcher) Unwatch() {
- cw.lock.Lock()
- defer cw.lock.Unlock()
-
- if cw.watchInProgress {
- cw.unwatchChan <- struct{}{}
- if cw.onCancelWasCalled {
- cw.onUnwatchAfterCancel()
- }
- cw.watchInProgress = false
- }
-}
diff --git a/vendor/github.com/jackc/pgconn/krb5.go b/vendor/github.com/jackc/pgconn/krb5.go
deleted file mode 100644
index 08427b8e6..000000000
--- a/vendor/github.com/jackc/pgconn/krb5.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package pgconn
-
-import (
- "errors"
- "fmt"
-
- "github.com/jackc/pgproto3/v2"
-)
-
-// NewGSSFunc creates a GSS authentication provider, for use with
-// RegisterGSSProvider.
-type NewGSSFunc func() (GSS, error)
-
-var newGSS NewGSSFunc
-
-// RegisterGSSProvider registers a GSS authentication provider. For example, if
-// you need to use Kerberos to authenticate with your server, add this to your
-// main package:
-//
-// import "github.com/otan/gopgkrb5"
-//
-// func init() {
-// pgconn.RegisterGSSProvider(func() (pgconn.GSS, error) { return gopgkrb5.NewGSS() })
-// }
-func RegisterGSSProvider(newGSSArg NewGSSFunc) {
- newGSS = newGSSArg
-}
-
-// GSS provides GSSAPI authentication (e.g., Kerberos).
-type GSS interface {
- GetInitToken(host string, service string) ([]byte, error)
- GetInitTokenFromSPN(spn string) ([]byte, error)
- Continue(inToken []byte) (done bool, outToken []byte, err error)
-}
-
-func (c *PgConn) gssAuth() error {
- if newGSS == nil {
- return errors.New("kerberos error: no GSSAPI provider registered, see https://github.com/otan/gopgkrb5")
- }
- cli, err := newGSS()
- if err != nil {
- return err
- }
-
- var nextData []byte
- if c.config.KerberosSpn != "" {
- // Use the supplied SPN if provided.
- nextData, err = cli.GetInitTokenFromSPN(c.config.KerberosSpn)
- } else {
- // Allow the kerberos service name to be overridden
- service := "postgres"
- if c.config.KerberosSrvName != "" {
- service = c.config.KerberosSrvName
- }
- nextData, err = cli.GetInitToken(c.config.Host, service)
- }
- if err != nil {
- return err
- }
-
- for {
- gssResponse := &pgproto3.GSSResponse{
- Data: nextData,
- }
- _, err = c.conn.Write(gssResponse.Encode(nil))
- if err != nil {
- return err
- }
- resp, err := c.rxGSSContinue()
- if err != nil {
- return err
- }
- var done bool
- done, nextData, err = cli.Continue(resp.Data)
- if err != nil {
- return err
- }
- if done {
- break
- }
- }
- return nil
-}
-
-func (c *PgConn) rxGSSContinue() (*pgproto3.AuthenticationGSSContinue, error) {
- msg, err := c.receiveMessage()
- if err != nil {
- return nil, err
- }
-
- switch m := msg.(type) {
- case *pgproto3.AuthenticationGSSContinue:
- return m, nil
- case *pgproto3.ErrorResponse:
- return nil, ErrorResponseToPgError(m)
- }
-
- return nil, fmt.Errorf("expected AuthenticationGSSContinue message but received unexpected message %T", msg)
-}
diff --git a/vendor/github.com/jackc/pgconn/pgconn.go b/vendor/github.com/jackc/pgconn/pgconn.go
deleted file mode 100644
index e53130306..000000000
--- a/vendor/github.com/jackc/pgconn/pgconn.go
+++ /dev/null
@@ -1,1774 +0,0 @@
-package pgconn
-
-import (
- "context"
- "crypto/md5"
- "crypto/tls"
- "encoding/binary"
- "encoding/hex"
- "errors"
- "fmt"
- "io"
- "math"
- "net"
- "strconv"
- "strings"
- "sync"
- "time"
-
- "github.com/jackc/pgconn/internal/ctxwatch"
- "github.com/jackc/pgio"
- "github.com/jackc/pgproto3/v2"
-)
-
-const (
- connStatusUninitialized = iota
- connStatusConnecting
- connStatusClosed
- connStatusIdle
- connStatusBusy
-)
-
-const wbufLen = 1024
-
-// Notice represents a notice response message reported by the PostgreSQL server. Be aware that this is distinct from
-// LISTEN/NOTIFY notification.
-type Notice PgError
-
-// Notification is a message received from the PostgreSQL LISTEN/NOTIFY system
-type Notification struct {
- PID uint32 // backend pid that sent the notification
- Channel string // channel from which notification was received
- Payload string
-}
-
-// DialFunc is a function that can be used to connect to a PostgreSQL server.
-type DialFunc func(ctx context.Context, network, addr string) (net.Conn, error)
-
-// LookupFunc is a function that can be used to lookup IPs addrs from host. Optionally an ip:port combination can be
-// returned in order to override the connection string's port.
-type LookupFunc func(ctx context.Context, host string) (addrs []string, err error)
-
-// BuildFrontendFunc is a function that can be used to create Frontend implementation for connection.
-type BuildFrontendFunc func(r io.Reader, w io.Writer) Frontend
-
-// 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
-// of the notice, but it must not invoke any query method. Be aware that this is distinct from LISTEN/NOTIFY
-// notification.
-type NoticeHandler func(*PgConn, *Notice)
-
-// NotificationHandler is a function that can handle notifications received from the PostgreSQL server. Notifications
-// 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 of the notice, but it must not invoke any query method. Be aware that this is distinct from a
-// notice event.
-type NotificationHandler func(*PgConn, *Notification)
-
-// Frontend used to receive messages from backend.
-type Frontend interface {
- Receive() (pgproto3.BackendMessage, error)
-}
-
-// PgConn is a low-level PostgreSQL connection handle. It is not safe for concurrent usage.
-type PgConn struct {
- conn net.Conn // the underlying TCP or unix domain socket connection
- pid uint32 // backend pid
- secretKey uint32 // key to use to send a cancel query message to the server
- parameterStatuses map[string]string // parameters that have been reported by the server
- txStatus byte
- frontend Frontend
-
- config *Config
-
- status byte // One of connStatus* constants
-
- bufferingReceive bool
- bufferingReceiveMux sync.Mutex
- bufferingReceiveMsg pgproto3.BackendMessage
- bufferingReceiveErr error
-
- peekedMsg pgproto3.BackendMessage
-
- // Reusable / preallocated resources
- wbuf []byte // write buffer
- resultReader ResultReader
- multiResultReader MultiResultReader
- contextWatcher *ctxwatch.ContextWatcher
-
- cleanupDone chan struct{}
-}
-
-// Connect establishes a connection to a PostgreSQL server using the environment and connString (in URL or DSN format)
-// to provide configuration. See documentation for ParseConfig for details. ctx can be used to cancel a connect attempt.
-func Connect(ctx context.Context, connString string) (*PgConn, error) {
- config, err := ParseConfig(connString)
- if err != nil {
- return nil, err
- }
-
- return ConnectConfig(ctx, config)
-}
-
-// Connect establishes a connection to a PostgreSQL server using the environment and connString (in URL or DSN format)
-// and ParseConfigOptions to provide additional configuration. See documentation for ParseConfig for details. ctx can be
-// used to cancel a connect attempt.
-func ConnectWithOptions(ctx context.Context, connString string, parseConfigOptions ParseConfigOptions) (*PgConn, error) {
- config, err := ParseConfigWithOptions(connString, parseConfigOptions)
- if err != nil {
- return nil, err
- }
-
- return ConnectConfig(ctx, config)
-}
-
-// Connect establishes a connection to a PostgreSQL server using config. config must have been constructed with
-// ParseConfig. ctx can be used to cancel a connect attempt.
-//
-// If config.Fallbacks are present they will sequentially be tried in case of error establishing network connection. An
-// authentication error will terminate the chain of attempts (like libpq:
-// https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-MULTIPLE-HOSTS) and be returned as the error. Otherwise,
-// if all attempts fail the last error is returned.
-func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err error) {
- // Default values are set in ParseConfig. Enforce initial creation by ParseConfig rather than setting defaults from
- // zero values.
- if !config.createdByParseConfig {
- panic("config must be created by ParseConfig")
- }
-
- // Simplify usage by treating primary config and fallbacks the same.
- fallbackConfigs := []*FallbackConfig{
- {
- Host: config.Host,
- Port: config.Port,
- TLSConfig: config.TLSConfig,
- },
- }
- fallbackConfigs = append(fallbackConfigs, config.Fallbacks...)
- ctx := octx
- fallbackConfigs, err = expandWithIPs(ctx, config.LookupFunc, fallbackConfigs)
- if err != nil {
- return nil, &connectError{config: config, msg: "hostname resolving error", err: err}
- }
-
- if len(fallbackConfigs) == 0 {
- return nil, &connectError{config: config, msg: "hostname resolving error", err: errors.New("ip addr wasn't found")}
- }
-
- foundBestServer := false
- var fallbackConfig *FallbackConfig
- for i, fc := range fallbackConfigs {
- // ConnectTimeout restricts the whole connection process.
- if config.ConnectTimeout != 0 {
- // create new context first time or when previous host was different
- if i == 0 || (fallbackConfigs[i].Host != fallbackConfigs[i-1].Host) {
- var cancel context.CancelFunc
- ctx, cancel = context.WithTimeout(octx, config.ConnectTimeout)
- defer cancel()
- }
- } else {
- ctx = octx
- }
- pgConn, err = connect(ctx, config, fc, false)
- if err == nil {
- foundBestServer = true
- break
- } else if pgerr, ok := err.(*PgError); ok {
- err = &connectError{config: config, msg: "server error", err: pgerr}
- const ERRCODE_INVALID_PASSWORD = "28P01" // wrong password
- 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_INSUFFICIENT_PRIVILEGE = "42501" // missing connect privilege
- if pgerr.Code == ERRCODE_INVALID_PASSWORD ||
- pgerr.Code == ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION && fc.TLSConfig != nil ||
- pgerr.Code == ERRCODE_INVALID_CATALOG_NAME ||
- pgerr.Code == ERRCODE_INSUFFICIENT_PRIVILEGE {
- break
- }
- } else if cerr, ok := err.(*connectError); ok {
- if _, ok := cerr.err.(*NotPreferredError); ok {
- fallbackConfig = fc
- }
- }
- }
-
- if !foundBestServer && fallbackConfig != nil {
- pgConn, err = connect(ctx, config, fallbackConfig, true)
- if pgerr, ok := err.(*PgError); ok {
- err = &connectError{config: config, msg: "server error", err: pgerr}
- }
- }
-
- if err != nil {
- return nil, err // no need to wrap in connectError because it will already be wrapped in all cases except PgError
- }
-
- if config.AfterConnect != nil {
- err := config.AfterConnect(ctx, pgConn)
- if err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "AfterConnect error", err: err}
- }
- }
-
- return pgConn, nil
-}
-
-func expandWithIPs(ctx context.Context, lookupFn LookupFunc, fallbacks []*FallbackConfig) ([]*FallbackConfig, error) {
- var configs []*FallbackConfig
-
- for _, fb := range fallbacks {
- // skip resolve for unix sockets
- if isAbsolutePath(fb.Host) {
- configs = append(configs, &FallbackConfig{
- Host: fb.Host,
- Port: fb.Port,
- TLSConfig: fb.TLSConfig,
- })
-
- continue
- }
-
- ips, err := lookupFn(ctx, fb.Host)
- if err != nil {
- return nil, err
- }
-
- for _, ip := range ips {
- splitIP, splitPort, err := net.SplitHostPort(ip)
- if err == nil {
- port, err := strconv.ParseUint(splitPort, 10, 16)
- if err != nil {
- return nil, fmt.Errorf("error parsing port (%s) from lookup: %w", splitPort, err)
- }
- configs = append(configs, &FallbackConfig{
- Host: splitIP,
- Port: uint16(port),
- TLSConfig: fb.TLSConfig,
- })
- } else {
- configs = append(configs, &FallbackConfig{
- Host: ip,
- Port: fb.Port,
- TLSConfig: fb.TLSConfig,
- })
- }
- }
- }
-
- return configs, nil
-}
-
-func connect(ctx context.Context, config *Config, fallbackConfig *FallbackConfig,
- ignoreNotPreferredErr bool) (*PgConn, error) {
- pgConn := new(PgConn)
- pgConn.config = config
- pgConn.wbuf = make([]byte, 0, wbufLen)
- pgConn.cleanupDone = make(chan struct{})
-
- var err error
- network, address := NetworkAddress(fallbackConfig.Host, fallbackConfig.Port)
- netConn, err := config.DialFunc(ctx, network, address)
- if err != nil {
- var netErr net.Error
- if errors.As(err, &netErr) && netErr.Timeout() {
- err = &errTimeout{err: err}
- }
- return nil, &connectError{config: config, msg: "dial error", err: err}
- }
-
- pgConn.conn = netConn
- pgConn.contextWatcher = newContextWatcher(netConn)
- pgConn.contextWatcher.Watch(ctx)
-
- if fallbackConfig.TLSConfig != nil {
- tlsConn, err := startTLS(netConn, fallbackConfig.TLSConfig)
- pgConn.contextWatcher.Unwatch() // Always unwatch `netConn` after TLS.
- if err != nil {
- netConn.Close()
- return nil, &connectError{config: config, msg: "tls error", err: err}
- }
-
- pgConn.conn = tlsConn
- pgConn.contextWatcher = newContextWatcher(tlsConn)
- pgConn.contextWatcher.Watch(ctx)
- }
-
- defer pgConn.contextWatcher.Unwatch()
-
- pgConn.parameterStatuses = make(map[string]string)
- pgConn.status = connStatusConnecting
- pgConn.frontend = config.BuildFrontend(pgConn.conn, pgConn.conn)
-
- startupMsg := pgproto3.StartupMessage{
- ProtocolVersion: pgproto3.ProtocolVersionNumber,
- Parameters: make(map[string]string),
- }
-
- // Copy default run-time params
- for k, v := range config.RuntimeParams {
- startupMsg.Parameters[k] = v
- }
-
- startupMsg.Parameters["user"] = config.User
- if config.Database != "" {
- startupMsg.Parameters["database"] = config.Database
- }
-
- if _, err := pgConn.conn.Write(startupMsg.Encode(pgConn.wbuf)); err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "failed to write startup message", err: err}
- }
-
- for {
- msg, err := pgConn.receiveMessage()
- if err != nil {
- pgConn.conn.Close()
- if err, ok := err.(*PgError); ok {
- return nil, err
- }
- return nil, &connectError{config: config, msg: "failed to receive message", err: preferContextOverNetTimeoutError(ctx, err)}
- }
-
- switch msg := msg.(type) {
- case *pgproto3.BackendKeyData:
- pgConn.pid = msg.ProcessID
- pgConn.secretKey = msg.SecretKey
-
- case *pgproto3.AuthenticationOk:
- case *pgproto3.AuthenticationCleartextPassword:
- err = pgConn.txPasswordMessage(pgConn.config.Password)
- if err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "failed to write password message", err: err}
- }
- case *pgproto3.AuthenticationMD5Password:
- digestedPassword := "md5" + hexMD5(hexMD5(pgConn.config.Password+pgConn.config.User)+string(msg.Salt[:]))
- err = pgConn.txPasswordMessage(digestedPassword)
- if err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "failed to write password message", err: err}
- }
- case *pgproto3.AuthenticationSASL:
- err = pgConn.scramAuth(msg.AuthMechanisms)
- if err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "failed SASL auth", err: err}
- }
- case *pgproto3.AuthenticationGSS:
- err = pgConn.gssAuth()
- if err != nil {
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "failed GSS auth", err: err}
- }
- case *pgproto3.ReadyForQuery:
- pgConn.status = connStatusIdle
- if config.ValidateConnect != nil {
- // ValidateConnect may execute commands that cause the context to be watched again. Unwatch first to avoid
- // the watch already in progress panic. This is that last thing done by this method so there is no need to
- // restart the watch after ValidateConnect returns.
- //
- // See https://github.com/jackc/pgconn/issues/40.
- pgConn.contextWatcher.Unwatch()
-
- err := config.ValidateConnect(ctx, pgConn)
- if err != nil {
- if _, ok := err.(*NotPreferredError); ignoreNotPreferredErr && ok {
- return pgConn, nil
- }
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "ValidateConnect failed", err: err}
- }
- }
- return pgConn, nil
- case *pgproto3.ParameterStatus, *pgproto3.NoticeResponse:
- // handled by ReceiveMessage
- case *pgproto3.ErrorResponse:
- pgConn.conn.Close()
- return nil, ErrorResponseToPgError(msg)
- default:
- pgConn.conn.Close()
- return nil, &connectError{config: config, msg: "received unexpected message", err: err}
- }
- }
-}
-
-func newContextWatcher(conn net.Conn) *ctxwatch.ContextWatcher {
- return ctxwatch.NewContextWatcher(
- func() { conn.SetDeadline(time.Date(1, 1, 1, 1, 1, 1, 1, time.UTC)) },
- func() { conn.SetDeadline(time.Time{}) },
- )
-}
-
-func startTLS(conn net.Conn, tlsConfig *tls.Config) (net.Conn, error) {
- err := binary.Write(conn, binary.BigEndian, []int32{8, 80877103})
- if err != nil {
- return nil, err
- }
-
- response := make([]byte, 1)
- if _, err = io.ReadFull(conn, response); err != nil {
- return nil, err
- }
-
- if response[0] != 'S' {
- return nil, errors.New("server refused TLS connection")
- }
-
- return tls.Client(conn, tlsConfig), nil
-}
-
-func (pgConn *PgConn) txPasswordMessage(password string) (err error) {
- msg := &pgproto3.PasswordMessage{Password: password}
- _, err = pgConn.conn.Write(msg.Encode(pgConn.wbuf))
- return err
-}
-
-func hexMD5(s string) string {
- hash := md5.New()
- io.WriteString(hash, s)
- return hex.EncodeToString(hash.Sum(nil))
-}
-
-func (pgConn *PgConn) signalMessage() chan struct{} {
- if pgConn.bufferingReceive {
- panic("BUG: signalMessage when already in progress")
- }
-
- pgConn.bufferingReceive = true
- pgConn.bufferingReceiveMux.Lock()
-
- ch := make(chan struct{})
- go func() {
- pgConn.bufferingReceiveMsg, pgConn.bufferingReceiveErr = pgConn.frontend.Receive()
- pgConn.bufferingReceiveMux.Unlock()
- close(ch)
- }()
-
- return ch
-}
-
-// SendBytes sends buf to the PostgreSQL server. It must only be used when the connection is not busy. e.g. It is as
-// error to call SendBytes while reading the result of a query.
-//
-// This is a very low level method that requires deep understanding of the PostgreSQL wire protocol to use correctly.
-// See https://www.postgresql.org/docs/current/protocol.html.
-func (pgConn *PgConn) SendBytes(ctx context.Context, buf []byte) error {
- if err := pgConn.lock(); err != nil {
- return err
- }
- defer pgConn.unlock()
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- return newContextAlreadyDoneError(ctx)
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- return &writeError{err: err, safeToRetry: n == 0}
- }
-
- return nil
-}
-
-// ReceiveMessage receives one wire protocol message from the PostgreSQL server. It must only be used when the
-// connection is not busy. e.g. It is an error to call ReceiveMessage while reading the result of a query. The messages
-// are still handled by the core pgconn message handling system so receiving a NotificationResponse will still trigger
-// the OnNotification callback.
-//
-// This is a very low level method that requires deep understanding of the PostgreSQL wire protocol to use correctly.
-// See https://www.postgresql.org/docs/current/protocol.html.
-func (pgConn *PgConn) ReceiveMessage(ctx context.Context) (pgproto3.BackendMessage, error) {
- if err := pgConn.lock(); err != nil {
- return nil, err
- }
- defer pgConn.unlock()
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- return nil, newContextAlreadyDoneError(ctx)
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- msg, err := pgConn.receiveMessage()
- if err != nil {
- err = &pgconnError{
- msg: "receive message failed",
- err: preferContextOverNetTimeoutError(ctx, err),
- safeToRetry: true}
- }
- return msg, err
-}
-
-// peekMessage peeks at the next message without setting up context cancellation.
-func (pgConn *PgConn) peekMessage() (pgproto3.BackendMessage, error) {
- if pgConn.peekedMsg != nil {
- return pgConn.peekedMsg, nil
- }
-
- var msg pgproto3.BackendMessage
- var err error
- if pgConn.bufferingReceive {
- pgConn.bufferingReceiveMux.Lock()
- msg = pgConn.bufferingReceiveMsg
- err = pgConn.bufferingReceiveErr
- pgConn.bufferingReceiveMux.Unlock()
- pgConn.bufferingReceive = false
-
- // If a timeout error happened in the background try the read again.
- var netErr net.Error
- if errors.As(err, &netErr) && netErr.Timeout() {
- msg, err = pgConn.frontend.Receive()
- }
- } else {
- msg, err = pgConn.frontend.Receive()
- }
-
- if err != nil {
- // Close on anything other than timeout error - everything else is fatal
- var netErr net.Error
- isNetErr := errors.As(err, &netErr)
- if !(isNetErr && netErr.Timeout()) {
- pgConn.asyncClose()
- }
-
- return nil, err
- }
-
- pgConn.peekedMsg = msg
- return msg, nil
-}
-
-// receiveMessage receives a message without setting up context cancellation
-func (pgConn *PgConn) receiveMessage() (pgproto3.BackendMessage, error) {
- msg, err := pgConn.peekMessage()
- if err != nil {
- // Close on anything other than timeout error - everything else is fatal
- var netErr net.Error
- isNetErr := errors.As(err, &netErr)
- if !(isNetErr && netErr.Timeout()) {
- pgConn.asyncClose()
- }
-
- return nil, err
- }
- pgConn.peekedMsg = nil
-
- switch msg := msg.(type) {
- case *pgproto3.ReadyForQuery:
- pgConn.txStatus = msg.TxStatus
- case *pgproto3.ParameterStatus:
- pgConn.parameterStatuses[msg.Name] = msg.Value
- case *pgproto3.ErrorResponse:
- if msg.Severity == "FATAL" {
- pgConn.status = connStatusClosed
- pgConn.conn.Close() // Ignore error as the connection is already broken and there is already an error to return.
- close(pgConn.cleanupDone)
- return nil, ErrorResponseToPgError(msg)
- }
- case *pgproto3.NoticeResponse:
- if pgConn.config.OnNotice != nil {
- pgConn.config.OnNotice(pgConn, noticeResponseToNotice(msg))
- }
- case *pgproto3.NotificationResponse:
- if pgConn.config.OnNotification != nil {
- pgConn.config.OnNotification(pgConn, &Notification{PID: msg.PID, Channel: msg.Channel, Payload: msg.Payload})
- }
- }
-
- return msg, nil
-}
-
-// Conn returns the underlying net.Conn.
-func (pgConn *PgConn) Conn() net.Conn {
- return pgConn.conn
-}
-
-// PID returns the backend PID.
-func (pgConn *PgConn) PID() uint32 {
- return pgConn.pid
-}
-
-// TxStatus returns the current TxStatus as reported by the server in the ReadyForQuery message.
-//
-// Possible return values:
-//
-// 'I' - idle / not in transaction
-// 'T' - in a transaction
-// 'E' - in a failed transaction
-//
-// See https://www.postgresql.org/docs/current/protocol-message-formats.html.
-func (pgConn *PgConn) TxStatus() byte {
- return pgConn.txStatus
-}
-
-// SecretKey returns the backend secret key used to send a cancel query message to the server.
-func (pgConn *PgConn) SecretKey() uint32 {
- return pgConn.secretKey
-}
-
-// Close closes a connection. It is safe to call Close on a already closed connection. Close attempts a clean close by
-// sending the exit message to PostgreSQL. However, this could block so ctx is available to limit the time to wait. The
-// underlying net.Conn.Close() will always be called regardless of any other errors.
-func (pgConn *PgConn) Close(ctx context.Context) error {
- if pgConn.status == connStatusClosed {
- return nil
- }
- pgConn.status = connStatusClosed
-
- defer close(pgConn.cleanupDone)
- defer pgConn.conn.Close()
-
- if ctx != context.Background() {
- // Close may be called while a cancellable query is in progress. This will most often be triggered by panic when
- // a defer closes the connection (possibly indirectly via a transaction or a connection pool). Unwatch to end any
- // previous watch. It is safe to Unwatch regardless of whether a watch is already is progress.
- //
- // See https://github.com/jackc/pgconn/issues/29
- pgConn.contextWatcher.Unwatch()
-
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- // Ignore any errors sending Terminate message and waiting for server to close connection.
- // This mimics the behavior of libpq PQfinish. It calls closePGconn which calls sendTerminateConn which purposefully
- // ignores errors.
- //
- // See https://github.com/jackc/pgx/issues/637
- pgConn.conn.Write([]byte{'X', 0, 0, 0, 4})
-
- return pgConn.conn.Close()
-}
-
-// asyncClose marks the connection as closed and asynchronously sends a cancel query message and closes the underlying
-// connection.
-func (pgConn *PgConn) asyncClose() {
- if pgConn.status == connStatusClosed {
- return
- }
- pgConn.status = connStatusClosed
-
- go func() {
- defer close(pgConn.cleanupDone)
- defer pgConn.conn.Close()
-
- deadline := time.Now().Add(time.Second * 15)
-
- ctx, cancel := context.WithDeadline(context.Background(), deadline)
- defer cancel()
-
- pgConn.CancelRequest(ctx)
-
- pgConn.conn.SetDeadline(deadline)
-
- pgConn.conn.Write([]byte{'X', 0, 0, 0, 4})
- }()
-}
-
-// CleanupDone returns a channel that will be closed after all underlying resources have been cleaned up. A closed
-// connection is no longer usable, but underlying resources, in particular the net.Conn, may not have finished closing
-// yet. This is because certain errors such as a context cancellation require that the interrupted function call return
-// immediately, but the error may also cause the connection to be closed. In these cases the underlying resources are
-// closed asynchronously.
-//
-// This is only likely to be useful to connection pools. It gives them a way avoid establishing a new connection while
-// an old connection is still being cleaned up and thereby exceeding the maximum pool size.
-func (pgConn *PgConn) CleanupDone() chan (struct{}) {
- return pgConn.cleanupDone
-}
-
-// IsClosed reports if the connection has been closed.
-//
-// CleanupDone() can be used to determine if all cleanup has been completed.
-func (pgConn *PgConn) IsClosed() bool {
- return pgConn.status < connStatusIdle
-}
-
-// IsBusy reports if the connection is busy.
-func (pgConn *PgConn) IsBusy() bool {
- return pgConn.status == connStatusBusy
-}
-
-// lock locks the connection.
-func (pgConn *PgConn) lock() error {
- switch pgConn.status {
- case connStatusBusy:
- return &connLockError{status: "conn busy"} // This only should be possible in case of an application bug.
- case connStatusClosed:
- return &connLockError{status: "conn closed"}
- case connStatusUninitialized:
- return &connLockError{status: "conn uninitialized"}
- }
- pgConn.status = connStatusBusy
- return nil
-}
-
-func (pgConn *PgConn) unlock() {
- switch pgConn.status {
- case connStatusBusy:
- pgConn.status = connStatusIdle
- case connStatusClosed:
- default:
- panic("BUG: cannot unlock unlocked connection") // This should only be possible if there is a bug in this package.
- }
-}
-
-// ParameterStatus returns the value of a parameter reported by the server (e.g.
-// server_version). Returns an empty string for unknown parameters.
-func (pgConn *PgConn) ParameterStatus(key string) string {
- return pgConn.parameterStatuses[key]
-}
-
-// CommandTag is the result of an Exec function
-type CommandTag []byte
-
-// RowsAffected returns the number of rows affected. If the CommandTag was not
-// for a row affecting command (e.g. "CREATE TABLE") then it returns 0.
-func (ct CommandTag) RowsAffected() int64 {
- // Find last non-digit
- idx := -1
- for i := len(ct) - 1; i >= 0; i-- {
- if ct[i] >= '0' && ct[i] <= '9' {
- idx = i
- } else {
- break
- }
- }
-
- if idx == -1 {
- return 0
- }
-
- var n int64
- for _, b := range ct[idx:] {
- n = n*10 + int64(b-'0')
- }
-
- return n
-}
-
-func (ct CommandTag) String() string {
- return string(ct)
-}
-
-// Insert is true if the command tag starts with "INSERT".
-func (ct CommandTag) Insert() bool {
- return len(ct) >= 6 &&
- ct[0] == 'I' &&
- ct[1] == 'N' &&
- ct[2] == 'S' &&
- ct[3] == 'E' &&
- ct[4] == 'R' &&
- ct[5] == 'T'
-}
-
-// Update is true if the command tag starts with "UPDATE".
-func (ct CommandTag) Update() bool {
- return len(ct) >= 6 &&
- ct[0] == 'U' &&
- ct[1] == 'P' &&
- ct[2] == 'D' &&
- ct[3] == 'A' &&
- ct[4] == 'T' &&
- ct[5] == 'E'
-}
-
-// Delete is true if the command tag starts with "DELETE".
-func (ct CommandTag) Delete() bool {
- return len(ct) >= 6 &&
- ct[0] == 'D' &&
- ct[1] == 'E' &&
- ct[2] == 'L' &&
- ct[3] == 'E' &&
- ct[4] == 'T' &&
- ct[5] == 'E'
-}
-
-// Select is true if the command tag starts with "SELECT".
-func (ct CommandTag) Select() bool {
- return len(ct) >= 6 &&
- ct[0] == 'S' &&
- ct[1] == 'E' &&
- ct[2] == 'L' &&
- ct[3] == 'E' &&
- ct[4] == 'C' &&
- ct[5] == 'T'
-}
-
-type StatementDescription struct {
- Name string
- SQL string
- ParamOIDs []uint32
- Fields []pgproto3.FieldDescription
-}
-
-// Prepare creates a prepared statement. If the name is empty, the anonymous prepared statement will be used. This
-// allows Prepare to also to describe statements without creating a server-side prepared statement.
-func (pgConn *PgConn) Prepare(ctx context.Context, name, sql string, paramOIDs []uint32) (*StatementDescription, error) {
- if err := pgConn.lock(); err != nil {
- return nil, err
- }
- defer pgConn.unlock()
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- return nil, newContextAlreadyDoneError(ctx)
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- buf := pgConn.wbuf
- buf = (&pgproto3.Parse{Name: name, Query: sql, ParameterOIDs: paramOIDs}).Encode(buf)
- buf = (&pgproto3.Describe{ObjectType: 'S', Name: name}).Encode(buf)
- buf = (&pgproto3.Sync{}).Encode(buf)
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- return nil, &writeError{err: err, safeToRetry: n == 0}
- }
-
- psd := &StatementDescription{Name: name, SQL: sql}
-
- var parseErr error
-
-readloop:
- for {
- msg, err := pgConn.receiveMessage()
- if err != nil {
- pgConn.asyncClose()
- return nil, preferContextOverNetTimeoutError(ctx, err)
- }
-
- switch msg := msg.(type) {
- case *pgproto3.ParameterDescription:
- psd.ParamOIDs = make([]uint32, len(msg.ParameterOIDs))
- copy(psd.ParamOIDs, msg.ParameterOIDs)
- case *pgproto3.RowDescription:
- psd.Fields = make([]pgproto3.FieldDescription, len(msg.Fields))
- copy(psd.Fields, msg.Fields)
- case *pgproto3.ErrorResponse:
- parseErr = ErrorResponseToPgError(msg)
- case *pgproto3.ReadyForQuery:
- break readloop
- }
- }
-
- if parseErr != nil {
- return nil, parseErr
- }
- return psd, nil
-}
-
-// ErrorResponseToPgError converts a wire protocol error message to a *PgError.
-func ErrorResponseToPgError(msg *pgproto3.ErrorResponse) *PgError {
- return &PgError{
- Severity: msg.Severity,
- Code: string(msg.Code),
- Message: string(msg.Message),
- Detail: string(msg.Detail),
- Hint: msg.Hint,
- Position: msg.Position,
- InternalPosition: msg.InternalPosition,
- InternalQuery: string(msg.InternalQuery),
- Where: string(msg.Where),
- SchemaName: string(msg.SchemaName),
- TableName: string(msg.TableName),
- ColumnName: string(msg.ColumnName),
- DataTypeName: string(msg.DataTypeName),
- ConstraintName: msg.ConstraintName,
- File: string(msg.File),
- Line: msg.Line,
- Routine: string(msg.Routine),
- }
-}
-
-func noticeResponseToNotice(msg *pgproto3.NoticeResponse) *Notice {
- pgerr := ErrorResponseToPgError((*pgproto3.ErrorResponse)(msg))
- return (*Notice)(pgerr)
-}
-
-// CancelRequest sends a cancel request to the PostgreSQL server. It returns an error if unable to deliver the cancel
-// request, but lack of an error does not ensure that the query was canceled. As specified in the documentation, there
-// is no way to be sure a query was canceled. See https://www.postgresql.org/docs/11/protocol-flow.html#id-1.10.5.7.9
-func (pgConn *PgConn) CancelRequest(ctx context.Context) error {
- // Open a cancellation request to the same server. The address is taken from the net.Conn directly instead of reusing
- // the connection config. This is important in high availability configurations where fallback connections may be
- // specified or DNS may be used to load balance.
- serverAddr := pgConn.conn.RemoteAddr()
- cancelConn, err := pgConn.config.DialFunc(ctx, serverAddr.Network(), serverAddr.String())
- if err != nil {
- return err
- }
- defer cancelConn.Close()
-
- if ctx != context.Background() {
- contextWatcher := ctxwatch.NewContextWatcher(
- func() { cancelConn.SetDeadline(time.Date(1, 1, 1, 1, 1, 1, 1, time.UTC)) },
- func() { cancelConn.SetDeadline(time.Time{}) },
- )
- contextWatcher.Watch(ctx)
- defer contextWatcher.Unwatch()
- }
-
- buf := make([]byte, 16)
- binary.BigEndian.PutUint32(buf[0:4], 16)
- binary.BigEndian.PutUint32(buf[4:8], 80877102)
- binary.BigEndian.PutUint32(buf[8:12], uint32(pgConn.pid))
- binary.BigEndian.PutUint32(buf[12:16], uint32(pgConn.secretKey))
- _, err = cancelConn.Write(buf)
- if err != nil {
- return err
- }
-
- _, err = cancelConn.Read(buf)
- if err != io.EOF {
- return err
- }
-
- return nil
-}
-
-// WaitForNotification waits for a LISTON/NOTIFY message to be received. It returns an error if a notification was not
-// received.
-func (pgConn *PgConn) WaitForNotification(ctx context.Context) error {
- if err := pgConn.lock(); err != nil {
- return err
- }
- defer pgConn.unlock()
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- return newContextAlreadyDoneError(ctx)
- default:
- }
-
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- for {
- msg, err := pgConn.receiveMessage()
- if err != nil {
- return preferContextOverNetTimeoutError(ctx, err)
- }
-
- switch msg.(type) {
- case *pgproto3.NotificationResponse:
- return nil
- }
- }
-}
-
-// Exec executes SQL via the PostgreSQL simple query protocol. SQL may contain multiple queries. Execution is
-// implicitly wrapped in a transaction unless a transaction is already in progress or SQL contains transaction control
-// statements.
-//
-// Prefer ExecParams unless executing arbitrary SQL that may contain multiple queries.
-func (pgConn *PgConn) Exec(ctx context.Context, sql string) *MultiResultReader {
- if err := pgConn.lock(); err != nil {
- return &MultiResultReader{
- closed: true,
- err: err,
- }
- }
-
- pgConn.multiResultReader = MultiResultReader{
- pgConn: pgConn,
- ctx: ctx,
- }
- multiResult := &pgConn.multiResultReader
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- multiResult.closed = true
- multiResult.err = newContextAlreadyDoneError(ctx)
- pgConn.unlock()
- return multiResult
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- }
-
- buf := pgConn.wbuf
- buf = (&pgproto3.Query{String: sql}).Encode(buf)
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- pgConn.contextWatcher.Unwatch()
- multiResult.closed = true
- multiResult.err = &writeError{err: err, safeToRetry: n == 0}
- pgConn.unlock()
- return multiResult
- }
-
- return multiResult
-}
-
-// ReceiveResults reads the result that might be returned by Postgres after a SendBytes
-// (e.a. after sending a CopyDone in a copy-both situation).
-//
-// This is a very low level method that requires deep understanding of the PostgreSQL wire protocol to use correctly.
-// See https://www.postgresql.org/docs/current/protocol.html.
-func (pgConn *PgConn) ReceiveResults(ctx context.Context) *MultiResultReader {
- if err := pgConn.lock(); err != nil {
- return &MultiResultReader{
- closed: true,
- err: err,
- }
- }
-
- pgConn.multiResultReader = MultiResultReader{
- pgConn: pgConn,
- ctx: ctx,
- }
- multiResult := &pgConn.multiResultReader
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- multiResult.closed = true
- multiResult.err = newContextAlreadyDoneError(ctx)
- pgConn.unlock()
- return multiResult
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- }
-
- return multiResult
-}
-
-// ExecParams executes a command via the PostgreSQL extended query protocol.
-//
-// sql is a SQL command string. It may only contain one query. Parameter substitution is positional using $1, $2, $3,
-// etc.
-//
-// paramValues are the parameter values. It must be encoded in the format given by paramFormats.
-//
-// paramOIDs is a slice of data type OIDs for paramValues. If paramOIDs is nil, the server will infer the data type for
-// all parameters. Any paramOID element that is 0 that will cause the server to infer the data type for that parameter.
-// ExecParams will panic if len(paramOIDs) is not 0, 1, or len(paramValues).
-//
-// paramFormats is a slice of format codes determining for each paramValue column whether it is encoded in text or
-// binary format. If paramFormats is nil all params are text format. ExecParams will panic if
-// len(paramFormats) is not 0, 1, or len(paramValues).
-//
-// resultFormats is a slice of format codes determining for each result column whether it is encoded in text or
-// binary format. If resultFormats is nil all results will be in text format.
-//
-// ResultReader must be closed before PgConn can be used again.
-func (pgConn *PgConn) ExecParams(ctx context.Context, sql string, paramValues [][]byte, paramOIDs []uint32, paramFormats []int16, resultFormats []int16) *ResultReader {
- result := pgConn.execExtendedPrefix(ctx, paramValues)
- if result.closed {
- return result
- }
-
- buf := pgConn.wbuf
- buf = (&pgproto3.Parse{Query: sql, ParameterOIDs: paramOIDs}).Encode(buf)
- buf = (&pgproto3.Bind{ParameterFormatCodes: paramFormats, Parameters: paramValues, ResultFormatCodes: resultFormats}).Encode(buf)
-
- pgConn.execExtendedSuffix(buf, result)
-
- return result
-}
-
-// ExecPrepared enqueues the execution of a prepared statement via the PostgreSQL extended query protocol.
-//
-// paramValues are the parameter values. It must be encoded in the format given by paramFormats.
-//
-// paramFormats is a slice of format codes determining for each paramValue column whether it is encoded in text or
-// binary format. If paramFormats is nil all params are text format. ExecPrepared will panic if
-// len(paramFormats) is not 0, 1, or len(paramValues).
-//
-// resultFormats is a slice of format codes determining for each result column whether it is encoded in text or
-// binary format. If resultFormats is nil all results will be in text format.
-//
-// ResultReader must be closed before PgConn can be used again.
-func (pgConn *PgConn) ExecPrepared(ctx context.Context, stmtName string, paramValues [][]byte, paramFormats []int16, resultFormats []int16) *ResultReader {
- result := pgConn.execExtendedPrefix(ctx, paramValues)
- if result.closed {
- return result
- }
-
- buf := pgConn.wbuf
- buf = (&pgproto3.Bind{PreparedStatement: stmtName, ParameterFormatCodes: paramFormats, Parameters: paramValues, ResultFormatCodes: resultFormats}).Encode(buf)
-
- pgConn.execExtendedSuffix(buf, result)
-
- return result
-}
-
-func (pgConn *PgConn) execExtendedPrefix(ctx context.Context, paramValues [][]byte) *ResultReader {
- pgConn.resultReader = ResultReader{
- pgConn: pgConn,
- ctx: ctx,
- }
- result := &pgConn.resultReader
-
- if err := pgConn.lock(); err != nil {
- result.concludeCommand(nil, err)
- result.closed = true
- return result
- }
-
- if len(paramValues) > math.MaxUint16 {
- result.concludeCommand(nil, fmt.Errorf("extended protocol limited to %v parameters", math.MaxUint16))
- result.closed = true
- pgConn.unlock()
- return result
- }
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- result.concludeCommand(nil, newContextAlreadyDoneError(ctx))
- result.closed = true
- pgConn.unlock()
- return result
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- }
-
- return result
-}
-
-func (pgConn *PgConn) execExtendedSuffix(buf []byte, result *ResultReader) {
- buf = (&pgproto3.Describe{ObjectType: 'P'}).Encode(buf)
- buf = (&pgproto3.Execute{}).Encode(buf)
- buf = (&pgproto3.Sync{}).Encode(buf)
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- result.concludeCommand(nil, &writeError{err: err, safeToRetry: n == 0})
- pgConn.contextWatcher.Unwatch()
- result.closed = true
- pgConn.unlock()
- return
- }
-
- result.readUntilRowDescription()
-}
-
-// CopyTo executes the copy command sql and copies the results to w.
-func (pgConn *PgConn) CopyTo(ctx context.Context, w io.Writer, sql string) (CommandTag, error) {
- if err := pgConn.lock(); err != nil {
- return nil, err
- }
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- pgConn.unlock()
- return nil, newContextAlreadyDoneError(ctx)
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- // Send copy to command
- buf := pgConn.wbuf
- buf = (&pgproto3.Query{String: sql}).Encode(buf)
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- pgConn.unlock()
- return nil, &writeError{err: err, safeToRetry: n == 0}
- }
-
- // Read results
- var commandTag CommandTag
- var pgErr error
- for {
- msg, err := pgConn.receiveMessage()
- if err != nil {
- pgConn.asyncClose()
- return nil, preferContextOverNetTimeoutError(ctx, err)
- }
-
- switch msg := msg.(type) {
- case *pgproto3.CopyDone:
- case *pgproto3.CopyData:
- _, err := w.Write(msg.Data)
- if err != nil {
- pgConn.asyncClose()
- return nil, err
- }
- case *pgproto3.ReadyForQuery:
- pgConn.unlock()
- return commandTag, pgErr
- case *pgproto3.CommandComplete:
- commandTag = CommandTag(msg.CommandTag)
- case *pgproto3.ErrorResponse:
- pgErr = ErrorResponseToPgError(msg)
- }
- }
-}
-
-// CopyFrom executes the copy command sql and copies all of r to the PostgreSQL server.
-//
-// Note: context cancellation will only interrupt operations on the underlying PostgreSQL network connection. Reads on r
-// could still block.
-func (pgConn *PgConn) CopyFrom(ctx context.Context, r io.Reader, sql string) (CommandTag, error) {
- if err := pgConn.lock(); err != nil {
- return nil, err
- }
- defer pgConn.unlock()
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- return nil, newContextAlreadyDoneError(ctx)
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- defer pgConn.contextWatcher.Unwatch()
- }
-
- // Send copy to command
- buf := pgConn.wbuf
- buf = (&pgproto3.Query{String: sql}).Encode(buf)
-
- n, err := pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- return nil, &writeError{err: err, safeToRetry: n == 0}
- }
-
- // Send copy data
- abortCopyChan := make(chan struct{})
- copyErrChan := make(chan error, 1)
- signalMessageChan := pgConn.signalMessage()
- var wg sync.WaitGroup
- wg.Add(1)
-
- go func() {
- defer wg.Done()
- buf := make([]byte, 0, 65536)
- buf = append(buf, 'd')
- sp := len(buf)
-
- for {
- n, readErr := r.Read(buf[5:cap(buf)])
- if n > 0 {
- buf = buf[0 : n+5]
- pgio.SetInt32(buf[sp:], int32(n+4))
-
- _, writeErr := pgConn.conn.Write(buf)
- if writeErr != nil {
- // Write errors are always fatal, but we can't use asyncClose because we are in a different goroutine.
- pgConn.conn.Close()
-
- copyErrChan <- writeErr
- return
- }
- }
- if readErr != nil {
- copyErrChan <- readErr
- return
- }
-
- select {
- case <-abortCopyChan:
- return
- default:
- }
- }
- }()
-
- var pgErr error
- var copyErr error
- for copyErr == nil && pgErr == nil {
- select {
- case copyErr = <-copyErrChan:
- case <-signalMessageChan:
- msg, err := pgConn.receiveMessage()
- if err != nil {
- pgConn.asyncClose()
- return nil, preferContextOverNetTimeoutError(ctx, err)
- }
-
- switch msg := msg.(type) {
- case *pgproto3.ErrorResponse:
- pgErr = ErrorResponseToPgError(msg)
- default:
- signalMessageChan = pgConn.signalMessage()
- }
- }
- }
- close(abortCopyChan)
- // Make sure io goroutine finishes before writing.
- wg.Wait()
-
- buf = buf[:0]
- if copyErr == io.EOF || pgErr != nil {
- copyDone := &pgproto3.CopyDone{}
- buf = copyDone.Encode(buf)
- } else {
- copyFail := &pgproto3.CopyFail{Message: copyErr.Error()}
- buf = copyFail.Encode(buf)
- }
- _, err = pgConn.conn.Write(buf)
- if err != nil {
- pgConn.asyncClose()
- return nil, err
- }
-
- // Read results
- var commandTag CommandTag
- for {
- msg, err := pgConn.receiveMessage()
- if err != nil {
- pgConn.asyncClose()
- return nil, preferContextOverNetTimeoutError(ctx, err)
- }
-
- switch msg := msg.(type) {
- case *pgproto3.ReadyForQuery:
- return commandTag, pgErr
- case *pgproto3.CommandComplete:
- commandTag = CommandTag(msg.CommandTag)
- case *pgproto3.ErrorResponse:
- pgErr = ErrorResponseToPgError(msg)
- }
- }
-}
-
-// MultiResultReader is a reader for a command that could return multiple results such as Exec or ExecBatch.
-type MultiResultReader struct {
- pgConn *PgConn
- ctx context.Context
-
- rr *ResultReader
-
- closed bool
- err error
-}
-
-// ReadAll reads all available results. Calling ReadAll is mutually exclusive with all other MultiResultReader methods.
-func (mrr *MultiResultReader) ReadAll() ([]*Result, error) {
- var results []*Result
-
- for mrr.NextResult() {
- results = append(results, mrr.ResultReader().Read())
- }
- err := mrr.Close()
-
- return results, err
-}
-
-func (mrr *MultiResultReader) receiveMessage() (pgproto3.BackendMessage, error) {
- msg, err := mrr.pgConn.receiveMessage()
-
- if err != nil {
- mrr.pgConn.contextWatcher.Unwatch()
- mrr.err = preferContextOverNetTimeoutError(mrr.ctx, err)
- mrr.closed = true
- mrr.pgConn.asyncClose()
- return nil, mrr.err
- }
-
- switch msg := msg.(type) {
- case *pgproto3.ReadyForQuery:
- mrr.pgConn.contextWatcher.Unwatch()
- mrr.closed = true
- mrr.pgConn.unlock()
- case *pgproto3.ErrorResponse:
- mrr.err = ErrorResponseToPgError(msg)
- }
-
- return msg, nil
-}
-
-// NextResult returns advances the MultiResultReader to the next result and returns true if a result is available.
-func (mrr *MultiResultReader) NextResult() bool {
- for !mrr.closed && mrr.err == nil {
- msg, err := mrr.receiveMessage()
- if err != nil {
- return false
- }
-
- switch msg := msg.(type) {
- case *pgproto3.RowDescription:
- mrr.pgConn.resultReader = ResultReader{
- pgConn: mrr.pgConn,
- multiResultReader: mrr,
- ctx: mrr.ctx,
- fieldDescriptions: msg.Fields,
- }
- mrr.rr = &mrr.pgConn.resultReader
- return true
- case *pgproto3.CommandComplete:
- mrr.pgConn.resultReader = ResultReader{
- commandTag: CommandTag(msg.CommandTag),
- commandConcluded: true,
- closed: true,
- }
- mrr.rr = &mrr.pgConn.resultReader
- return true
- case *pgproto3.EmptyQueryResponse:
- return false
- }
- }
-
- return false
-}
-
-// ResultReader returns the current ResultReader.
-func (mrr *MultiResultReader) ResultReader() *ResultReader {
- return mrr.rr
-}
-
-// Close closes the MultiResultReader and returns the first error that occurred during the MultiResultReader's use.
-func (mrr *MultiResultReader) Close() error {
- for !mrr.closed {
- _, err := mrr.receiveMessage()
- if err != nil {
- return mrr.err
- }
- }
-
- return mrr.err
-}
-
-// ResultReader is a reader for the result of a single query.
-type ResultReader struct {
- pgConn *PgConn
- multiResultReader *MultiResultReader
- ctx context.Context
-
- fieldDescriptions []pgproto3.FieldDescription
- rowValues [][]byte
- commandTag CommandTag
- commandConcluded bool
- closed bool
- err error
-}
-
-// Result is the saved query response that is returned by calling Read on a ResultReader.
-type Result struct {
- FieldDescriptions []pgproto3.FieldDescription
- Rows [][][]byte
- CommandTag CommandTag
- Err error
-}
-
-// Read saves the query response to a Result.
-func (rr *ResultReader) Read() *Result {
- br := &Result{}
-
- for rr.NextRow() {
- if br.FieldDescriptions == nil {
- br.FieldDescriptions = make([]pgproto3.FieldDescription, len(rr.FieldDescriptions()))
- copy(br.FieldDescriptions, rr.FieldDescriptions())
- }
-
- row := make([][]byte, len(rr.Values()))
- copy(row, rr.Values())
- br.Rows = append(br.Rows, row)
- }
-
- br.CommandTag, br.Err = rr.Close()
-
- return br
-}
-
-// NextRow advances the ResultReader to the next row and returns true if a row is available.
-func (rr *ResultReader) NextRow() bool {
- for !rr.commandConcluded {
- msg, err := rr.receiveMessage()
- if err != nil {
- return false
- }
-
- switch msg := msg.(type) {
- case *pgproto3.DataRow:
- rr.rowValues = msg.Values
- return true
- }
- }
-
- return false
-}
-
-// FieldDescriptions returns the field descriptions for the current result set. The returned slice is only valid until
-// the ResultReader is closed.
-func (rr *ResultReader) FieldDescriptions() []pgproto3.FieldDescription {
- return rr.fieldDescriptions
-}
-
-// Values returns the current row data. NextRow must have been previously been called. The returned [][]byte is only
-// valid until the next NextRow call or the ResultReader is closed. However, the underlying byte data is safe to
-// retain a reference to and mutate.
-func (rr *ResultReader) Values() [][]byte {
- return rr.rowValues
-}
-
-// Close consumes any remaining result data and returns the command tag or
-// error.
-func (rr *ResultReader) Close() (CommandTag, error) {
- if rr.closed {
- return rr.commandTag, rr.err
- }
- rr.closed = true
-
- for !rr.commandConcluded {
- _, err := rr.receiveMessage()
- if err != nil {
- return nil, rr.err
- }
- }
-
- if rr.multiResultReader == nil {
- for {
- msg, err := rr.receiveMessage()
- if err != nil {
- return nil, rr.err
- }
-
- switch msg := msg.(type) {
- // Detect a deferred constraint violation where the ErrorResponse is sent after CommandComplete.
- case *pgproto3.ErrorResponse:
- rr.err = ErrorResponseToPgError(msg)
- case *pgproto3.ReadyForQuery:
- rr.pgConn.contextWatcher.Unwatch()
- rr.pgConn.unlock()
- return rr.commandTag, rr.err
- }
- }
- }
-
- return rr.commandTag, rr.err
-}
-
-// readUntilRowDescription ensures the ResultReader's fieldDescriptions are loaded. It does not return an error as any
-// error will be stored in the ResultReader.
-func (rr *ResultReader) readUntilRowDescription() {
- for !rr.commandConcluded {
- // Peek before receive to avoid consuming a DataRow if the result set does not include a RowDescription method.
- // This should never happen under normal pgconn usage, but it is possible if SendBytes and ReceiveResults are
- // manually used to construct a query that does not issue a describe statement.
- msg, _ := rr.pgConn.peekMessage()
- if _, ok := msg.(*pgproto3.DataRow); ok {
- return
- }
-
- // Consume the message
- msg, _ = rr.receiveMessage()
- if _, ok := msg.(*pgproto3.RowDescription); ok {
- return
- }
- }
-}
-
-func (rr *ResultReader) receiveMessage() (msg pgproto3.BackendMessage, err error) {
- if rr.multiResultReader == nil {
- msg, err = rr.pgConn.receiveMessage()
- } else {
- msg, err = rr.multiResultReader.receiveMessage()
- }
-
- if err != nil {
- err = preferContextOverNetTimeoutError(rr.ctx, err)
- rr.concludeCommand(nil, err)
- rr.pgConn.contextWatcher.Unwatch()
- rr.closed = true
- if rr.multiResultReader == nil {
- rr.pgConn.asyncClose()
- }
-
- return nil, rr.err
- }
-
- switch msg := msg.(type) {
- case *pgproto3.RowDescription:
- rr.fieldDescriptions = msg.Fields
- case *pgproto3.CommandComplete:
- rr.concludeCommand(CommandTag(msg.CommandTag), nil)
- case *pgproto3.EmptyQueryResponse:
- rr.concludeCommand(nil, nil)
- case *pgproto3.ErrorResponse:
- rr.concludeCommand(nil, ErrorResponseToPgError(msg))
- }
-
- return msg, nil
-}
-
-func (rr *ResultReader) concludeCommand(commandTag CommandTag, err error) {
- // Keep the first error that is recorded. Store the error before checking if the command is already concluded to
- // allow for receiving an error after CommandComplete but before ReadyForQuery.
- if err != nil && rr.err == nil {
- rr.err = err
- }
-
- if rr.commandConcluded {
- return
- }
-
- rr.commandTag = commandTag
- rr.rowValues = nil
- rr.commandConcluded = true
-}
-
-// Batch is a collection of queries that can be sent to the PostgreSQL server in a single round-trip.
-type Batch struct {
- buf []byte
-}
-
-// ExecParams appends an ExecParams command to the batch. See PgConn.ExecParams for parameter descriptions.
-func (batch *Batch) ExecParams(sql string, paramValues [][]byte, paramOIDs []uint32, paramFormats []int16, resultFormats []int16) {
- batch.buf = (&pgproto3.Parse{Query: sql, ParameterOIDs: paramOIDs}).Encode(batch.buf)
- batch.ExecPrepared("", paramValues, paramFormats, resultFormats)
-}
-
-// ExecPrepared appends an ExecPrepared e command to the batch. See PgConn.ExecPrepared for parameter descriptions.
-func (batch *Batch) ExecPrepared(stmtName string, paramValues [][]byte, paramFormats []int16, resultFormats []int16) {
- batch.buf = (&pgproto3.Bind{PreparedStatement: stmtName, ParameterFormatCodes: paramFormats, Parameters: paramValues, ResultFormatCodes: resultFormats}).Encode(batch.buf)
- batch.buf = (&pgproto3.Describe{ObjectType: 'P'}).Encode(batch.buf)
- batch.buf = (&pgproto3.Execute{}).Encode(batch.buf)
-}
-
-// ExecBatch executes all the queries in batch in a single round-trip. Execution is implicitly transactional unless a
-// transaction is already in progress or SQL contains transaction control statements.
-func (pgConn *PgConn) ExecBatch(ctx context.Context, batch *Batch) *MultiResultReader {
- if err := pgConn.lock(); err != nil {
- return &MultiResultReader{
- closed: true,
- err: err,
- }
- }
-
- pgConn.multiResultReader = MultiResultReader{
- pgConn: pgConn,
- ctx: ctx,
- }
- multiResult := &pgConn.multiResultReader
-
- if ctx != context.Background() {
- select {
- case <-ctx.Done():
- multiResult.closed = true
- multiResult.err = newContextAlreadyDoneError(ctx)
- pgConn.unlock()
- return multiResult
- default:
- }
- pgConn.contextWatcher.Watch(ctx)
- }
-
- batch.buf = (&pgproto3.Sync{}).Encode(batch.buf)
-
- // A large batch can deadlock without concurrent reading and writing. If the Write fails the underlying net.Conn is
- // closed. This is all that can be done without introducing a race condition or adding a concurrent safe communication
- // channel to relay the error back. The practical effect of this is that the underlying Write error is not reported.
- // The error the code reading the batch results receives will be a closed connection error.
- //
- // See https://github.com/jackc/pgx/issues/374.
- go func() {
- _, err := pgConn.conn.Write(batch.buf)
- if err != nil {
- pgConn.conn.Close()
- }
- }()
-
- return multiResult
-}
-
-// EscapeString escapes a string such that it can safely be interpolated into a SQL command string. It does not include
-// the surrounding single quotes.
-//
-// The current implementation requires that standard_conforming_strings=on and client_encoding="UTF8". If these
-// conditions are not met an error will be returned. It is possible these restrictions will be lifted in the future.
-func (pgConn *PgConn) EscapeString(s string) (string, error) {
- if pgConn.ParameterStatus("standard_conforming_strings") != "on" {
- return "", errors.New("EscapeString must be run with standard_conforming_strings=on")
- }
-
- if pgConn.ParameterStatus("client_encoding") != "UTF8" {
- return "", errors.New("EscapeString must be run with client_encoding=UTF8")
- }
-
- return strings.Replace(s, "'", "''", -1), nil
-}
-
-// HijackedConn is the result of hijacking a connection.
-//
-// Due to the necessary exposure of internal implementation details, it is not covered by the semantic versioning
-// compatibility.
-type HijackedConn struct {
- Conn net.Conn // the underlying TCP or unix domain socket connection
- PID uint32 // backend pid
- SecretKey uint32 // key to use to send a cancel query message to the server
- ParameterStatuses map[string]string // parameters that have been reported by the server
- TxStatus byte
- Frontend Frontend
- Config *Config
-}
-
-// Hijack extracts the internal connection data. pgConn must be in an idle state. pgConn is unusable after hijacking.
-// Hijacking is typically only useful when using pgconn to establish a connection, but taking complete control of the
-// raw connection after that (e.g. a load balancer or proxy).
-//
-// Due to the necessary exposure of internal implementation details, it is not covered by the semantic versioning
-// compatibility.
-func (pgConn *PgConn) Hijack() (*HijackedConn, error) {
- if err := pgConn.lock(); err != nil {
- return nil, err
- }
- pgConn.status = connStatusClosed
-
- return &HijackedConn{
- Conn: pgConn.conn,
- PID: pgConn.pid,
- SecretKey: pgConn.secretKey,
- ParameterStatuses: pgConn.parameterStatuses,
- TxStatus: pgConn.txStatus,
- Frontend: pgConn.frontend,
- Config: pgConn.config,
- }, nil
-}
-
-// Construct created a PgConn from an already established connection to a PostgreSQL server. This is the inverse of
-// PgConn.Hijack. The connection must be in an idle state.
-//
-// Due to the necessary exposure of internal implementation details, it is not covered by the semantic versioning
-// compatibility.
-func Construct(hc *HijackedConn) (*PgConn, error) {
- pgConn := &PgConn{
- conn: hc.Conn,
- pid: hc.PID,
- secretKey: hc.SecretKey,
- parameterStatuses: hc.ParameterStatuses,
- txStatus: hc.TxStatus,
- frontend: hc.Frontend,
- config: hc.Config,
-
- status: connStatusIdle,
-
- wbuf: make([]byte, 0, wbufLen),
- cleanupDone: make(chan struct{}),
- }
-
- pgConn.contextWatcher = newContextWatcher(pgConn.conn)
-
- return pgConn, nil
-}
diff --git a/vendor/github.com/jackc/pgio/.travis.yml b/vendor/github.com/jackc/pgio/.travis.yml
deleted file mode 100644
index e176228e8..000000000
--- a/vendor/github.com/jackc/pgio/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-
-go:
- - 1.x
- - tip
-
-matrix:
- allow_failures:
- - go: tip
diff --git a/vendor/github.com/jackc/pgio/LICENSE b/vendor/github.com/jackc/pgio/LICENSE
deleted file mode 100644
index c1c4f50fc..000000000
--- a/vendor/github.com/jackc/pgio/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2019 Jack Christensen
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/jackc/pgio/README.md b/vendor/github.com/jackc/pgio/README.md
deleted file mode 100644
index 1952ed862..000000000
--- a/vendor/github.com/jackc/pgio/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-[![](https://godoc.org/github.com/jackc/pgio?status.svg)](https://godoc.org/github.com/jackc/pgio)
-[![Build Status](https://travis-ci.org/jackc/pgio.svg)](https://travis-ci.org/jackc/pgio)
-
-# pgio
-
-Package pgio is a low-level toolkit building messages in the PostgreSQL wire protocol.
-
-pgio provides functions for appending integers to a []byte while doing byte
-order conversion.
-
-Extracted from original implementation in https://github.com/jackc/pgx.
diff --git a/vendor/github.com/jackc/pgio/doc.go b/vendor/github.com/jackc/pgio/doc.go
deleted file mode 100644
index ef2dcc7f7..000000000
--- a/vendor/github.com/jackc/pgio/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Package pgio is a low-level toolkit building messages in the PostgreSQL wire protocol.
-/*
-pgio provides functions for appending integers to a []byte while doing byte
-order conversion.
-*/
-package pgio
diff --git a/vendor/github.com/jackc/pgio/write.go b/vendor/github.com/jackc/pgio/write.go
deleted file mode 100644
index 96aedf9dd..000000000
--- a/vendor/github.com/jackc/pgio/write.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package pgio
-
-import "encoding/binary"
-
-func AppendUint16(buf []byte, n uint16) []byte {
- wp := len(buf)
- buf = append(buf, 0, 0)
- binary.BigEndian.PutUint16(buf[wp:], n)
- return buf
-}
-
-func AppendUint32(buf []byte, n uint32) []byte {
- wp := len(buf)
- buf = append(buf, 0, 0, 0, 0)
- binary.BigEndian.PutUint32(buf[wp:], n)
- return buf
-}
-
-func AppendUint64(buf []byte, n uint64) []byte {
- wp := len(buf)
- buf = append(buf, 0, 0, 0, 0, 0, 0, 0, 0)
- binary.BigEndian.PutUint64(buf[wp:], n)
- return buf
-}
-
-func AppendInt16(buf []byte, n int16) []byte {
- return AppendUint16(buf, uint16(n))
-}
-
-func AppendInt32(buf []byte, n int32) []byte {
- return AppendUint32(buf, uint32(n))
-}
-
-func AppendInt64(buf []byte, n int64) []byte {
- return AppendUint64(buf, uint64(n))
-}
-
-func SetInt32(buf []byte, n int32) {
- binary.BigEndian.PutUint32(buf, uint32(n))
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/.travis.yml b/vendor/github.com/jackc/pgproto3/v2/.travis.yml
deleted file mode 100644
index e176228e8..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-
-go:
- - 1.x
- - tip
-
-matrix:
- allow_failures:
- - go: tip
diff --git a/vendor/github.com/jackc/pgproto3/v2/LICENSE b/vendor/github.com/jackc/pgproto3/v2/LICENSE
deleted file mode 100644
index c1c4f50fc..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2019 Jack Christensen
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/jackc/pgproto3/v2/README.md b/vendor/github.com/jackc/pgproto3/v2/README.md
deleted file mode 100644
index 77a31700a..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-[![](https://godoc.org/github.com/jackc/pgproto3?status.svg)](https://godoc.org/github.com/jackc/pgproto3)
-[![Build Status](https://travis-ci.org/jackc/pgproto3.svg)](https://travis-ci.org/jackc/pgproto3)
-
----
-
-This version is used with pgx `v4`. In pgx `v5` it is part of the https://github.com/jackc/pgx repository.
-
----
-
-# pgproto3
-
-Package pgproto3 is a encoder and decoder of the PostgreSQL wire protocol version 3.
-
-pgproto3 can be used as a foundation for PostgreSQL drivers, proxies, mock servers, load balancers and more.
-
-See example/pgfortune for a playful example of a fake PostgreSQL server.
-
-Extracted from original implementation in https://github.com/jackc/pgx.
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_cleartext_password.go b/vendor/github.com/jackc/pgproto3/v2/authentication_cleartext_password.go
deleted file mode 100644
index 241fa6005..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_cleartext_password.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationCleartextPassword is a message sent from the backend indicating that a clear-text password is required.
-type AuthenticationCleartextPassword struct {
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationCleartextPassword) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationCleartextPassword) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationCleartextPassword) Decode(src []byte) error {
- if len(src) != 4 {
- return errors.New("bad authentication message size")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeCleartextPassword {
- return errors.New("bad auth type")
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationCleartextPassword) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- dst = pgio.AppendInt32(dst, 8)
- dst = pgio.AppendUint32(dst, AuthTypeCleartextPassword)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src AuthenticationCleartextPassword) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "AuthenticationCleartextPassword",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_gss.go b/vendor/github.com/jackc/pgproto3/v2/authentication_gss.go
deleted file mode 100644
index 5a3f3b1d5..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_gss.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
- "github.com/jackc/pgio"
-)
-
-type AuthenticationGSS struct{}
-
-func (a *AuthenticationGSS) Backend() {}
-
-func (a *AuthenticationGSS) AuthenticationResponse() {}
-
-func (a *AuthenticationGSS) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("authentication message too short")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeGSS {
- return errors.New("bad auth type")
- }
- return nil
-}
-
-func (a *AuthenticationGSS) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- dst = pgio.AppendInt32(dst, 4)
- dst = pgio.AppendUint32(dst, AuthTypeGSS)
- return dst
-}
-
-func (a *AuthenticationGSS) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data []byte
- }{
- Type: "AuthenticationGSS",
- })
-}
-
-func (a *AuthenticationGSS) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Type string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_gss_continue.go b/vendor/github.com/jackc/pgproto3/v2/authentication_gss_continue.go
deleted file mode 100644
index cf8b18345..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_gss_continue.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
- "github.com/jackc/pgio"
-)
-
-type AuthenticationGSSContinue struct {
- Data []byte
-}
-
-func (a *AuthenticationGSSContinue) Backend() {}
-
-func (a *AuthenticationGSSContinue) AuthenticationResponse() {}
-
-func (a *AuthenticationGSSContinue) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("authentication message too short")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeGSSCont {
- return errors.New("bad auth type")
- }
-
- a.Data = src[4:]
- return nil
-}
-
-func (a *AuthenticationGSSContinue) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- dst = pgio.AppendInt32(dst, int32(len(a.Data))+8)
- dst = pgio.AppendUint32(dst, AuthTypeGSSCont)
- dst = append(dst, a.Data...)
- return dst
-}
-
-func (a *AuthenticationGSSContinue) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data []byte
- }{
- Type: "AuthenticationGSSContinue",
- Data: a.Data,
- })
-}
-
-func (a *AuthenticationGSSContinue) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Type string
- Data []byte
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- a.Data = msg.Data
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_md5_password.go b/vendor/github.com/jackc/pgproto3/v2/authentication_md5_password.go
deleted file mode 100644
index 32ec0390e..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_md5_password.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationMD5Password is a message sent from the backend indicating that an MD5 hashed password is required.
-type AuthenticationMD5Password struct {
- Salt [4]byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationMD5Password) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationMD5Password) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationMD5Password) Decode(src []byte) error {
- if len(src) != 8 {
- return errors.New("bad authentication message size")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeMD5Password {
- return errors.New("bad auth type")
- }
-
- copy(dst.Salt[:], src[4:8])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationMD5Password) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- dst = pgio.AppendInt32(dst, 12)
- dst = pgio.AppendUint32(dst, AuthTypeMD5Password)
- dst = append(dst, src.Salt[:]...)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src AuthenticationMD5Password) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Salt [4]byte
- }{
- Type: "AuthenticationMD5Password",
- Salt: src.Salt,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *AuthenticationMD5Password) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Type string
- Salt [4]byte
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Salt = msg.Salt
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_ok.go b/vendor/github.com/jackc/pgproto3/v2/authentication_ok.go
deleted file mode 100644
index 2b476fe51..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_ok.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationOk is a message sent from the backend indicating that authentication was successful.
-type AuthenticationOk struct {
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationOk) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationOk) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationOk) Decode(src []byte) error {
- if len(src) != 4 {
- return errors.New("bad authentication message size")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeOk {
- return errors.New("bad auth type")
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationOk) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- dst = pgio.AppendInt32(dst, 8)
- dst = pgio.AppendUint32(dst, AuthTypeOk)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src AuthenticationOk) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "AuthenticationOK",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl.go b/vendor/github.com/jackc/pgproto3/v2/authentication_sasl.go
deleted file mode 100644
index bdcb2c367..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationSASL is a message sent from the backend indicating that SASL authentication is required.
-type AuthenticationSASL struct {
- AuthMechanisms []string
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationSASL) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationSASL) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationSASL) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("authentication message too short")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeSASL {
- return errors.New("bad auth type")
- }
-
- authMechanisms := src[4:]
- for len(authMechanisms) > 1 {
- idx := bytes.IndexByte(authMechanisms, 0)
- if idx > 0 {
- dst.AuthMechanisms = append(dst.AuthMechanisms, string(authMechanisms[:idx]))
- authMechanisms = authMechanisms[idx+1:]
- }
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationSASL) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
- dst = pgio.AppendUint32(dst, AuthTypeSASL)
-
- for _, s := range src.AuthMechanisms {
- dst = append(dst, []byte(s)...)
- dst = append(dst, 0)
- }
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src AuthenticationSASL) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- AuthMechanisms []string
- }{
- Type: "AuthenticationSASL",
- AuthMechanisms: src.AuthMechanisms,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_continue.go b/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_continue.go
deleted file mode 100644
index 7f4a9c235..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_continue.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationSASLContinue is a message sent from the backend containing a SASL challenge.
-type AuthenticationSASLContinue struct {
- Data []byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationSASLContinue) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationSASLContinue) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationSASLContinue) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("authentication message too short")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeSASLContinue {
- return errors.New("bad auth type")
- }
-
- dst.Data = src[4:]
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationSASLContinue) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
- dst = pgio.AppendUint32(dst, AuthTypeSASLContinue)
-
- dst = append(dst, src.Data...)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src AuthenticationSASLContinue) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data string
- }{
- Type: "AuthenticationSASLContinue",
- Data: string(src.Data),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *AuthenticationSASLContinue) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Data string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Data = []byte(msg.Data)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_final.go b/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_final.go
deleted file mode 100644
index d82b9ee4d..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/authentication_sasl_final.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-// AuthenticationSASLFinal is a message sent from the backend indicating a SASL authentication has completed.
-type AuthenticationSASLFinal struct {
- Data []byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*AuthenticationSASLFinal) Backend() {}
-
-// Backend identifies this message as an authentication response.
-func (*AuthenticationSASLFinal) AuthenticationResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *AuthenticationSASLFinal) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("authentication message too short")
- }
-
- authType := binary.BigEndian.Uint32(src)
-
- if authType != AuthTypeSASLFinal {
- return errors.New("bad auth type")
- }
-
- dst.Data = src[4:]
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *AuthenticationSASLFinal) Encode(dst []byte) []byte {
- dst = append(dst, 'R')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
- dst = pgio.AppendUint32(dst, AuthTypeSASLFinal)
-
- dst = append(dst, src.Data...)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Unmarshaler.
-func (src AuthenticationSASLFinal) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data string
- }{
- Type: "AuthenticationSASLFinal",
- Data: string(src.Data),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *AuthenticationSASLFinal) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Data string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Data = []byte(msg.Data)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/backend.go b/vendor/github.com/jackc/pgproto3/v2/backend.go
deleted file mode 100644
index 1f1436529..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/backend.go
+++ /dev/null
@@ -1,213 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "errors"
- "fmt"
- "io"
-)
-
-// Backend acts as a server for the PostgreSQL wire protocol version 3.
-type Backend struct {
- cr ChunkReader
- w io.Writer
-
- // Frontend message flyweights
- bind Bind
- cancelRequest CancelRequest
- _close Close
- copyFail CopyFail
- copyData CopyData
- copyDone CopyDone
- describe Describe
- execute Execute
- flush Flush
- functionCall FunctionCall
- gssEncRequest GSSEncRequest
- parse Parse
- query Query
- sslRequest SSLRequest
- startupMessage StartupMessage
- sync Sync
- terminate Terminate
-
- bodyLen int
- msgType byte
- partialMsg bool
- authType uint32
-}
-
-const (
- minStartupPacketLen = 4 // minStartupPacketLen is a single 32-bit int version or code.
- maxStartupPacketLen = 10000 // maxStartupPacketLen is MAX_STARTUP_PACKET_LENGTH from PG source.
-)
-
-// NewBackend creates a new Backend.
-func NewBackend(cr ChunkReader, w io.Writer) *Backend {
- return &Backend{cr: cr, w: w}
-}
-
-// Send sends a message to the frontend.
-func (b *Backend) Send(msg BackendMessage) error {
- _, err := b.w.Write(msg.Encode(nil))
- return err
-}
-
-// ReceiveStartupMessage receives the initial connection message. This method is used of the normal Receive method
-// because the initial connection message is "special" and does not include the message type as the first byte. This
-// will return either a StartupMessage, SSLRequest, GSSEncRequest, or CancelRequest.
-func (b *Backend) ReceiveStartupMessage() (FrontendMessage, error) {
- buf, err := b.cr.Next(4)
- if err != nil {
- return nil, err
- }
- msgSize := int(binary.BigEndian.Uint32(buf) - 4)
-
- if msgSize < minStartupPacketLen || msgSize > maxStartupPacketLen {
- return nil, fmt.Errorf("invalid length of startup packet: %d", msgSize)
- }
-
- buf, err = b.cr.Next(msgSize)
- if err != nil {
- return nil, translateEOFtoErrUnexpectedEOF(err)
- }
-
- code := binary.BigEndian.Uint32(buf)
-
- switch code {
- case ProtocolVersionNumber:
- err = b.startupMessage.Decode(buf)
- if err != nil {
- return nil, err
- }
- return &b.startupMessage, nil
- case sslRequestNumber:
- err = b.sslRequest.Decode(buf)
- if err != nil {
- return nil, err
- }
- return &b.sslRequest, nil
- case cancelRequestCode:
- err = b.cancelRequest.Decode(buf)
- if err != nil {
- return nil, err
- }
- return &b.cancelRequest, nil
- case gssEncReqNumber:
- err = b.gssEncRequest.Decode(buf)
- if err != nil {
- return nil, err
- }
- return &b.gssEncRequest, nil
- default:
- return nil, fmt.Errorf("unknown startup message code: %d", code)
- }
-}
-
-// Receive receives a message from the frontend. The returned message is only valid until the next call to Receive.
-func (b *Backend) Receive() (FrontendMessage, error) {
- if !b.partialMsg {
- header, err := b.cr.Next(5)
- if err != nil {
- return nil, translateEOFtoErrUnexpectedEOF(err)
- }
-
- b.msgType = header[0]
- b.bodyLen = int(binary.BigEndian.Uint32(header[1:])) - 4
- b.partialMsg = true
- if b.bodyLen < 0 {
- return nil, errors.New("invalid message with negative body length received")
- }
- }
-
- var msg FrontendMessage
- switch b.msgType {
- case 'B':
- msg = &b.bind
- case 'C':
- msg = &b._close
- case 'D':
- msg = &b.describe
- case 'E':
- msg = &b.execute
- case 'F':
- msg = &b.functionCall
- case 'f':
- msg = &b.copyFail
- case 'd':
- msg = &b.copyData
- case 'c':
- msg = &b.copyDone
- case 'H':
- msg = &b.flush
- case 'P':
- msg = &b.parse
- case 'p':
- switch b.authType {
- case AuthTypeSASL:
- msg = &SASLInitialResponse{}
- case AuthTypeSASLContinue:
- msg = &SASLResponse{}
- case AuthTypeSASLFinal:
- msg = &SASLResponse{}
- case AuthTypeGSS, AuthTypeGSSCont:
- msg = &GSSResponse{}
- case AuthTypeCleartextPassword, AuthTypeMD5Password:
- fallthrough
- default:
- // to maintain backwards compatability
- msg = &PasswordMessage{}
- }
- case 'Q':
- msg = &b.query
- case 'S':
- msg = &b.sync
- case 'X':
- msg = &b.terminate
- default:
- return nil, fmt.Errorf("unknown message type: %c", b.msgType)
- }
-
- msgBody, err := b.cr.Next(b.bodyLen)
- if err != nil {
- return nil, translateEOFtoErrUnexpectedEOF(err)
- }
-
- b.partialMsg = false
-
- err = msg.Decode(msgBody)
- return msg, err
-}
-
-// SetAuthType sets the authentication type in the backend.
-// Since multiple message types can start with 'p', SetAuthType allows
-// contextual identification of FrontendMessages. For example, in the
-// PG message flow documentation for PasswordMessage:
-//
-// Byte1('p')
-//
-// Identifies the message as a password response. Note that this is also used for
-// GSSAPI, SSPI and SASL response messages. The exact message type can be deduced from
-// the context.
-//
-// Since the Frontend does not know about the state of a backend, it is important
-// to call SetAuthType() after an authentication request is received by the Frontend.
-func (b *Backend) SetAuthType(authType uint32) error {
- switch authType {
- case AuthTypeOk,
- AuthTypeCleartextPassword,
- AuthTypeMD5Password,
- AuthTypeSCMCreds,
- AuthTypeGSS,
- AuthTypeGSSCont,
- AuthTypeSSPI,
- AuthTypeSASL,
- AuthTypeSASLContinue,
- AuthTypeSASLFinal:
- b.authType = authType
- default:
- return fmt.Errorf("authType not recognized: %d", authType)
- }
-
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/backend_key_data.go b/vendor/github.com/jackc/pgproto3/v2/backend_key_data.go
deleted file mode 100644
index ca20dd259..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/backend_key_data.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type BackendKeyData struct {
- ProcessID uint32
- SecretKey uint32
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*BackendKeyData) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *BackendKeyData) Decode(src []byte) error {
- if len(src) != 8 {
- return &invalidMessageLenErr{messageType: "BackendKeyData", expectedLen: 8, actualLen: len(src)}
- }
-
- dst.ProcessID = binary.BigEndian.Uint32(src[:4])
- dst.SecretKey = binary.BigEndian.Uint32(src[4:])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *BackendKeyData) Encode(dst []byte) []byte {
- dst = append(dst, 'K')
- dst = pgio.AppendUint32(dst, 12)
- dst = pgio.AppendUint32(dst, src.ProcessID)
- dst = pgio.AppendUint32(dst, src.SecretKey)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src BackendKeyData) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ProcessID uint32
- SecretKey uint32
- }{
- Type: "BackendKeyData",
- ProcessID: src.ProcessID,
- SecretKey: src.SecretKey,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/big_endian.go b/vendor/github.com/jackc/pgproto3/v2/big_endian.go
deleted file mode 100644
index f7bdb97eb..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/big_endian.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
-)
-
-type BigEndianBuf [8]byte
-
-func (b BigEndianBuf) Int16(n int16) []byte {
- buf := b[0:2]
- binary.BigEndian.PutUint16(buf, uint16(n))
- return buf
-}
-
-func (b BigEndianBuf) Uint16(n uint16) []byte {
- buf := b[0:2]
- binary.BigEndian.PutUint16(buf, n)
- return buf
-}
-
-func (b BigEndianBuf) Int32(n int32) []byte {
- buf := b[0:4]
- binary.BigEndian.PutUint32(buf, uint32(n))
- return buf
-}
-
-func (b BigEndianBuf) Uint32(n uint32) []byte {
- buf := b[0:4]
- binary.BigEndian.PutUint32(buf, n)
- return buf
-}
-
-func (b BigEndianBuf) Int64(n int64) []byte {
- buf := b[0:8]
- binary.BigEndian.PutUint64(buf, uint64(n))
- return buf
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/bind.go b/vendor/github.com/jackc/pgproto3/v2/bind.go
deleted file mode 100644
index e9664f59f..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/bind.go
+++ /dev/null
@@ -1,216 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/hex"
- "encoding/json"
- "fmt"
-
- "github.com/jackc/pgio"
-)
-
-type Bind struct {
- DestinationPortal string
- PreparedStatement string
- ParameterFormatCodes []int16
- Parameters [][]byte
- ResultFormatCodes []int16
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Bind) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Bind) Decode(src []byte) error {
- *dst = Bind{}
-
- idx := bytes.IndexByte(src, 0)
- if idx < 0 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- dst.DestinationPortal = string(src[:idx])
- rp := idx + 1
-
- idx = bytes.IndexByte(src[rp:], 0)
- if idx < 0 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- dst.PreparedStatement = string(src[rp : rp+idx])
- rp += idx + 1
-
- if len(src[rp:]) < 2 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- parameterFormatCodeCount := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
-
- if parameterFormatCodeCount > 0 {
- dst.ParameterFormatCodes = make([]int16, parameterFormatCodeCount)
-
- if len(src[rp:]) < len(dst.ParameterFormatCodes)*2 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- for i := 0; i < parameterFormatCodeCount; i++ {
- dst.ParameterFormatCodes[i] = int16(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
- }
- }
-
- if len(src[rp:]) < 2 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- parameterCount := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
-
- if parameterCount > 0 {
- dst.Parameters = make([][]byte, parameterCount)
-
- for i := 0; i < parameterCount; i++ {
- if len(src[rp:]) < 4 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
-
- msgSize := int(int32(binary.BigEndian.Uint32(src[rp:])))
- rp += 4
-
- // null
- if msgSize == -1 {
- continue
- }
-
- if len(src[rp:]) < msgSize {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
-
- dst.Parameters[i] = src[rp : rp+msgSize]
- rp += msgSize
- }
- }
-
- if len(src[rp:]) < 2 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- resultFormatCodeCount := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
-
- dst.ResultFormatCodes = make([]int16, resultFormatCodeCount)
- if len(src[rp:]) < len(dst.ResultFormatCodes)*2 {
- return &invalidMessageFormatErr{messageType: "Bind"}
- }
- for i := 0; i < resultFormatCodeCount; i++ {
- dst.ResultFormatCodes[i] = int16(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Bind) Encode(dst []byte) []byte {
- dst = append(dst, 'B')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.DestinationPortal...)
- dst = append(dst, 0)
- dst = append(dst, src.PreparedStatement...)
- dst = append(dst, 0)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.ParameterFormatCodes)))
- for _, fc := range src.ParameterFormatCodes {
- dst = pgio.AppendInt16(dst, fc)
- }
-
- dst = pgio.AppendUint16(dst, uint16(len(src.Parameters)))
- for _, p := range src.Parameters {
- if p == nil {
- dst = pgio.AppendInt32(dst, -1)
- continue
- }
-
- dst = pgio.AppendInt32(dst, int32(len(p)))
- dst = append(dst, p...)
- }
-
- dst = pgio.AppendUint16(dst, uint16(len(src.ResultFormatCodes)))
- for _, fc := range src.ResultFormatCodes {
- dst = pgio.AppendInt16(dst, fc)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Bind) MarshalJSON() ([]byte, error) {
- formattedParameters := make([]map[string]string, len(src.Parameters))
- for i, p := range src.Parameters {
- if p == nil {
- continue
- }
-
- textFormat := true
- if len(src.ParameterFormatCodes) == 1 {
- textFormat = src.ParameterFormatCodes[0] == 0
- } else if len(src.ParameterFormatCodes) > 1 {
- textFormat = src.ParameterFormatCodes[i] == 0
- }
-
- if textFormat {
- formattedParameters[i] = map[string]string{"text": string(p)}
- } else {
- formattedParameters[i] = map[string]string{"binary": hex.EncodeToString(p)}
- }
- }
-
- return json.Marshal(struct {
- Type string
- DestinationPortal string
- PreparedStatement string
- ParameterFormatCodes []int16
- Parameters []map[string]string
- ResultFormatCodes []int16
- }{
- Type: "Bind",
- DestinationPortal: src.DestinationPortal,
- PreparedStatement: src.PreparedStatement,
- ParameterFormatCodes: src.ParameterFormatCodes,
- Parameters: formattedParameters,
- ResultFormatCodes: src.ResultFormatCodes,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *Bind) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- DestinationPortal string
- PreparedStatement string
- ParameterFormatCodes []int16
- Parameters []map[string]string
- ResultFormatCodes []int16
- }
- err := json.Unmarshal(data, &msg)
- if err != nil {
- return err
- }
- dst.DestinationPortal = msg.DestinationPortal
- dst.PreparedStatement = msg.PreparedStatement
- dst.ParameterFormatCodes = msg.ParameterFormatCodes
- dst.Parameters = make([][]byte, len(msg.Parameters))
- dst.ResultFormatCodes = msg.ResultFormatCodes
- for n, parameter := range msg.Parameters {
- dst.Parameters[n], err = getValueFromJSON(parameter)
- if err != nil {
- return fmt.Errorf("cannot get param %d: %w", n, err)
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/bind_complete.go b/vendor/github.com/jackc/pgproto3/v2/bind_complete.go
deleted file mode 100644
index 3be256c89..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/bind_complete.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type BindComplete struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*BindComplete) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *BindComplete) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "BindComplete", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *BindComplete) Encode(dst []byte) []byte {
- return append(dst, '2', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src BindComplete) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "BindComplete",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/cancel_request.go b/vendor/github.com/jackc/pgproto3/v2/cancel_request.go
deleted file mode 100644
index 942e404be..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/cancel_request.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-const cancelRequestCode = 80877102
-
-type CancelRequest struct {
- ProcessID uint32
- SecretKey uint32
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*CancelRequest) Frontend() {}
-
-func (dst *CancelRequest) Decode(src []byte) error {
- if len(src) != 12 {
- return errors.New("bad cancel request size")
- }
-
- requestCode := binary.BigEndian.Uint32(src)
-
- if requestCode != cancelRequestCode {
- return errors.New("bad cancel request code")
- }
-
- dst.ProcessID = binary.BigEndian.Uint32(src[4:])
- dst.SecretKey = binary.BigEndian.Uint32(src[8:])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 4 byte message length.
-func (src *CancelRequest) Encode(dst []byte) []byte {
- dst = pgio.AppendInt32(dst, 16)
- dst = pgio.AppendInt32(dst, cancelRequestCode)
- dst = pgio.AppendUint32(dst, src.ProcessID)
- dst = pgio.AppendUint32(dst, src.SecretKey)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CancelRequest) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ProcessID uint32
- SecretKey uint32
- }{
- Type: "CancelRequest",
- ProcessID: src.ProcessID,
- SecretKey: src.SecretKey,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/chunkreader.go b/vendor/github.com/jackc/pgproto3/v2/chunkreader.go
deleted file mode 100644
index 92206f358..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/chunkreader.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package pgproto3
-
-import (
- "io"
-
- "github.com/jackc/chunkreader/v2"
-)
-
-// ChunkReader is an interface to decouple github.com/jackc/chunkreader from this package.
-type ChunkReader interface {
- // Next returns buf filled with the next n bytes. If an error (including a partial read) occurs,
- // buf must be nil. Next must preserve any partially read data. Next must not reuse buf.
- Next(n int) (buf []byte, err error)
-}
-
-// NewChunkReader creates and returns a new default ChunkReader.
-func NewChunkReader(r io.Reader) ChunkReader {
- return chunkreader.New(r)
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/close.go b/vendor/github.com/jackc/pgproto3/v2/close.go
deleted file mode 100644
index a45f2b930..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/close.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type Close struct {
- ObjectType byte // 'S' = prepared statement, 'P' = portal
- Name string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Close) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Close) Decode(src []byte) error {
- if len(src) < 2 {
- return &invalidMessageFormatErr{messageType: "Close"}
- }
-
- dst.ObjectType = src[0]
- rp := 1
-
- idx := bytes.IndexByte(src[rp:], 0)
- if idx != len(src[rp:])-1 {
- return &invalidMessageFormatErr{messageType: "Close"}
- }
-
- dst.Name = string(src[rp : len(src)-1])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Close) Encode(dst []byte) []byte {
- dst = append(dst, 'C')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.ObjectType)
- dst = append(dst, src.Name...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Close) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ObjectType string
- Name string
- }{
- Type: "Close",
- ObjectType: string(src.ObjectType),
- Name: src.Name,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *Close) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- ObjectType string
- Name string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- if len(msg.ObjectType) != 1 {
- return errors.New("invalid length for Close.ObjectType")
- }
-
- dst.ObjectType = byte(msg.ObjectType[0])
- dst.Name = msg.Name
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/close_complete.go b/vendor/github.com/jackc/pgproto3/v2/close_complete.go
deleted file mode 100644
index 1d7b8f085..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/close_complete.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type CloseComplete struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CloseComplete) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CloseComplete) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "CloseComplete", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CloseComplete) Encode(dst []byte) []byte {
- return append(dst, '3', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CloseComplete) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "CloseComplete",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/command_complete.go b/vendor/github.com/jackc/pgproto3/v2/command_complete.go
deleted file mode 100644
index cdc49f39f..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/command_complete.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type CommandComplete struct {
- CommandTag []byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CommandComplete) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CommandComplete) Decode(src []byte) error {
- idx := bytes.IndexByte(src, 0)
- if idx != len(src)-1 {
- return &invalidMessageFormatErr{messageType: "CommandComplete"}
- }
-
- dst.CommandTag = src[:idx]
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CommandComplete) Encode(dst []byte) []byte {
- dst = append(dst, 'C')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.CommandTag...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CommandComplete) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- CommandTag string
- }{
- Type: "CommandComplete",
- CommandTag: string(src.CommandTag),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *CommandComplete) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- CommandTag string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.CommandTag = []byte(msg.CommandTag)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_both_response.go b/vendor/github.com/jackc/pgproto3/v2/copy_both_response.go
deleted file mode 100644
index 4a1c3a07b..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_both_response.go
+++ /dev/null
@@ -1,95 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type CopyBothResponse struct {
- OverallFormat byte
- ColumnFormatCodes []uint16
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CopyBothResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyBothResponse) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- if buf.Len() < 3 {
- return &invalidMessageFormatErr{messageType: "CopyBothResponse"}
- }
-
- overallFormat := buf.Next(1)[0]
-
- columnCount := int(binary.BigEndian.Uint16(buf.Next(2)))
- if buf.Len() != columnCount*2 {
- return &invalidMessageFormatErr{messageType: "CopyBothResponse"}
- }
-
- columnFormatCodes := make([]uint16, columnCount)
- for i := 0; i < columnCount; i++ {
- columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2))
- }
-
- *dst = CopyBothResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes}
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyBothResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'W')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
- dst = append(dst, src.OverallFormat)
- dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes)))
- for _, fc := range src.ColumnFormatCodes {
- dst = pgio.AppendUint16(dst, fc)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyBothResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ColumnFormatCodes []uint16
- }{
- Type: "CopyBothResponse",
- ColumnFormatCodes: src.ColumnFormatCodes,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *CopyBothResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- OverallFormat string
- ColumnFormatCodes []uint16
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- if len(msg.OverallFormat) != 1 {
- return errors.New("invalid length for CopyBothResponse.OverallFormat")
- }
-
- dst.OverallFormat = msg.OverallFormat[0]
- dst.ColumnFormatCodes = msg.ColumnFormatCodes
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_data.go b/vendor/github.com/jackc/pgproto3/v2/copy_data.go
deleted file mode 100644
index 128aa198c..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_data.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package pgproto3
-
-import (
- "encoding/hex"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type CopyData struct {
- Data []byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CopyData) Backend() {}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*CopyData) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyData) Decode(src []byte) error {
- dst.Data = src
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyData) Encode(dst []byte) []byte {
- dst = append(dst, 'd')
- dst = pgio.AppendInt32(dst, int32(4+len(src.Data)))
- dst = append(dst, src.Data...)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyData) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data string
- }{
- Type: "CopyData",
- Data: hex.EncodeToString(src.Data),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *CopyData) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Data string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Data = []byte(msg.Data)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_done.go b/vendor/github.com/jackc/pgproto3/v2/copy_done.go
deleted file mode 100644
index 0e13282bf..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_done.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type CopyDone struct {
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CopyDone) Backend() {}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*CopyDone) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyDone) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "CopyDone", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyDone) Encode(dst []byte) []byte {
- return append(dst, 'c', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyDone) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "CopyDone",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_fail.go b/vendor/github.com/jackc/pgproto3/v2/copy_fail.go
deleted file mode 100644
index 78ff0b30b..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_fail.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type CopyFail struct {
- Message string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*CopyFail) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyFail) Decode(src []byte) error {
- idx := bytes.IndexByte(src, 0)
- if idx != len(src)-1 {
- return &invalidMessageFormatErr{messageType: "CopyFail"}
- }
-
- dst.Message = string(src[:idx])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyFail) Encode(dst []byte) []byte {
- dst = append(dst, 'f')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.Message...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyFail) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Message string
- }{
- Type: "CopyFail",
- Message: src.Message,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_in_response.go b/vendor/github.com/jackc/pgproto3/v2/copy_in_response.go
deleted file mode 100644
index 80733adcf..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_in_response.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type CopyInResponse struct {
- OverallFormat byte
- ColumnFormatCodes []uint16
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*CopyInResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyInResponse) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- if buf.Len() < 3 {
- return &invalidMessageFormatErr{messageType: "CopyInResponse"}
- }
-
- overallFormat := buf.Next(1)[0]
-
- columnCount := int(binary.BigEndian.Uint16(buf.Next(2)))
- if buf.Len() != columnCount*2 {
- return &invalidMessageFormatErr{messageType: "CopyInResponse"}
- }
-
- columnFormatCodes := make([]uint16, columnCount)
- for i := 0; i < columnCount; i++ {
- columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2))
- }
-
- *dst = CopyInResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes}
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyInResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'G')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.OverallFormat)
- dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes)))
- for _, fc := range src.ColumnFormatCodes {
- dst = pgio.AppendUint16(dst, fc)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyInResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ColumnFormatCodes []uint16
- }{
- Type: "CopyInResponse",
- ColumnFormatCodes: src.ColumnFormatCodes,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *CopyInResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- OverallFormat string
- ColumnFormatCodes []uint16
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- if len(msg.OverallFormat) != 1 {
- return errors.New("invalid length for CopyInResponse.OverallFormat")
- }
-
- dst.OverallFormat = msg.OverallFormat[0]
- dst.ColumnFormatCodes = msg.ColumnFormatCodes
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/copy_out_response.go b/vendor/github.com/jackc/pgproto3/v2/copy_out_response.go
deleted file mode 100644
index 5e607e3ac..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/copy_out_response.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type CopyOutResponse struct {
- OverallFormat byte
- ColumnFormatCodes []uint16
-}
-
-func (*CopyOutResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *CopyOutResponse) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- if buf.Len() < 3 {
- return &invalidMessageFormatErr{messageType: "CopyOutResponse"}
- }
-
- overallFormat := buf.Next(1)[0]
-
- columnCount := int(binary.BigEndian.Uint16(buf.Next(2)))
- if buf.Len() != columnCount*2 {
- return &invalidMessageFormatErr{messageType: "CopyOutResponse"}
- }
-
- columnFormatCodes := make([]uint16, columnCount)
- for i := 0; i < columnCount; i++ {
- columnFormatCodes[i] = binary.BigEndian.Uint16(buf.Next(2))
- }
-
- *dst = CopyOutResponse{OverallFormat: overallFormat, ColumnFormatCodes: columnFormatCodes}
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *CopyOutResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'H')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.OverallFormat)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.ColumnFormatCodes)))
- for _, fc := range src.ColumnFormatCodes {
- dst = pgio.AppendUint16(dst, fc)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src CopyOutResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ColumnFormatCodes []uint16
- }{
- Type: "CopyOutResponse",
- ColumnFormatCodes: src.ColumnFormatCodes,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *CopyOutResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- OverallFormat string
- ColumnFormatCodes []uint16
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- if len(msg.OverallFormat) != 1 {
- return errors.New("invalid length for CopyOutResponse.OverallFormat")
- }
-
- dst.OverallFormat = msg.OverallFormat[0]
- dst.ColumnFormatCodes = msg.ColumnFormatCodes
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/data_row.go b/vendor/github.com/jackc/pgproto3/v2/data_row.go
deleted file mode 100644
index 637687616..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/data_row.go
+++ /dev/null
@@ -1,142 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/hex"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type DataRow struct {
- Values [][]byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*DataRow) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *DataRow) Decode(src []byte) error {
- if len(src) < 2 {
- return &invalidMessageFormatErr{messageType: "DataRow"}
- }
- rp := 0
- fieldCount := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
-
- // If the capacity of the values slice is too small OR substantially too
- // large reallocate. This is too avoid one row with many columns from
- // permanently allocating memory.
- if cap(dst.Values) < fieldCount || cap(dst.Values)-fieldCount > 32 {
- newCap := 32
- if newCap < fieldCount {
- newCap = fieldCount
- }
- dst.Values = make([][]byte, fieldCount, newCap)
- } else {
- dst.Values = dst.Values[:fieldCount]
- }
-
- for i := 0; i < fieldCount; i++ {
- if len(src[rp:]) < 4 {
- return &invalidMessageFormatErr{messageType: "DataRow"}
- }
-
- msgSize := int(int32(binary.BigEndian.Uint32(src[rp:])))
- rp += 4
-
- // null
- if msgSize == -1 {
- dst.Values[i] = nil
- } else {
- if len(src[rp:]) < msgSize {
- return &invalidMessageFormatErr{messageType: "DataRow"}
- }
-
- dst.Values[i] = src[rp : rp+msgSize : rp+msgSize]
- rp += msgSize
- }
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *DataRow) Encode(dst []byte) []byte {
- dst = append(dst, 'D')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.Values)))
- for _, v := range src.Values {
- if v == nil {
- dst = pgio.AppendInt32(dst, -1)
- continue
- }
-
- dst = pgio.AppendInt32(dst, int32(len(v)))
- dst = append(dst, v...)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src DataRow) MarshalJSON() ([]byte, error) {
- formattedValues := make([]map[string]string, len(src.Values))
- for i, v := range src.Values {
- if v == nil {
- continue
- }
-
- var hasNonPrintable bool
- for _, b := range v {
- if b < 32 {
- hasNonPrintable = true
- break
- }
- }
-
- if hasNonPrintable {
- formattedValues[i] = map[string]string{"binary": hex.EncodeToString(v)}
- } else {
- formattedValues[i] = map[string]string{"text": string(v)}
- }
- }
-
- return json.Marshal(struct {
- Type string
- Values []map[string]string
- }{
- Type: "DataRow",
- Values: formattedValues,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *DataRow) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Values []map[string]string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Values = make([][]byte, len(msg.Values))
- for n, parameter := range msg.Values {
- var err error
- dst.Values[n], err = getValueFromJSON(parameter)
- if err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/describe.go b/vendor/github.com/jackc/pgproto3/v2/describe.go
deleted file mode 100644
index 0d825db19..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/describe.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type Describe struct {
- ObjectType byte // 'S' = prepared statement, 'P' = portal
- Name string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Describe) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Describe) Decode(src []byte) error {
- if len(src) < 2 {
- return &invalidMessageFormatErr{messageType: "Describe"}
- }
-
- dst.ObjectType = src[0]
- rp := 1
-
- idx := bytes.IndexByte(src[rp:], 0)
- if idx != len(src[rp:])-1 {
- return &invalidMessageFormatErr{messageType: "Describe"}
- }
-
- dst.Name = string(src[rp : len(src)-1])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Describe) Encode(dst []byte) []byte {
- dst = append(dst, 'D')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.ObjectType)
- dst = append(dst, src.Name...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Describe) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ObjectType string
- Name string
- }{
- Type: "Describe",
- ObjectType: string(src.ObjectType),
- Name: src.Name,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *Describe) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- ObjectType string
- Name string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- if len(msg.ObjectType) != 1 {
- return errors.New("invalid length for Describe.ObjectType")
- }
-
- dst.ObjectType = byte(msg.ObjectType[0])
- dst.Name = msg.Name
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/doc.go b/vendor/github.com/jackc/pgproto3/v2/doc.go
deleted file mode 100644
index 8226dc983..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/doc.go
+++ /dev/null
@@ -1,4 +0,0 @@
-// Package pgproto3 is a encoder and decoder of the PostgreSQL wire protocol version 3.
-//
-// See https://www.postgresql.org/docs/current/protocol-message-formats.html for meanings of the different messages.
-package pgproto3
diff --git a/vendor/github.com/jackc/pgproto3/v2/empty_query_response.go b/vendor/github.com/jackc/pgproto3/v2/empty_query_response.go
deleted file mode 100644
index 2b85e744b..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/empty_query_response.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type EmptyQueryResponse struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*EmptyQueryResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *EmptyQueryResponse) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "EmptyQueryResponse", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *EmptyQueryResponse) Encode(dst []byte) []byte {
- return append(dst, 'I', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src EmptyQueryResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "EmptyQueryResponse",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/error_response.go b/vendor/github.com/jackc/pgproto3/v2/error_response.go
deleted file mode 100644
index ec51e0192..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/error_response.go
+++ /dev/null
@@ -1,334 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "strconv"
-)
-
-type ErrorResponse struct {
- Severity string
- SeverityUnlocalized string // only in 9.6 and greater
- Code string
- Message string
- Detail string
- Hint string
- Position int32
- InternalPosition int32
- InternalQuery string
- Where string
- SchemaName string
- TableName string
- ColumnName string
- DataTypeName string
- ConstraintName string
- File string
- Line int32
- Routine string
-
- UnknownFields map[byte]string
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*ErrorResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *ErrorResponse) Decode(src []byte) error {
- *dst = ErrorResponse{}
-
- buf := bytes.NewBuffer(src)
-
- for {
- k, err := buf.ReadByte()
- if err != nil {
- return err
- }
- if k == 0 {
- break
- }
-
- vb, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- v := string(vb[:len(vb)-1])
-
- switch k {
- case 'S':
- dst.Severity = v
- case 'V':
- dst.SeverityUnlocalized = v
- case 'C':
- dst.Code = v
- case 'M':
- dst.Message = v
- case 'D':
- dst.Detail = v
- case 'H':
- dst.Hint = v
- case 'P':
- s := v
- n, _ := strconv.ParseInt(s, 10, 32)
- dst.Position = int32(n)
- case 'p':
- s := v
- n, _ := strconv.ParseInt(s, 10, 32)
- dst.InternalPosition = int32(n)
- case 'q':
- dst.InternalQuery = v
- case 'W':
- dst.Where = v
- case 's':
- dst.SchemaName = v
- case 't':
- dst.TableName = v
- case 'c':
- dst.ColumnName = v
- case 'd':
- dst.DataTypeName = v
- case 'n':
- dst.ConstraintName = v
- case 'F':
- dst.File = v
- case 'L':
- s := v
- n, _ := strconv.ParseInt(s, 10, 32)
- dst.Line = int32(n)
- case 'R':
- dst.Routine = v
-
- default:
- if dst.UnknownFields == nil {
- dst.UnknownFields = make(map[byte]string)
- }
- dst.UnknownFields[k] = v
- }
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *ErrorResponse) Encode(dst []byte) []byte {
- return append(dst, src.marshalBinary('E')...)
-}
-
-func (src *ErrorResponse) marshalBinary(typeByte byte) []byte {
- var bigEndian BigEndianBuf
- buf := &bytes.Buffer{}
-
- buf.WriteByte(typeByte)
- buf.Write(bigEndian.Uint32(0))
-
- if src.Severity != "" {
- buf.WriteByte('S')
- buf.WriteString(src.Severity)
- buf.WriteByte(0)
- }
- if src.SeverityUnlocalized != "" {
- buf.WriteByte('V')
- buf.WriteString(src.SeverityUnlocalized)
- buf.WriteByte(0)
- }
- if src.Code != "" {
- buf.WriteByte('C')
- buf.WriteString(src.Code)
- buf.WriteByte(0)
- }
- if src.Message != "" {
- buf.WriteByte('M')
- buf.WriteString(src.Message)
- buf.WriteByte(0)
- }
- if src.Detail != "" {
- buf.WriteByte('D')
- buf.WriteString(src.Detail)
- buf.WriteByte(0)
- }
- if src.Hint != "" {
- buf.WriteByte('H')
- buf.WriteString(src.Hint)
- buf.WriteByte(0)
- }
- if src.Position != 0 {
- buf.WriteByte('P')
- buf.WriteString(strconv.Itoa(int(src.Position)))
- buf.WriteByte(0)
- }
- if src.InternalPosition != 0 {
- buf.WriteByte('p')
- buf.WriteString(strconv.Itoa(int(src.InternalPosition)))
- buf.WriteByte(0)
- }
- if src.InternalQuery != "" {
- buf.WriteByte('q')
- buf.WriteString(src.InternalQuery)
- buf.WriteByte(0)
- }
- if src.Where != "" {
- buf.WriteByte('W')
- buf.WriteString(src.Where)
- buf.WriteByte(0)
- }
- if src.SchemaName != "" {
- buf.WriteByte('s')
- buf.WriteString(src.SchemaName)
- buf.WriteByte(0)
- }
- if src.TableName != "" {
- buf.WriteByte('t')
- buf.WriteString(src.TableName)
- buf.WriteByte(0)
- }
- if src.ColumnName != "" {
- buf.WriteByte('c')
- buf.WriteString(src.ColumnName)
- buf.WriteByte(0)
- }
- if src.DataTypeName != "" {
- buf.WriteByte('d')
- buf.WriteString(src.DataTypeName)
- buf.WriteByte(0)
- }
- if src.ConstraintName != "" {
- buf.WriteByte('n')
- buf.WriteString(src.ConstraintName)
- buf.WriteByte(0)
- }
- if src.File != "" {
- buf.WriteByte('F')
- buf.WriteString(src.File)
- buf.WriteByte(0)
- }
- if src.Line != 0 {
- buf.WriteByte('L')
- buf.WriteString(strconv.Itoa(int(src.Line)))
- buf.WriteByte(0)
- }
- if src.Routine != "" {
- buf.WriteByte('R')
- buf.WriteString(src.Routine)
- buf.WriteByte(0)
- }
-
- for k, v := range src.UnknownFields {
- buf.WriteByte(k)
- buf.WriteByte(0)
- buf.WriteString(v)
- buf.WriteByte(0)
- }
-
- buf.WriteByte(0)
-
- binary.BigEndian.PutUint32(buf.Bytes()[1:5], uint32(buf.Len()-1))
-
- return buf.Bytes()
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src ErrorResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Severity string
- SeverityUnlocalized string // only in 9.6 and greater
- Code string
- Message string
- Detail string
- Hint string
- Position int32
- InternalPosition int32
- InternalQuery string
- Where string
- SchemaName string
- TableName string
- ColumnName string
- DataTypeName string
- ConstraintName string
- File string
- Line int32
- Routine string
-
- UnknownFields map[byte]string
- }{
- Type: "ErrorResponse",
- Severity: src.Severity,
- SeverityUnlocalized: src.SeverityUnlocalized,
- Code: src.Code,
- Message: src.Message,
- Detail: src.Detail,
- Hint: src.Hint,
- Position: src.Position,
- InternalPosition: src.InternalPosition,
- InternalQuery: src.InternalQuery,
- Where: src.Where,
- SchemaName: src.SchemaName,
- TableName: src.TableName,
- ColumnName: src.ColumnName,
- DataTypeName: src.DataTypeName,
- ConstraintName: src.ConstraintName,
- File: src.File,
- Line: src.Line,
- Routine: src.Routine,
- UnknownFields: src.UnknownFields,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *ErrorResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Type string
- Severity string
- SeverityUnlocalized string // only in 9.6 and greater
- Code string
- Message string
- Detail string
- Hint string
- Position int32
- InternalPosition int32
- InternalQuery string
- Where string
- SchemaName string
- TableName string
- ColumnName string
- DataTypeName string
- ConstraintName string
- File string
- Line int32
- Routine string
-
- UnknownFields map[byte]string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
-
- dst.Severity = msg.Severity
- dst.SeverityUnlocalized = msg.SeverityUnlocalized
- dst.Code = msg.Code
- dst.Message = msg.Message
- dst.Detail = msg.Detail
- dst.Hint = msg.Hint
- dst.Position = msg.Position
- dst.InternalPosition = msg.InternalPosition
- dst.InternalQuery = msg.InternalQuery
- dst.Where = msg.Where
- dst.SchemaName = msg.SchemaName
- dst.TableName = msg.TableName
- dst.ColumnName = msg.ColumnName
- dst.DataTypeName = msg.DataTypeName
- dst.ConstraintName = msg.ConstraintName
- dst.File = msg.File
- dst.Line = msg.Line
- dst.Routine = msg.Routine
-
- dst.UnknownFields = msg.UnknownFields
-
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/execute.go b/vendor/github.com/jackc/pgproto3/v2/execute.go
deleted file mode 100644
index 8bae61332..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/execute.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type Execute struct {
- Portal string
- MaxRows uint32
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Execute) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Execute) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- b, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- dst.Portal = string(b[:len(b)-1])
-
- if buf.Len() < 4 {
- return &invalidMessageFormatErr{messageType: "Execute"}
- }
- dst.MaxRows = binary.BigEndian.Uint32(buf.Next(4))
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Execute) Encode(dst []byte) []byte {
- dst = append(dst, 'E')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.Portal...)
- dst = append(dst, 0)
-
- dst = pgio.AppendUint32(dst, src.MaxRows)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Execute) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Portal string
- MaxRows uint32
- }{
- Type: "Execute",
- Portal: src.Portal,
- MaxRows: src.MaxRows,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/flush.go b/vendor/github.com/jackc/pgproto3/v2/flush.go
deleted file mode 100644
index 2725f6894..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/flush.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type Flush struct{}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Flush) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Flush) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "Flush", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Flush) Encode(dst []byte) []byte {
- return append(dst, 'H', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Flush) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "Flush",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/frontend.go b/vendor/github.com/jackc/pgproto3/v2/frontend.go
deleted file mode 100644
index 5be8de808..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/frontend.go
+++ /dev/null
@@ -1,206 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "errors"
- "fmt"
- "io"
-)
-
-// Frontend acts as a client for the PostgreSQL wire protocol version 3.
-type Frontend struct {
- cr ChunkReader
- w io.Writer
-
- // Backend message flyweights
- authenticationOk AuthenticationOk
- authenticationCleartextPassword AuthenticationCleartextPassword
- authenticationMD5Password AuthenticationMD5Password
- authenticationGSS AuthenticationGSS
- authenticationGSSContinue AuthenticationGSSContinue
- authenticationSASL AuthenticationSASL
- authenticationSASLContinue AuthenticationSASLContinue
- authenticationSASLFinal AuthenticationSASLFinal
- backendKeyData BackendKeyData
- bindComplete BindComplete
- closeComplete CloseComplete
- commandComplete CommandComplete
- copyBothResponse CopyBothResponse
- copyData CopyData
- copyInResponse CopyInResponse
- copyOutResponse CopyOutResponse
- copyDone CopyDone
- dataRow DataRow
- emptyQueryResponse EmptyQueryResponse
- errorResponse ErrorResponse
- functionCallResponse FunctionCallResponse
- noData NoData
- noticeResponse NoticeResponse
- notificationResponse NotificationResponse
- parameterDescription ParameterDescription
- parameterStatus ParameterStatus
- parseComplete ParseComplete
- readyForQuery ReadyForQuery
- rowDescription RowDescription
- portalSuspended PortalSuspended
-
- bodyLen int
- msgType byte
- partialMsg bool
- authType uint32
-}
-
-// NewFrontend creates a new Frontend.
-func NewFrontend(cr ChunkReader, w io.Writer) *Frontend {
- return &Frontend{cr: cr, w: w}
-}
-
-// Send sends a message to the backend.
-func (f *Frontend) Send(msg FrontendMessage) error {
- _, err := f.w.Write(msg.Encode(nil))
- return err
-}
-
-func translateEOFtoErrUnexpectedEOF(err error) error {
- if err == io.EOF {
- return io.ErrUnexpectedEOF
- }
- return err
-}
-
-// Receive receives a message from the backend. The returned message is only valid until the next call to Receive.
-func (f *Frontend) Receive() (BackendMessage, error) {
- if !f.partialMsg {
- header, err := f.cr.Next(5)
- if err != nil {
- return nil, translateEOFtoErrUnexpectedEOF(err)
- }
-
- f.msgType = header[0]
- f.bodyLen = int(binary.BigEndian.Uint32(header[1:])) - 4
- f.partialMsg = true
- if f.bodyLen < 0 {
- return nil, errors.New("invalid message with negative body length received")
- }
- }
-
- msgBody, err := f.cr.Next(f.bodyLen)
- if err != nil {
- return nil, translateEOFtoErrUnexpectedEOF(err)
- }
-
- f.partialMsg = false
-
- var msg BackendMessage
- switch f.msgType {
- case '1':
- msg = &f.parseComplete
- case '2':
- msg = &f.bindComplete
- case '3':
- msg = &f.closeComplete
- case 'A':
- msg = &f.notificationResponse
- case 'c':
- msg = &f.copyDone
- case 'C':
- msg = &f.commandComplete
- case 'd':
- msg = &f.copyData
- case 'D':
- msg = &f.dataRow
- case 'E':
- msg = &f.errorResponse
- case 'G':
- msg = &f.copyInResponse
- case 'H':
- msg = &f.copyOutResponse
- case 'I':
- msg = &f.emptyQueryResponse
- case 'K':
- msg = &f.backendKeyData
- case 'n':
- msg = &f.noData
- case 'N':
- msg = &f.noticeResponse
- case 'R':
- var err error
- msg, err = f.findAuthenticationMessageType(msgBody)
- if err != nil {
- return nil, err
- }
- case 's':
- msg = &f.portalSuspended
- case 'S':
- msg = &f.parameterStatus
- case 't':
- msg = &f.parameterDescription
- case 'T':
- msg = &f.rowDescription
- case 'V':
- msg = &f.functionCallResponse
- case 'W':
- msg = &f.copyBothResponse
- case 'Z':
- msg = &f.readyForQuery
- default:
- return nil, fmt.Errorf("unknown message type: %c", f.msgType)
- }
-
- err = msg.Decode(msgBody)
- return msg, err
-}
-
-// Authentication message type constants.
-// See src/include/libpq/pqcomm.h for all
-// constants.
-const (
- AuthTypeOk = 0
- AuthTypeCleartextPassword = 3
- AuthTypeMD5Password = 5
- AuthTypeSCMCreds = 6
- AuthTypeGSS = 7
- AuthTypeGSSCont = 8
- AuthTypeSSPI = 9
- AuthTypeSASL = 10
- AuthTypeSASLContinue = 11
- AuthTypeSASLFinal = 12
-)
-
-func (f *Frontend) findAuthenticationMessageType(src []byte) (BackendMessage, error) {
- if len(src) < 4 {
- return nil, errors.New("authentication message too short")
- }
- f.authType = binary.BigEndian.Uint32(src[:4])
-
- switch f.authType {
- case AuthTypeOk:
- return &f.authenticationOk, nil
- case AuthTypeCleartextPassword:
- return &f.authenticationCleartextPassword, nil
- case AuthTypeMD5Password:
- return &f.authenticationMD5Password, nil
- case AuthTypeSCMCreds:
- return nil, errors.New("AuthTypeSCMCreds is unimplemented")
- case AuthTypeGSS:
- return &f.authenticationGSS, nil
- case AuthTypeGSSCont:
- return &f.authenticationGSSContinue, nil
- case AuthTypeSSPI:
- return nil, errors.New("AuthTypeSSPI is unimplemented")
- case AuthTypeSASL:
- return &f.authenticationSASL, nil
- case AuthTypeSASLContinue:
- return &f.authenticationSASLContinue, nil
- case AuthTypeSASLFinal:
- return &f.authenticationSASLFinal, nil
- default:
- return nil, fmt.Errorf("unknown authentication type: %d", f.authType)
- }
-}
-
-// GetAuthType returns the authType used in the current state of the frontend.
-// See SetAuthType for more information.
-func (f *Frontend) GetAuthType() uint32 {
- return f.authType
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/function_call.go b/vendor/github.com/jackc/pgproto3/v2/function_call.go
deleted file mode 100644
index b3a22c4fb..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/function_call.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "github.com/jackc/pgio"
-)
-
-type FunctionCall struct {
- Function uint32
- ArgFormatCodes []uint16
- Arguments [][]byte
- ResultFormatCode uint16
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*FunctionCall) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *FunctionCall) Decode(src []byte) error {
- *dst = FunctionCall{}
- rp := 0
- // Specifies the object ID of the function to call.
- dst.Function = binary.BigEndian.Uint32(src[rp:])
- rp += 4
- // The number of argument format codes that follow (denoted C below).
- // This can be zero to indicate that there are no arguments or that the arguments all use the default format (text);
- // or one, in which case the specified format code is applied to all arguments;
- // or it can equal the actual number of arguments.
- nArgumentCodes := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
- argumentCodes := make([]uint16, nArgumentCodes)
- for i := 0; i < nArgumentCodes; i++ {
- // The argument format codes. Each must presently be zero (text) or one (binary).
- ac := binary.BigEndian.Uint16(src[rp:])
- if ac != 0 && ac != 1 {
- return &invalidMessageFormatErr{messageType: "FunctionCall"}
- }
- argumentCodes[i] = ac
- rp += 2
- }
- dst.ArgFormatCodes = argumentCodes
-
- // Specifies the number of arguments being supplied to the function.
- nArguments := int(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
- arguments := make([][]byte, nArguments)
- for i := 0; i < nArguments; i++ {
- // The length of the argument value, in bytes (this count does not include itself). Can be zero.
- // As a special case, -1 indicates a NULL argument value. No value bytes follow in the NULL case.
- argumentLength := int(binary.BigEndian.Uint32(src[rp:]))
- rp += 4
- if argumentLength == -1 {
- arguments[i] = nil
- } else {
- // The value of the argument, in the format indicated by the associated format code. n is the above length.
- argumentValue := src[rp : rp+argumentLength]
- rp += argumentLength
- arguments[i] = argumentValue
- }
- }
- dst.Arguments = arguments
- // The format code for the function result. Must presently be zero (text) or one (binary).
- resultFormatCode := binary.BigEndian.Uint16(src[rp:])
- if resultFormatCode != 0 && resultFormatCode != 1 {
- return &invalidMessageFormatErr{messageType: "FunctionCall"}
- }
- dst.ResultFormatCode = resultFormatCode
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *FunctionCall) Encode(dst []byte) []byte {
- dst = append(dst, 'F')
- sp := len(dst)
- dst = pgio.AppendUint32(dst, 0) // Unknown length, set it at the end
- dst = pgio.AppendUint32(dst, src.Function)
- dst = pgio.AppendUint16(dst, uint16(len(src.ArgFormatCodes)))
- for _, argFormatCode := range src.ArgFormatCodes {
- dst = pgio.AppendUint16(dst, argFormatCode)
- }
- dst = pgio.AppendUint16(dst, uint16(len(src.Arguments)))
- for _, argument := range src.Arguments {
- if argument == nil {
- dst = pgio.AppendInt32(dst, -1)
- } else {
- dst = pgio.AppendInt32(dst, int32(len(argument)))
- dst = append(dst, argument...)
- }
- }
- dst = pgio.AppendUint16(dst, src.ResultFormatCode)
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
- return dst
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/function_call_response.go b/vendor/github.com/jackc/pgproto3/v2/function_call_response.go
deleted file mode 100644
index 53d642221..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/function_call_response.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/hex"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type FunctionCallResponse struct {
- Result []byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*FunctionCallResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *FunctionCallResponse) Decode(src []byte) error {
- if len(src) < 4 {
- return &invalidMessageFormatErr{messageType: "FunctionCallResponse"}
- }
- rp := 0
- resultSize := int(binary.BigEndian.Uint32(src[rp:]))
- rp += 4
-
- if resultSize == -1 {
- dst.Result = nil
- return nil
- }
-
- if len(src[rp:]) != resultSize {
- return &invalidMessageFormatErr{messageType: "FunctionCallResponse"}
- }
-
- dst.Result = src[rp:]
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *FunctionCallResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'V')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- if src.Result == nil {
- dst = pgio.AppendInt32(dst, -1)
- } else {
- dst = pgio.AppendInt32(dst, int32(len(src.Result)))
- dst = append(dst, src.Result...)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src FunctionCallResponse) MarshalJSON() ([]byte, error) {
- var formattedValue map[string]string
- var hasNonPrintable bool
- for _, b := range src.Result {
- if b < 32 {
- hasNonPrintable = true
- break
- }
- }
-
- if hasNonPrintable {
- formattedValue = map[string]string{"binary": hex.EncodeToString(src.Result)}
- } else {
- formattedValue = map[string]string{"text": string(src.Result)}
- }
-
- return json.Marshal(struct {
- Type string
- Result map[string]string
- }{
- Type: "FunctionCallResponse",
- Result: formattedValue,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *FunctionCallResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- Result map[string]string
- }
- err := json.Unmarshal(data, &msg)
- if err != nil {
- return err
- }
- dst.Result, err = getValueFromJSON(msg.Result)
- return err
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/gss_enc_request.go b/vendor/github.com/jackc/pgproto3/v2/gss_enc_request.go
deleted file mode 100644
index cf405a3e0..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/gss_enc_request.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-const gssEncReqNumber = 80877104
-
-type GSSEncRequest struct {
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*GSSEncRequest) Frontend() {}
-
-func (dst *GSSEncRequest) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("gss encoding request too short")
- }
-
- requestCode := binary.BigEndian.Uint32(src)
-
- if requestCode != gssEncReqNumber {
- return errors.New("bad gss encoding request code")
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 4 byte message length.
-func (src *GSSEncRequest) Encode(dst []byte) []byte {
- dst = pgio.AppendInt32(dst, 8)
- dst = pgio.AppendInt32(dst, gssEncReqNumber)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src GSSEncRequest) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ProtocolVersion uint32
- Parameters map[string]string
- }{
- Type: "GSSEncRequest",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/gss_response.go b/vendor/github.com/jackc/pgproto3/v2/gss_response.go
deleted file mode 100644
index 62da99c79..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/gss_response.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
- "github.com/jackc/pgio"
-)
-
-type GSSResponse struct {
- Data []byte
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (g *GSSResponse) Frontend() {}
-
-func (g *GSSResponse) Decode(data []byte) error {
- g.Data = data
- return nil
-}
-
-func (g *GSSResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'p')
- dst = pgio.AppendInt32(dst, int32(4+len(g.Data)))
- dst = append(dst, g.Data...)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (g *GSSResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data []byte
- }{
- Type: "GSSResponse",
- Data: g.Data,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (g *GSSResponse) UnmarshalJSON(data []byte) error {
- var msg struct {
- Data []byte
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- g.Data = msg.Data
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/no_data.go b/vendor/github.com/jackc/pgproto3/v2/no_data.go
deleted file mode 100644
index d8f85d38a..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/no_data.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type NoData struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*NoData) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *NoData) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "NoData", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *NoData) Encode(dst []byte) []byte {
- return append(dst, 'n', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src NoData) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "NoData",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/notice_response.go b/vendor/github.com/jackc/pgproto3/v2/notice_response.go
deleted file mode 100644
index 4ac28a791..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/notice_response.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package pgproto3
-
-type NoticeResponse ErrorResponse
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*NoticeResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *NoticeResponse) Decode(src []byte) error {
- return (*ErrorResponse)(dst).Decode(src)
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *NoticeResponse) Encode(dst []byte) []byte {
- return append(dst, (*ErrorResponse)(src).marshalBinary('N')...)
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/notification_response.go b/vendor/github.com/jackc/pgproto3/v2/notification_response.go
deleted file mode 100644
index e762eb967..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/notification_response.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type NotificationResponse struct {
- PID uint32
- Channel string
- Payload string
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*NotificationResponse) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *NotificationResponse) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- pid := binary.BigEndian.Uint32(buf.Next(4))
-
- b, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- channel := string(b[:len(b)-1])
-
- b, err = buf.ReadBytes(0)
- if err != nil {
- return err
- }
- payload := string(b[:len(b)-1])
-
- *dst = NotificationResponse{PID: pid, Channel: channel, Payload: payload}
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *NotificationResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'A')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = pgio.AppendUint32(dst, src.PID)
- dst = append(dst, src.Channel...)
- dst = append(dst, 0)
- dst = append(dst, src.Payload...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src NotificationResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- PID uint32
- Channel string
- Payload string
- }{
- Type: "NotificationResponse",
- PID: src.PID,
- Channel: src.Channel,
- Payload: src.Payload,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/parameter_description.go b/vendor/github.com/jackc/pgproto3/v2/parameter_description.go
deleted file mode 100644
index e28965c8a..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/parameter_description.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type ParameterDescription struct {
- ParameterOIDs []uint32
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*ParameterDescription) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *ParameterDescription) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- if buf.Len() < 2 {
- return &invalidMessageFormatErr{messageType: "ParameterDescription"}
- }
-
- // Reported parameter count will be incorrect when number of args is greater than uint16
- buf.Next(2)
- // Instead infer parameter count by remaining size of message
- parameterCount := buf.Len() / 4
-
- *dst = ParameterDescription{ParameterOIDs: make([]uint32, parameterCount)}
-
- for i := 0; i < parameterCount; i++ {
- dst.ParameterOIDs[i] = binary.BigEndian.Uint32(buf.Next(4))
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *ParameterDescription) Encode(dst []byte) []byte {
- dst = append(dst, 't')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.ParameterOIDs)))
- for _, oid := range src.ParameterOIDs {
- dst = pgio.AppendUint32(dst, oid)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src ParameterDescription) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ParameterOIDs []uint32
- }{
- Type: "ParameterDescription",
- ParameterOIDs: src.ParameterOIDs,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/parameter_status.go b/vendor/github.com/jackc/pgproto3/v2/parameter_status.go
deleted file mode 100644
index c4021d92f..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/parameter_status.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type ParameterStatus struct {
- Name string
- Value string
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*ParameterStatus) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *ParameterStatus) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- b, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- name := string(b[:len(b)-1])
-
- b, err = buf.ReadBytes(0)
- if err != nil {
- return err
- }
- value := string(b[:len(b)-1])
-
- *dst = ParameterStatus{Name: name, Value: value}
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *ParameterStatus) Encode(dst []byte) []byte {
- dst = append(dst, 'S')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.Name...)
- dst = append(dst, 0)
- dst = append(dst, src.Value...)
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (ps ParameterStatus) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Name string
- Value string
- }{
- Type: "ParameterStatus",
- Name: ps.Name,
- Value: ps.Value,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/parse.go b/vendor/github.com/jackc/pgproto3/v2/parse.go
deleted file mode 100644
index 723885d41..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/parse.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type Parse struct {
- Name string
- Query string
- ParameterOIDs []uint32
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Parse) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Parse) Decode(src []byte) error {
- *dst = Parse{}
-
- buf := bytes.NewBuffer(src)
-
- b, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- dst.Name = string(b[:len(b)-1])
-
- b, err = buf.ReadBytes(0)
- if err != nil {
- return err
- }
- dst.Query = string(b[:len(b)-1])
-
- if buf.Len() < 2 {
- return &invalidMessageFormatErr{messageType: "Parse"}
- }
- parameterOIDCount := int(binary.BigEndian.Uint16(buf.Next(2)))
-
- for i := 0; i < parameterOIDCount; i++ {
- if buf.Len() < 4 {
- return &invalidMessageFormatErr{messageType: "Parse"}
- }
- dst.ParameterOIDs = append(dst.ParameterOIDs, binary.BigEndian.Uint32(buf.Next(4)))
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Parse) Encode(dst []byte) []byte {
- dst = append(dst, 'P')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, src.Name...)
- dst = append(dst, 0)
- dst = append(dst, src.Query...)
- dst = append(dst, 0)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.ParameterOIDs)))
- for _, oid := range src.ParameterOIDs {
- dst = pgio.AppendUint32(dst, oid)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Parse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Name string
- Query string
- ParameterOIDs []uint32
- }{
- Type: "Parse",
- Name: src.Name,
- Query: src.Query,
- ParameterOIDs: src.ParameterOIDs,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/parse_complete.go b/vendor/github.com/jackc/pgproto3/v2/parse_complete.go
deleted file mode 100644
index 92c9498b6..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/parse_complete.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type ParseComplete struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*ParseComplete) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *ParseComplete) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "ParseComplete", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *ParseComplete) Encode(dst []byte) []byte {
- return append(dst, '1', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src ParseComplete) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "ParseComplete",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/password_message.go b/vendor/github.com/jackc/pgproto3/v2/password_message.go
deleted file mode 100644
index cae76c50c..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/password_message.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type PasswordMessage struct {
- Password string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*PasswordMessage) Frontend() {}
-
-// Frontend identifies this message as an authentication response.
-func (*PasswordMessage) InitialResponse() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *PasswordMessage) Decode(src []byte) error {
- buf := bytes.NewBuffer(src)
-
- b, err := buf.ReadBytes(0)
- if err != nil {
- return err
- }
- dst.Password = string(b[:len(b)-1])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *PasswordMessage) Encode(dst []byte) []byte {
- dst = append(dst, 'p')
- dst = pgio.AppendInt32(dst, int32(4+len(src.Password)+1))
-
- dst = append(dst, src.Password...)
- dst = append(dst, 0)
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src PasswordMessage) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Password string
- }{
- Type: "PasswordMessage",
- Password: src.Password,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/pgproto3.go b/vendor/github.com/jackc/pgproto3/v2/pgproto3.go
deleted file mode 100644
index 70c825e3c..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/pgproto3.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package pgproto3
-
-import (
- "encoding/hex"
- "errors"
- "fmt"
-)
-
-// Message is the interface implemented by an object that can decode and encode
-// a particular PostgreSQL message.
-type Message interface {
- // Decode is allowed and expected to retain a reference to data after
- // returning (unlike encoding.BinaryUnmarshaler).
- Decode(data []byte) error
-
- // Encode appends itself to dst and returns the new buffer.
- Encode(dst []byte) []byte
-}
-
-type FrontendMessage interface {
- Message
- Frontend() // no-op method to distinguish frontend from backend methods
-}
-
-type BackendMessage interface {
- Message
- Backend() // no-op method to distinguish frontend from backend methods
-}
-
-type AuthenticationResponseMessage interface {
- BackendMessage
- AuthenticationResponse() // no-op method to distinguish authentication responses
-}
-
-type invalidMessageLenErr struct {
- messageType string
- expectedLen int
- actualLen int
-}
-
-func (e *invalidMessageLenErr) Error() string {
- return fmt.Sprintf("%s body must have length of %d, but it is %d", e.messageType, e.expectedLen, e.actualLen)
-}
-
-type invalidMessageFormatErr struct {
- messageType string
-}
-
-func (e *invalidMessageFormatErr) Error() string {
- return fmt.Sprintf("%s body is invalid", e.messageType)
-}
-
-// getValueFromJSON gets the value from a protocol message representation in JSON.
-func getValueFromJSON(v map[string]string) ([]byte, error) {
- if v == nil {
- return nil, nil
- }
- if text, ok := v["text"]; ok {
- return []byte(text), nil
- }
- if binary, ok := v["binary"]; ok {
- return hex.DecodeString(binary)
- }
- return nil, errors.New("unknown protocol representation")
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/portal_suspended.go b/vendor/github.com/jackc/pgproto3/v2/portal_suspended.go
deleted file mode 100644
index 1a9e7bfb1..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/portal_suspended.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type PortalSuspended struct{}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*PortalSuspended) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *PortalSuspended) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "PortalSuspended", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *PortalSuspended) Encode(dst []byte) []byte {
- return append(dst, 's', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src PortalSuspended) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "PortalSuspended",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/query.go b/vendor/github.com/jackc/pgproto3/v2/query.go
deleted file mode 100644
index 41c93b4a8..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/query.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type Query struct {
- String string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Query) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Query) Decode(src []byte) error {
- i := bytes.IndexByte(src, 0)
- if i != len(src)-1 {
- return &invalidMessageFormatErr{messageType: "Query"}
- }
-
- dst.String = string(src[:i])
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Query) Encode(dst []byte) []byte {
- dst = append(dst, 'Q')
- dst = pgio.AppendInt32(dst, int32(4+len(src.String)+1))
-
- dst = append(dst, src.String...)
- dst = append(dst, 0)
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Query) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- String string
- }{
- Type: "Query",
- String: src.String,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/ready_for_query.go b/vendor/github.com/jackc/pgproto3/v2/ready_for_query.go
deleted file mode 100644
index 67a39be39..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/ready_for_query.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
- "errors"
-)
-
-type ReadyForQuery struct {
- TxStatus byte
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*ReadyForQuery) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *ReadyForQuery) Decode(src []byte) error {
- if len(src) != 1 {
- return &invalidMessageLenErr{messageType: "ReadyForQuery", expectedLen: 1, actualLen: len(src)}
- }
-
- dst.TxStatus = src[0]
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *ReadyForQuery) Encode(dst []byte) []byte {
- return append(dst, 'Z', 0, 0, 0, 5, src.TxStatus)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src ReadyForQuery) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- TxStatus string
- }{
- Type: "ReadyForQuery",
- TxStatus: string(src.TxStatus),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *ReadyForQuery) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- TxStatus string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- if len(msg.TxStatus) != 1 {
- return errors.New("invalid length for ReadyForQuery.TxStatus")
- }
- dst.TxStatus = msg.TxStatus[0]
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/row_description.go b/vendor/github.com/jackc/pgproto3/v2/row_description.go
deleted file mode 100644
index a2e0d28e2..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/row_description.go
+++ /dev/null
@@ -1,165 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-const (
- TextFormat = 0
- BinaryFormat = 1
-)
-
-type FieldDescription struct {
- Name []byte
- TableOID uint32
- TableAttributeNumber uint16
- DataTypeOID uint32
- DataTypeSize int16
- TypeModifier int32
- Format int16
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (fd FieldDescription) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Name string
- TableOID uint32
- TableAttributeNumber uint16
- DataTypeOID uint32
- DataTypeSize int16
- TypeModifier int32
- Format int16
- }{
- Name: string(fd.Name),
- TableOID: fd.TableOID,
- TableAttributeNumber: fd.TableAttributeNumber,
- DataTypeOID: fd.DataTypeOID,
- DataTypeSize: fd.DataTypeSize,
- TypeModifier: fd.TypeModifier,
- Format: fd.Format,
- })
-}
-
-type RowDescription struct {
- Fields []FieldDescription
-}
-
-// Backend identifies this message as sendable by the PostgreSQL backend.
-func (*RowDescription) Backend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *RowDescription) Decode(src []byte) error {
-
- if len(src) < 2 {
- return &invalidMessageFormatErr{messageType: "RowDescription"}
- }
- fieldCount := int(binary.BigEndian.Uint16(src))
- rp := 2
-
- dst.Fields = dst.Fields[0:0]
-
- for i := 0; i < fieldCount; i++ {
- var fd FieldDescription
-
- idx := bytes.IndexByte(src[rp:], 0)
- if idx < 0 {
- return &invalidMessageFormatErr{messageType: "RowDescription"}
- }
- fd.Name = src[rp : rp+idx]
- rp += idx + 1
-
- // Since buf.Next() doesn't return an error if we hit the end of the buffer
- // check Len ahead of time
- if len(src[rp:]) < 18 {
- return &invalidMessageFormatErr{messageType: "RowDescription"}
- }
-
- fd.TableOID = binary.BigEndian.Uint32(src[rp:])
- rp += 4
- fd.TableAttributeNumber = binary.BigEndian.Uint16(src[rp:])
- rp += 2
- fd.DataTypeOID = binary.BigEndian.Uint32(src[rp:])
- rp += 4
- fd.DataTypeSize = int16(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
- fd.TypeModifier = int32(binary.BigEndian.Uint32(src[rp:]))
- rp += 4
- fd.Format = int16(binary.BigEndian.Uint16(src[rp:]))
- rp += 2
-
- dst.Fields = append(dst.Fields, fd)
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *RowDescription) Encode(dst []byte) []byte {
- dst = append(dst, 'T')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = pgio.AppendUint16(dst, uint16(len(src.Fields)))
- for _, fd := range src.Fields {
- dst = append(dst, fd.Name...)
- dst = append(dst, 0)
-
- dst = pgio.AppendUint32(dst, fd.TableOID)
- dst = pgio.AppendUint16(dst, fd.TableAttributeNumber)
- dst = pgio.AppendUint32(dst, fd.DataTypeOID)
- dst = pgio.AppendInt16(dst, fd.DataTypeSize)
- dst = pgio.AppendInt32(dst, fd.TypeModifier)
- dst = pgio.AppendInt16(dst, fd.Format)
- }
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src RowDescription) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Fields []FieldDescription
- }{
- Type: "RowDescription",
- Fields: src.Fields,
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *RowDescription) UnmarshalJSON(data []byte) error {
- var msg struct {
- Fields []struct {
- Name string
- TableOID uint32
- TableAttributeNumber uint16
- DataTypeOID uint32
- DataTypeSize int16
- TypeModifier int32
- Format int16
- }
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- dst.Fields = make([]FieldDescription, len(msg.Fields))
- for n, field := range msg.Fields {
- dst.Fields[n] = FieldDescription{
- Name: []byte(field.Name),
- TableOID: field.TableOID,
- TableAttributeNumber: field.TableAttributeNumber,
- DataTypeOID: field.DataTypeOID,
- DataTypeSize: field.DataTypeSize,
- TypeModifier: field.TypeModifier,
- Format: field.Format,
- }
- }
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/sasl_initial_response.go b/vendor/github.com/jackc/pgproto3/v2/sasl_initial_response.go
deleted file mode 100644
index a6b553e72..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/sasl_initial_response.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-type SASLInitialResponse struct {
- AuthMechanism string
- Data []byte
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*SASLInitialResponse) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *SASLInitialResponse) Decode(src []byte) error {
- *dst = SASLInitialResponse{}
-
- rp := 0
-
- idx := bytes.IndexByte(src, 0)
- if idx < 0 {
- return errors.New("invalid SASLInitialResponse")
- }
-
- dst.AuthMechanism = string(src[rp:idx])
- rp = idx + 1
-
- rp += 4 // The rest of the message is data so we can just skip the size
- dst.Data = src[rp:]
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *SASLInitialResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'p')
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = append(dst, []byte(src.AuthMechanism)...)
- dst = append(dst, 0)
-
- dst = pgio.AppendInt32(dst, int32(len(src.Data)))
- dst = append(dst, src.Data...)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src SASLInitialResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- AuthMechanism string
- Data string
- }{
- Type: "SASLInitialResponse",
- AuthMechanism: src.AuthMechanism,
- Data: string(src.Data),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *SASLInitialResponse) UnmarshalJSON(data []byte) error {
- // Ignore null, like in the main JSON package.
- if string(data) == "null" {
- return nil
- }
-
- var msg struct {
- AuthMechanism string
- Data string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- dst.AuthMechanism = msg.AuthMechanism
- dst.Data = []byte(msg.Data)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/sasl_response.go b/vendor/github.com/jackc/pgproto3/v2/sasl_response.go
deleted file mode 100644
index d3e5d6a56..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/sasl_response.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-
- "github.com/jackc/pgio"
-)
-
-type SASLResponse struct {
- Data []byte
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*SASLResponse) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *SASLResponse) Decode(src []byte) error {
- *dst = SASLResponse{Data: src}
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *SASLResponse) Encode(dst []byte) []byte {
- dst = append(dst, 'p')
- dst = pgio.AppendInt32(dst, int32(4+len(src.Data)))
-
- dst = append(dst, src.Data...)
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src SASLResponse) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- Data string
- }{
- Type: "SASLResponse",
- Data: string(src.Data),
- })
-}
-
-// UnmarshalJSON implements encoding/json.Unmarshaler.
-func (dst *SASLResponse) UnmarshalJSON(data []byte) error {
- var msg struct {
- Data string
- }
- if err := json.Unmarshal(data, &msg); err != nil {
- return err
- }
- dst.Data = []byte(msg.Data)
- return nil
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/ssl_request.go b/vendor/github.com/jackc/pgproto3/v2/ssl_request.go
deleted file mode 100644
index 96ce489e5..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/ssl_request.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package pgproto3
-
-import (
- "encoding/binary"
- "encoding/json"
- "errors"
-
- "github.com/jackc/pgio"
-)
-
-const sslRequestNumber = 80877103
-
-type SSLRequest struct {
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*SSLRequest) Frontend() {}
-
-func (dst *SSLRequest) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("ssl request too short")
- }
-
- requestCode := binary.BigEndian.Uint32(src)
-
- if requestCode != sslRequestNumber {
- return errors.New("bad ssl request code")
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 4 byte message length.
-func (src *SSLRequest) Encode(dst []byte) []byte {
- dst = pgio.AppendInt32(dst, 8)
- dst = pgio.AppendInt32(dst, sslRequestNumber)
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src SSLRequest) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ProtocolVersion uint32
- Parameters map[string]string
- }{
- Type: "SSLRequest",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/startup_message.go b/vendor/github.com/jackc/pgproto3/v2/startup_message.go
deleted file mode 100644
index 5f1cd24f7..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/startup_message.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package pgproto3
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "errors"
- "fmt"
-
- "github.com/jackc/pgio"
-)
-
-const ProtocolVersionNumber = 196608 // 3.0
-
-type StartupMessage struct {
- ProtocolVersion uint32
- Parameters map[string]string
-}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*StartupMessage) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *StartupMessage) Decode(src []byte) error {
- if len(src) < 4 {
- return errors.New("startup message too short")
- }
-
- dst.ProtocolVersion = binary.BigEndian.Uint32(src)
- rp := 4
-
- if dst.ProtocolVersion != ProtocolVersionNumber {
- return fmt.Errorf("Bad startup message version number. Expected %d, got %d", ProtocolVersionNumber, dst.ProtocolVersion)
- }
-
- dst.Parameters = make(map[string]string)
- for {
- idx := bytes.IndexByte(src[rp:], 0)
- if idx < 0 {
- return &invalidMessageFormatErr{messageType: "StartupMesage"}
- }
- key := string(src[rp : rp+idx])
- rp += idx + 1
-
- idx = bytes.IndexByte(src[rp:], 0)
- if idx < 0 {
- return &invalidMessageFormatErr{messageType: "StartupMesage"}
- }
- value := string(src[rp : rp+idx])
- rp += idx + 1
-
- dst.Parameters[key] = value
-
- if len(src[rp:]) == 1 {
- if src[rp] != 0 {
- return fmt.Errorf("Bad startup message last byte. Expected 0, got %d", src[rp])
- }
- break
- }
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *StartupMessage) Encode(dst []byte) []byte {
- sp := len(dst)
- dst = pgio.AppendInt32(dst, -1)
-
- dst = pgio.AppendUint32(dst, src.ProtocolVersion)
- for k, v := range src.Parameters {
- dst = append(dst, k...)
- dst = append(dst, 0)
- dst = append(dst, v...)
- dst = append(dst, 0)
- }
- dst = append(dst, 0)
-
- pgio.SetInt32(dst[sp:], int32(len(dst[sp:])))
-
- return dst
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src StartupMessage) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- ProtocolVersion uint32
- Parameters map[string]string
- }{
- Type: "StartupMessage",
- ProtocolVersion: src.ProtocolVersion,
- Parameters: src.Parameters,
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/sync.go b/vendor/github.com/jackc/pgproto3/v2/sync.go
deleted file mode 100644
index 5db8e07ac..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/sync.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type Sync struct{}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Sync) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Sync) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "Sync", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Sync) Encode(dst []byte) []byte {
- return append(dst, 'S', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Sync) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "Sync",
- })
-}
diff --git a/vendor/github.com/jackc/pgproto3/v2/terminate.go b/vendor/github.com/jackc/pgproto3/v2/terminate.go
deleted file mode 100644
index 135191eae..000000000
--- a/vendor/github.com/jackc/pgproto3/v2/terminate.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package pgproto3
-
-import (
- "encoding/json"
-)
-
-type Terminate struct{}
-
-// Frontend identifies this message as sendable by a PostgreSQL frontend.
-func (*Terminate) Frontend() {}
-
-// Decode decodes src into dst. src must contain the complete message with the exception of the initial 1 byte message
-// type identifier and 4 byte message length.
-func (dst *Terminate) Decode(src []byte) error {
- if len(src) != 0 {
- return &invalidMessageLenErr{messageType: "Terminate", expectedLen: 0, actualLen: len(src)}
- }
-
- return nil
-}
-
-// Encode encodes src into dst. dst will include the 1 byte message type identifier and the 4 byte message length.
-func (src *Terminate) Encode(dst []byte) []byte {
- return append(dst, 'X', 0, 0, 0, 4)
-}
-
-// MarshalJSON implements encoding/json.Marshaler.
-func (src Terminate) MarshalJSON() ([]byte, error) {
- return json.Marshal(struct {
- Type string
- }{
- Type: "Terminate",
- })
-}