package com.revolsys.jdbc.field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Map;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.identifier.Identifier;
import com.revolsys.identifier.TypedIdentifier;
import com.revolsys.record.Record;
import com.revolsys.record.schema.FieldDefinition;
public class JdbcFieldDefinition extends FieldDefinition {
public static final String UNKNOWN = "UNKNOWN";
private static final JdbcFieldDefinition FIELD_UNKNOWN = new JdbcFieldDefinition();
private static final JdbcBooleanFieldDefinition FIELD_BOOLEAN = new JdbcBooleanFieldDefinition(
UNKNOWN, UNKNOWN, Types.BIT, -1, false, null, null);
private static final JdbcTimestampFieldDefinition FIELD_TIMESTAMP = new JdbcTimestampFieldDefinition(
UNKNOWN, UNKNOWN, -1, false, null, null);
private static final JdbcDateFieldDefinition FIELD_DATE = new JdbcDateFieldDefinition(UNKNOWN,
UNKNOWN, -1, false, null, null);
private static final JdbcBigDecimalFieldDefinition FIELD_BIG_DECIMAL = new JdbcBigDecimalFieldDefinition(
UNKNOWN, UNKNOWN, Types.NUMERIC, -1, -1, false, null, null);
private static final JdbcFloatFieldDefinition FIELD_FLOAT = new JdbcFloatFieldDefinition(UNKNOWN,
UNKNOWN, Types.FLOAT, false, null, null);
private static final JdbcDoubleFieldDefinition FIELD_DOUBLE = new JdbcDoubleFieldDefinition(
UNKNOWN, UNKNOWN, Types.DOUBLE, false, null, null);
private static final JdbcByteFieldDefinition FIELD_BYTE = new JdbcByteFieldDefinition(UNKNOWN,
UNKNOWN, Types.TINYINT, false, null, null);
private static final JdbcShortFieldDefinition FIELD_SHORT = new JdbcShortFieldDefinition(UNKNOWN,
UNKNOWN, Types.SMALLINT, false, null, null);
private static final JdbcIntegerFieldDefinition FIELD_INTEGER = new JdbcIntegerFieldDefinition(
UNKNOWN, UNKNOWN, Types.INTEGER, false, null, null);
private static final JdbcLongFieldDefinition FIELD_LONG = new JdbcLongFieldDefinition(UNKNOWN,
UNKNOWN, Types.BIGINT, false, null, null);
private static final JdbcStringFieldDefinition FIELD_STRING = new JdbcStringFieldDefinition(
UNKNOWN, UNKNOWN, Types.CHAR, -1, false, null, null);
private static final JdbcFieldDefinition FIELD_OBJECT = new JdbcFieldDefinition(UNKNOWN, UNKNOWN,
DataTypes.OBJECT, Types.OTHER, 0, 0, false, null, null);
public static JdbcFieldDefinition newFieldDefinition(Object value) {
if (value instanceof TypedIdentifier) {
return FIELD_STRING;
} else if (value instanceof Identifier) {
final Identifier identifier = (Identifier)value;
value = identifier.toSingleValue();
}
if (value == null) {
return FIELD_OBJECT;
} else if (value instanceof CharSequence) {
return FIELD_STRING;
} else if (value instanceof BigInteger) {
return FIELD_LONG;
} else if (value instanceof Long) {
return FIELD_LONG;
} else if (value instanceof Integer) {
return FIELD_INTEGER;
} else if (value instanceof Short) {
return FIELD_SHORT;
} else if (value instanceof Byte) {
return FIELD_BYTE;
} else if (value instanceof Double) {
return FIELD_DOUBLE;
} else if (value instanceof Float) {
return FIELD_FLOAT;
} else if (value instanceof BigDecimal) {
return FIELD_BIG_DECIMAL;
} else if (value instanceof Date) {
return FIELD_DATE;
} else if (value instanceof java.util.Date) {
return FIELD_TIMESTAMP;
} else if (value instanceof Boolean) {
return FIELD_BOOLEAN;
} else {
return FIELD_UNKNOWN;
}
}
private String dbName;
private boolean quoteName = false;
private int sqlType;
private JdbcFieldDefinition() {
setName(UNKNOWN);
}
public JdbcFieldDefinition(final String dbName, final String name, final DataType type,
final int sqlType, final int length, final int scale, final boolean required,
final String description, final Map<String, Object> properties) {
super(name, type, length, scale, required, description, properties);
this.dbName = dbName;
this.sqlType = sqlType;
}
public void addColumnName(final StringBuilder sql, final String tablePrefix) {
if (tablePrefix != null) {
sql.append(tablePrefix);
sql.append(".");
}
final String dbName = getDbName();
if (this.quoteName) {
sql.append('"');
}
sql.append(dbName);
if (this.quoteName) {
sql.append('"');
}
}
public void addInsertStatementPlaceHolder(final StringBuilder sql, final boolean generateKeys) {
addStatementPlaceHolder(sql);
}
public void addSelectStatementPlaceHolder(final StringBuilder sql) {
addStatementPlaceHolder(sql);
}
public void addStatementPlaceHolder(final StringBuilder sql) {
sql.append('?');
}
@Override
public JdbcFieldDefinition clone() {
return new JdbcFieldDefinition(this.dbName, getName(), getDataType(), getSqlType(), getLength(),
getScale(), isRequired(), getDescription(), getProperties());
}
public String getDbName() {
return this.dbName;
}
public int getSqlType() {
return this.sqlType;
}
public boolean isQuoteName() {
return this.quoteName;
}
public int setFieldValueFromResultSet(final ResultSet resultSet, final int columnIndex,
final Record record) throws SQLException {
final Object value = resultSet.getObject(columnIndex);
setValue(record, value);
return columnIndex + 1;
}
public int setInsertPreparedStatementValue(final PreparedStatement statement,
final int parameterIndex, final Record record) throws SQLException {
final String name = getName();
final Object value = record.getValue(name);
return setPreparedStatementValue(statement, parameterIndex, value);
}
public int setPreparedStatementValue(final PreparedStatement statement, final int parameterIndex,
final Object value) throws SQLException {
if (value == null) {
statement.setNull(parameterIndex, this.sqlType);
} else {
statement.setObject(parameterIndex, value);
}
return parameterIndex + 1;
}
public void setQuoteName(final boolean quoteName) {
this.quoteName = quoteName;
}
public void setSqlType(final int sqlType) {
this.sqlType = sqlType;
}
}