001 package hep.aida.ref.sql;
002
003 // FreeHEP
004 import hep.aida.ref.tuple.FTupleCursor;
005
006 // Log4J
007 import org.apache.log4j.Logger;
008
009 /** <code>SQLTupleCursor</code> extends {@link FTupleCursor}
010 * with SQL backend.
011 * <p><font color="#880088">
012 * <pre>
013 * $Log: SQLTupleCursor.java,v $
014 * Revision 1.7 2007/05/23 16:38:44 hrivnac
015 * logical connections for Plotter; better UML
016 *
017 * Revision 1.6 2005/09/02 14:10:31 hrivnac
018 * moved to JAS3 0.8.2
019 *
020 * Revision 1.5 2004/10/29 22:27:25 hrivnac
021 * imports corrected
022 *
023 * Revision 1.4 2004/10/12 19:26:59 hrivnac
024 * MySQL Connector 3.0.14
025 *
026 * Revision 1.3 2004/05/22 15:12:59 hrivnac
027 * class id reformated
028 *
029 * Revision 1.2 2004/05/04 08:50:33 hrivnac
030 * can run with JAS3
031 *
032 * Revision 1.1 2004/05/03 19:22:30 hrivnac
033 * basic support for JAS3
034 *
035 * </pre>
036 * </font></p>
037 * @opt attributes
038 * @opt operations
039 * @opt types
040 * @opt visibility
041 * @version $Id: SQLTupleCursor.java,v 1.7 2007/05/23 16:38:44 hrivnac Exp $
042 * @author <a href="mailto:Julius.Hrivnac@cern.ch">J.Hrivnac</a> */
043 public class SQLTupleCursor implements FTupleCursor {
044
045 /** Create with reference to {@link SQLTuple}.
046 * @param tuple The {@link SQLTuple} containing requested column. */
047 public SQLTupleCursor(SQLTuple tuple) {
048 _tuple = tuple;
049 _closed = false;
050 }
051
052 /** Give the current row number
053 * @return The current row number, or -1 if before the first row. */
054 public int row() throws IllegalStateException {
055 if (_closed) throw new IllegalStateException("Cursor is closed");
056 return _tuple.row();
057 }
058
059 /** Rewind the Cursor to before the first row. */
060 public void start() throws IllegalStateException {
061 if (_closed) throw new IllegalStateException("Cursor is closed");
062 _tuple.start();
063 }
064
065 /** Step to the next row.
066 * @return False if there are no more rows. */
067 public boolean next() throws IllegalStateException {
068 if (_closed) throw new IllegalStateException("Cursor is closed");
069 return _tuple.next();
070 }
071
072 /** Skips rows.
073 * @param rows The number of rows to skip, greater than 0. */
074 public void skip(int rows) throws IllegalStateException {
075 if (_closed) throw new IllegalStateException("Cursor is closed");
076 _tuple.skip(rows);
077 }
078
079 /** Step to a specific row.
080 * @param n The row to move to.
081 * @throws IndexOutOfBoundsException if the index is < 0 or >= number of rows.
082 * @throws UnsupportedOperationException if the Tuple does not support random access. */
083 public void setRow(int n) throws IllegalStateException {
084 if (_closed) throw new IllegalStateException("Cursor is closed");
085 if (n < 0 || n >= _tuple.rows()) throw new IllegalStateException("Requested row " + n + " isn't within available rows < 0, " + _tuple.rows() + ")");
086 _tuple.setRow(n);
087 }
088
089 /** Close this cursor. Any further attempts to use the cursor will result in
090 * an {@link IllegalStateException}. */
091 public void close() {
092 _closed = true;
093 }
094
095 private SQLTuple _tuple;
096
097 private boolean _closed;
098
099 /** Logging . */
100 private static Logger log = Logger.getLogger(SQLTupleCursor.class);
101
102 }