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