Skip to content

Commit

Permalink
Merge pull request #76 from agquick/master
Browse files Browse the repository at this point in the history
Support for multiple statements in Cassandra cql migration files
  • Loading branch information
dhui committed Jul 24, 2018
2 parents feea45c + 4244ebe commit fad64ed
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
4 changes: 4 additions & 0 deletions database/cassandra/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
* Drop command will not work on Cassandra 2.X because it rely on
system_schema table which comes with 3.X
* Other commands should work properly but are **not tested**
* The Cassandra driver (gocql) does not natively support executing multipe statements in a single query. To allow for multiple statements in a single migration, you can use the `x-multi-statement` param. There are two important caveats:
* This mode splits the migration text into separately-executed statements by a semi-colon `;`. Thus `x-multi-statement` cannot be used when a statement in the migration contains a string with a semi-colon.
* The queries are not executed in any sort of transaction/batch, meaning you are responsible for fixing partial migrations.


## Usage
Expand All @@ -12,6 +15,7 @@ system_schema table which comes with 3.X
| URL Query | Default value | Description |
|------------|-------------|-----------|
| `x-migrations-table` | schema_migrations | Name of the migrations table |
| `x-multi-statement` | false | Enable multiple statements to be ran in a single migration (See note above) |
| `port` | 9042 | The port to bind to |
| `consistency` | ALL | Migration consistency
| `protocol` | | Cassandra protocol version (3 or 4)
Expand Down
19 changes: 18 additions & 1 deletion database/cassandra/cassandra.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var (
type Config struct {
MigrationsTable string
KeyspaceName string
MultiStatementEnabled bool
}

type Cassandra struct {
Expand Down Expand Up @@ -127,6 +128,7 @@ func (c *Cassandra) Open(url string) (database.Driver, error) {
return WithInstance(session, &Config{
KeyspaceName: strings.TrimPrefix(u.Path, "/"),
MigrationsTable: u.Query().Get("x-migrations-table"),
MultiStatementEnabled: u.Query().Get("x-multi-statement") == "true",
})
}

Expand Down Expand Up @@ -155,11 +157,26 @@ func (c *Cassandra) Run(migration io.Reader) error {
}
// run migration
query := string(migr[:])

if c.config.MultiStatementEnabled {
// split query by semi-colon
queries := strings.Split(query, ";")

for _, q := range(queries) {
tq := strings.TrimSpace(q)
if (tq == "") { continue }
if err := c.session.Query(tq).Exec(); err != nil {
// TODO: cast to Cassandra error and get line number
return database.Error{OrigErr: err, Err: "migration failed", Query: migr}
}
}
return nil
}

if err := c.session.Query(query).Exec(); err != nil {
// TODO: cast to Cassandra error and get line number
return database.Error{OrigErr: err, Err: "migration failed", Query: migr}
}

return nil
}

Expand Down

0 comments on commit fad64ed

Please sign in to comment.