1 /* 2 * Copyright (C) 2007 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 java.util.ArrayList; 20 21 import android.util.Log; 22 23 /** 24 * Provides debugging info about all SQLite databases running in the current process. 25 * 26 * {@hide} 27 */ 28 public final class SQLiteDebug { 29 /** 30 * Controls the printing of SQL statements as they are executed. 31 */ 32 public static final boolean DEBUG_SQL_STATEMENTS = 33 Log.isLoggable("SQLiteStatements", Log.VERBOSE); 34 35 /** 36 * Controls the printing of wall-clock time taken to execute SQL statements 37 * as they are executed. 38 */ 39 public static final boolean DEBUG_SQL_TIME = 40 Log.isLoggable("SQLiteTime", Log.VERBOSE); 41 42 /** 43 * Controls the printing of compiled-sql-statement cache stats. 44 */ 45 public static final boolean DEBUG_SQL_CACHE = 46 Log.isLoggable("SQLiteCompiledSql", Log.VERBOSE); 47 48 /** 49 * Controls the stack trace reporting of active cursors being 50 * finalized. 51 */ 52 public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = 53 Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE); 54 55 /** 56 * Controls the tracking of time spent holding the database lock. 57 */ 58 public static final boolean DEBUG_LOCK_TIME_TRACKING = 59 Log.isLoggable("SQLiteLockTime", Log.VERBOSE); 60 61 /** 62 * Controls the printing of stack traces when tracking the time spent holding the database lock. 63 */ 64 public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = 65 Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE); 66 67 /** 68 * Contains statistics about the active pagers in the current process. 69 * 70 * @see #getPagerStats(PagerStats) 71 */ 72 public static class PagerStats { 73 /** The total number of bytes in all pagers in the current process 74 * @deprecated not used any longer 75 */ 76 @Deprecated 77 public long totalBytes; 78 /** The number of bytes in referenced pages in all pagers in the current process 79 * @deprecated not used any longer 80 * */ 81 @Deprecated 82 public long referencedBytes; 83 /** The number of bytes in all database files opened in the current process 84 * @deprecated not used any longer 85 */ 86 @Deprecated 87 public long databaseBytes; 88 /** The number of pagers opened in the current process 89 * @deprecated not used any longer 90 */ 91 @Deprecated 92 public int numPagers; 93 94 /** the current amount of memory checked out by sqlite using sqlite3_malloc(). 95 * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html 96 */ 97 public int memoryUsed; 98 99 /** the number of bytes of page cache allocation which could not be sattisfied by the 100 * SQLITE_CONFIG_PAGECACHE buffer and where forced to overflow to sqlite3_malloc(). 101 * The returned value includes allocations that overflowed because they where too large 102 * (they were larger than the "sz" parameter to SQLITE_CONFIG_PAGECACHE) and allocations 103 * that overflowed because no space was left in the page cache. 104 * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html 105 */ 106 public int pageCacheOverflo; 107 108 /** records the largest memory allocation request handed to sqlite3. 109 * documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html 110 */ 111 public int largestMemAlloc; 112 113 /** a list of {@link DbStats} - one for each main database opened by the applications 114 * running on the android device 115 */ 116 public ArrayList<DbStats> dbStats; 117 } 118 119 /** 120 * contains statistics about a database 121 */ 122 public static class DbStats { 123 /** name of the database */ 124 public String dbName; 125 126 /** the page size for the database */ 127 public long pageSize; 128 129 /** the database size */ 130 public long dbSize; 131 132 /** documented here http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html */ 133 public int lookaside; 134 135 /** statement cache stats: hits/misses/cachesize */ 136 public String cache; 137 DbStats(String dbName, long pageCount, long pageSize, int lookaside, int hits, int misses, int cachesize)138 public DbStats(String dbName, long pageCount, long pageSize, int lookaside, 139 int hits, int misses, int cachesize) { 140 this.dbName = dbName; 141 this.pageSize = pageSize / 1024; 142 dbSize = (pageCount * pageSize) / 1024; 143 this.lookaside = lookaside; 144 this.cache = hits + "/" + misses + "/" + cachesize; 145 } 146 } 147 148 /** 149 * return all pager and database stats for the current process. 150 * @return {@link PagerStats} 151 */ getDatabaseInfo()152 public static PagerStats getDatabaseInfo() { 153 PagerStats stats = new PagerStats(); 154 getPagerStats(stats); 155 stats.dbStats = SQLiteDatabase.getDbStats(); 156 return stats; 157 } 158 159 /** 160 * Gathers statistics about all pagers in the current process. 161 */ getPagerStats(PagerStats stats)162 public static native void getPagerStats(PagerStats stats); 163 164 /** 165 * Returns the size of the SQLite heap. 166 * @return The size of the SQLite heap in bytes. 167 */ getHeapSize()168 public static native long getHeapSize(); 169 170 /** 171 * Returns the amount of allocated memory in the SQLite heap. 172 * @return The allocated size in bytes. 173 */ getHeapAllocatedSize()174 public static native long getHeapAllocatedSize(); 175 176 /** 177 * Returns the amount of free memory in the SQLite heap. 178 * @return The freed size in bytes. 179 */ getHeapFreeSize()180 public static native long getHeapFreeSize(); 181 182 /** 183 * Determines the number of dirty belonging to the SQLite 184 * heap segments of this process. pages[0] returns the number of 185 * shared pages, pages[1] returns the number of private pages 186 */ getHeapDirtyPages(int[] pages)187 public static native void getHeapDirtyPages(int[] pages); 188 189 private static int sNumActiveCursorsFinalized = 0; 190 191 /** 192 * Returns the number of active cursors that have been finalized. This depends on the GC having 193 * run but is still useful for tests. 194 */ getNumActiveCursorsFinalized()195 public static int getNumActiveCursorsFinalized() { 196 return sNumActiveCursorsFinalized; 197 } 198 notifyActiveCursorFinalized()199 static synchronized void notifyActiveCursorFinalized() { 200 sNumActiveCursorsFinalized++; 201 } 202 } 203