package com.revolsys.jdbc.field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import com.revolsys.datatype.DataTypes;
import com.revolsys.record.Record;
public class JdbcBigIntegerFieldDefinition extends JdbcFieldDefinition {
public JdbcBigIntegerFieldDefinition(final String dbName, final String name, final int sqlType,
final int length, final boolean required, final String description,
final Map<String, Object> properties) {
super(dbName, name, DataTypes.INTEGER, sqlType, length, 0, required, description, properties);
}
@Override
public JdbcBigIntegerFieldDefinition clone() {
return new JdbcBigIntegerFieldDefinition(getDbName(), getName(), getSqlType(), getLength(),
isRequired(), getDescription(), getProperties());
}
@Override
public int setFieldValueFromResultSet(final ResultSet resultSet, final int columnIndex,
final Record record) throws SQLException {
Object value;
final int length = getLength();
if (length <= 2) {
value = resultSet.getByte(columnIndex);
} else if (length <= 4) {
value = resultSet.getShort(columnIndex);
} else if (length <= 9) {
value = resultSet.getInt(columnIndex);
} else if (length <= 18) {
value = resultSet.getLong(columnIndex);
} else {
final BigDecimal number = resultSet.getBigDecimal(columnIndex);
if (number == null) {
value = null;
} else {
value = number.toBigInteger();
}
}
if (!resultSet.wasNull()) {
setValue(record, value);
}
return columnIndex + 1;
}
@Override
public int setPreparedStatementValue(final PreparedStatement statement, final int parameterIndex,
final Object value) throws SQLException {
if (value == null) {
statement.setNull(parameterIndex, getSqlType());
} else {
if (value instanceof BigDecimal) {
final BigDecimal number = (BigDecimal)value;
statement.setBigDecimal(parameterIndex, number);
} else if (value instanceof BigInteger) {
final BigInteger number = (BigInteger)value;
statement.setBigDecimal(parameterIndex, new BigDecimal(number));
} else if (value instanceof Number) {
final Number number = (Number)value;
statement.setLong(parameterIndex, number.longValue());
} else {
final BigDecimal number = new BigDecimal(value.toString());
statement.setBigDecimal(parameterIndex, number);
}
}
return parameterIndex + 1;
}
}