All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sfm.jdbc.impl.JdbcMapperImpl Maven / Gradle / Ivy

package org.sfm.jdbc.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
//IFJAVA8_START
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import java.util.Spliterator;
//IFJAVA8_END

import org.sfm.jdbc.JdbcMapper;
import org.sfm.map.MappingException;
import org.sfm.map.RowHandlerErrorHandler;
import org.sfm.map.impl.FieldMapper;
import org.sfm.map.impl.MapperImpl;
import org.sfm.reflect.Instantiator;
import org.sfm.utils.RowHandler;

public final class JdbcMapperImpl extends MapperImpl implements JdbcMapper {

	
	private final RowHandlerErrorHandler errorHandler; 
	
	public JdbcMapperImpl(final FieldMapper[] mappers, final Instantiator instantiator, final RowHandlerErrorHandler errorHandler) {
		super(mappers, instantiator);
		this.errorHandler = errorHandler;
	}

	@Override
	public > H forEach(final ResultSet rs, final H handler)
			throws SQLException, MappingException {
		while(rs.next()) {
			T t = map(rs);
			try {
				handler.handle(t);
			} catch(Throwable error) {
				errorHandler.handlerError(error, t);
			}
		}
		return handler;
	}

	@Override
	public Iterator iterate(ResultSet rs) throws SQLException,
			MappingException {
		return new ResultSetIterator(rs, this);
	}

	//IFJAVA8_START
	@Override
	public Stream stream(ResultSet rs) throws SQLException, MappingException {
		return StreamSupport.stream(new JdbcSpliterator(rs), false);
	}

	public class JdbcSpliterator implements Spliterator {
		private final ResultSet resultSet;

		public JdbcSpliterator(ResultSet resultSet) {
			this.resultSet = resultSet;
		}

		@Override
		public boolean tryAdvance(Consumer action) {
			try {
				if (resultSet.next()) {
                    action.accept(map(resultSet));
                    return true;
                }
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
			return false;
		}

		@Override
		public void forEachRemaining(Consumer action) {
			try {
				forEach(resultSet, new RowHandler() {
                    @Override
                    public void handle(T t) throws Exception {
                        action.accept(t);
                    }
                });
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}

		@Override
		public Spliterator trySplit() {
			return null;
		}

		@Override
		public long estimateSize() {
			return Long.MAX_VALUE;
		}

		@Override
		public int characteristics() {
			return Spliterator.ORDERED | Spliterator.NONNULL;
		}
	}

	//IFJAVA8_END
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy