From e7a689267a87c361eff6151f781f4783d485f541 Mon Sep 17 00:00:00 2001 From: Yuriy Didukh Date: Mon, 7 Aug 2017 18:31:20 +0300 Subject: [PATCH] Add possiblity for cassandra migrations to have multiple query statements in a single migrate file (up/down) --- database/cassandra/cassandra.go | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index 3dd93793..b32e5d88 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -9,6 +9,8 @@ import ( "time" "github.com/mattes/migrate/database" "strconv" + "strings" + "regexp" ) func init() { @@ -129,10 +131,26 @@ func (p *Cassandra) Run(migration io.Reader) error { return err } // run migration - query := string(migr[:]) - if err := p.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} + var isPreparedStatement = regexp.MustCompile(`(?mi)^BEGIN BATCH`) + var splitRegex = regexp.MustCompile(`(?m);\s*$`) + + queries := string(migr[:]) + requests := []string{queries} + if isPreparedStatement.MatchString(queries) != true { + requests = splitRegex.Split(queries, -1) + } + + for i, query := range requests { + if strings.TrimSpace(query) == "" { + continue + } + if i < len(requests) - 1 { + query += ";" + } + if err := p.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