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