org.apache.ddlutils.platform
Class JdbcModelReader

java.lang.Object
  extended by org.apache.ddlutils.platform.JdbcModelReader
Direct Known Subclasses:
AxionModelReader, Db2ModelReader, DerbyModelReader, FirebirdModelReader, HsqlDbModelReader, InterbaseModelReader, MaxDbModelReader, MckoiModelReader, MSSqlModelReader, MySqlModelReader, Oracle8ModelReader, PostgreSqlModelReader, SapDbModelReader, SybaseModelReader

public class JdbcModelReader
extends java.lang.Object

An utility class to create a Database model from a live database.

Version:
$Revision: 543392 $

Constructor Summary
JdbcModelReader(Platform platform)
          Creates a new model reader instance.
 
Method Summary
protected  void determineAutoIncrementFromResultSetMetaData(Table table, Column[] columnsToCheck)
          Helper method that determines the auto increment status for the given columns via the ResultSetMetaData.isAutoIncrement(int) method.
 java.lang.String determineSchemaOf(java.sql.Connection connection, java.lang.String schemaPattern, Table table)
          Deprecated. Will be removed once full schema support is in place
protected  java.util.List getColumnsForColumn()
          Returns the descriptors for the columns to be read from the column meta data result set.
protected  java.util.List getColumnsForFK()
          Returns the descriptors for the columns to be read from the foreign key meta data result set.
protected  java.util.List getColumnsForIndex()
          Returns the descriptors for the columns to be read from the index meta data result set.
protected  java.util.List getColumnsForPK()
          Returns the descriptors for the columns to be read from the primary key meta data result set.
protected  java.util.List getColumnsForTable()
          Returns the descriptors for the columns to be read from the table meta data result set.
protected  java.sql.Connection getConnection()
          Returns the active connection.
 Database getDatabase(java.sql.Connection connection, java.lang.String name)
          Reads the database model from the given connection.
 Database getDatabase(java.sql.Connection connection, java.lang.String name, java.lang.String catalog, java.lang.String schema, java.lang.String[] tableTypes)
          Reads the database model from the given connection.
 java.lang.String getDefaultCatalogPattern()
          Returns the catalog(s) in the database to read per default.
 java.lang.String getDefaultColumnPattern()
          Returns the default pattern to read the relevant columns from the database.
 java.lang.String getDefaultSchemaPattern()
          Returns the schema(s) in the database to read per default.
 java.lang.String getDefaultTablePattern()
          Returns the default pattern to read the relevant tables from the database.
 java.lang.String[] getDefaultTableTypes()
          Returns the table types to recognize per default.
 Platform getPlatform()
          Returns the platform that this model reader belongs to.
 PlatformInfo getPlatformInfo()
          Returns the platform specific settings.
protected  java.util.List initColumnsForColumn()
          Returns descriptors for the columns that shall be read from the result set when reading the meta data for table columns.
protected  java.util.List initColumnsForFK()
          Returns descriptors for the columns that shall be read from the result set when reading the meta data for foreign keys originating from a table.
protected  java.util.List initColumnsForIndex()
          Returns descriptors for the columns that shall be read from the result set when reading the meta data for indices.
protected  java.util.List initColumnsForPK()
          Returns descriptors for the columns that shall be read from the result set when reading the meta data for primary keys.
protected  java.util.List initColumnsForTable()
          Returns descriptors for the columns that shall be read from the result set when reading the meta data for a table.
protected  boolean isInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, Index index)
          Tries to determine whether the index is the internal database-generated index for the given foreign key.
protected  boolean isInternalPrimaryKeyIndex(DatabaseMetaDataWrapper metaData, Table table, Index index)
          Tries to determine whether the index is the internal database-generated index for the given table's primary key.
protected  boolean matches(Index index, java.util.List columnsToSearchFor)
          Checks whether the given index matches the column list.
protected  Column readColumn(DatabaseMetaDataWrapper metaData, java.util.Map values)
          Extracts a column definition from the result set.
protected  java.util.Collection readColumns(DatabaseMetaDataWrapper metaData, java.lang.String tableName)
          Reads the column definitions for the indicated table.
protected  java.util.Map readColumns(java.sql.ResultSet resultSet, java.util.List columnDescriptors)
          Reads the indicated columns from the result set.
protected  void readForeignKey(DatabaseMetaDataWrapper metaData, java.util.Map values, java.util.Map knownFks)
          Reads the next foreign key spec from the result set.
protected  java.util.Collection readForeignKeys(DatabaseMetaDataWrapper metaData, java.lang.String tableName)
          Retrieves the foreign keys of the indicated table.
protected  void readIndex(DatabaseMetaDataWrapper metaData, java.util.Map values, java.util.Map knownIndices)
          Reads the next index spec from the result set.
protected  java.util.Collection readIndices(DatabaseMetaDataWrapper metaData, java.lang.String tableName)
          Determines the indices for the indicated table.
protected  java.lang.String readPrimaryKeyName(DatabaseMetaDataWrapper metaData, java.util.Map values)
          Extracts a primary key name from the result set.
protected  java.util.Collection readPrimaryKeyNames(DatabaseMetaDataWrapper metaData, java.lang.String tableName)
          Retrieves the names of the columns that make up the primary key for a given table.
protected  Table readTable(DatabaseMetaDataWrapper metaData, java.util.Map values)
          Reads the next table from the meta data.
protected  java.util.Collection readTables(java.lang.String catalog, java.lang.String schemaPattern, java.lang.String[] tableTypes)
          Reads the tables from the database metadata.
protected  void removeInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk)
          Tries to remove the internal index for the given foreign key.
protected  void removeInternalPrimaryKeyIndex(DatabaseMetaDataWrapper metaData, Table table)
          Tries to remove the internal index for the table's primary key.
protected  void removeSystemIndices(DatabaseMetaDataWrapper metaData, Table table)
          Removes system indices (generated by the database for primary and foreign keys) from the table.
 void setDefaultCatalogPattern(java.lang.String catalogPattern)
          Sets the catalog(s) in the database to read per default.
 void setDefaultColumnPattern(java.lang.String columnPattern)
          Sets the default pattern to read the relevant columns from the database.
 void setDefaultSchemaPattern(java.lang.String schemaPattern)
          Sets the schema(s) in the database to read per default.
 void setDefaultTablePattern(java.lang.String tablePattern)
          Sets the default pattern to read the relevant tables from the database.
 void setDefaultTableTypes(java.lang.String[] types)
          Sets the table types to recognize per default.
protected  void sortForeignKeys(Database model)
          Sorts the foreign keys in the tables of the model.
protected  java.lang.String unescape(java.lang.String text, java.lang.String unescaped, java.lang.String escaped)
          Replaces a specific character sequence in the given text with the character sequence whose escaped version it is.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JdbcModelReader

public JdbcModelReader(Platform platform)
Creates a new model reader instance.

Parameters:
platform - The plaftform this builder belongs to
Method Detail

getPlatform

public Platform getPlatform()
Returns the platform that this model reader belongs to.

Returns:
The platform

getPlatformInfo

public PlatformInfo getPlatformInfo()
Returns the platform specific settings.

Returns:
The platform settings

initColumnsForTable

protected java.util.List initColumnsForTable()
Returns descriptors for the columns that shall be read from the result set when reading the meta data for a table. Note that the columns are read in the order defined by this list.
Redefine this method if you want more columns or a different order.

Returns:
The descriptors for the result set columns

initColumnsForColumn

protected java.util.List initColumnsForColumn()
Returns descriptors for the columns that shall be read from the result set when reading the meta data for table columns. Note that the columns are read in the order defined by this list.
Redefine this method if you want more columns or a different order.

Returns:
The map column name -> descriptor for the result set columns

initColumnsForPK

protected java.util.List initColumnsForPK()
Returns descriptors for the columns that shall be read from the result set when reading the meta data for primary keys. Note that the columns are read in the order defined by this list.
Redefine this method if you want more columns or a different order.

Returns:
The map column name -> descriptor for the result set columns

initColumnsForFK

