From b6f01da2326bfd440c5458b9255f33d15797a847 Mon Sep 17 00:00:00 2001 From: Dan Sosedoff Date: Wed, 25 Sep 2019 20:29:21 -0500 Subject: [PATCH] Drop unsupported pg_dump options from connection string --- pkg/client/dump.go | 38 ++++++++++++++++++++++++++++++++++++-- pkg/client/dump_test.go | 10 ++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/pkg/client/dump.go b/pkg/client/dump.go index 68a3aaa..4a232f8 100644 --- a/pkg/client/dump.go +++ b/pkg/client/dump.go @@ -4,19 +4,36 @@ import ( "bytes" "fmt" "io" + "net/url" "os/exec" + "strings" ) +var ( + unsupportedDumpOptions = []string{ + "search_path", + } +) + +// Dump represents a database dump type Dump struct { Table string } +// CanExport returns true if database dump tool could be used without an error func (d *Dump) CanExport() bool { err := exec.Command("pg_dump", "--version").Run() return err == nil } -func (d *Dump) Export(url string, writer io.Writer) error { +// Export streams the database dump to the specified writer +func (d *Dump) Export(connstr string, writer io.Writer) error { + if str, err := removeUnsupportedOptions(connstr); err != nil { + return err + } else { + connstr = str + } + errOutput := bytes.NewBuffer(nil) opts := []string{ @@ -29,7 +46,7 @@ func (d *Dump) Export(url string, writer io.Writer) error { opts = append(opts, []string{"--table", d.Table}...) } - opts = append(opts, url) + opts = append(opts, connstr) cmd := exec.Command("pg_dump", opts...) cmd.Stdout = writer @@ -40,3 +57,20 @@ func (d *Dump) Export(url string, writer io.Writer) error { } return nil } + +// removeUnsupportedOptions removes any options unsupported for making a db dump +func removeUnsupportedOptions(input string) (string, error) { + uri, err := url.Parse(input) + if err != nil { + return "", err + } + + q := uri.Query() + for _, opt := range unsupportedDumpOptions { + q.Del(opt) + q.Del(strings.ToUpper(opt)) + } + uri.RawQuery = q.Encode() + + return uri.String(), nil +} diff --git a/pkg/client/dump_test.go b/pkg/client/dump_test.go index 884bc35..413a068 100644 --- a/pkg/client/dump_test.go +++ b/pkg/client/dump_test.go @@ -34,8 +34,8 @@ func testDumpExport(t *testing.T) { assert.NoError(t, err) // Test nonexistent database - invalidUrl := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, "foobar") - err = dump.Export(invalidUrl, saveFile) + invalidURL := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable", serverUser, serverHost, serverPort, "foobar") + err = dump.Export(invalidURL, saveFile) assert.Contains(t, err.Error(), `database "foobar" does not exist`) // Test dump of non existent db @@ -43,4 +43,10 @@ func testDumpExport(t *testing.T) { err = dump.Export(url, saveFile) assert.NotNil(t, err) assert.Contains(t, err.Error(), "pg_dump: no matching tables were found") + + // Should drop "search_path" param from URI + dump = Dump{} + searchPathURL := fmt.Sprintf("postgres://%s@%s:%s/%s?sslmode=disable&search_path=private", serverUser, serverHost, serverPort, serverDatabase) + err = dump.Export(searchPathURL, saveFile) + assert.NoError(t, err) }