package com.w11k.lsql.dialects; import com.w11k.lsql.LSql; import com.w11k.lsql.converter.Converter; import org.postgresql.jdbc4.Jdbc4ResultSetMetaData; import java.sql.*; public class PostgresDialect extends GenericDialect { private static class BooleanConverter extends Converter { public BooleanConverter() { super(Boolean.class, new int[]{Types.BIT, Types.BOOLEAN}, Types.BIT); } @Override protected void setValue(LSql lSql, PreparedStatement ps, int index, Object val) throws SQLException { ps.setBoolean(index, (Boolean) val); } @Override protected Object getValue(LSql lSql, ResultSet rs, int index) throws SQLException { if (rs.getMetaData().getColumnType(index) == Types.BOOLEAN) { return rs.getBoolean(index); } else if (rs.getMetaData().getColumnType(index) == Types.BIT) { return rs.getString(index).trim().equalsIgnoreCase("t"); } else { throw new IllegalStateException("Database boolean column is neither BOOLEAN nor BIT."); } } } public PostgresDialect() { getConverterRegistry().addConverter(new BooleanConverter()); } @Override public String getSchemaAndTableNameFromResultSetMetaData(ResultSetMetaData metaData, int columnIndex) throws SQLException { Jdbc4ResultSetMetaData postgresMetaData = (Jdbc4ResultSetMetaData) metaData; String schema = getIdentifierConverter().sqlToJava(postgresMetaData.getBaseSchemaName(columnIndex)); String table = getIdentifierConverter().sqlToJava(postgresMetaData.getBaseTableName(columnIndex)); return schema.equals("") ? table : schema + "." + table; } @Override public String getColumnNameFromResultSetMetaData(ResultSetMetaData metaData, int columnIndex) throws SQLException { Jdbc4ResultSetMetaData postgresMetaData = (Jdbc4ResultSetMetaData) metaData; return postgresMetaData.getBaseColumnName(columnIndex); } }