ShadowSQLiteCursor.java revision 3c12685104bc2899a199fbb057ca5d58d171cdf1
1b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipackage com.xtremelabs.robolectric.shadows;
2b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
3b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesiimport android.database.sqlite.SQLiteCursor;
422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
63f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
7bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Connection;
83f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSet;
93f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSetMetaData;
103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.SQLException;
11bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Statement;
12b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
13132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi/**
14132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi * Simulates an Android Cursor object, by wrapping a JDBC ResultSet.
15132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi */
16b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi@Implements(SQLiteCursor.class)
17b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipublic class ShadowSQLiteCursor extends ShadowAbstractCursor {
18b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
193f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    private ResultSet resultSet;
20bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    String[] columnNames;
213f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    private int rowCount;
223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
24b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public int getCount() {
25bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
26b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi        return rowCount;
27b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
29bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    /**
30bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * Stores the column names so they are retrievable after the resultSet has closed
31bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     */
32bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    private void cacheColumnNames(ResultSet rs) {
33bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	try {
34bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            ResultSetMetaData metaData = rs.getMetaData();
35bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            String[] colNames = new String[metaData.getColumnCount()];
363f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            int columnCount = metaData.getColumnCount();
373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
382d5bab29e309152e1ffaf74b8a8f47d2f1dffac1Chris Van Vranken                colNames[columnIndex - 1] = metaData.getColumnName(columnIndex);
393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            }
40bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            this.columnNames = colNames;
413f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
42bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            throw new RuntimeException("SQL exception in cacheColumnNames", e);
433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
45bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
46bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    @Implementation
47bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    public String[] getColumnNames() {
48bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	return columnNames;
49bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    }
503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
513f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public int getColumnIndex(String columnName) {
533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (columnName == null) {
543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return -1;
553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
563f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
573f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        String[] columnNames = getColumnNames();
583f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        for (int columnIndex = 0; columnIndex < columnNames.length; columnIndex++) {
593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            if (columnNames[columnIndex].equalsIgnoreCase(columnName)) {
603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz                return columnIndex;
613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            }
623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return -1;
653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public int getColumnIndexOrThrow(String columnName) {
693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        int columnIndex = getColumnIndex(columnName);
703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (columnIndex == -1) {
713f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new IllegalArgumentException("Column index does not exist");
723f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return columnIndex;
743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
76b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Implementation
77b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Override
78b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public final boolean moveToFirst() {
79bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	boolean result = false;
80bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	if (resultSet==null) return false;
813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
82bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	if(resultSet.isBeforeFirst()) {
83bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken                result = resultSet.next();
84bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	} else if (resultSet.isFirst()) {
85bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        		result = true;
86bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	} else {
87bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        		result = false;
88bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	}
893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in moveToFirst", e);
913f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
92bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        if (result=true) super.moveToFirst();
93bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        return result;
94b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
95b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
96b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Implementation
97b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Override
98b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public boolean moveToNext() {
99bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	if (resultSet==null) return false;
1003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet.next();
1023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in moveToNext", e);
1043f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1053f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return super.moveToNext();
1063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1075c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi
1085c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    @Implementation
1095c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    @Override
1105c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    public boolean moveToPosition(int pos) {
1113c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    	int plusone = pos+1;
1125c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    	try {
1133c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    		if (plusone<resultSet.getRow()) throw new RuntimeException("Cannot moveToPosition(" + pos + "), cursor is TYPE_FORWARD_ONLY, and current position is beyond that.");
1143c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    		while(plusone>resultSet.getRow())
1153c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    		resultSet.next();
1165c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    	} catch (SQLException e) {
1175c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi            throw new RuntimeException("SQL exception in moveToPosition", e);
1185c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi        }
1195c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    	return super.moveToPosition(pos);
1205c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    }
121b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
1223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public byte[] getBlob(int columnIndex) {
124b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi        try {
1253f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getBytes(columnIndex + 1);
1263f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1273f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getBlob", e);
1283f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
129b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
130b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
1313f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
132b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public String getString(int columnIndex) {
1333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1343f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getString(columnIndex + 1);
1353f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1363f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getString", e);
1373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
141b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public int getInt(int columnIndex) {
1423f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getInt(columnIndex + 1);
1443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1453f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getInt", e);
1463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
150b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public long getLong(int columnIndex) {
1513f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getLong(columnIndex + 1);
1533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getLong", e);
1553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1563f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1573f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1583f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public float getFloat(int columnIndex) {
1603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getFloat(columnIndex + 1);
1623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getFloat", e);
1643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public double getDouble(int columnIndex) {
1693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return resultSet.getDouble(columnIndex + 1);
1713f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1723f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in getDouble", e);
1733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1773f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public void close() {
1783f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet == null) {
1793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return;
1803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet.close();
1843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet = null;
1853f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1863f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in close", e);
1873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1913f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isClosed() {
1923f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return (resultSet == null);
1933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isNull(int columnIndex) {
1973f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1986b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken            Object o = resultSet.getObject(columnIndex + 1);
1996b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken            return o == null;
2003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
2016b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken            throw new RuntimeException("SQL exception in isNull", e);
2023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
2033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
2043f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
2053f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    /**
2063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * Allows test cases access to the underlying JDBC ResultSet, for use in
207b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     * assertions.
208b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     *
2093f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * @return the result set
2103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     */
2113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public ResultSet getResultSet() {
2123f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return resultSet;
2133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
214bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
215bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    /**
216bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * Allows test cases access to the underlying JDBC ResultSetMetaData, for use in
217bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * assertions. Available even if cl
218bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     *
219bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * @return the result set
220bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     */
221bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    public ResultSet getResultSetMetaData() {
222bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        return resultSet;
223bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    }
2243f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
225bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    private void setRowCount(String sql, Connection connection) throws SQLException {
226bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
227bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        ResultSet rs = statement.executeQuery(sql);
228bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        int count = 0;
229bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
230bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken         if (rs.next()) {
231bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	         // here you know that there is at least one record
232bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	    do {
233bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	    	count++;   // here you do whatever needs to be done for each record. Note that it will be called for the first record.
234bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	     } while (rs.next());
235bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 } else {
236bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        		 rs.close();
237bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	   this.close();  // here you do whatever needs to be done when there is no record
238bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 }
239bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
240bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        rowCount = count;
241bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
242bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    }
243bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
2443c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    public void setResultSet(ResultSet result, String sql) {
2453f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        this.resultSet = result;
2463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        rowCount = 0;
2476b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken
2483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        // Cache count up front, since computing result count in JDBC
2493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        // is destructive to cursor position.
2503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet != null) {
251bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	cacheColumnNames(resultSet);
252bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	try {
2533c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken        		setRowCount(sql,result.getStatement().getConnection());
254bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			} catch (SQLException e) {
255bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			    throw new RuntimeException("SQL exception in setResultSet", e);
256bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			}
2573f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
2583f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
259b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi}
260