package io.ebeaninternal.server.type;
import io.ebeaninternal.server.core.Message;
import io.ebeaninternal.server.core.timezone.DataTimeZone;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.sql.Array;
import java.sql.Date;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
public class RsetDataReader implements DataReader {
private static final int bufferSize = 512;
static final int clobBufferSize = 512;
static final int stringInitialSize = 512;
private final DataTimeZone dataTimeZone;
private final ResultSet rset;
protected int pos;
public RsetDataReader(DataTimeZone dataTimeZone, ResultSet rset) {
this.dataTimeZone = dataTimeZone;
this.rset = rset;
}
@Override
public void close() throws SQLException {
rset.close();
}
@Override
public boolean next() throws SQLException {
return rset.next();
}
@Override
public void resetColumnPosition() {
pos = 0;
}
@Override
public void incrementPos(int increment) {
pos += increment;
}
protected int pos() {
return ++pos;
}
@Override
public Array getArray() throws SQLException {
return rset.getArray(pos());
}
@Override
public Object getObject() throws SQLException {
return rset.getObject(pos());
}
@Override
public BigDecimal getBigDecimal() throws SQLException {
return rset.getBigDecimal(pos());
}
@Override
public InputStream getBinaryStream() throws SQLException {
return rset.getBinaryStream(pos());
}
@Override
public Boolean getBoolean() throws SQLException {
boolean v = rset.getBoolean(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
@Override
public Byte getByte() throws SQLException {
byte v = rset.getByte(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
@Override
public byte[] getBytes() throws SQLException {
return rset.getBytes(pos());
}
@Override
public Date getDate() throws SQLException {
return rset.getDate(pos());
}
@Override
public Double getDouble() throws SQLException {
double v = rset.getDouble(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
@Override
public Float getFloat() throws SQLException {
float v = rset.getFloat(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
@Override
public Integer getInt() throws SQLException {
int v = rset.getInt(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
@Override
public Long getLong() throws SQLException {
long v = rset.getLong(pos());
if (rset.wasNull()) {
return null;
}
return v;
}
public Ref getRef() throws SQLException {
return rset.getRef(pos());
}
@Override
public Short getShort() throws SQLException {
short s = rset.getShort(pos());
if (rset.wasNull()) {
return null;
}
return s;
}
@Override
public String getString() throws SQLException {
return rset.getString(pos());
}
@Override
public Time getTime() throws SQLException {
return rset.getTime(pos());
}
@Override
public Timestamp getTimestamp() throws SQLException {
Calendar cal = dataTimeZone.getTimeZone();
if (cal != null) {
return rset.getTimestamp(pos(), cal);
} else {
return rset.getTimestamp(pos());
}
}
@Override
public String getStringFromStream() throws SQLException {
Reader reader = rset.getCharacterStream(pos());
if (reader == null) {
return null;
}
return readStringLob(reader);
}
protected String readStringLob(Reader reader) throws SQLException {
char[] buffer = new char[clobBufferSize];
int readLength;
StringBuilder out = new StringBuilder(stringInitialSize);
try {
while ((readLength = reader.read(buffer)) != -1) {
out.append(buffer, 0, readLength);
}
reader.close();
} catch (IOException e) {
throw new SQLException(Message.msg("persist.clob.io", e.getMessage()));
}
return out.toString();
}
@Override
public byte[] getBinaryBytes() throws SQLException {
InputStream in = rset.getBinaryStream(pos());
return getBinaryLob(in);
}
protected byte[] getBinaryLob(InputStream in) throws SQLException {
if (in == null) {
return null;
}
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
byte[] buf = new byte[bufferSize];
int len;
while ((len = in.read(buf, 0, buf.length)) != -1) {
out.write(buf, 0, len);
}
byte[] data = out.toByteArray();
if (data.length == 0) {
data = null;
}
in.close();
return data;
} catch (IOException e) {
throw new SQLException(e.getClass().getName() + ":" + e.getMessage());
}
}
}