/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.storage.rdbms; import org.apache.log4j.Logger; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Represents the results of a database query * * @author Peter Breton * @version $Revision$ */ public class TableRowIterator { private static final Logger log = Logger.getLogger(TableRowIterator.class); /** * Results from a query */ private ResultSet results; /** * Statement used to submit the query */ private Statement statemt = null; /** * The name of the RDBMS table */ private String table; /** * True if there is a next row */ private boolean hasNext = true; /** * True if we have already advanced to the next row. */ private boolean hasAdvanced = false; /** * Column names for the results in this table */ List<String> columnNames = null; /** * Constructor * * @param results - * A JDBC ResultSet */ TableRowIterator(ResultSet results) { this(results, null); statemt = null; } /** * Constructor * * @param results - * A JDBC ResultSet * @param table - * The name of the table */ TableRowIterator(ResultSet results, String table) { this(results, table, null); statemt = null; } TableRowIterator(ResultSet results, String table, List<String> columnNames) { this.results = results; this.table = table; if (columnNames == null) { try { this.columnNames = (table == null) ? DatabaseManager.getColumnNames(results.getMetaData()) : DatabaseManager.getColumnNames(table); } catch (SQLException e) { this.columnNames = null; } } else { this.columnNames = Collections.unmodifiableList(columnNames); } statemt = null; } /** * Finalize -- this method is called when this object is GC-ed. */ protected void finalize() throws Throwable { close(); super.finalize(); } /** * setStatement -- this method saves the statement used to do the query. We * must keep this so that the statement can be closed when we are finished. * * @param st - * The statement used to do the query that created this * TableRowIterator */ public void setStatement(Statement st) { statemt = st; } /** * Advance to the next row and return it. Returns null if there are no more * rows. * * @return - The next row, or null if no more rows * @exception SQLException - * If a database error occurs while fetching values */ public TableRow next() throws SQLException { if (results == null) { return null; } if (!hasNext()) { return null; } hasAdvanced = false; return DatabaseManager.process(results, table, columnNames); } /** * Return true if there are more rows, false otherwise * * @return - true if there are more rows, false otherwise * @exception SQLException - * If a database error occurs while fetching values */ public boolean hasNext() throws SQLException { if (results == null) { close(); return false; } if (hasAdvanced) { return hasNext; } hasAdvanced = true; hasNext = results.next(); // No more results if (!hasNext) { close(); } return hasNext; } /** * Saves all the values returned by iterator into a list. * * As a side effect the result set is closed and no more * operations can be performed on this object. * * @return - A list of all the values returned by the iterator. * @exception SQLException - * If a database error occurs while fetching values */ public List<TableRow> toList() throws SQLException { List<TableRow> resultsList = new ArrayList<TableRow>(); try { while (hasNext()) { resultsList.add(next()); } } finally { // Close the connection after converting it to a list. this.close(); } return resultsList; } /** * Close the Iterator and release any associated resources */ public void close() { try { if (results != null) { results.close(); results = null; } } catch (SQLException sqle) { } // try to close the statement if we have one try { if (statemt != null) { statemt.close(); statemt = null; } } catch (SQLException sqle) { } columnNames = null; } }