package dbmigrate.parser;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import dbmigrate.model.db.Column;
import dbmigrate.model.db.IColumn;
import dbmigrate.model.db.Table;
import dbmigrate.model.db.TypeEnum;
import dbmigrate.model.operation.AddColumnOperationDescriptor;
import dbmigrate.model.operation.CreateTableOperationDescriptor;
import dbmigrate.model.operation.DropColumnOperationDescriptor;
import dbmigrate.model.operation.DropTableOperationDescriptor;
import dbmigrate.model.operation.IOperationDescriptor;
import dbmigrate.model.operation.MergeColumnOperationDescriptor;
import dbmigrate.model.operation.MigrationConfiguration;
import dbmigrate.model.operation.RenameColumnOperationDescriptor;
import dbmigrate.parser.model.CreateColumn;
import dbmigrate.parser.model.CreateTable;
import dbmigrate.parser.model.DestinationColumn;
import dbmigrate.parser.model.EditColumn;
import dbmigrate.parser.model.IOperation;
import dbmigrate.parser.model.MergeColumns;
import dbmigrate.parser.model.Migration;
import dbmigrate.parser.model.RemoveColumn;
import dbmigrate.parser.model.RemoveTable;
import dbmigrate.parser.model.SplitColumn;
public class Loader {
public static MigrationConfiguration load(File file, boolean performValidation) throws Exception {
return Loader.load(file, performValidation, true);
}
public static MigrationConfiguration load(File file, boolean performValidation, boolean forwards) throws Exception {
Migration m = MigrationParser.loadMigration(file, performValidation);
return Loader.map(m, forwards);
}
public static MigrationConfiguration map(Migration m) throws Exception {
return Loader.map(m, true);
}
public static MigrationConfiguration map(Migration m, boolean forwards) throws Exception {
MigrationConfiguration mc = new MigrationConfiguration(m.getVersion());
Loader.processMigrationConfiguration(m.getDoList(), mc, true);
Loader.processMigrationConfiguration(m.getUndoList(), mc, false);
return mc;
}
private static void processMigrationConfiguration(List<IOperation> ops, MigrationConfiguration mc, boolean forwards) throws Exception {
for (IOperation op : ops) {
IOperationDescriptor d = null;
if (op instanceof RemoveColumn) {
RemoveColumn rc = (RemoveColumn) op;
Table t = new Table();
t.setName(rc.getTable());
Column c = new Column();
c.setName(rc.getName());
d = new DropColumnOperationDescriptor(t, c);
} else if (op instanceof RemoveTable) {
RemoveTable rt = (RemoveTable) op;
Table t = new Table();
t.setName(rt.getName());
d = new DropTableOperationDescriptor(t);
} else if (op instanceof EditColumn) {
EditColumn ec = (EditColumn) op;
Table t = new Table();
t.setName(ec.getTable());
Column c1 = new Column();
c1.setName(ec.getOldColumnName());
Column c2 = new Column();
c2.setName(ec.getNewColumnName());
d = new RenameColumnOperationDescriptor(t,c1,c2);
} else if (op instanceof CreateTable) {
CreateTable ct = (CreateTable) op;
Table t = new Table();
t.setName(ct.getName());
ArrayList<IColumn> columns = new ArrayList<IColumn>();
List<dbmigrate.parser.model.Column> col = ct.getColumns();
if (col != null) {
for (dbmigrate.parser.model.Column c : col) {
Column cc = new Column();
cc.setLength((int) (long) c.getLength());
cc.setName(c.getName());
cc.setNullable(c.getNotnull());
cc.setType(Loader.getType(c.getType()));
cc.setLength((int) (long) c.getLength());
cc.setNullable(!c.getNotnull());
cc.setSigned(c.getSigned());
cc.setDefault(c.getDefaultValue());
columns.add(cc);
}
}
t.setColumns(columns);
d = new CreateTableOperationDescriptor(t);
} else if (op instanceof CreateColumn) {
CreateColumn c = (CreateColumn) op;
Table t = new Table();
t.setName(c.getTable());
Column cc = new Column();
if (c.getLength() != null) {
cc.setLength((int) (long) c.getLength());
}
cc.setName(c.getName());
// cc.setNullable(c.getNotnull());
cc.setType(getType(c.getType()));
// cc.setLength((int)(long)c.getLength());
cc.setNullable(!c.getNotnull());
cc.setSigned(c.getSigned());
cc.setDefault(c.getDefaultValue());
d = new AddColumnOperationDescriptor(t.getName(), cc);
} else if (op instanceof MergeColumns) {
MergeColumns c = (MergeColumns) op;
CreateColumn dc = c.getDestinationColumn().getCreateColumn();
List<String> cols = c.getColumnNames();
Table t = new Table();
t.setName(dc.getTable());
Column cc = new Column();
if (dc.getLength() != null) {
cc.setLength((int) (long) dc.getLength());
}
cc.setName(dc.getName());
// cc.setNullable(c.getNotnull());
cc.setType(getType(dc.getType()));
// cc.setLength((int)(long)c.getLength());
cc.setNullable(!dc.getNotnull());
cc.setSigned(dc.getSigned());
cc.setDefault(dc.getDefaultValue());
Column c1 = new Column();
c1.setName(cols.get(0));
Column c2 = new Column();
c2.setName(cols.get(1));
d = new MergeColumnOperationDescriptor(c1, c2,
c.getTableName(), c.getDestinationColumn().getMergeExpression(),
new AddColumnOperationDescriptor(t.getName(), cc));
} else if (op instanceof SplitColumn) {
} else {
throw new Exception("Unknown operation: "
+ op.getClass().getName());
}
if(forwards) {
mc.addOperation(d);
} else {
mc.addUndoOperation(d);
}
}
}
private static TypeEnum getType(String type) throws Exception {
if ("boolean".equals(type)) {
return TypeEnum.BOOLEAN;
} else if ("short".equals(type)) {
return TypeEnum.SHORTINT;
} else if ("int".equals(type)) {
return TypeEnum.INT;
} else if ("bigint".equals(type)) {
return TypeEnum.BIGINT;
} else if ("varchar".equals(type)) {
return TypeEnum.VARCHAR;
} else if ("char".equals(type)) {
return TypeEnum.CHAR;
} else if ("text".equals(type)) {
return TypeEnum.TEXT;
} else if ("double".equals(type)) {
return TypeEnum.DOUBLE;
} else if ("binary".equals(type)) {
return TypeEnum.BINARY;
} else {
throw new Exception("Unknown data type: " + type);
}
}
}