📄 firebirdmodelreader.java
字号:
*/
protected Collection readForeignKeys(DatabaseMetaDataWrapper metaData, String tableName) throws SQLException
{
Map fks = new ListOrderedMap();
ResultSet fkData = null;
try
{
if (getPlatform().isDelimitedIdentifierModeOn())
{
// Jaybird has a problem when delimited identifiers are used as
// it is not able to find the foreign key info for the table
// So we have to filter manually below
fkData = metaData.getForeignKeys(getDefaultTablePattern());
while (fkData.next())
{
Map values = readColumns(fkData, getColumnsForFK());
if (tableName.equals(values.get("FKTABLE_NAME")))
{
readForeignKey(metaData, values, fks);
}
}
}
else
{
fkData = metaData.getForeignKeys(tableName);
while (fkData.next())
{
Map values = readColumns(fkData, getColumnsForFK());
readForeignKey(metaData, values, fks);
}
}
}
finally
{
if (fkData != null)
{
fkData.close();
}
}
return fks.values();
}
/**
* {@inheritDoc}
*/
protected Collection readIndices(DatabaseMetaDataWrapper metaData, String tableName) throws SQLException
{
// Jaybird is not able to read indices when delimited identifiers are turned on,
// so we gather the data manually using Firebird's system tables
Map indices = new ListOrderedMap();
StringBuffer query = new StringBuffer();
query.append("SELECT a.RDB$INDEX_NAME INDEX_NAME, b.RDB$RELATION_NAME TABLE_NAME, b.RDB$UNIQUE_FLAG NON_UNIQUE,");
query.append(" a.RDB$FIELD_POSITION ORDINAL_POSITION, a.RDB$FIELD_NAME COLUMN_NAME, 3 INDEX_TYPE");
query.append(" FROM RDB$INDEX_SEGMENTS a, RDB$INDICES b WHERE a.RDB$INDEX_NAME=b.RDB$INDEX_NAME AND b.RDB$RELATION_NAME = ?");
PreparedStatement stmt = getConnection().prepareStatement(query.toString());
ResultSet indexData = null;
stmt.setString(1, getPlatform().isDelimitedIdentifierModeOn() ? tableName : tableName.toUpperCase());
try
{
indexData = stmt.executeQuery();
while (indexData.next())
{
Map values = readColumns(indexData, getColumnsForIndex());
// we have to reverse the meaning of the unique flag
values.put("NON_UNIQUE", Boolean.FALSE.equals(values.get("NON_UNIQUE")) ? Boolean.TRUE : Boolean.FALSE);
// and trim the names
values.put("INDEX_NAME", ((String)values.get("INDEX_NAME")).trim());
values.put("TABLE_NAME", ((String)values.get("TABLE_NAME")).trim());
values.put("COLUMN_NAME", ((String)values.get("COLUMN_NAME")).trim());
readIndex(metaData, values, indices);
}
}
finally
{
if (indexData != null)
{
indexData.close();
}
}
return indices.values();
}
/**
* {@inheritDoc}
*/
protected boolean isInternalPrimaryKeyIndex(DatabaseMetaDataWrapper metaData, Table table, Index index) throws SQLException
{
String tableName = getPlatform().getSqlBuilder().getTableName(table);
String indexName = getPlatform().getSqlBuilder().getIndexName(index);
StringBuffer query = new StringBuffer();
query.append("SELECT RDB$CONSTRAINT_NAME FROM RDB$RELATION_CONSTRAINTS where RDB$RELATION_NAME=? AND RDB$CONSTRAINT_TYPE=? AND RDB$INDEX_NAME=?");
PreparedStatement stmt = getConnection().prepareStatement(query.toString());
try
{
stmt.setString(1, getPlatform().isDelimitedIdentifierModeOn() ? tableName : tableName.toUpperCase());
stmt.setString(2, "PRIMARY KEY");
stmt.setString(3, indexName);
ResultSet resultSet = stmt.executeQuery();
return resultSet.next();
}
finally
{
if (stmt != null)
{
stmt.close();
}
}
}
/**
* {@inheritDoc}
*/
protected boolean isInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, Index index) throws SQLException
{
String tableName = getPlatform().getSqlBuilder().getTableName(table);
String indexName = getPlatform().getSqlBuilder().getIndexName(index);
String fkName = getPlatform().getSqlBuilder().getForeignKeyName(table, fk);
StringBuffer query = new StringBuffer();
query.append("SELECT RDB$CONSTRAINT_NAME FROM RDB$RELATION_CONSTRAINTS where RDB$RELATION_NAME=? AND RDB$CONSTRAINT_TYPE=? AND RDB$CONSTRAINT_NAME=? AND RDB$INDEX_NAME=?");
PreparedStatement stmt = getConnection().prepareStatement(query.toString());
try
{
stmt.setString(1, getPlatform().isDelimitedIdentifierModeOn() ? tableName : tableName.toUpperCase());
stmt.setString(2, "FOREIGN KEY");
stmt.setString(3, fkName);
stmt.setString(4, indexName);
ResultSet resultSet = stmt.executeQuery();
return resultSet.next();
}
finally
{
if (stmt != null)
{
stmt.close();
}
}
}
/**
* {@inheritDoc}
*/
public String determineSchemaOf(Connection connection, String schemaPattern, Table table) throws SQLException
{
ResultSet tableData = null;
ResultSet columnData = null;
try
{
DatabaseMetaDataWrapper metaData = new DatabaseMetaDataWrapper();
metaData.setMetaData(connection.getMetaData());
metaData.setCatalog(getDefaultCatalogPattern());
metaData.setSchemaPattern(schemaPattern == null ? getDefaultSchemaPattern() : schemaPattern);
metaData.setTableTypes(getDefaultTableTypes());
String tablePattern = table.getName();
if (getPlatform().isDelimitedIdentifierModeOn())
{
tablePattern = tablePattern.toUpperCase();
}
tableData = metaData.getTables(tablePattern);
boolean found = false;
String schema = null;
while (!found && tableData.next())
{
Map values = readColumns(tableData, getColumnsForTable());
String tableName = (String)values.get("TABLE_NAME");
if ((tableName != null) && (tableName.length() > 0))
{
schema = (String)values.get("TABLE_SCHEM");
found = true;
if (getPlatform().isDelimitedIdentifierModeOn())
{
// Jaybird has a problem when delimited identifiers are used as
// it is not able to find the columns for the table
// So we have to filter manually below
columnData = metaData.getColumns(getDefaultTablePattern(), getDefaultColumnPattern());
}
else
{
columnData = metaData.getColumns(tableName, getDefaultColumnPattern());
}
while (found && columnData.next())
{
values = readColumns(columnData, getColumnsForColumn());
if (getPlatform().isDelimitedIdentifierModeOn() &&
!tableName.equals(values.get("TABLE_NAME")))
{
continue;
}
if (table.findColumn((String)values.get("COLUMN_NAME"),
getPlatform().isDelimitedIdentifierModeOn()) == null)
{
found = false;
}
}
columnData.close();
columnData = null;
}
}
return found ? schema : null;
}
finally
{
if (columnData != null)
{
columnData.close();
}
if (tableData != null)
{
tableData.close();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -