📄 sqlbuilder.java
字号:
Table table = new Table();
table.setCatalog(targetTable.getCatalog());
table.setSchema(targetTable.getSchema());
table.setName(targetTable.getName() + "_");
table.setType(targetTable.getType());
for (int idx = 0; idx < targetTable.getColumnCount(); idx++)
{
try
{
table.addColumn((Column)targetTable.getColumn(idx).clone());
}
catch (CloneNotSupportedException ex)
{
throw new DdlUtilsException(ex);
}
}
return table;
}
/**
* Outputs the DDL to create the given temporary table. Per default this is simply
* a call to {@link #createTable(Database, Table, Map)}.
*
* @param database The database model
* @param table The table
* @param parameters Additional platform-specific parameters for the table creation
*/
protected void createTemporaryTable(Database database, Table table, Map parameters) throws IOException
{
createTable(database, table, parameters);
}
/**
* Outputs the DDL to drop the given temporary table. Per default this is simply
* a call to {@link #dropTable(Table)}.
*
* @param database The database model
* @param table The table
*/
protected void dropTemporaryTable(Database database, Table table) throws IOException
{
dropTable(table);
}
/**
* Creates the target table object that differs from the given target table only in the
* indices. More specifically, only those indices are used that have not changed.
*
* @param targetModel The target database
* @param sourceTable The source table
* @param targetTable The target table
* @return The table
*/
protected Table getRealTargetTableFor(Database targetModel, Table sourceTable, Table targetTable) throws IOException
{
Table table = new Table();
table.setCatalog(targetTable.getCatalog());
table.setSchema(targetTable.getSchema());
table.setName(targetTable.getName());
table.setType(targetTable.getType());
for (int idx = 0; idx < targetTable.getColumnCount(); idx++)
{
try
{
table.addColumn((Column)targetTable.getColumn(idx).clone());
}
catch (CloneNotSupportedException ex)
{
throw new DdlUtilsException(ex);
}
}
boolean caseSensitive = getPlatform().isDelimitedIdentifierModeOn();
for (int idx = 0; idx < targetTable.getIndexCount(); idx++)
{
Index targetIndex = targetTable.getIndex(idx);
Index sourceIndex = sourceTable.findIndex(targetIndex.getName(), caseSensitive);
if (sourceIndex != null)
{
if ((caseSensitive && sourceIndex.equals(targetIndex)) ||
(!caseSensitive && sourceIndex.equalsIgnoreCase(targetIndex)))
{
table.addIndex(targetIndex);
}
}
}
return table;
}
/**
* Writes a statement that copies the data from the source to the target table. Note
* that this copies only those columns that are in both tables.
* Database-specific implementations might redefine this method though they usually
* it suffices to redefine the {@link #writeCastExpression(Column, Column)} method.
*
* @param sourceTable The source table
* @param targetTable The target table
*/
protected void writeCopyDataStatement(Table sourceTable, Table targetTable) throws IOException
{
ListOrderedMap columns = new ListOrderedMap();
for (int idx = 0; idx < sourceTable.getColumnCount(); idx++)
{
Column sourceColumn = sourceTable.getColumn(idx);
Column targetColumn = targetTable.findColumn(sourceColumn.getName(),
getPlatform().isDelimitedIdentifierModeOn());
if (targetColumn != null)
{
columns.put(sourceColumn, targetColumn);
}
}
print("INSERT INTO ");
printIdentifier(getTableName(targetTable));
print(" (");
for (Iterator columnIt = columns.keySet().iterator(); columnIt.hasNext();)
{
printIdentifier(getColumnName((Column)columnIt.next()));
if (columnIt.hasNext())
{
print(",");
}
}
print(") SELECT ");
for (Iterator columnsIt = columns.entrySet().iterator(); columnsIt.hasNext();)
{
Map.Entry entry = (Map.Entry)columnsIt.next();
writeCastExpression((Column)entry.getKey(),
(Column)entry.getValue());
if (columnsIt.hasNext())
{
print(",");
}
}
print(" FROM ");
printIdentifier(getTableName(sourceTable));
printEndOfStatement();
}
/**
* Writes a cast expression that converts the value of the source column to the data type
* of the target column. Per default, simply the name of the source column is written
* thereby assuming that any casts happen implicitly.
*
* @param sourceColumn The source column
* @param targetColumn The target column
*/
protected void writeCastExpression(Column sourceColumn, Column targetColumn) throws IOException
{
printIdentifier(getColumnName(sourceColumn));
}
/**
* Processes the addition of a primary key to a table.
*
* @param currentModel The current database schema
* @param desiredModel The desired database schema
* @param change The change object
*/
protected void processChange(Database currentModel,
Database desiredModel,
AddPrimaryKeyChange change) throws IOException
{
writeExternalPrimaryKeysCreateStmt(change.getChangedTable(), change.getPrimaryKeyColumns());
change.apply(currentModel, getPlatform().isDelimitedIdentifierModeOn());
}
/**
* Searches in the given table for a corresponding foreign key. If the given key
* has no name, then a foreign key to the same table with the same columns in the
* same order is searched. If the given key has a name, then the a corresponding
* key also needs to have the same name, or no name at all, but not a different one.
*
* @param table The table to search in
* @param fk The original foreign key
* @return The corresponding foreign key if found
*/
protected ForeignKey findCorrespondingForeignKey(Table table, ForeignKey fk)
{
boolean caseMatters = getPlatform().isDelimitedIdentifierModeOn();
boolean checkFkName = (fk.getName() != null) && (fk.getName().length() > 0);
Reference[] refs = fk.getReferences();
ArrayList curRefs = new ArrayList();
for (int fkIdx = 0; fkIdx < table.getForeignKeyCount(); fkIdx++)
{
ForeignKey curFk = table.getForeignKey(fkIdx);
boolean checkCurFkName = checkFkName &&
(curFk.getName() != null) && (curFk.getName().length() > 0);
if ((!checkCurFkName || areEqual(fk.getName(), curFk.getName(), caseMatters)) &&
areEqual(fk.getForeignTableName(), curFk.getForeignTableName(), caseMatters))
{
curRefs.clear();
CollectionUtils.addAll(curRefs, curFk.getReferences());
// the order is not fixed, so we have to take this long way
if (curRefs.size() == refs.length)
{
for (int refIdx = 0; refIdx < refs.length; refIdx++)
{
boolean found = false;
for (int curRefIdx = 0; !found && (curRefIdx < curRefs.size()); curRefIdx++)
{
Reference curRef = (Reference)curRefs.get(curRefIdx);
if ((caseMatters && refs[refIdx].equals(curRef)) ||
(!caseMatters && refs[refIdx].equalsIgnoreCase(curRef)))
{
curRefs.remove(curRefIdx);
found = true;
}
}
}
if (curRefs.isEmpty())
{
return curFk;
}
}
}
}
return null;
}
/**
* Compares the two strings.
*
* @param string1 The first string
* @param string2 The second string
* @param caseMatters Whether case matters in the comparison
* @return <code>true</code> if the string are equal
*/
protected boolean areEqual(String string1, String string2, boolean caseMatters)
{
return (caseMatters && string1.equals(string2)) ||
(!caseMatters && string1.equalsIgnoreCase(string2));
}
/**
* Outputs the DDL to create the table along with any non-external constraints as well
* as with external primary keys and indices (but not foreign keys).
*
* @param database The database model
* @param table The table
*/
public void createTable(Database database, Table table) throws IOException
{
createTable(database, table, null);
}
/**
* Outputs the DDL to create the table along with any non-external constraints as well
* as with external primary keys and indices (but not foreign keys).
*
* @param database The database model
* @param table The table
* @param parameters Additional platform-specific parameters for the table creation
*/
public void createTable(Database database, Table table, Map parameters) throws IOException
{
writeTableCreationStmt(database, table, parameters);
writeTableCreationStmtEnding(table, parameters);
if (!getPlatformInfo().isPrimaryKeyEmbedded())
{
writeExternalPrimaryKeysCreateStmt(table, table.getPrimaryKeyColumns());
}
if (!getPlatformInfo().isIndicesEmbedded())
{
writeExternalIndicesCreateStmt(table);
}
}
/**
* Creates the external foreignkey creation statements for all tables in the database.
*
* @param database The database
*/
public void createExternalForeignKeys(Database database) throws IOException
{
for (int idx = 0; idx < database.getTableCount(); idx++)
{
createExternalForeignKeys(database, database.getTable(idx));
}
}
/**
* Creates external foreignkey creation statements if necessary.
*
* @param database The database model
* @param table The table
*/
public void createExternalForeignKeys(Database database, Table table) throws IOException
{
if (!getPlatformInfo().isForeignKeysEmbedded())
{
for (int idx = 0; idx < table.getForeignKeyCount(); idx++)
{
writeExternalForeignKeyCreateStmt(database, table, table.getForeignKey(idx));
}
}
}
/**
* Outputs the DDL required to drop the database.
*
* @param database The database
*/
public void dropTables(Database database) throws IOException
{
// we're dropping the external foreignkeys first
for (int idx = database.getTableCount() - 1; idx >= 0; idx--)
{
Table table = database.getTable(idx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -