schema/alter_schema.go (41 lines of code) (raw):
// Copyright (c) 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package schema
import (
"database/sql"
"fmt"
"time"
"github.com/gofrs/uuid"
"github.com/uber/storagetapper/log"
"github.com/uber/storagetapper/types"
"github.com/uber/storagetapper/util"
)
// MutateTable perform alter schema for the given table, using temporary table
// and return structured and raw schema
func MutateTable(sdb *sql.DB, svc string, dbName string, tableName string, alter string, ts *types.TableSchema, rawSchema *string) bool {
//TODO: Wrap below SQL calls in a transaction
stn, err := uuid.NewV4()
if log.E(err) {
return false
}
tn := time.Now().Format("20060102") + "_" + stn.String()
ftn := "`" + types.MyDBName + "`.`" + tn + "`"
c := fmt.Sprintf("%s_%s_%s", svc, dbName, tableName)
if log.E(util.ExecSQL(sdb, "CREATE TABLE "+ftn+*rawSchema+" COMMENT='"+c+"'")) {
return false
}
defer func() {
log.E(util.ExecSQL(sdb, "DROP TABLE "+ftn))
}()
if log.E(util.ExecSQL(sdb, "ALTER TABLE "+ftn+" "+alter)) {
return false
}
ct, err := getRawLow(sdb, ftn)
if log.E(err) {
return false
}
tsn, err := GetColumns(sdb, types.MyDBName, tn)
if log.E(err) {
return false
}
ts.DBName = dbName
ts.TableName = tableName
ts.Columns = tsn.Columns
*rawSchema = ct
return true
}