package org.infinispan.tools.jdbc.migrator; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.NoSuchElementException; import org.infinispan.commons.io.ByteBuffer; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.marshall.core.MarshalledEntry; import org.infinispan.marshall.core.MarshalledEntryImpl; import org.infinispan.persistence.jdbc.connectionfactory.ConnectionFactory; import org.infinispan.persistence.jdbc.table.management.TableManager; import org.infinispan.persistence.keymappers.TwoWayKey2StringMapper; import org.infinispan.persistence.spi.PersistenceException; import org.infinispan.util.KeyValuePair; /** * @author Ryan Emerson * @since 9.0 */ class StringJdbcIterator extends AbstractJdbcEntryIterator { private final TwoWayKey2StringMapper key2StringMapper; StringJdbcIterator(ConnectionFactory connectionFactory, TableManager tableManager, StreamingMarshaller marshaller, TwoWayKey2StringMapper key2StringMapper) { super(connectionFactory, tableManager, marshaller); this.key2StringMapper = key2StringMapper; } @Override public boolean hasNext() { return rowIndex < numberOfRows; } @Override public MarshalledEntry next() { try { if (rs.next()) { rowIndex++; Object key = key2StringMapper.getKeyMapping(rs.getString(2)); KeyValuePair<ByteBuffer, ByteBuffer> icv = unmarshall(rs.getBinaryStream(1)); return new MarshalledEntryImpl(key, icv.getKey(), icv.getValue(), marshaller); } else { close(); throw new NoSuchElementException(); } } catch (SQLException e) { throw new PersistenceException("SQL error while fetching all StoredEntries", e); } } @SuppressWarnings("unchecked") private KeyValuePair<ByteBuffer, ByteBuffer> unmarshall(InputStream inputStream) throws PersistenceException { try { return (KeyValuePair<ByteBuffer, ByteBuffer>) marshaller.objectFromInputStream(inputStream); } catch (IOException e) { throw new PersistenceException("I/O error while unmarshalling from stream", e); } catch (ClassNotFoundException e) { throw new PersistenceException(e); } } }