1e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown/* 2e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Copyright (C) 2011 The Android Open Source Project 3e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * 4e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * you may not use this file except in compliance with the License. 6e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * You may obtain a copy of the License at 7e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * 8e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * 10e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Unless required by applicable law or agreed to in writing, software 11e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * See the License for the specific language governing permissions and 14e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * limitations under the License. 15e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown */ 16e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 17e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brownpackage android.database.sqlite; 18e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 195936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brownimport android.content.res.Resources; 20e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brownimport android.os.StatFs; 21888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brownimport android.os.SystemProperties; 22e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 23e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown/** 24e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Provides access to SQLite functions that affect all database connection, 25e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * such as memory management. 26e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * 274b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * The native code associated with SQLiteGlobal is also sets global configuration options 284b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * using sqlite3_config() then calls sqlite3_initialize() to ensure that the SQLite 294b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * library is properly initialized exactly once before any other framework or application 304b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * code has a chance to run. 314b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * 324b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * Verbose SQLite logging is enabled if the "log.tag.SQLiteLog" property is set to "V". 334b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * (per {@link SQLiteDebug#DEBUG_SQL_LOG}). 344b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown * 35e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * @hide 36e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown */ 37e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brownpublic final class SQLiteGlobal { 38e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown private static final String TAG = "SQLiteGlobal"; 39e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 40e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown private static final Object sLock = new Object(); 41e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown private static int sDefaultPageSize; 42e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 434b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown private static native int nativeReleaseMemory(); 44e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 45e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown private SQLiteGlobal() { 46e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 47e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 48e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown /** 49e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Attempts to release memory by pruning the SQLite page cache and other 50e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * internal data structures. 51e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * 52e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * @return The number of bytes that were freed. 53e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown */ 54e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown public static int releaseMemory() { 554b57553e693c9705e8363d3e0e9d881261b3e6faJeff Brown return nativeReleaseMemory(); 56e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 57e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown 58e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown /** 59e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Gets the default page size to use when creating a database. 60e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown */ 61e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown public static int getDefaultPageSize() { 62e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown synchronized (sLock) { 63e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown if (sDefaultPageSize == 0) { 64e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown sDefaultPageSize = new StatFs("/data").getBlockSize(); 65e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 66888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return SystemProperties.getInt("debug.sqlite.pagesize", sDefaultPageSize); 67e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 68e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 695936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown 705936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown /** 715936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown * Gets the default journal mode when WAL is not in use. 725936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown */ 735936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown public static String getDefaultJournalMode() { 74888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return SystemProperties.get("debug.sqlite.journalmode", 75888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getString( 76888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown com.android.internal.R.string.db_default_journal_mode)); 775936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown } 785936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown 795936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown /** 805936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown * Gets the journal size limit in bytes. 815936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown */ 825936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown public static int getJournalSizeLimit() { 83888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return SystemProperties.getInt("debug.sqlite.journalsizelimit", 84888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getInteger( 85888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown com.android.internal.R.integer.db_journal_size_limit)); 865936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown } 875936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown 885936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown /** 898dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown * Gets the default database synchronization mode when WAL is not in use. 905936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown */ 918dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown public static String getDefaultSyncMode() { 92888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return SystemProperties.get("debug.sqlite.syncmode", 93888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getString( 94888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown com.android.internal.R.string.db_default_sync_mode)); 958dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown } 968dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown 978dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown /** 988dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown * Gets the database synchronization mode when in WAL mode. 998dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown */ 1008dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown public static String getWALSyncMode() { 101888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return SystemProperties.get("debug.sqlite.wal.syncmode", 102888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getString( 103888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown com.android.internal.R.string.db_wal_sync_mode)); 1045936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown } 1055936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown 1065936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown /** 1075936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown * Gets the WAL auto-checkpoint integer in database pages. 1085936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown */ 1095936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown public static int getWALAutoCheckpoint() { 110888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown int value = SystemProperties.getInt("debug.sqlite.wal.autocheckpoint", 111888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getInteger( 1125936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown com.android.internal.R.integer.db_wal_autocheckpoint)); 113888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return Math.max(1, value); 1145936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown } 1155936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown 1165936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown /** 1178dc3cc2e13b500e368f5ba1aacfaf0eddbce668cJeff Brown * Gets the connection pool size when in WAL mode. 1185936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown */ 1195936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown public static int getWALConnectionPoolSize() { 120888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown int value = SystemProperties.getInt("debug.sqlite.wal.poolsize", 121888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown Resources.getSystem().getInteger( 1225936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown com.android.internal.R.integer.db_connection_pool_size)); 123888da152ece9a8cfe62fad9e7d1a43e792c41e2fJeff Brown return Math.max(2, value); 1245936ff097eff2c736af2e43fd4a8f7db0ddcfb5aJeff Brown } 125e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown} 126