Skip to content

Commit

Permalink
extended DataBind, so that it could return the last bound object
Browse files Browse the repository at this point in the history
  • Loading branch information
rPraml committed Jun 20, 2023
1 parent ca3c02b commit 9b3b8ad
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,9 @@ public interface DataBinder {
*/
String popJson();

/**
* Returns the last bound object (e.g. for BindValidation). Note for InputStreams you'll get an InputStreamInfo.
*/
Object popLastObject();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.ebean.core.type;

import java.io.InputStream;

/**
* Helper to transports length info of DataBind.setBinaryStream(stream, length) to BindValidation
*
* @author Roland Praml, FOCONIS AG
*/
public class InputStreamInfo {
private final InputStream stream;

private final long length;

public InputStreamInfo(InputStream stream, long length) {
this.stream = stream;
this.length = length;
}

public InputStream stream() {
return stream;
}

public long length() {
return length;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package io.ebeaninternal.server.bind;

import io.ebean.core.type.DataBinder;
import io.ebean.core.type.InputStreamInfo;
import io.ebeaninternal.api.CoreLog;
import io.ebeaninternal.server.core.timezone.DataTimeZone;

import java.io.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
Expand All @@ -15,6 +19,7 @@

public class DataBind implements DataBinder {

private static final Object UNBOUND = new Object();
private final DataTimeZone dataTimeZone;
private final PreparedStatement pstmt;
private final Connection connection;
Expand All @@ -23,6 +28,8 @@ public class DataBind implements DataBinder {
protected int pos;
private String json;

private Object lastObject = UNBOUND;

public DataBind(DataTimeZone dataTimeZone, PreparedStatement pstmt, Connection connection) {
this.dataTimeZone = dataTimeZone;
this.pstmt = pstmt;
Expand Down Expand Up @@ -65,16 +72,19 @@ public final int currentPos() {
@Override
public void setObject(Object value) throws SQLException {
pstmt.setObject(++pos, value);
lastObject = value;
}

@Override
public final void setObject(Object value, int sqlType) throws SQLException {
pstmt.setObject(++pos, value, sqlType);
lastObject = value;
}

@Override
public void setNull(int jdbcType) throws SQLException {
pstmt.setNull(++pos, jdbcType);
lastObject = null;
}

@Override
Expand All @@ -96,7 +106,7 @@ public final int executeUpdate() throws SQLException {
}
}

private void closeInputStreams() {
public void closeInputStreams() {
if (inputStreams != null) {
for (InputStream inputStream : inputStreams) {
try {
Expand All @@ -117,36 +127,43 @@ public final PreparedStatement getPstmt() {
@Override
public void setString(String value) throws SQLException {
pstmt.setString(++pos, value);
lastObject = value;
}

@Override
public final void setInt(int value) throws SQLException {
pstmt.setInt(++pos, value);
lastObject = value;
}

@Override
public final void setLong(long value) throws SQLException {
pstmt.setLong(++pos, value);
lastObject = value;
}

@Override
public final void setShort(short value) throws SQLException {
pstmt.setShort(++pos, value);
lastObject = value;
}

@Override
public final void setFloat(float value) throws SQLException {
pstmt.setFloat(++pos, value);
lastObject = value;
}

@Override
public final void setDouble(double value) throws SQLException {
pstmt.setDouble(++pos, value);
lastObject = value;
}

@Override
public final void setBigDecimal(BigDecimal value) throws SQLException {
pstmt.setBigDecimal(++pos, value);
lastObject = value;
}

@Override
Expand All @@ -157,6 +174,7 @@ public final void setDate(java.sql.Date value) throws SQLException {
} else {
pstmt.setDate(++pos, value);
}
lastObject = value;
}

@Override
Expand All @@ -167,6 +185,7 @@ public final void setTimestamp(Timestamp value) throws SQLException {
} else {
pstmt.setTimestamp(++pos, value);
}
lastObject = value;
}

@Override
Expand All @@ -177,26 +196,31 @@ public final void setTime(Time value) throws SQLException {
} else {
pstmt.setTime(++pos, value);
}
lastObject = value;
}

@Override
public void setBoolean(boolean value) throws SQLException {
pstmt.setBoolean(++pos, value);
lastObject = value;
}

@Override
public void setBytes(byte[] value) throws SQLException {
pstmt.setBytes(++pos, value);
lastObject = value;
}

@Override
public void setByte(byte value) throws SQLException {
pstmt.setByte(++pos, value);
lastObject = value;
}

@Override
public void setChar(char value) throws SQLException {
pstmt.setString(++pos, String.valueOf(value));
lastObject = value;
}

@Override
Expand All @@ -211,21 +235,34 @@ public void setBinaryStream(InputStream inputStream, long length) throws SQLExce
}
inputStreams.add(inputStream);
pstmt.setBinaryStream(++pos, inputStream, length);
lastObject = new InputStreamInfo(inputStream, length);
}

@Override
public void setBlob(byte[] bytes) throws SQLException {
pstmt.setBinaryStream(++pos, new ByteArrayInputStream(bytes), bytes.length);
lastObject = bytes;
}

@Override
public void setClob(String content) throws SQLException {
pstmt.setCharacterStream(++pos, new StringReader(content), content.length());
lastObject = content;
}

@Override
public void setArray(String arrayType, Object[] elements) throws SQLException {
pstmt.setArray(++pos, connection.createArrayOf(arrayType, elements));
lastObject = elements;
}

@Override
public Object popLastObject() {
Object ret = lastObject;
lastObject = UNBOUND;
if (ret == UNBOUND) {
throw new IllegalStateException("No object bound");
}
return ret;
}
}

0 comments on commit 9b3b8ad

Please sign in to comment.