19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.database.sqlite; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.CursorWindow; 20a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.CancellationSignal; 21a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.OperationCanceledException; 22b18f27dbf43ee9028a11cafbca23d3fa318e278bVasu Noriimport android.util.Log; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 25e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Represents a query that reads the resulting rows into a {@link SQLiteQuery}. 26e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * This class is used by {@link SQLiteCursor} and isn't useful itself. 27e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * <p> 28e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * This class is not thread-safe. 29e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * </p> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31d5064be3b5922ee6522a33f8b729ffee2e3d7b4bJeff Brownpublic final class SQLiteQuery extends SQLiteProgram { 320732f7912ccec9a1cc379b535ac0b56ae50972b3Vasu Nori private static final String TAG = "SQLiteQuery"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 344c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown private final CancellationSignal mCancellationSignal; 3575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 364c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown SQLiteQuery(SQLiteDatabase db, String query, CancellationSignal cancellationSignal) { 374c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown super(db, query, null, cancellationSignal); 3875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 394c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mCancellationSignal = cancellationSignal; 4065a8883f0e605bb8a73a692987b47ce5da632e72Vasu Nori } 4165a8883f0e605bb8a73a692987b47ce5da632e72Vasu Nori 4265a8883f0e605bb8a73a692987b47ce5da632e72Vasu Nori /** 43e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Reads rows into a buffer. 44722802e76b8805da523a612ad3482450fd327db0Brad Fitzpatrick * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param window The window to fill into 46650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * @param startPos The start position for filling the window. 47650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * @param requiredPos The position of a row that MUST be in the window. 48650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * If it won't fit, then the query should discard part of what it filled. 49650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * @param countAllRows True to count all rows that the query would 50650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * return regardless of whether they fit in the window. 51650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * @return Number of rows that were enumerated. Might not be all rows 52650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown * unless countAllRows is true. 5375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown * 5475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown * @throws SQLiteException if an error occurs. 5575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown * @throws OperationCanceledException if the operation was canceled. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 57e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown int fillWindow(CursorWindow window, int startPos, int requiredPos, boolean countAllRows) { 58e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 60e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown window.acquireReference(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown int numRows = getSession().executeForCursorWindow(getSql(), getBindArgs(), 6375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown window, startPos, requiredPos, countAllRows, getConnectionFlags(), 644c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mCancellationSignal); 65e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return numRows; 66e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 67e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 68e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 69e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteException ex) { 70e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown Log.e(TAG, "exception: " + ex.getMessage() + "; query: " + getSql()); 71e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 73722802e76b8805da523a612ad3482450fd327db0Brad Fitzpatrick window.releaseReference(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseReference(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 797ce745248d4de0e6543a559c93423df899832100Jeff Brown 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 82e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return "SQLiteQuery: " + getSql(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 85