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