use of org.knime.core.data.blob.BinaryObjectDataValue in project knime-core by knime.
the class DatabaseHelper method fillStatement.
/**
* Set given column value into SQL statement.
* @param stmt statement used
* @param dbIdx database index to update/write
* @param cspec column spec to check type
* @param cell the data cell to write into the statement
* @param tz the {@link TimeZone} to use
* @param columnTypes
* @throws SQLException if the value can't be set
*/
protected void fillStatement(final PreparedStatement stmt, final int dbIdx, final DataColumnSpec cspec, final DataCell cell, final TimeZone tz, final Map<Integer, Integer> columnTypes) throws SQLException {
if (cspec.getType().isCompatible(BooleanValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BOOLEAN);
} else {
boolean bool = ((BooleanValue) cell).getBooleanValue();
stmt.setBoolean(dbIdx, bool);
}
} else if (cspec.getType().isCompatible(IntValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.INTEGER);
} else {
int integer = ((IntValue) cell).getIntValue();
stmt.setInt(dbIdx, integer);
}
} else if (cspec.getType().isCompatible(LongValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BIGINT);
} else {
long dbl = ((LongValue) cell).getLongValue();
stmt.setLong(dbIdx, dbl);
}
} else if (cspec.getType().isCompatible(DoubleValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.DOUBLE);
} else {
double dbl = ((DoubleValue) cell).getDoubleValue();
if (Double.isNaN(dbl)) {
stmt.setNull(dbIdx, Types.DOUBLE);
} else {
stmt.setDouble(dbIdx, dbl);
}
}
} else if (cspec.getType().isCompatible(DateAndTimeValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.DATE);
} else {
final DateAndTimeValue dateCell = (DateAndTimeValue) cell;
final long corrDate = dateCell.getUTCTimeInMillis() - tz.getOffset(dateCell.getUTCTimeInMillis());
if (!dateCell.hasTime() && !dateCell.hasMillis()) {
java.sql.Date date = new java.sql.Date(corrDate);
stmt.setDate(dbIdx, date);
} else if (!dateCell.hasDate()) {
java.sql.Time time = new java.sql.Time(corrDate);
stmt.setTime(dbIdx, time);
} else {
java.sql.Timestamp timestamp = new java.sql.Timestamp(corrDate);
stmt.setTimestamp(dbIdx, timestamp);
}
}
} else if (cspec.getType().isCompatible(BinaryObjectDataValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BLOB);
} else {
try {
BinaryObjectDataValue value = (BinaryObjectDataValue) cell;
InputStream is = value.openInputStream();
if (is == null) {
stmt.setNull(dbIdx, Types.BLOB);
} else {
try {
// to be compatible with JDBC 3.0, the length of the stream is restricted to max integer,
// which are ~2GB; with JDBC 4.0 longs are supported and the respective method can be called
stmt.setBinaryStream(dbIdx, is, (int) value.length());
} catch (SQLException ex) {
// if no supported (i.e. SQLite) set byte array
byte[] bytes = IOUtils.toByteArray(is);
stmt.setBytes(dbIdx, bytes);
}
}
} catch (IOException ioe) {
stmt.setNull(dbIdx, Types.BLOB);
}
}
} else if (cspec.getType().isCompatible(CollectionDataValue.class)) {
fillArray(stmt, dbIdx, cell, tz);
} else if ((columnTypes == null) || cspec.getType().isCompatible(StringValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.VARCHAR);
} else {
stmt.setString(dbIdx, cell.toString());
}
} else {
Integer sqlType = columnTypes.get(dbIdx);
if (sqlType == null) {
sqlType = Types.VARCHAR;
}
if (cell.isMissing()) {
stmt.setNull(dbIdx, sqlType);
} else {
stmt.setObject(dbIdx, cell.toString(), sqlType);
}
}
}
use of org.knime.core.data.blob.BinaryObjectDataValue in project knime-core by knime.
the class DatabaseWriterConnection method fillStatement.
/**
* Set given column value into SQL statement.
* @param stmt statement used
* @param dbIdx database index to update/write
* @param cspec column spec to check type
* @param cell the data cell to write into the statement
* @param tz the {@link TimeZone} to use
* @throws SQLException if the value can't be set
*/
private static void fillStatement(final PreparedStatement stmt, final int dbIdx, final DataColumnSpec cspec, final DataCell cell, final TimeZone tz, final Map<Integer, Integer> columnTypes) throws SQLException {
if (cspec.getType().isCompatible(BooleanValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BOOLEAN);
} else {
boolean bool = ((BooleanValue) cell).getBooleanValue();
stmt.setBoolean(dbIdx, bool);
}
} else if (cspec.getType().isCompatible(IntValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.INTEGER);
} else {
int integer = ((IntValue) cell).getIntValue();
stmt.setInt(dbIdx, integer);
}
} else if (cspec.getType().isCompatible(LongValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BIGINT);
} else {
long dbl = ((LongValue) cell).getLongValue();
stmt.setLong(dbIdx, dbl);
}
} else if (cspec.getType().isCompatible(DoubleValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.DOUBLE);
} else {
double dbl = ((DoubleValue) cell).getDoubleValue();
if (Double.isNaN(dbl)) {
stmt.setNull(dbIdx, Types.DOUBLE);
} else {
stmt.setDouble(dbIdx, dbl);
}
}
} else if (cspec.getType().isCompatible(DateAndTimeValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.DATE);
} else {
final DateAndTimeValue dateCell = (DateAndTimeValue) cell;
final long corrDate = dateCell.getUTCTimeInMillis() - tz.getOffset(dateCell.getUTCTimeInMillis());
if (!dateCell.hasTime() && !dateCell.hasMillis()) {
java.sql.Date date = new java.sql.Date(corrDate);
stmt.setDate(dbIdx, date);
} else if (!dateCell.hasDate()) {
java.sql.Time time = new java.sql.Time(corrDate);
stmt.setTime(dbIdx, time);
} else {
java.sql.Timestamp timestamp = new java.sql.Timestamp(corrDate);
stmt.setTimestamp(dbIdx, timestamp);
}
}
} else if (cspec.getType().isCompatible(BinaryObjectDataValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.BLOB);
} else {
try {
BinaryObjectDataValue value = (BinaryObjectDataValue) cell;
InputStream is = value.openInputStream();
if (is == null) {
stmt.setNull(dbIdx, Types.BLOB);
} else {
try {
// to be compatible with JDBC 3.0, the length of the stream is restricted to max integer,
// which are ~2GB; with JDBC 4.0 longs are supported and the respective method can be called
stmt.setBinaryStream(dbIdx, is, (int) value.length());
} catch (SQLException ex) {
// if no supported (i.e. SQLite) set byte array
byte[] bytes = IOUtils.toByteArray(is);
stmt.setBytes(dbIdx, bytes);
}
}
} catch (IOException ioe) {
stmt.setNull(dbIdx, Types.BLOB);
}
}
} else if ((columnTypes == null) || cspec.getType().isCompatible(StringValue.class)) {
if (cell.isMissing()) {
stmt.setNull(dbIdx, Types.VARCHAR);
} else {
stmt.setString(dbIdx, cell.toString());
}
} else {
Integer sqlType = columnTypes.get(dbIdx);
if (sqlType == null) {
sqlType = Types.VARCHAR;
}
if (cell.isMissing()) {
stmt.setNull(dbIdx, sqlType);
} else {
stmt.setObject(dbIdx, cell.toString(), sqlType);
}
}
}
Aggregations