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 17254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown#define LOG_TAG "SQLiteDebug" 18254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 20254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown#include <JNIHelp.h> 21254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown#include <android_runtime/AndroidRuntime.h> 22254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sqlite3.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brownstatic struct { 34254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown jfieldID memoryUsed; 35254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown jfieldID pageCacheOverflow; 36254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown jfieldID largestMemAlloc; 37254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown} gSQLiteDebugPagerStatsClassInfo; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brownstatic void nativeGetPagerStats(JNIEnv *env, jobject clazz, jobject statsObj) 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 41c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori int memoryUsed; 422a293b61cb0efbf24994d74ed980f58b820bb35aJeff Brown int pageCacheOverflow; 43c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori int largestMemAlloc; 44c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori int unused; 45c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori 46c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori sqlite3_status(SQLITE_STATUS_MEMORY_USED, &memoryUsed, &unused, 0); 47c3849200fa60b22ea583ba2a6f902d6a632a5e7eVasu Nori sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &unused, &largestMemAlloc, 0); 482a293b61cb0efbf24994d74ed980f58b820bb35aJeff Brown sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflow, &unused, 0); 49254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown env->SetIntField(statsObj, gSQLiteDebugPagerStatsClassInfo.memoryUsed, memoryUsed); 50254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown env->SetIntField(statsObj, gSQLiteDebugPagerStatsClassInfo.pageCacheOverflow, 51254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown pageCacheOverflow); 52254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown env->SetIntField(statsObj, gSQLiteDebugPagerStatsClassInfo.largestMemAlloc, largestMemAlloc); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 61254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown { "nativeGetPagerStats", "(Landroid/database/sqlite/SQLiteDebug$PagerStats;)V", 62254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown (void*) nativeGetPagerStats }, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown#define FIND_CLASS(var, className) \ 66254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown var = env->FindClass(className); \ 67254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown LOG_FATAL_IF(! var, "Unable to find class " className); 68254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown 69254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 70254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 71254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 72254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_database_SQLiteDebug(JNIEnv *env) 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 76254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown FIND_CLASS(clazz, "android/database/sqlite/SQLiteDebug$PagerStats"); 77254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown 78254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown GET_FIELD_ID(gSQLiteDebugPagerStatsClassInfo.memoryUsed, clazz, 79254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown "memoryUsed", "I"); 80254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown GET_FIELD_ID(gSQLiteDebugPagerStatsClassInfo.largestMemAlloc, clazz, 81254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown "largestMemAlloc", "I"); 82254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown GET_FIELD_ID(gSQLiteDebugPagerStatsClassInfo.pageCacheOverflow, clazz, 83254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown "pageCacheOverflow", "I"); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85254fba8960b018a29c5fe422b8a0fd9eeedbf3e4Jeff Brown return AndroidRuntime::registerNativeMethods(env, "android/database/sqlite/SQLiteDebug", 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gMethods, NELEM(gMethods)); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 90