1 /* //device/libs/android_runtime/android_database_SQLiteCursor.cpp 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #undef LOG_TAG 19 #define LOG_TAG "Cursor" 20 21 #include <jni.h> 22 #include <JNIHelp.h> 23 #include <android_runtime/AndroidRuntime.h> 24 25 #include <sqlite3.h> 26 27 #include <utils/Log.h> 28 29 #include <stdio.h> 30 #include <string.h> 31 #include <unistd.h> 32 33 #include "sqlite3_exception.h" 34 35 namespace android { 36 37 38 sqlite3_stmt * compile(JNIEnv* env, jobject object, 39 sqlite3 * handle, jstring sqlString); 40 41 static jfieldID gHandleField; 42 static jfieldID gStatementField; 43 44 45 #define GET_STATEMENT(env, object) \ 46 (sqlite3_stmt *)env->GetIntField(object, gStatementField) 47 #define GET_HANDLE(env, object) \ 48 (sqlite3 *)env->GetIntField(object, gHandleField) 49 50 51 static void native_execute(JNIEnv* env, jobject object) 52 { 53 int err; 54 sqlite3 * handle = GET_HANDLE(env, object); 55 sqlite3_stmt * statement = GET_STATEMENT(env, object); 56 57 // Execute the statement 58 err = sqlite3_step(statement); 59 60 // Throw an exception if an error occured 61 if (err != SQLITE_DONE) { 62 throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); 63 } 64 65 // Reset the statment so it's ready to use again 66 sqlite3_reset(statement); 67 } 68 69 static jlong native_1x1_long(JNIEnv* env, jobject object) 70 { 71 int err; 72 sqlite3 * handle = GET_HANDLE(env, object); 73 sqlite3_stmt * statement = GET_STATEMENT(env, object); 74 jlong value = -1; 75 76 // Execute the statement 77 err = sqlite3_step(statement); 78 79 // Handle the result 80 if (err == SQLITE_ROW) { 81 // No errors, read the data and return it 82 value = sqlite3_column_int64(statement, 0); 83 } else { 84 throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); 85 } 86 87 // Reset the statment so it's ready to use again 88 sqlite3_reset(statement); 89 90 return value; 91 } 92 93 static jstring native_1x1_string(JNIEnv* env, jobject object) 94 { 95 int err; 96 sqlite3 * handle = GET_HANDLE(env, object); 97 sqlite3_stmt * statement = GET_STATEMENT(env, object); 98 jstring value = NULL; 99 100 // Execute the statement 101 err = sqlite3_step(statement); 102 103 // Handle the result 104 if (err == SQLITE_ROW) { 105 // No errors, read the data and return it 106 char const * text = (char const *)sqlite3_column_text(statement, 0); 107 value = env->NewStringUTF(text); 108 } else { 109 throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); 110 } 111 112 // Reset the statment so it's ready to use again 113 sqlite3_reset(statement); 114 115 return value; 116 } 117 118 119 static JNINativeMethod sMethods[] = 120 { 121 /* name, signature, funcPtr */ 122 {"native_execute", "()V", (void *)native_execute}, 123 {"native_1x1_long", "()J", (void *)native_1x1_long}, 124 {"native_1x1_string", "()Ljava/lang/String;", (void *)native_1x1_string}, 125 }; 126 127 int register_android_database_SQLiteStatement(JNIEnv * env) 128 { 129 jclass clazz; 130 131 clazz = env->FindClass("android/database/sqlite/SQLiteStatement"); 132 if (clazz == NULL) { 133 LOGE("Can't find android/database/sqlite/SQLiteStatement"); 134 return -1; 135 } 136 137 gHandleField = env->GetFieldID(clazz, "nHandle", "I"); 138 gStatementField = env->GetFieldID(clazz, "nStatement", "I"); 139 140 if (gHandleField == NULL || gStatementField == NULL) { 141 LOGE("Error locating fields"); 142 return -1; 143 } 144 145 return AndroidRuntime::registerNativeMethods(env, 146 "android/database/sqlite/SQLiteStatement", sMethods, NELEM(sMethods)); 147 } 148 149 } // namespace android 150