ShadowSQLiteCursor.java revision b0b6ef0508aac9638763141f2f23c79482b1ead2
1b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipackage com.xtremelabs.robolectric.shadows;
2b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
3e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport android.database.sqlite.SQLiteCursor;
4e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport com.xtremelabs.robolectric.internal.Implementation;
5e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport com.xtremelabs.robolectric.internal.Implements;
6b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport org.h2.jdbc.JdbcClob;
7e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
8bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Connection;
93f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSet;
103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSetMetaData;
113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.SQLException;
12bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Statement;
13b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vrankenimport java.util.HashMap;
14b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vrankenimport java.util.Map;
15b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
16132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi/**
17132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi * Simulates an Android Cursor object, by wrapping a JDBC ResultSet.
18132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi */
19b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi@Implements(SQLiteCursor.class)
20b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipublic class ShadowSQLiteCursor extends ShadowAbstractCursor {
21b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    private ResultSet resultSet;
23b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
2423c888fc3422c493d25dab19a0842dc591243096Chris Van Vranken
25bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    /**
26bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * Stores the column names so they are retrievable after the resultSet has closed
27bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     */
28bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    private void cacheColumnNames(ResultSet rs) {
29bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	try {
30bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            ResultSetMetaData metaData = rs.getMetaData();
31b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            int columnCount = metaData.getColumnCount();
32b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            columnNameArray = new String[columnCount];
333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
342e4dd19a1a59a2489c76d8ac359b4ab52027e509Chris Van Vranken                String cName = metaData.getColumnName(columnIndex).toLowerCase();
352e4dd19a1a59a2489c76d8ac359b4ab52027e509Chris Van Vranken                this.columnNames.put(cName, columnIndex-1);
36b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken                this.columnNameArray[columnIndex-1]=cName;
373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            }
383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
39bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken            throw new RuntimeException("SQL exception in cacheColumnNames", e);
403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
413f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
42bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
43b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
45b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
46b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private Integer getColIndex(String columnName) {
473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (columnName == null) {
483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return -1;
493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
5055fc1ea619eb28eec3a75c5efaf0d75bed8c9f13Chris Van Vranken
5155fc1ea619eb28eec3a75c5efaf0d75bed8c9f13Chris Van Vranken        Integer i  = this.columnNames.get(columnName.toLowerCase());
52b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        if (i==null) return -1;
53b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return i;
54b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
55b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
56b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    @Implementation
57b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    public int getColumnIndex(String columnName) {
58b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	return getColIndex(columnName);
593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public int getColumnIndexOrThrow(String columnName) {
63b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	Integer columnIndex = getColIndex(columnName);
643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (columnIndex == -1) {
653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new IllegalArgumentException("Column index does not exist");
663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return columnIndex;
683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
70b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Implementation
71b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Override
72b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public final boolean moveToFirst() {
733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return super.moveToFirst();
74b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
75b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
76b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Implementation
77b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Override
78b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public boolean moveToNext() {
793f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken        return super.moveToNext();
803f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    }
813f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken
823f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    @Implementation
833f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    @Override
84415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    public boolean moveToPrevious() {
85415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi        return super.moveToPrevious();
86415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    }
87415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi
88415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    @Implementation
89415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    @Override
905c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    public boolean moveToPosition(int pos) {
915c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    	return super.moveToPosition(pos);
925c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    }
93b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public byte[] getBlob(int columnIndex) {
96b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
97b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return (byte[]) this.currentRow.get(getColumnNames()[columnIndex]);
98b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
99b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
1003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
101b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public String getString(int columnIndex) {
102b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        checkPosition();
103b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        Object value = this.currentRow.get(getColumnNames()[columnIndex]);
104b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        if (value instanceof JdbcClob) {
105b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            try {
106b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala                return ((JdbcClob) value).getSubString(1, (int)((JdbcClob) value).length());
107b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            } catch (SQLException x) {
108b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala                throw new RuntimeException(x);
109b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            }
110b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        } else {
111b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            return (String)value;
112b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        }
1133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
114b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
115b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	@Implementation
116b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	public short getShort(int columnIndex) {
117b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken		checkPosition();
1186a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken		Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1196a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1206a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Short(o.toString());
121b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	}
122b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
1233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
124b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public int getInt(int columnIndex) {
125b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1266a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1276a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1286a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Integer(o.toString());
1293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1303f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1313f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
132b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public long getLong(int columnIndex) {
133b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1346a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1356a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1366a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Long(o.toString());
1373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public float getFloat(int columnIndex) {
141b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1426a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1436a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1446a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Float(o.toString());
1456a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken
1463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public double getDouble(int columnIndex) {
150b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1516a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1526a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1536a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	return new Double(o.toString());
154b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
155b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
156b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private void checkPosition() {
1571089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken        if (-1 == currentRowNumber || getCount() == currentRowNumber) {
1581089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken            throw new IndexOutOfBoundsException(currentRowNumber + " " + getCount());
1593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public void close() {
1643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet == null) {
1653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return;
1663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet.close();
1703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet = null;
171b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            rows = null;
172b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            currentRow = null;
1733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in close", e);
1753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1773f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1783f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isClosed() {
1803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return (resultSet == null);
1813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isNull(int columnIndex) {
185b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        Object o = this.currentRow.get(getColumnNames()[columnIndex]);
186b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return o == null;
1873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    /**
1903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * Allows test cases access to the underlying JDBC ResultSet, for use in
191b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     * assertions.
192b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     *
1933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * @return the result set
1943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     */
1953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public ResultSet getResultSet() {
1963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return resultSet;
1973f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
198bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
199bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    /**
200bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * Allows test cases access to the underlying JDBC ResultSetMetaData, for use in
201bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * assertions. Available even if cl
202bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     *
203bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * @return the result set
204bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     */
205bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    public ResultSet getResultSetMetaData() {
206bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        return resultSet;
207b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
208b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
209b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    /**
210b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * loads a row's values
211b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @param rs
212b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @return
213b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @throws SQLException
214b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     */
215b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private Map<String,Object> fillRowValues(ResultSet rs) throws SQLException {
216b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	Map<String,Object> row = new HashMap<String,Object>();
217b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	for (String s : getColumnNames()) {
218b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken			  row.put(s, rs.getObject(s));
219b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	}
220b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	return row;
221b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
222b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private void fillRows(String sql, Connection connection) throws SQLException {
223a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    	//ResultSets in SQLite\Android are only TYPE_FORWARD_ONLY. Android caches results in the WindowedCursor to allow moveToPrevious() to function.
224a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    	//Robolectric will have to cache the results too. In the rows map.
225bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
226bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        ResultSet rs = statement.executeQuery(sql);
227bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        int count = 0;
228b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        if (rs.next()) {
229b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        	     do {
230b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        	    	Map<String,Object> row = fillRowValues(rs);
231b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken         	    	rows.put(count, row);
232a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        	    	count++;
233bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	     } while (rs.next());
234bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 } else {
235a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        		 rs.close();
236bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 }
237bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
238bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        rowCount = count;
239bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
240bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    }
241bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
2423c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    public void setResultSet(ResultSet result, String sql) {
2433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        this.resultSet = result;
2443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        rowCount = 0;
2456b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken
246b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        //Cache all rows.  Caching rows should be thought of as a simple replacement for ShadowCursorWindow
2473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet != null) {
248bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	cacheColumnNames(resultSet);
249bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	try {
250b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        		fillRows(sql, result.getStatement().getConnection());
251bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			} catch (SQLException e) {
252bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			    throw new RuntimeException("SQL exception in setResultSet", e);
253bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			}
2543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
2553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
256b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi}
257