package org.infinispan.tools.jdbc.migrator; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.marshall.core.MarshalledEntry; import org.infinispan.persistence.jdbc.JdbcUtil; 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 */ abstract class AbstractJdbcEntryIterator implements Iterator<MarshalledEntry>, AutoCloseable { final ConnectionFactory connectionFactory; final TableManager tableManager; final StreamingMarshaller marshaller; private Connection conn; private PreparedStatement ps; ResultSet rs; int numberOfRows = 0; int rowIndex = 0; AbstractJdbcEntryIterator(ConnectionFactory connectionFactory, TableManager tableManager, StreamingMarshaller marshaller) { this.connectionFactory = connectionFactory; this.tableManager = tableManager; this.marshaller = marshaller; Statement st = null; ResultSet countRs = null; try { conn = connectionFactory.getConnection(); st = conn.createStatement(); countRs = st.executeQuery(tableManager.getCountRowsSql()); countRs.next(); numberOfRows = countRs.getInt(1); ps = conn.prepareStatement(tableManager.getLoadAllRowsSql(), ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setFetchSize(tableManager.getFetchSize()); rs = ps.executeQuery(); } catch (SQLException e) { throw new PersistenceException("SQL error while fetching all StoredEntries", e); } finally { JdbcUtil.safeClose(st); JdbcUtil.safeClose(countRs); } } @Override public void close() { JdbcUtil.safeClose(rs); JdbcUtil.safeClose(ps); connectionFactory.releaseConnection(conn); } }