android_database_SQLiteGlobal.cpp revision e5360fbf3efe85427f7e7f59afe7bbeddb4949ac
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2011 The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "SQLiteGlobal" 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <jni.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <JNIHelp.h> 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <android_runtime/AndroidRuntime.h> 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <sqlite3.h> 24a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber#include <sqlite3_android.h> 251608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "android_database_SQLiteCommon.h" 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 285778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber// Called each time a message is logged. 31918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huberstatic void sqliteLogCallback(void* data, int iErrCode, const char* zMsg) { 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool verboseLog = !!data; 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iErrCode == 0 || iErrCode == SQLITE_CONSTRAINT) { 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (verboseLog) { 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV(LOG_VERBOSE, SQLITE_LOG_TAG, "(%d) %s\n", iErrCode, zMsg); 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOG(LOG_ERROR, SQLITE_LOG_TAG, "(%d) %s\n", iErrCode, zMsg); 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 42a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber// Sets the global SQLite configuration. 43a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber// This must be called before any other SQLite functions are called. */ 44a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huberstatic void nativeConfig(JNIEnv* env, jclass clazz, jboolean verboseLog, jint softHeapLimit) { 45a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber // Enable multi-threaded mode. In this mode, SQLite is safe to use by multiple 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber // threads as long as no two threads use the same database connection at the same 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber // time (which we guarantee in the SQLite database wrappers). 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Redirect SQLite log messages to the Android log. 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber sqlite3_config(SQLITE_CONFIG_LOG, &sqliteLogCallback, verboseLog ? (void*)1 : NULL); 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber // The soft heap limit prevents the page cache allocations from growing 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber // beyond the given limit, no matter what the max page cache sizes are 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber // set to. The limit does not, as of 3.5.0, affect any other allocations. 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sqlite3_soft_heap_limit(softHeapLimit); 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 595778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic jint nativeReleaseMemory(JNIEnv* env, jclass clazz, jint bytesToFree) { 60918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber return sqlite3_release_memory(bytesToFree); 611b86fe063badb5f28c467ade39be0f4008688947Andreas Huber} 621b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 631b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstatic JNINativeMethod sMethods[] = 64dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber{ 65dc7431e70b4b030b5f42d0dfc3ef244d4f583dd2Andreas Huber /* name, signature, funcPtr */ 66918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber { "nativeConfig", "(ZI)V", 67918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber (void*)nativeConfig }, 68918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber { "nativeReleaseMemory", "(I)I", 69918c7652b9a38c02e26c0c46541cea82070c0e43Andreas Huber (void*)nativeReleaseMemory }, 701608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber}; 711b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 725778822d86b0337407514b9372562b86edfa91cdAndreas Huberint register_android_database_SQLiteGlobal(JNIEnv *env) 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber{ 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber return AndroidRuntime::registerNativeMethods(env, "android/database/sqlite/SQLiteGlobal", 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sMethods, NELEM(sMethods)); 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 77a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Huber 781608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber} // namespace android 791608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber