Home | History | Annotate | Download | only in sqlite
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.database.sqlite;
     18 
     19 import android.database.CursorWindow;
     20 import android.os.CancellationSignal;
     21 import android.os.OperationCanceledException;
     22 import android.util.Log;
     23 
     24 /**
     25  * Represents a query that reads the resulting rows into a {@link SQLiteQuery}.
     26  * This class is used by {@link SQLiteCursor} and isn't useful itself.
     27  * <p>
     28  * This class is not thread-safe.
     29  * </p>
     30  */
     31 public final class SQLiteQuery extends SQLiteProgram {
     32     private static final String TAG = "SQLiteQuery";
     33 
     34     private final CancellationSignal mCancellationSignal;
     35 
     36     SQLiteQuery(SQLiteDatabase db, String query, CancellationSignal cancellationSignal) {
     37         super(db, query, null, cancellationSignal);
     38 
     39         mCancellationSignal = cancellationSignal;
     40     }
     41 
     42     /**
     43      * Reads rows into a buffer.
     44      *
     45      * @param window The window to fill into
     46      * @param startPos The start position for filling the window.
     47      * @param requiredPos The position of a row that MUST be in the window.
     48      * If it won't fit, then the query should discard part of what it filled.
     49      * @param countAllRows True to count all rows that the query would
     50      * return regardless of whether they fit in the window.
     51      * @return Number of rows that were enumerated.  Might not be all rows
     52      * unless countAllRows is true.
     53      *
     54      * @throws SQLiteException if an error occurs.
     55      * @throws OperationCanceledException if the operation was canceled.
     56      */
     57     int fillWindow(CursorWindow window, int startPos, int requiredPos, boolean countAllRows) {
     58         acquireReference();
     59         try {
     60             window.acquireReference();
     61             try {
     62                 int numRows = getSession().executeForCursorWindow(getSql(), getBindArgs(),
     63                         window, startPos, requiredPos, countAllRows, getConnectionFlags(),
     64                         mCancellationSignal);
     65                 return numRows;
     66             } catch (SQLiteDatabaseCorruptException ex) {
     67                 onCorruption();
     68                 throw ex;
     69             } catch (SQLiteException ex) {
     70                 Log.e(TAG, "exception: " + ex.getMessage() + "; query: " + getSql());
     71                 throw ex;
     72             } finally {
     73                 window.releaseReference();
     74             }
     75         } finally {
     76             releaseReference();
     77         }
     78     }
     79 
     80     @Override
     81     public String toString() {
     82         return "SQLiteQuery: " + getSql();
     83     }
     84 }
     85