protected java.util.List initColumnsForFK()
Returns descriptors for the columns that shall be read from the result set when reading the meta data for foreign keys originating from a table. Note that the columns are read in the order defined by this list.
Redefine this method if you want more columns or a different order.

Returns:
The map column name -> descriptor for the result set columns

initColumnsForIndex

protected java.util.List initColumnsForIndex()
Returns descriptors for the columns that shall be read from the result set when reading the meta data for indices. Note that the columns are read in the order defined by this list.
Redefine this method if you want more columns or a different order.

Returns:
The map column name -> descriptor for the result set columns

getDefaultCatalogPattern

public java.lang.String getDefaultCatalogPattern()
Returns the catalog(s) in the database to read per default.

Returns:
The default catalog(s)

setDefaultCatalogPattern

public void setDefaultCatalogPattern(java.lang.String catalogPattern)
Sets the catalog(s) in the database to read per default.

Parameters:
catalogPattern - The catalog(s)

getDefaultSchemaPattern

public java.lang.String getDefaultSchemaPattern()
Returns the schema(s) in the database to read per default.

Returns:
The default schema(s)

setDefaultSchemaPattern

public void setDefaultSchemaPattern(java.lang.String schemaPattern)
Sets the schema(s) in the database to read per default.

Parameters:
schemaPattern - The schema(s)

getDefaultTablePattern

public java.lang.String getDefaultTablePattern()
Returns the default pattern to read the relevant tables from the database.

Returns:
The table pattern

setDefaultTablePattern

public void setDefaultTablePattern(java.lang.String tablePattern)
Sets the default pattern to read the relevant tables from the database.

Parameters:
tablePattern - The table pattern

getDefaultColumnPattern

public java.lang.String getDefaultColumnPattern()
Returns the default pattern to read the relevant columns from the database.

Returns:
The column pattern

setDefaultColumnPattern

public void setDefaultColumnPattern(java.lang.String columnPattern)
Sets the default pattern to read the relevant columns from the database.

Parameters:
columnPattern - The column pattern

getDefaultTableTypes

public java.lang.String[] getDefaultTableTypes()
Returns the table types to recognize per default.

Returns:
The default table types

setDefaultTableTypes

public void setDefaultTableTypes(java.lang.String[] types)
Sets the table types to recognize per default. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".

Parameters:
types - The table types

getColumnsForTable

protected java.util.List getColumnsForTable()
Returns the descriptors for the columns to be read from the table meta data result set.

Returns:
The column descriptors

getColumnsForColumn

protected java.util.List getColumnsForColumn()
Returns the descriptors for the columns to be read from the column meta data result set.

Returns:
The column descriptors

getColumnsForPK

protected java.util.List getColumnsForPK()
Returns the descriptors for the columns to be read from the primary key meta data result set.

Returns:
The column descriptors

getColumnsForFK

protected java.util.List getColumnsForFK()
Returns the descriptors for the columns to be read from the foreign key meta data result set.

Returns:
The column descriptors

getColumnsForIndex

protected java.util.List getColumnsForIndex()
Returns the descriptors for the columns to be read from the index meta data result set.

Returns:
The column descriptors

getConnection

protected java.sql.Connection getConnection()
Returns the active connection. Note that this is only set during a call to readTables(String, String, String[]).

Returns:
The connection or null if there is no active connection

getDatabase

public Database getDatabase(java.sql.Connection connection,
                            java.lang.String name)
                     throws java.sql.SQLException
Reads the database model from the given connection.

Parameters:
connection - The connection
name - The name of the resulting database; null when the default name (the catalog) is desired which might be null itself though
Returns:
The database model
Throws:
java.sql.SQLException

getDatabase

public Database getDatabase(java.sql.Connection connection,
                            java.lang.String name,
                            java.lang.String catalog,
                            java.lang.String schema,
                            java.lang.String[] tableTypes)
                     throws java.sql.SQLException
Reads the database model from the given connection.

Parameters:
connection - The connection
name - The name of the resulting database; null when the default name (the catalog) is desired which might be null itself though
catalog - The catalog to acess in the database; use null for the default value
schema - The schema to acess in the database; use null for the default value
tableTypes - The table types to process; use null or an empty list for the default ones
Returns:
The database model
Throws:
java.sql.SQLException

readTables

protected java.util.Collection readTables(java.lang.String catalog,
                                          java.lang.String schemaPattern,
                                          java.lang.String[] tableTypes)
                                   throws java.sql.SQLException
Reads the tables from the database metadata.

Parameters:
catalog - The catalog to acess in the database; use null for the default value
schemaPattern - The schema(s) to acess in the database; use null for the default value
tableTypes - The table types to process; use null or an empty list for the default ones
Returns:
The tables
Throws:
java.sql.SQLException

readTable

protected Table readTable(DatabaseMetaDataWrapper metaData,
                          java.util.Map values)
                   throws java.sql.SQLException
Reads the next table from the meta data.

Parameters:
metaData - The database meta data
values - The table metadata values as defined by getColumnsForTable()
Returns:
The table or null if the result set row did not contain a valid table
Throws:
java.sql.SQLException

removeSystemIndices

protected void removeSystemIndices(DatabaseMetaDataWrapper metaData,
                                   Table table)
                            throws java.sql.SQLException
Removes system indices (generated by the database for primary and foreign keys) from the table.

Parameters:
metaData - The database meta data
table - The table
Throws:
java.sql.SQLException

removeInternalPrimaryKeyIndex

protected void removeInternalPrimaryKeyIndex(DatabaseMetaDataWrapper metaData,
                                             Table table)
                                      throws java.sql.SQLException
Tries to remove the internal index for the table's primary key.

Parameters:
metaData - The database meta data
table - The table
Throws:
java.sql.SQLException

removeInternalForeignKeyIndex

protected void removeInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData,
                                             Table table,
                                             ForeignKey fk)
                                      throws java.sql.SQLException
Tries to remove the internal index for the given foreign key.

Parameters:
metaData - The database meta data
table - The table where the table is defined
fk - The foreign key
Throws:
java.sql.SQLException

matches

protected boolean matches(Index index,
                          java.util.List columnsToSearchFor)
Checks whether the given index matches the column list.

Parameters:
index - The index
columnsToSearchFor - The names of the columns that the index should be for
Returns:
true if the index matches the columns

isInternalPrimaryKeyIndex

protected boolean isInternalPrimaryKeyIndex(DatabaseMetaDataWrapper metaData,
                                            Table table,
                                            Index index)
                                     throws java.sql.SQLException
Tries to determine whether the index is the internal database-generated index for the given table's primary key. Note that only unique indices with the correct columns are fed to this method. Redefine this method for specific platforms if there are better ways to determine internal indices.

Parameters:
metaData - The database meta data
table - The table owning the index
index - The index to check
Returns:
true if the index seems to be an internal primary key one
Throws:
java.sql.SQLException

isInternalForeignKeyIndex

protected boolean isInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData,
                                            Table table,
                                            ForeignKey fk,
                                            Index index)
                                     throws java.sql.SQLException
Tries to determine whether the index is the internal database-generated index for the given foreign key. Note that only non-unique indices with the correct columns are fed to this method. Redefine this method for specific platforms if there are better ways to determine internal indices.

Parameters:
metaData - The database meta data
table - The table owning the index and foreign key
fk - The foreign key
index - The index to check
Returns:
true if the index seems to be an internal primary key one
Throws:
java.sql.SQLException

readColumns

protected java.util.Collection readColumns(DatabaseMetaDataWrapper metaData,
                                           java.lang.String tableName)
                                    throws java.sql.SQLException
Reads the column definitions for the indicated table.

Parameters:
metaData - The database meta data
tableName - The name of the table
Returns:
The columns
Throws:
java.sql.SQLException

readColumn

protected Column readColumn(DatabaseMetaDataWrapper metaData,
                            java.util.Map values)
                     throws java.sql.SQLException
Extracts a column definition from the result set.

Parameters:
metaData - The database meta data
values - The column meta data values as defined by getColumnsForColumn()
Returns:
The column
Throws:
java.sql.SQLException

readPrimaryKeyNames

protected java.util.Collection readPrimaryKeyNames(DatabaseMetaDataWrapper metaData,
                                                   java.lang.String tableName)
                                            throws java.sql.SQLException
