package com.zendesk.maxwell.schema.ddl;
import java.util.ArrayList;
import java.util.List;
import com.zendesk.maxwell.MaxwellFilter;
import com.zendesk.maxwell.CaseSensitivity;
import com.zendesk.maxwell.schema.Database;
import com.zendesk.maxwell.schema.Schema;
import com.zendesk.maxwell.schema.Table;
import com.zendesk.maxwell.schema.columndef.ColumnDef;
import com.zendesk.maxwell.schema.columndef.StringColumnDef;
public class TableCreate extends SchemaChange {
public String database;
public String table;
public List<ColumnDef> columns;
public List<String> pks;
public String charset;
public String likeDB;
public String likeTable;
public final boolean ifNotExists;
public TableCreate (String database, String table, boolean ifNotExists) {
this.database = database;
this.table = table;
this.ifNotExists = ifNotExists;
this.columns = new ArrayList<>();
this.pks = new ArrayList<>();
}
@Override
public ResolvedTableCreate resolve(Schema schema) throws InvalidSchemaError {
Database d = schema.findDatabaseOrThrow(this.database);
if ( ifNotExists && d.hasTable(table) )
return null;
Table table = null;
if ( likeDB != null && likeTable != null ) {
table = resolveLikeTable(schema);
} else {
table = new Table(this.database, this.table, this.charset, this.columns, this.pks);
resolveCharsets(d.getCharset(), table);
}
if ( schema.getCaseSensitivity() == CaseSensitivity.CONVERT_TO_LOWER )
table.name = table.name.toLowerCase();
return new ResolvedTableCreate(table);
}
private Table resolveLikeTable(Schema schema) throws InvalidSchemaError {
Database sourceDB = schema.findDatabaseOrThrow(likeDB);
Table sourceTable = sourceDB.findTableOrThrow(likeTable);
Table copiedTable = sourceTable.copy();
copiedTable.database = this.database;
copiedTable.name = this.table;
return copiedTable;
}
private void resolveCharsets(String dbCharset, Table resolved) {
if ( this.charset != null )
resolved.charset = this.charset;
else
// inherit charset from database
resolved.charset = dbCharset;
resolved.setDefaultColumnCharsets();
}
@Override
public boolean isBlacklisted(MaxwellFilter filter) {
if ( filter == null ) {
return false;
} else {
return filter.isTableBlacklisted(this.database, this.table);
}
}
}