19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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
19c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Noriimport java.util.ArrayList;
20c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
21c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintanaimport android.util.Log;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provides debugging info about all SQLite databases running in the current process.
254dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori *
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class SQLiteDebug {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Controls the printing of SQL statements as they are executed.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana    public static final boolean DEBUG_SQL_STATEMENTS =
33c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana            Log.isLoggable("SQLiteStatements", Log.VERBOSE);
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
363ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori     * Controls the printing of wall-clock time taken to execute SQL statements
373ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori     * as they are executed.
385a03f36ef845f73eb4473193dbb0f93dd12a51afVasu Nori     */
393ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori    public static final boolean DEBUG_SQL_TIME =
403ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori            Log.isLoggable("SQLiteTime", Log.VERBOSE);
415a03f36ef845f73eb4473193dbb0f93dd12a51afVasu Nori
425a03f36ef845f73eb4473193dbb0f93dd12a51afVasu Nori    /**
433ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori     * Controls the printing of compiled-sql-statement cache stats.
444dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori     */
453ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori    public static final boolean DEBUG_SQL_CACHE =
463ef94e25b4c896ecaa85aa2c12b8863ecdf98df0Vasu Nori            Log.isLoggable("SQLiteCompiledSql", Log.VERBOSE);
474dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori
484dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Controls the stack trace reporting of active cursors being
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finalized.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana    public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION =
53c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana            Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
564dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori     * Controls the tracking of time spent holding the database lock.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
58c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana    public static final boolean DEBUG_LOCK_TIME_TRACKING =
59c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana            Log.isLoggable("SQLiteLockTime", Log.VERBOSE);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
624dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori     * Controls the printing of stack traces when tracking the time spent holding the database lock.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
64c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana    public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE =
65c4516a7b62de525e3d6d5e76851bdfaf12c11f05Fred Quintana            Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains statistics about the active pagers in the current process.
694dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori     *
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPagerStats(PagerStats)
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PagerStats {
73c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** The total number of bytes in all pagers in the current process
74c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * @deprecated not used any longer
75c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
76c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        @Deprecated
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long totalBytes;
78c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** The number of bytes in referenced pages in all pagers in the current process
79c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * @deprecated not used any longer
80c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * */
81c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        @Deprecated
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long referencedBytes;
83c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** The number of bytes in all database files opened in the current process
84c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * @deprecated not used any longer
85c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
86c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        @Deprecated
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long databaseBytes;
88c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** The number of pagers opened in the current process
89c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * @deprecated not used any longer
90c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
91c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        @Deprecated
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int numPagers;
93c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
94c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** the current amount of memory checked out by sqlite using sqlite3_malloc().
95c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
96c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
97c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public int memoryUsed;
98c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
99c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** the number of bytes of page cache allocation which could not be sattisfied by the
100c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * SQLITE_CONFIG_PAGECACHE buffer and where forced to overflow to sqlite3_malloc().
101c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * The returned value includes allocations that overflowed because they where too large
102c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * (they were larger than the "sz" parameter to SQLITE_CONFIG_PAGECACHE) and allocations
103c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * that overflowed because no space was left in the page cache.
104c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
105c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
106c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public int pageCacheOverflo;
107c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
108c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** records the largest memory allocation request handed to sqlite3.
109c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
110c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
111c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public int largestMemAlloc;
112c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
113c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** a list of {@link DbStats} - one for each main database opened by the applications
114c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         * running on the android device
115c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori         */
116c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public ArrayList<DbStats> dbStats;
117c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    }
118c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
119c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    /**
120c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori     * contains statistics about a database
121c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori     */
122c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    public static class DbStats {
123c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** name of the database */
124c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public String dbName;
125c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
126c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** the page size for the database */
127c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public long pageSize;
128c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
129c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** the database size */
130c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public long dbSize;
131c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
132c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        /** documented here http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html */
133c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public int lookaside;
134c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
135c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        public DbStats(String dbName, long pageCount, long pageSize, int lookaside) {
136c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori            this.dbName = dbName;
1379540a8d320d14b75203d9cc4ca65638fd06a94fbVasu Nori            this.pageSize = pageSize / 1024;
138c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori            dbSize = (pageCount * pageSize) / 1024;
139c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori            this.lookaside = lookaside;
140c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        }
141c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    }
142c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori
143c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    /**
144c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori     * return all pager and database stats for the current process.
145c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori     * @return {@link PagerStats}
146c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori     */
147c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori    public static PagerStats getDatabaseInfo() {
148c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        PagerStats stats = new PagerStats();
149c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        getPagerStats(stats);
150c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        stats.dbStats = SQLiteDatabase.getDbStats();
151c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori        return stats;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gathers statistics about all pagers in the current process.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native void getPagerStats(PagerStats stats);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the size of the SQLite heap.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The size of the SQLite heap in bytes.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native long getHeapSize();
1644dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the amount of allocated memory in the SQLite heap.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The allocated size in bytes.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native long getHeapAllocatedSize();
1704dd4ab4cc322e82401f380aeb877daa4a20d7069Vasu Nori
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the amount of free memory in the SQLite heap.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The freed size in bytes.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native long getHeapFreeSize();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determines the number of dirty belonging to the SQLite
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * heap segments of this process.  pages[0] returns the number of
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * shared pages, pages[1] returns the number of private pages
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native void getHeapDirtyPages(int[] pages);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int sNumActiveCursorsFinalized = 0;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of active cursors that have been finalized. This depends on the GC having
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * run but is still useful for tests.
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getNumActiveCursorsFinalized() {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sNumActiveCursorsFinalized;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static synchronized void notifyActiveCursorFinalized() {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sNumActiveCursorsFinalized++;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
198