package com.revolsys.oracle.recordstore.field;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import com.revolsys.datatype.DataTypes;
import com.revolsys.jdbc.field.JdbcFieldDefinition;
import com.revolsys.record.Record;
import com.revolsys.spring.resource.Resource;
public class OracleJdbcBlobFieldDefinition extends JdbcFieldDefinition {
public OracleJdbcBlobFieldDefinition(final String dbName, final String name, final int sqlType,
final int length, final boolean required, final String description) {
super(dbName, name, DataTypes.BLOB, sqlType, length, 0, required, description,
Collections.<String, Object> emptyMap());
}
@Override
public int setFieldValueFromResultSet(final ResultSet resultSet, final int columnIndex,
final Record object) throws SQLException {
final Blob value = resultSet.getBlob(columnIndex);
object.setValue(getIndex(), value);
return columnIndex + 1;
}
@Override
public int setPreparedStatementValue(final PreparedStatement statement, final int parameterIndex,
final Object value) throws SQLException {
if (value == null) {
final int sqlType = getSqlType();
statement.setNull(parameterIndex, sqlType);
} else {
if (value instanceof Blob) {
final Blob blob = (Blob)value;
statement.setBlob(parameterIndex, blob);
} else {
InputStream in;
if (value instanceof Blob) {
final Blob blob = (Blob)value;
in = blob.getBinaryStream();
} else if (value instanceof byte[]) {
final byte[] bytes = (byte[])value;
in = new ByteArrayInputStream(bytes);
} else if (value instanceof CharSequence) {
final String string = ((CharSequence)value).toString();
final byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
in = new ByteArrayInputStream(bytes);
} else {
try {
final Resource resource = Resource.getResource(value);
in = resource.newBufferedInputStream();
} catch (final IllegalArgumentException e) {
throw new IllegalArgumentException(value.getClass() + " not valid for a blob column");
}
}
statement.setBinaryStream(parameterIndex, in);
}
}
return parameterIndex + 1;
}
}