package example;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

@MappedTypes(OrderStatus.class)
@MappedJdbcTypes(value = JdbcType.INTEGER, includeNullJdbcType = true)
public final class StatusHandler extends BaseTypeHandler<OrderStatus> {
    public static final AtomicInteger WRITES = new AtomicInteger();
    public static final AtomicInteger READS = new AtomicInteger();
    @Override public void setNonNullParameter(PreparedStatement statement, int index,
            OrderStatus parameter, JdbcType jdbcType) throws SQLException {
        WRITES.incrementAndGet();
        statement.setInt(index, parameter.code());
    }
    @Override public OrderStatus getNullableResult(ResultSet rows, String column) throws SQLException {
        READS.incrementAndGet();
        int code = rows.getInt(column);
        return rows.wasNull() ? null : OrderStatus.fromCode(code);
    }
    @Override public OrderStatus getNullableResult(ResultSet rows, int column) throws SQLException {
        READS.incrementAndGet();
        int code = rows.getInt(column);
        return rows.wasNull() ? null : OrderStatus.fromCode(code);
    }
    @Override public OrderStatus getNullableResult(CallableStatement statement, int column) throws SQLException {
        READS.incrementAndGet();
        int code = statement.getInt(column);
        return statement.wasNull() ? null : OrderStatus.fromCode(code);
    }
}
