2
0

Add Config.Copy() method that return a smart copy of the config.

This commit is contained in:
georgysavva
2020-06-01 19:20:17 +03:00
parent 2647eff567
commit 8d541d0004
4 changed files with 45 additions and 0 deletions
+9
View File
@@ -17,6 +17,8 @@ import (
"strings"
"time"
"github.com/mohae/deepcopy"
"github.com/jackc/chunkreader/v2"
"github.com/jackc/pgpassfile"
"github.com/jackc/pgproto3/v2"
@@ -62,6 +64,13 @@ type Config struct {
createdByParseConfig bool // Used to enforce created by ParseConfig rule.
}
func (c *Config) Copy() *Config {
newConf := deepcopy.Copy(c).(*Config)
// We need to set this field manually because it's unexported and deep copy won't touch it.
newConf.createdByParseConfig = c.createdByParseConfig
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 {
+33
View File
@@ -1,6 +1,7 @@
package pgconn_test
import (
"context"
"crypto/tls"
"fmt"
"io/ioutil"
@@ -527,6 +528,38 @@ func TestParseConfig(t *testing.T) {
}
}
func TestConfigCopyReturnsEqualConfig(t *testing.T) {
connString := "postgres://jack:secret@localhost:5432/mydb?sslmode=disable&application_name=pgxtest&search_path=myschema&connect_timeout=5"
original, err := pgconn.ParseConfig(connString)
require.NoError(t, err)
copied := original.Copy()
assertConfigsEqual(t, original, copied, "Test Config.Copy() returns equal config")
}
func TestConfigCopyOriginalConfigDidNotChange(t *testing.T) {
connString := "postgres://jack:secret@localhost:5432/mydb?sslmode=disable&application_name=pgxtest&search_path=myschema&connect_timeout=5"
original, err := pgconn.ParseConfig(connString)
require.NoError(t, err)
copied := original.Copy()
copied.Port = uint16(5433)
assert.Equal(t, uint16(5432), original.Port)
}
func TestConfigCopyCanBeUsedToConnect(t *testing.T) {
connString := os.Getenv("PGX_TEST_CONN_STRING")
original, err := pgconn.ParseConfig(connString)
require.NoError(t, err)
copied := original.Copy()
assert.NotPanics(t, func() {
_, err = pgconn.ConnectConfig(context.Background(), copied)
})
assert.NoError(t, err)
}
func assertConfigsEqual(t *testing.T, expected, actual *pgconn.Config, testName string) {
if !assert.NotNil(t, expected) {
return
+1
View File
@@ -9,6 +9,7 @@ require (
github.com/jackc/pgpassfile v1.0.0
github.com/jackc/pgproto3/v2 v2.0.1
github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
github.com/stretchr/testify v1.5.1
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59
golang.org/x/text v0.3.2
+2
View File
@@ -54,6 +54,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=