package org.hibernate.cfg.reveng.dialect;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.tool.util.ReflectHelper;
/**
* MetaData dialect that work around tweaks in the H2 database.
*
* @author Max Rydahl Andersen
*
*/
public class H2MetaDataDialect extends JDBCMetaDataDialect {
private static boolean understandsCatalogName = true;
public H2MetaDataDialect() {
super();
try {
Class<?> constants = ReflectHelper.classForName( "org.h2.engine.Constants" );
Integer build = (Integer)constants.getDeclaredField( "BUILD_ID" ).get( null );
if ( build.intValue() < 55 ) {
understandsCatalogName = false;
}
}
catch( Throwable e ) {
// ignore (probably H2 not in the classpath)
}
}
protected void putTablePart(Map<String, Object> element, ResultSet tableRs) throws SQLException {
super.putTablePart( element, tableRs );
if ( !understandsCatalogName ) {
element.put( "TABLE_CAT", null );
}
}
protected void putExportedKeysPart(Map<String, Object> element, ResultSet rs) throws SQLException {
super.putExportedKeysPart( element, rs );
if ( !understandsCatalogName ) {
element.put( "PKTABLE_CAT", null );
}
}
public Iterator<Map<String, Object>> getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String table) {
try {
catalog = caseForSearch( catalog );
schema = caseForSearch( schema );
table = caseForSearch( table );
log.debug("geSuggestedPrimaryKeyStrategyName(" + catalog + "." + schema + "." + table + ")");
String sql = "SELECT idx.TABLE_CATALOG TABLE_CAT, idx.TABLE_SCHEMA TABLE_SCHEM, idx.TABLE_NAME, idx.COLUMN_NAME, cols.COLUMN_DEFAULT COLUMN_DEFAULT FROM " +
"INFORMATION_SCHEMA.INDEXES idx, INFORMATION_SCHEMA.COLUMNS cols " +
"WHERE " +
"idx.TABLE_CATALOG = cols.TABLE_CATALOG " +
"and idx.TABLE_SCHEMA = cols.TABLE_SCHEMA " +
"and idx.TABLE_NAME = cols.TABLE_NAME " +
"AND idx.PRIMARY_KEY = TRUE " +
"AND COLUMN_DEFAULT like '%NEXT VALUE FOR%' ";
if(catalog!=null) {
sql += "AND idx.TABLE_CATALOG like '" + catalog + "' ";
}
if(schema!=null) {
sql += "AND idx.TABLE_SCHEMA like '" + schema + "' ";
}
if(table!=null) {
sql += "AND idx.TABLE_NAME like '" + table + "' ";
}
PreparedStatement statement = getConnection().prepareStatement( sql );
return new ResultSetIterator(statement.executeQuery(), getSQLExceptionConverter()) {
Map<String, Object> element = new HashMap<String, Object>();
protected Map<String, Object> convertRow(ResultSet tableRs) throws SQLException {
element.clear();
putTablePart( element, tableRs );
String string = tableRs.getString("COLUMN_DEFAULT");
element.put("HIBERNATE_STRATEGY", StringHelper.isEmpty( string )?null:"identity");
return element;
}
protected Throwable handleSQLException(SQLException e) {
// schemaRs and catalogRs are only used for error reporting if
// we get an exception
throw getSQLExceptionConverter().convert( e,
"Could not get list of suggested identity strategies from database. Probably a JDBC driver problem. ", null );
}
};
} catch (SQLException e) {
throw getSQLExceptionConverter().convert(e, "Could not get list of suggested identity strategies from database. Probably a JDBC driver problem.", null);
}
}
}