package com.w11k.lsql.dialects;
import com.google.common.base.Optional;
import com.w11k.lsql.LSql;
import com.w11k.lsql.Table;
import com.w11k.lsql.converter.ConverterRegistry;
import com.w11k.lsql.converter.sqltypes.*;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import static com.google.common.base.Optional.absent;
import static com.google.common.base.Optional.of;
public class GenericDialect {
private LSql lSql;
private StatementCreator statementCreator = new StatementCreator();
private ConverterRegistry converterRegistry = new ConverterRegistry();
private IdentifierConverter identifierConverter = IdentifierConverter.JAVA_CAMEL_CASE_TO_SQL_LOWER_UNDERSCORE;
public GenericDialect() {
// http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html
this.converterRegistry.addConverter(IntConverter.INSTANCE);
this.converterRegistry.addConverter(DoubleConverter.INSTANCE);
this.converterRegistry.addConverter(FloatConverter.INSTANCE);
this.converterRegistry.addConverter(BooleanConverter.INSTANCE);
this.converterRegistry.addConverter(StringConverter.INSTANCE);
this.converterRegistry.addConverter(BinaryConverter.INSTANCE);
this.converterRegistry.addConverter(ByteConverter.INSTANCE);
this.converterRegistry.addConverter(BlobConverter.INSTANCE);
this.converterRegistry.addConverter(ClobConverter.INSTANCE);
this.converterRegistry.addConverter(JodaDateConverter.INSTANCE);
// TODO Missing primitives
// TODO add more types
// static int LONGVARBINARY;
// static int STRUCT;
// static int TIME;
// static int DATE;
}
public LSql getlSql() {
return lSql;
}
public void setlSql(LSql lSql) {
this.lSql = lSql;
}
public ConverterRegistry getConverterRegistry() {
return this.converterRegistry;
}
public void setConverterRegistry(ConverterRegistry converterRegistry) {
this.converterRegistry = converterRegistry;
}
public StatementCreator getStatementCreator() {
return statementCreator;
}
public IdentifierConverter getIdentifierConverter() {
return identifierConverter;
}
public void setIdentifierConverter(IdentifierConverter identifierConverter) {
this.identifierConverter = identifierConverter;
}
public String getSchemaAndTableNameFromResultSetMetaData(ResultSetMetaData metaData,
int columnIndex) throws SQLException {
String schema = getIdentifierConverter().sqlToJava(metaData.getSchemaName(columnIndex));
String table = getIdentifierConverter().sqlToJava(metaData.getTableName(columnIndex));
return schema.equals("") ? table : schema + "." + table;
}
public String getColumnNameFromResultSetMetaData(ResultSetMetaData metaData,
int columnIndex) throws SQLException {
return getIdentifierConverter().sqlToJava(metaData.getColumnName(columnIndex));
}
public Optional<Object> extractGeneratedPk(Table table,
ResultSet resultSet) throws SQLException {
String pkName = table.getPrimaryKeyColumn().get();
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
String label = metaData.getColumnLabel(i);
if (getIdentifierConverter().sqlToJava(label).equals(pkName)) {
return of(table.column(pkName).getConverter()
.getValueFromResultSet(getlSql(), resultSet, i));
}
}
return absent();
}
}