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
19a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringertimport android.os.ParcelFileDescriptor;
20cfda9f3a4756c71b3aadd1387419cb3b513dd400Brad Fitzpatrick
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
22e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Represents a statement that can be executed against a database.  The statement
23e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * cannot return multiple rows or columns, but single value (1 x 1) result sets
24e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * are supported.
25e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * <p>
26e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * This class is not thread-safe.
27e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * </p>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
29e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brownpublic final class SQLiteStatement extends SQLiteProgram {
30e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown    SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) {
3175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        super(db, sql, bindArgs, null);
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     * Execute this SQL statement, if it is not a SELECT / INSERT / DELETE / UPDATE, for example
36fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     * CREATE / DROP table, view, trigger, index etc.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.SQLException If the SQL string is invalid for
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         some reason
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void execute() {
42e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
43e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        try {
4475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            getSession().execute(getSql(), getBindArgs(), getConnectionFlags(), null);
45e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
46e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
47e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
48e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } finally {
49e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
50e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        }
51fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori    }
52fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori
53fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori    /**
544e874edf69ce9900eb847629dc4d3616972a3468Vasu Nori     * Execute this SQL statement, if the the number of rows affected by execution of this SQL
55fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     * statement is of any importance to the caller - for example, UPDATE / DELETE SQL statements.
56fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     *
57fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     * @return the number of rows affected by this SQL statement execution.
58fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     * @throws android.database.SQLException If the SQL string is invalid for
59fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     *         some reason
60fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori     */
61fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori    public int executeUpdateDelete() {
62e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
632467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        try {
64e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            return getSession().executeForChangedRowCount(
6575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    getSql(), getBindArgs(), getConnectionFlags(), null);
66e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
67e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
68e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
692467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        } finally {
70e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
755bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * Execute this SQL statement and return the ID of the row inserted due to this call.
765bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * The SQL statement should be an INSERT for this to be a useful call.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
785bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.SQLException If the SQL string is invalid for
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         some reason
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long executeInsert() {
84e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
852467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        try {
86e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            return getSession().executeForLastInsertedRowId(
8775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    getSql(), getBindArgs(), getConnectionFlags(), null);
88e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
89e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
90e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
912467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        } finally {
92e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a statement that returns a 1 by 1 table with a numeric value.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, SELECT COUNT(*) FROM table;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The result of the query.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long simpleQueryForLong() {
105e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
1062467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        try {
107e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            return getSession().executeForLong(
10875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    getSql(), getBindArgs(), getConnectionFlags(), null);
109e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
110e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
111e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
1122467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        } finally {
113e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a statement that returns a 1 by 1 table with a text value.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, SELECT COUNT(*) FROM table;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The result of the query.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String simpleQueryForString() {
126e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
1272467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        try {
128e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            return getSession().executeForString(
12975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    getSql(), getBindArgs(), getConnectionFlags(), null);
130e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
131e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
132e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
1332467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        } finally {
134e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
1357501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori        }
1367501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori    }
1377501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori
1387501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori    /**
139a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     * Executes a statement that returns a 1 by 1 table with a blob value.
140a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     *
141a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     * @return A read-only file descriptor for a copy of the blob value, or {@code null}
142a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     *         if the value is null or could not be read for some reason.
143a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     *
144a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
145a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert     */
146a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert    public ParcelFileDescriptor simpleQueryForBlobFileDescriptor() {
147e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        acquireReference();
1482467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        try {
149e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            return getSession().executeForBlobFileDescriptor(
15075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    getSql(), getBindArgs(), getConnectionFlags(), null);
151e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        } catch (SQLiteDatabaseCorruptException ex) {
152e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            onCorruption();
153e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            throw ex;
1542467561ac2c7de870417e0405a138c857c9d5629Vasu Nori        } finally {
155e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown            releaseReference();
156ce38b98feb1e7c9c1799eb270c40798d833aa9aeVasu Nori        }
1577501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori    }
1587501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori
159e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown    @Override
160e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown    public String toString() {
161e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown        return "SQLiteProgram: " + getSql();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
164