package org.infinispan.tools.jdbc.migrator; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.marshall.core.MarshalledEntry; import org.infinispan.persistence.jdbc.connectionfactory.ConnectionFactory; import org.infinispan.persistence.jdbc.table.management.TableManager; import org.infinispan.persistence.spi.PersistenceException; /** * @author Ryan Emerson * @since 9.0 */ class BinaryJdbcIterator extends AbstractJdbcEntryIterator { private Iterator<MarshalledEntry> iterator = Collections.emptyIterator(); BinaryJdbcIterator(ConnectionFactory connectionFactory, TableManager tableManager, StreamingMarshaller marshaller) { super(connectionFactory, tableManager, marshaller); } @Override public boolean hasNext() { return iterator.hasNext() || rowIndex < numberOfRows; } @Override public MarshalledEntry next() { if (!iterator.hasNext()) { iterator = getNextBucketIterator(); } rowIndex++; return iterator.next(); } private Iterator<MarshalledEntry> getNextBucketIterator() { try { if (rs.next()) { InputStream inputStream = rs.getBinaryStream(1); Map<Object, MarshalledEntry> bucketEntries = unmarshallBucketEntries(inputStream); numberOfRows += bucketEntries.size() - 1; // Guaranteed that bucket size will never be 0 return bucketEntries.values().iterator(); } else { close(); throw new NoSuchElementException(); } } catch (SQLException e) { throw new PersistenceException("SQL error while fetching all StoredEntries", e); } } private Map<Object, MarshalledEntry> unmarshallBucketEntries(InputStream inputStream) { try { return (Map<Object, MarshalledEntry>) marshaller.objectFromInputStream(inputStream); } catch (IOException e) { throw new PersistenceException("I/O error while unmarshalling from stream", e); } catch (ClassNotFoundException e) { throw new PersistenceException(e); } } }