Retrieves the names of the columns that make up the primary key for a given table.

Parameters:
metaData - The database meta data
tableName - The name of the table from which to retrieve PK information
Returns:
The primary key column names
Throws:
java.sql.SQLException

readPrimaryKeyName

protected java.lang.String readPrimaryKeyName(DatabaseMetaDataWrapper metaData,
                                              java.util.Map values)
                                       throws java.sql.SQLException
Extracts a primary key name from the result set.

Parameters:
metaData - The database meta data
values - The primary key meta data values as defined by getColumnsForPK()
Returns:
The primary key name
Throws:
java.sql.SQLException

readForeignKeys

protected java.util.Collection readForeignKeys(DatabaseMetaDataWrapper metaData,
                                               java.lang.String tableName)
                                        throws java.sql.SQLException
Retrieves the foreign keys of the indicated table.

Parameters:
metaData - The database meta data
tableName - The name of the table from which to retrieve FK information
Returns:
The foreign keys
Throws:
java.sql.SQLException

readForeignKey

protected void readForeignKey(DatabaseMetaDataWrapper metaData,
                              java.util.Map values,
                              java.util.Map knownFks)
                       throws java.sql.SQLException
Reads the next foreign key spec from the result set.

Parameters:
metaData - The database meta data
values - The foreign key meta data as defined by getColumnsForFK()
knownFks - The already read foreign keys for the current table
Throws:
java.sql.SQLException

readIndices

protected java.util.Collection readIndices(DatabaseMetaDataWrapper metaData,
                                           java.lang.String tableName)
                                    throws java.sql.SQLException
Determines the indices for the indicated table.

Parameters:
metaData - The database meta data
tableName - The name of the table
Returns:
The list of indices
Throws:
java.sql.SQLException

readIndex

protected void readIndex(DatabaseMetaDataWrapper metaData,
                         java.util.Map values,
                         java.util.Map knownIndices)
                  throws java.sql.SQLException
Reads the next index spec from the result set.

Parameters:
metaData - The database meta data
values - The index meta data as defined by getColumnsForIndex()
knownIndices - The already read indices for the current table
Throws:
java.sql.SQLException

readColumns

protected java.util.Map readColumns(java.sql.ResultSet resultSet,
                                    java.util.List columnDescriptors)
                             throws java.sql.SQLException
Reads the indicated columns from the result set.

Parameters:
resultSet - The result set
columnDescriptors - The dscriptors of the columns to read
Returns:
The read values keyed by the column name
Throws:
java.sql.SQLException

determineAutoIncrementFromResultSetMetaData

protected void determineAutoIncrementFromResultSetMetaData(Table table,
                                                           Column[] columnsToCheck)
                                                    throws java.sql.SQLException
Helper method that determines the auto increment status for the given columns via the ResultSetMetaData.isAutoIncrement(int) method.

Parameters:
table - The table
columnsToCheck - The columns to check (e.g. the primary key columns)
Throws:
java.sql.SQLException

sortForeignKeys

protected void sortForeignKeys(Database model)
Sorts the foreign keys in the tables of the model.

Parameters:
model - The model

unescape

protected java.lang.String unescape(java.lang.String text,
                                    java.lang.String unescaped,
                                    java.lang.String escaped)
Replaces a specific character sequence in the given text with the character sequence whose escaped version it is.

Parameters:
text - The text
unescaped - The unescaped string, e.g. "'"
escaped - The escaped version, e.g. "''"
Returns:
The resulting text

determineSchemaOf

public java.lang.String determineSchemaOf(java.sql.Connection connection,
                                          java.lang.String schemaPattern,
                                          Table table)
                                   throws java.sql.SQLException
Deprecated. Will be removed once full schema support is in place

Tries to find the schema to which the given table belongs.

Parameters:
connection - The database connection
schemaPattern - The schema pattern to limit the schemas to search in
table - The table to search for
Returns:
The schema name or null if the schema of the table could not be found
Throws:
java.sql.SQLException


Copyright © 2005-2009 Apache Software Foundation. All Rights Reserved.