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;
6e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz
7320946cbbc34c5db5a856eb5581b5e3280c2c5f3Chris Van Vrankenimport java.sql.Clob;
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
720b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    public final boolean moveToLast() {
730b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham        return super.moveToLast();
740b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    }
750b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham
760b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    @Implementation
770b1cf2dae9f688eaf17eee6ba853ebf5f9b21689adriancowham    @Override
78b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public final boolean moveToFirst() {
793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return super.moveToFirst();
80b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
81b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
82b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Implementation
83b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    @Override
84b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public boolean moveToNext() {
853f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken        return super.moveToNext();
863f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    }
873f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken
883f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    @Implementation
893f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken    @Override
90415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    public boolean moveToPrevious() {
91415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi        return super.moveToPrevious();
92415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    }
93415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi
94415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    @Implementation
95415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi    @Override
965c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    public boolean moveToPosition(int pos) {
975c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    	return super.moveToPosition(pos);
985c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi    }
99b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
1003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public byte[] getBlob(int columnIndex) {
102b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
103b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return (byte[]) this.currentRow.get(getColumnNames()[columnIndex]);
104b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    }
105b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi
1063f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
107b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public String getString(int columnIndex) {
108b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        checkPosition();
109b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        Object value = this.currentRow.get(getColumnNames()[columnIndex]);
110320946cbbc34c5db5a856eb5581b5e3280c2c5f3Chris Van Vranken        if (value instanceof Clob) {
111b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            try {
112320946cbbc34c5db5a856eb5581b5e3280c2c5f3Chris Van Vranken                return ((Clob) value).getSubString(1, (int)((Clob) value).length());
113b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            } catch (SQLException x) {
114b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala                throw new RuntimeException(x);
115b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            }
116b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        } else {
117b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala            return (String)value;
118b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        }
1193f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
120b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
121b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	@Implementation
122b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	public short getShort(int columnIndex) {
123b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken		checkPosition();
1246a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken		Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1256a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1266a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Short(o.toString());
127b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken	}
128b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
1293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
130b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public int getInt(int columnIndex) {
131b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1326a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1336a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1346a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Integer(o.toString());
1353f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1363f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
138b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi    public long getLong(int columnIndex) {
139b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1406a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1416a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1426a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Long(o.toString());
1433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1453f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public float getFloat(int columnIndex) {
147b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1486a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1496a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1506a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken        return new Float(o.toString());
1516a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken
1523f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public double getDouble(int columnIndex) {
156b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	checkPosition();
1576a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	Object o =this.currentRow.get(getColumnNames()[columnIndex]);
1586a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	if (o==null) return 0;
1596a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken    	return new Double(o.toString());
160b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
161b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
162b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private void checkPosition() {
1631089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken        if (-1 == currentRowNumber || getCount() == currentRowNumber) {
1641089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken            throw new IndexOutOfBoundsException(currentRowNumber + " " + getCount());
1653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public void close() {
1703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet == null) {
1713f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            return;
1723f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        try {
1753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet.close();
1763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            resultSet = null;
177b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            rows = null;
178b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken            currentRow = null;
1793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        } catch (SQLException e) {
1803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz            throw new RuntimeException("SQL exception in close", e);
1813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
1823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1853f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isClosed() {
1863f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return (resultSet == null);
1873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    @Implementation
1903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public boolean isNull(int columnIndex) {
191b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        Object o = this.currentRow.get(getColumnNames()[columnIndex]);
192b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        return o == null;
1933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
1943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz
1953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    /**
1963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * Allows test cases access to the underlying JDBC ResultSet, for use in
197b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     * assertions.
198b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi     *
1993f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     * @return the result set
2003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz     */
2013f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    public ResultSet getResultSet() {
2023f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        return resultSet;
2033f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
204bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
205bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    /**
206bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * Allows test cases access to the underlying JDBC ResultSetMetaData, for use in
207bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * assertions. Available even if cl
208bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     *
209bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     * @return the result set
210bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken     */
211bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    public ResultSet getResultSetMetaData() {
212bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        return resultSet;
213b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
214b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken
215b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    /**
216b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * loads a row's values
217b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @param rs
218b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @return
219b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     * @throws SQLException
220b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken     */
221b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private Map<String,Object> fillRowValues(ResultSet rs) throws SQLException {
222b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	Map<String,Object> row = new HashMap<String,Object>();
223b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	for (String s : getColumnNames()) {
224b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken			  row.put(s, rs.getObject(s));
225b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	}
226b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    	return row;
227b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    }
228b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken    private void fillRows(String sql, Connection connection) throws SQLException {
229a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    	//ResultSets in SQLite\Android are only TYPE_FORWARD_ONLY. Android caches results in the WindowedCursor to allow moveToPrevious() to function.
230a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken    	//Robolectric will have to cache the results too. In the rows map.
231bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    	Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
232bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        ResultSet rs = statement.executeQuery(sql);
233bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        int count = 0;
234b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        if (rs.next()) {
235b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        	     do {
236b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        	    	Map<String,Object> row = fillRowValues(rs);
237b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken         	    	rows.put(count, row);
238a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        	    	count++;
239bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	     } while (rs.next());
240bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 } else {
241a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken        		 rs.close();
242bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	 }
243bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
244bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        rowCount = count;
245bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
246bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken    }
247bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken
2483c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken    public void setResultSet(ResultSet result, String sql) {
2493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        this.resultSet = result;
2503f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        rowCount = 0;
2516b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken
252b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken        //Cache all rows.  Caching rows should be thought of as a simple replacement for ShadowCursorWindow
2533f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        if (resultSet != null) {
254bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	cacheColumnNames(resultSet);
255bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken        	try {
256b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala        		fillRows(sql, result.getStatement().getConnection());
257bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			} catch (SQLException e) {
258bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			    throw new RuntimeException("SQL exception in setResultSet", e);
259bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken			}
2603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz        }
2613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz    }
262b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi}
263