From b6f3be0e8e954a86a0ecad3f45a881cfe68f0064 Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Mon, 30 Jul 2018 09:33:49 +0200 Subject: [PATCH] build postgres dsn string dynamically --- pkg/datastore/sqlstore/config.go | 22 +++++++++++++++----- pkg/datastore/sqlstore/config_test.go | 29 +++++++++++++++++++++++++++ pkg/datastore/sqlstore/pageviews.go | 7 +++++++ 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 pkg/datastore/sqlstore/config_test.go diff --git a/pkg/datastore/sqlstore/config.go b/pkg/datastore/sqlstore/config.go index f5b170e..c4e69a8 100644 --- a/pkg/datastore/sqlstore/config.go +++ b/pkg/datastore/sqlstore/config.go @@ -1,8 +1,8 @@ package sqlstore import ( - "fmt" mysql "github.com/go-sql-driver/mysql" + "strings" ) type Config struct { @@ -19,11 +19,23 @@ func (c *Config) DSN() string { switch c.Driver { case "postgres": - dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s", c.Host, c.User, c.Password, c.Name) - - if c.SSLMode != "" { - dsn = dsn + fmt.Sprintf(" sslmode=%s", c.SSLMode) + params := map[string]string{ + "host": c.Host, + "dbname": c.Name, + "user": c.User, + "password": c.Password, + "sslmode": c.SSLMode, } + + for k, v := range params { + if v == "" { + continue + } + + dsn = dsn + k + "=" + v + " " + } + + dsn = strings.TrimSpace(dsn) case "mysql": mc := mysql.NewConfig() mc.User = c.User diff --git a/pkg/datastore/sqlstore/config_test.go b/pkg/datastore/sqlstore/config_test.go new file mode 100644 index 0000000..b6e61c2 --- /dev/null +++ b/pkg/datastore/sqlstore/config_test.go @@ -0,0 +1,29 @@ +package sqlstore + +import ( + "fmt" + "testing" +) + +func TestConfigDSN(t *testing.T) { + c := Config{ + Driver: "postgres", + User: "john", + Password: "foo", + } + e := fmt.Sprintf("user=%s password=%s", c.User, c.Password) + if v := c.DSN(); v != e { + t.Errorf("Invalid DSN. Expected %s, got %s", e, v) + } + + c = Config{ + Driver: "postgres", + User: "john", + Password: "foo", + SSLMode: "disable", + } + e = fmt.Sprintf("user=%s password=%s sslmode=%s", c.User, c.Password, c.SSLMode) + if v := c.DSN(); v != e { + t.Errorf("Invalid DSN. Expected %s, got %s", e, v) + } +} diff --git a/pkg/datastore/sqlstore/pageviews.go b/pkg/datastore/sqlstore/pageviews.go index c1506b1..ff6bcd6 100644 --- a/pkg/datastore/sqlstore/pageviews.go +++ b/pkg/datastore/sqlstore/pageviews.go @@ -78,7 +78,9 @@ func (db *sqlstore) UpdatePageviews(pageviews []*models.Pageview) error { if err != nil { return err } + query := tx.Rebind(`UPDATE pageviews SET is_bounce = ?, duration = ? WHERE id = ?`) + stmt, err := tx.Preparex(query) if err != nil { return err @@ -86,6 +88,11 @@ func (db *sqlstore) UpdatePageviews(pageviews []*models.Pageview) error { for i := range pageviews { _, err = stmt.Exec(query, pageviews[i].IsBounce, pageviews[i].Duration) + + if err != nil { + tx.Rollback() + return err + } } err = tx.Commit()