package org.jboss.ejb.plugins.cmp.jdbc;
import org.jboss.logging.Logger;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.io.StringReader;
import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
public interface JDBCParameterSetter
{
void set(PreparedStatement ps, int index, int jdbcType, Object value, Logger log) throws SQLException;
abstract class JDBCAbstractParameterSetter implements JDBCParameterSetter
{
public void set(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
if(log.isTraceEnabled())
{
log.trace("param: " +
"i=" + index + ", " +
"type=" + JDBCUtil.getJDBCTypeName(jdbcType) + ", " +
"value=" + ((value == null) ? "NULL" : value));
}
if(value == null)
{
ps.setNull(index, jdbcType);
}
else
{
value = JDBCUtil.coerceToSQLType(jdbcType, value);
setNotNull(ps, index, jdbcType, value, log);
}
}
protected abstract void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException;
}
JDBCParameterSetter CLOB = new JDBCAbstractParameterSetter()
{
protected void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
String string = value.toString();
ps.setCharacterStream(index, new StringReader(string), string.length());
}
};
JDBCParameterSetter BINARY = new JDBCAbstractParameterSetter()
{
protected void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
byte[] bytes = JDBCUtil.convertObjectToByteArray(value);
ps.setBytes(index, bytes);
}
};
JDBCParameterSetter BLOB = new JDBCAbstractParameterSetter()
{
protected void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
byte[] bytes = JDBCUtil.convertObjectToByteArray(value);
ps.setBinaryStream(index, new ByteArrayInputStream(bytes), bytes.length);
}
};
JDBCParameterSetter NUMERIC = new JDBCAbstractParameterSetter()
{
protected void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
if(value instanceof BigDecimal)
{
ps.setBigDecimal(index, (BigDecimal)value);
}
else
{
ps.setObject(index, value, jdbcType, 0);
}
}
};
JDBCParameterSetter OBJECT = new JDBCAbstractParameterSetter()
{
protected void setNotNull(PreparedStatement ps, int index, int jdbcType, Object value, Logger log)
throws SQLException
{
ps.setObject(index, value, jdbcType);
}
};
}