3.1.2: 2012-07-31

net.sf.basedb.core.dbengine
Class TableInfo

java.lang.Object
  extended by net.sf.basedb.core.dbengine.TableInfo

public class TableInfo
extends Object

Holds minimal but useful information about a table in the database. The information can be populated either from Hibernate mappings or from JDBC metadata about the database. This makes it possible to compare the structure of the current database with the information in the Hibernate mapping documents.

The main reason for this class to exists is that we want to solve the problem Hibernate has with creating indexes when doing an update. The information in this class makes it possible to find which indexes are missing. As a bonus we also have code to drop and re-create all indexes.

Version:
2.0
Author:
nicklas
Last modified
$Date: 2011-11-25 13:07:04 +0100 (Fri, 25 Nov 2011) $

Nested Class Summary
static class TableInfo.ColumnInfo
          Holds information about a single column in a table.
static class TableInfo.ForeignKeyInfo
          Holds information about a foreign key of a table.
static class TableInfo.IndexInfo
          Holds information about an index in a table.
static class TableInfo.PrimaryKeyInfo
          Holds information about the primary key of a table.
 
Field Summary
private  long approximateNumberOfRows
           
private  Set<TableInfo.ColumnInfo> columns
           
private  Dialect dialect
           
private  boolean existsInDb
           
private  Set<TableInfo.ForeignKeyInfo> foreignKeys
           
private  Set<TableInfo.IndexInfo> indexes
           
private  long numberOfRows
           
private  TableInfo.PrimaryKeyInfo pkInfo
           
private static Set<Integer> STRING_TYPE
           
private  Table table
           
 
Constructor Summary
private TableInfo(Table table)
           
  TableInfo(Table table, DatabaseMetaData metaData)
          Create table info by reading JDBC metadata from the current database
  TableInfo(Table table, Dialect dialect)
          Create table info by reading the Hibernate mappings.
 
Method Summary
 boolean existsInDb()
          Check if the table exists in the database or not.
 TableInfo.ColumnInfo findColumn(String column)
          Find information about a column with the given name.
 String findIndexName(String name, Set<String> columns)
          Check if there is an index with the same name or exactly the same set of columns.
 Set<TableInfo.ColumnInfo> getColumns()
          Get information about the columns in the table.
 Set<TableInfo.ForeignKeyInfo> getForeignKeys()
          Get information about the foreign keys in the table.
 String getFullQuotedTableName(DbEngine engine)
          Get the fully quialified and quoted table name using the quoting rules from the given DBEngine
 Set<TableInfo.IndexInfo> getIndexes()
          Get information about the indexes in the table.
 TableInfo.PrimaryKeyInfo getPrimaryKey()
          Get information about the primary key of the table
 long getRowCount(DbEngine engine, Connection connection, boolean approximate)
          Count the number of rows in the table.
 Table getTable()
          Get the table this information is representing.
static List<Table> listTables(DatabaseMetaData metaData, String catalog, String schema)
          List all tables that are present in the given catalog and/or schema.
private  String makeSafe(String name)
          Sometime the database put quotes around names.
 boolean safeToDrop(TableInfo.IndexInfo ii)
          It is safe to drop an index if it is not a foreign key, a primary key index or a unique column.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

table

private final Table table

dialect

private Dialect dialect

existsInDb

private boolean existsInDb

columns

private Set<TableInfo.ColumnInfo> columns

pkInfo

private TableInfo.PrimaryKeyInfo pkInfo

foreignKeys

private Set<TableInfo.ForeignKeyInfo> foreignKeys

indexes

private Set<TableInfo.IndexInfo> indexes

numberOfRows

private long numberOfRows

approximateNumberOfRows

private long approximateNumberOfRows

STRING_TYPE

private static final Set<Integer> STRING_TYPE
Constructor Detail

TableInfo

private TableInfo(Table table)

TableInfo

