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