From 5eaf23f8366f4dcf223b971d0ff2a8e83aa8eb51 Mon Sep 17 00:00:00 2001 From: Florent Solt Date: Fri, 11 Jun 2021 09:36:15 +0200 Subject: [PATCH 1/5] Support for AWS Keyspaces --- database/cassandra/README.md | 1 + database/cassandra/cassandra.go | 20 ++++++++++++++++---- go.mod | 2 +- go.sum | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/database/cassandra/README.md b/database/cassandra/README.md index b44000d7b..c3d4387ad 100644 --- a/database/cassandra/README.md +++ b/database/cassandra/README.md @@ -26,6 +26,7 @@ system_schema table which comes with 3.X | `sslkey` | | Key file location. The file must contain PEM encoded data. | | `sslrootcert` | | The location of the root certificate file. The file must contain PEM encoded data. | | `sslmode` | | Whether or not to use SSL (disable\|require\|verify-ca\|verify-full) | +| `disable-host-lookup`| false | Disable initial host lookup. | `timeout` is parsed using [time.ParseDuration(s string)](https://golang.org/pkg/time/#ParseDuration) diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index 58713e72b..54e15e157 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -156,6 +156,10 @@ func (c *Cassandra) Open(url string) (database.Driver, error) { } } + if s := u.Query().Get("disable-host-lookup"); len(s) > 0 { + cluster.DisableInitialHostLookup = true + } + session, err := cluster.CreateSession() if err != nil { return nil, err @@ -228,16 +232,24 @@ func (c *Cassandra) Run(migration io.Reader) error { } func (c *Cassandra) SetVersion(version int, dirty bool) error { - query := `TRUNCATE "` + c.config.MigrationsTable + `"` - if err := c.session.Query(query).Exec(); err != nil { - return &database.Error{OrigErr: err, Query: []byte(query)} + if previous, _, err := c.Version(); err == nil { + if previous != database.NilVersion { + // DELETE instead of TRUNCATE because AWS Keyspaces does not support it + // see: https://docs.aws.amazon.com/keyspaces/latest/devguide/cassandra-apis.html + query := `DELETE FROM "` + c.config.MigrationsTable + `" WHERE version = ?` + if err := c.session.Query(query, previous).Exec(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(query)} + } + } + } else { + return err } // Also re-write the schema version for nil dirty versions to prevent // empty schema version for failed down migration on the first migration // See: https://github.com/golang-migrate/migrate/issues/330 if version >= 0 || (version == database.NilVersion && dirty) { - query = `INSERT INTO "` + c.config.MigrationsTable + `" (version, dirty) VALUES (?, ?)` + query := `INSERT INTO "` + c.config.MigrationsTable + `" (version, dirty) VALUES (?, ?)` if err := c.session.Query(query, version, dirty).Exec(); err != nil { return &database.Error{OrigErr: err, Query: []byte(query)} } diff --git a/go.mod b/go.mod index a2f9bd092..2e0995cb1 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/gabriel-vasile/mimetype v1.4.0 // indirect github.com/go-sql-driver/mysql v1.5.0 github.com/gobuffalo/here v0.6.0 - github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 + github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/google/go-github/v35 v35.2.0 github.com/gorilla/mux v1.7.4 // indirect diff --git a/go.sum b/go.sum index 44e21bbe8..584a63c36 100644 --- a/go.sum +++ b/go.sum @@ -438,6 +438,8 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 h1:vF83LI8tAakwEwvWZtrIEx7pOySacl2TOxx6eXk4ePo= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= +github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 h1:N/MD/sr6o61X+iZBAT2qEUF023s4KbA8RWfKzl0L6MQ= +github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= From b9b66468f572a71492900e8f58781dfdb05cc5ce Mon Sep 17 00:00:00 2001 From: Florent Solt Date: Sat, 12 Jun 2021 15:09:24 +0200 Subject: [PATCH 2/5] Use ParseBool https://github.com/golang-migrate/migrate/pull/579#discussion_r650171022 --- database/cassandra/cassandra.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index 54e15e157..b08ef802d 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -156,8 +156,10 @@ func (c *Cassandra) Open(url string) (database.Driver, error) { } } - if s := u.Query().Get("disable-host-lookup"); len(s) > 0 { + if flag, err := strconv.ParseBool(u.Query().Get("disable-host-lookup")); err != nil && flag { cluster.DisableInitialHostLookup = true + } else if err != nil { + return nil, err } session, err := cluster.CreateSession() From 79472544ff9b54e65b1b6e1ad0ad946b39340efd Mon Sep 17 00:00:00 2001 From: Florent Solt Date: Sat, 12 Jun 2021 15:10:06 +0200 Subject: [PATCH 3/5] Delete all rows https://github.com/golang-migrate/migrate/pull/579#discussion_r650178687 --- database/cassandra/cassandra.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index b08ef802d..47a83b854 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -234,17 +234,19 @@ func (c *Cassandra) Run(migration io.Reader) error { } func (c *Cassandra) SetVersion(version int, dirty bool) error { - if previous, _, err := c.Version(); err == nil { - if previous != database.NilVersion { - // DELETE instead of TRUNCATE because AWS Keyspaces does not support it - // see: https://docs.aws.amazon.com/keyspaces/latest/devguide/cassandra-apis.html - query := `DELETE FROM "` + c.config.MigrationsTable + `" WHERE version = ?` - if err := c.session.Query(query, previous).Exec(); err != nil { - return &database.Error{OrigErr: err, Query: []byte(query)} - } + // DELETE instead of TRUNCATE because AWS Keyspaces does not support it + // see: https://docs.aws.amazon.com/keyspaces/latest/devguide/cassandra-apis.html + squery := `SELECT version FROM "` + c.config.MigrationsTable + `"` + dquery := `DELETE FROM "` + c.config.MigrationsTable + `" WHERE version = ?` + iter := c.session.Query(squery).Iter() + var previous int + for iter.Scan(&previous) { + if err := c.session.Query(dquery, previous).Exec(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(dquery)} } - } else { - return err + } + if err := iter.Close(); err != nil { + return &database.Error{OrigErr: err, Query: []byte(squery)} } // Also re-write the schema version for nil dirty versions to prevent From dbb574c92c797f8d0577334f859baf0841d19110 Mon Sep 17 00:00:00 2001 From: Baumanar Date: Mon, 11 Oct 2021 17:49:18 +0200 Subject: [PATCH 4/5] fix test --- database/cassandra/cassandra.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index 47a83b854..a639426d1 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -156,10 +156,12 @@ func (c *Cassandra) Open(url string) (database.Driver, error) { } } - if flag, err := strconv.ParseBool(u.Query().Get("disable-host-lookup")); err != nil && flag { - cluster.DisableInitialHostLookup = true - } else if err != nil { - return nil, err + if len(u.Query().Get("disable-host-lookup")) > 0 { + if flag, err := strconv.ParseBool(u.Query().Get("disable-host-lookup")); err != nil && flag { + cluster.DisableInitialHostLookup = true + } else if err != nil { + return nil, err + } } session, err := cluster.CreateSession() From c81e147ad684cae993ecf6e3ed8b06b538512230 Mon Sep 17 00:00:00 2001 From: Baumanar Date: Thu, 14 Oct 2021 10:37:49 +0200 Subject: [PATCH 5/5] go mod tidy --- go.mod | 1 - go.sum | 2 -- 2 files changed, 3 deletions(-) diff --git a/go.mod b/go.mod index 2e0995cb1..49d5967cf 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30 // indirect github.com/aws/aws-sdk-go v1.17.7 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.4 // indirect - github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect github.com/cenkalti/backoff/v4 v4.0.2 github.com/cockroachdb/cockroach-go/v2 v2.1.1 github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 // indirect diff --git a/go.sum b/go.sum index 584a63c36..153d65687 100644 --- a/go.sum +++ b/go.sum @@ -436,8 +436,6 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 h1:vF83LI8tAakwEwvWZtrIEx7pOySacl2TOxx6eXk4ePo= -github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 h1:N/MD/sr6o61X+iZBAT2qEUF023s4KbA8RWfKzl0L6MQ= github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=