# HSQLDBParameterBinders.java

    package org.codefilarete.stalactite.sql.statement.binder;

    import java.io.InputStream;
    import java.sql.JDBCType;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.time.OffsetDateTime;
    import java.time.ZonedDateTime;

    import static org.codefilarete.stalactite.sql.statement.binder.DefaultResultSetReaders.BINARYSTREAM_READER;

    /**
     * Specialized {@link ParameterBinder}s for HSQLDB.
     *
     * @author Guillaume Mary
     */
    public final class HSQLDBParameterBinders {

    	/**
    	 * Specialization is made by overriding {@link PreparedStatement#setBinaryStream(int, InputStream)} for null values because it fails
    	 * with "org.hsqldb.HsqlException: Invalid argument in JDBC call"
    	 * HsqlDB 2.3.2
    	 */
    	public static final ParameterBinder<InputStream> BINARYSTREAM_BINDER = new LambdaParameterBinder<>(BINARYSTREAM_READER, new PreparedStatementWriter<InputStream>() {
    		@Override
    		public void set(PreparedStatement p, int i, InputStream v) throws SQLException {
    			if (v == null) {
    				p.setObject(i, null);
    			} else {
    				p.setBinaryStream(i, v);
    			}
    		}

    		@Override
    		public Class<InputStream> getType() {
    			return InputStream.class;
    		}
    	});

    	/**
    	 * HSQLDB native support for {@link ZonedDateTime}
    	 */
    	public static final ParameterBinder<ZonedDateTime> ZONED_DATE_TIME_BINDER = new NullAwareParameterBinder<>(
    			new ZonedDateTimeResultSetReader(),
    			new ZonedDateTimePreparedStatementWriter());

    	/**
    	 * HSQLDB native support for {@link OffsetDateTime}
    	 */
    	public static final ParameterBinder<OffsetDateTime> OFFSET_DATE_TIME_BINDER = new NullAwareParameterBinder<>(
    			new JdbcTypeResultSetReader<>(OffsetDateTime.class),
    			new JdbcTypePreparedStatementWriter<>(OffsetDateTime.class, JDBCType.TIMESTAMP_WITH_TIMEZONE));

    	private HSQLDBParameterBinders() {}
    }