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;
/**
*
* @author ddukker
*
*/
public class SQLServerMetaDataDialect extends JDBCMetaDataDialect {
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 + ")");
sql = "SELECT a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME as table_name, c.DATA_TYPE as data_type, b.CONSTRAINT_TYPE, OBJECTPROPERTY(OBJECT_ID(a.TABLE_NAME),'TableHasIdentity') as hasIdentity " +
"FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE a " +
"INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS b on a.CONSTRAINT_NAME = b.CONSTRAINT_NAME " +
"INNER JOIN INFORMATION_SCHEMA.Columns c on a.TABLE_CATALOG = c.TABLE_CATALOG AND a.TABLE_SCHEMA = c.TABLE_SCHEMA AND a.TABLE_NAME = c.TABLE_NAME AND a.COLUMN_NAME = c.COLUMN_NAME " +
"WHERE a.TABLE_NAME='"+table+"' AND a.TABLE_SCHEMA='"+schema+"' AND a.TABLE_CATALOG='"+catalog+"' AND b.CONSTRAINT_TYPE = 'Primary key'";
PreparedStatement statement = getConnection().prepareStatement( sql );
final String sc = schema;
final String cat = catalog;
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();
element.put("TABLE_NAME", tableRs.getString("table_name"));
element.put("TABLE_SCHEM", sc);
element.put("TABLE_CAT", cat);
String string = tableRs.getString("data_type");
boolean bool = tableRs.getBoolean("hasIdentity");
if(string!=null) {
if(string.equalsIgnoreCase("uniqueidentifier")){
element.put("HIBERNATE_STRATEGY", "guid");
}else if(bool){
element.put("HIBERNATE_STRATEGY", "identity");
}else{
element.put("HIBERNATE_STRATEGY", null);
}
}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);
}
}
}