public TableInfo(Table table,
                 DatabaseMetaData metaData)
          throws SQLException
Create table info by reading JDBC metadata from the current database

Parameters:
table - The Hibernate table object
metaData - The JDBC metadata connected to the current database
Throws:
SQLException - If there is an error

TableInfo

public TableInfo(Table table,
                 Dialect dialect)
Create table info by reading the Hibernate mappings.

Parameters:
table - The Hibernate table object
dialect - The current database dialect
Method Detail

listTables

public static List<Table> listTables(DatabaseMetaData metaData,
                                     String catalog,
                                     String schema)
                              throws SQLException
List all tables that are present in the given catalog and/or schema.

Parameters:
metaData - A metadata object that is connected to a database
catalog - The name of the catalog, or null
schema - The name of the schema, or null
Returns:
A list of tables
Throws:
SQLException
Since:
3.1

getTable

public Table getTable()
Get the table this information is representing.

Returns:
The table object
Since:
3.1

existsInDb

public boolean existsInDb()
Check if the table exists in the database or not. This value is only meaningful if the TableInfo object was created from JDBC metadata using TableInfo(Table, DatabaseMetaData).

Since:
3.1

makeSafe

private String makeSafe(String name)
Sometime the database put quotes around names. This method strips all extra characters.

Parameters:
name - The name to make safe, or null
Returns:
The safe name or null
Since:
2.1.1

getColumns

public Set<TableInfo.ColumnInfo> getColumns()
Get information about the columns in the table.

Returns:
A set containing information about each column

getPrimaryKey

public TableInfo.PrimaryKeyInfo getPrimaryKey()
Get information about the primary key of the table

Returns:
A PrimaryKeyInfo object, or null if the table doesn't have a primary key

getForeignKeys

public Set<TableInfo.ForeignKeyInfo> getForeignKeys()
Get information about the foreign keys in the table.

Returns:
A set containing information about each foreign key

getIndexes

public Set<TableInfo.IndexInfo> getIndexes()
Get information about the indexes in the table. Note! Some databases ie. MySQL, uses indexes to keep track of foreign and primary keys. This means that the information in this set includes one index for each primary/foreign key in addition to those indexes created for other reasons.

Returns:
A set containing information about each index

safeToDrop

public boolean safeToDrop(TableInfo.IndexInfo ii)
It is safe to drop an index if it is not a foreign key, a primary key index or a unique column.

In any case, we don't want to mess with primary or foreign key indexes, and Hibernate seems to be able to manage indexes for unique columns (single) so we don't mess with that either.

Parameters:
ii - The IndexInfo object we want to check if it is safe to drop
Returns:
TRUE if is safe to drop the index, FALSE otherwise

findIndexName

public String findIndexName(String name,
                            Set<String> columns)
Check if there is an index with the same name or exactly the same set of columns.

Hibernate doesn't generate a name for multi-column indexes or unique constraints, which means that we have to find any index matching the column names. In case, Hibernate starts generating the indexes with names, we check against the name as well.

Parameters:
name - The name of the index to look for, or null to only use the columns
columns - A set containing the column names that should be present in the index
Returns:
The name of the index, or null if no index was found

findColumn

public TableInfo.ColumnInfo findColumn(String column)
Find information about a column with the given name.

Parameters:
column - The name of the column
Returns:
The column information or null if no column is found
Since:
3.1

getFullQuotedTableName

public String getFullQuotedTableName(DbEngine engine)
Get the fully quialified and quoted table name using the quoting rules from the given DBEngine

Parameters:
engine - A DbEngine
Returns:
The fully quoted table name
Since:
3.1

getRowCount

public long getRowCount(DbEngine engine,
                        Connection connection,
                        boolean approximate)
                 throws SQLException
Count the number of rows in the table.

Parameters:
connection - The connection to user for counting
Throws:
SQLException
Since:
3.1

3.1.2: 2012-07-31