package org.hibernate.cfg.reveng.dialect;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.hibernate.tool.util.TableNameQualifier;
/**
* @author Dmitry Geraskov
*
*/
public class HSQLMetaDataDialect extends JDBCMetaDataDialect {
private String quote(String columnName) {
if(columnName==null) return columnName;
if(needQuote(columnName)) {
if(columnName.length()>1 && columnName.charAt(0)=='\"' && columnName.charAt(columnName.length()-1)=='\"') {
return columnName; // avoid double quoting
}
return "\"" + columnName + "\"";
} else {
return columnName;
}
}
public Iterator<Map<String, Object>> getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String table) {
String sql = null;
try {
catalog = caseForSearch( catalog );
schema = caseForSearch( schema );
table = caseForSearch( table );
//log.debug("geSuggestedPrimaryKeyStrategyName(" + catalog + "." + schema + "." + table + ")");
final String sc = schema;
final String cat = catalog;
return new ResultSetIterator(getMetaData().getTables(catalog, schema, table, new String[]{"TABLE"}),
getSQLExceptionConverter()) {
Map<String, Object> element = new HashMap<String, Object>();
protected Map<String, Object> convertRow(ResultSet tableRs) throws SQLException{
String table = tableRs.getString("TABLE_NAME");
String fullTableName = TableNameQualifier.qualify(quote(cat), quote(sc), quote(table));
String sql ="SELECT * FROM " + fullTableName + " WHERE 0>1"; // can't use FALSE constant since it would not work with older HSQL versions. (JBIDE-5957)
boolean isAutoIncrement = false;
PreparedStatement statement = null;
try {
statement = getConnection().prepareStatement( sql );
element.clear();
element.put("TABLE_NAME", table);
element.put("TABLE_SCHEM", sc);
element.put("TABLE_CAT", null);
ResultSet rs = statement.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
isAutoIncrement = rsmd.isAutoIncrement(i + 1);
if (isAutoIncrement) break;
}
} catch(SQLException e) {
//log error and set HIBERNATE_STRATEGY to null
log.debug("Error while getting suggested primary key strategy for " + fullTableName + ". Falling back to default strategy.",e);
} finally {
if(statement!=null) {
try {
statement.close();
}
catch (SQLException e) {
throw getSQLExceptionConverter().convert(e,
"Problem while closing prepared statement", null);
}
}
}
if(isAutoIncrement) {
element.put("HIBERNATE_STRATEGY", "identity");
} else {
element.put("HIBERNATE_STRATEGY", null);
}
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. ", sql);
}
}
}