android_database_CursorWindow.cpp revision e6044145bccf30e2b1785eb33a26de6496167986
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 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef LOG_TAG 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "CursorWindow" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <JNIHelp.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String16.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 322807df89af680e46cb35ee0035bb10b42d3136a2Mike Lockwood#include "binder/CursorWindow.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "sqlite3_exception.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gWindowField; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gBufferField; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID gSizeCopiedField; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define GET_WINDOW(env, object) ((CursorWindow *)env->GetIntField(object, gWindowField)) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SET_WINDOW(env, object, window) (env->SetIntField(object, gWindowField, (int)window)) 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SET_BUFFER(env, object, buf) (env->SetObjectField(object, gBufferField, buf)) 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SET_SIZE_COPIED(env, object, size) (env->SetIntField(object, gSizeCopiedField, size)) 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectCursorWindow * get_window_from_object(JNIEnv * env, jobject javaWindow) 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GET_WINDOW(env, javaWindow); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 536141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noristatic jint native_init_empty(JNIEnv * env, jobject object, jint cursorWindowSize, 5434ad57f0e844cd97f59d4ab22087d60d58650ba4Vasu Nori jboolean localOnly) 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t * data; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t size; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6034ad57f0e844cd97f59d4ab22087d60d58650ba4Vasu Nori window = new CursorWindow(cursorWindowSize); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window) { 626141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window->initBuffer(localOnly)) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete window; 666141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 1; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 696141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori LOG_WINDOW("native_init_empty: window = %p", window); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_WINDOW(env, object, window); 716141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 0; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 746141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noristatic jint native_init_memory(JNIEnv * env, jobject object, jobject memObj) 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> memory = interface_cast<IMemory>(ibinderForJavaObject(env, memObj)); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (memory == NULL) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Couldn't get native binder"); 796141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 1; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = new CursorWindow(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window) { 846141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 1; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window->setMemory(memory)) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete window; 886141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 1; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 916141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori LOG_WINDOW("native_init_memory: numRows = %d, numColumns = %d, window = %p", window->getNumRows(), window->getNumColumns(), window); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_WINDOW(env, object, window); 936141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori return 0; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject native_getBinder(JNIEnv * env, jobject object) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> memory = window->getMemory(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (memory != NULL) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> binder = memory->asBinder(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, binder); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void native_clear(JNIEnv * env, jobject object) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Clearing window %p", window); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window == NULL) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "clear() called after close()"); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project window->clear(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void native_close(JNIEnv * env, jobject object) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Closing window %p", window); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete window; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_WINDOW(env, object, 0); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void throwExceptionWithRowCol(JNIEnv * env, jint row, jint column) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 132b37f8a8af15425ed3e65104e8556099d33a9c1ceVasu Nori char buf[200]; 133b37f8a8af15425ed3e65104e8556099d33a9c1ceVasu Nori snprintf(buf, sizeof(buf), "Couldn't read row %d, col %d from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it", 134b37f8a8af15425ed3e65104e8556099d33a9c1ceVasu Nori row, column); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", buf); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void throwUnknowTypeException(JNIEnv * env, jint type) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[80]; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(buf, sizeof(buf), "UNKNOWN type %d", type); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", buf); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong getLong_native(JNIEnv * env, jobject object, jint row, jint column) 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t err; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Getting long for %d,%d from %p", row, column, window); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t field; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = window->read_field_slot(row, column, &field); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwExceptionWithRowCol(env, row, column); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t type = field.type; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == FIELD_TYPE_INTEGER) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t value; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getLong(row, column, &value)) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_STRING) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t size = field.data.buffer.size; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size > 0) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return strtoll((char const *)window->offsetToPtr(field.data.buffer.offset), NULL, 0); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 ascii((char16_t *) window->offsetToPtr(field.data.buffer.offset), size / 2); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char const * str = ascii.string(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return strtoll(str, NULL, 0); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_FLOAT) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double value; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getDouble(row, column, &value)) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_NULL) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_BLOB) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "Unable to convert BLOB to long"); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwUnknowTypeException(env, type); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jbyteArray getBlob_native(JNIEnv* env, jobject object, jint row, jint column) 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t err; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Getting blob for %d,%d from %p", row, column, window); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t field; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = window->read_field_slot(row, column, &field); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwExceptionWithRowCol(env, row, column); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t type = field.type; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == FIELD_TYPE_BLOB || type == FIELD_TYPE_STRING) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray byteArray = env->NewByteArray(field.data.buffer.size); 211e6044145bccf30e2b1785eb33a26de6496167986Vasu Nori if (!byteArray) { 212e6044145bccf30e2b1785eb33a26de6496167986Vasu Nori throw_sqlite3_exception(env, "Native could not create new byte[]"); 213e6044145bccf30e2b1785eb33a26de6496167986Vasu Nori return NULL; 214e6044145bccf30e2b1785eb33a26de6496167986Vasu Nori } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetByteArrayRegion(byteArray, 0, field.data.buffer.size, 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (const jbyte*)window->offsetToPtr(field.data.buffer.offset)); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byteArray; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_INTEGER) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "INTEGER data in getBlob_native "); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_FLOAT) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "FLOAT data in getBlob_native "); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_NULL) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwUnknowTypeException(env, type); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring getString_native(JNIEnv* env, jobject object, jint row, jint column) 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t err; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Getting string for %d,%d from %p", row, column, window); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t field; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = window->read_field_slot(row, column, &field); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwExceptionWithRowCol(env, row, column); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t type = field.type; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == FIELD_TYPE_STRING) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t size = field.data.buffer.size; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size > 0) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pass size - 1 since the UTF8 is null terminated and we don't want a null terminator on the UTF16 string 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 utf16((char const *)window->offsetToPtr(field.data.buffer.offset), size - 1); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((jchar const *)utf16.string(), utf16.size()); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((jchar const *)window->offsetToPtr(field.data.buffer.offset), size / 2); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(""); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_INTEGER) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t value; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getLong(row, column, &value)) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[32]; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(buf, sizeof(buf), "%lld", value); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(buf); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_FLOAT) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double value; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getDouble(row, column, &value)) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[32]; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(buf, sizeof(buf), "%g", value); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(buf); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_NULL) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_BLOB) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "Unable to convert BLOB to string"); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwUnknowTypeException(env, type); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use this only to convert characters that are known to be within the 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0-127 range for direct conversion to UTF-16 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint charToJchar(const char* src, jchar* dst, jint bufferSize) 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len = strlen(src); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bufferSize < len) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = bufferSize; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < len; i++) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *dst++ = (*src++ & 0x7F); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return len; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jcharArray copyStringToBuffer_native(JNIEnv* env, jobject object, jint row, 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint column, jint bufferSize, jobject buf) 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t err; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Copying string for %d,%d from %p", row, column, window); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t field; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = window->read_field_slot(row, column, &field); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Unable to get field slot"); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31503d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jcharArray buffer = (jcharArray)env->GetObjectField(buf, gBufferField); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer == NULL) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "buf should not be null"); 31903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana return NULL; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jchar* dst = env->GetCharArrayElements(buffer, NULL); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t type = field.type; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sizeCopied = 0; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jcharArray newArray = NULL; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == FIELD_TYPE_STRING) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t size = field.data.buffer.size; 32703d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana if (size > 0) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pass size - 1 since the UTF8 is null terminated and we don't want a null terminator on the UTF16 string 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 utf16((char const *)window->offsetToPtr(field.data.buffer.offset), size - 1); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t strSize = utf16.size(); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strSize > bufferSize || dst == NULL) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newArray = env->NewCharArray(strSize); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetCharArrayRegion(newArray, 0, strSize, (jchar const *)utf16.string()); 33503d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana } else { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(dst, (jchar const *)utf16.string(), strSize * 2); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeCopied = strSize; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeCopied = size/2 + size % 2; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size > bufferSize * 2 || dst == NULL) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newArray = env->NewCharArray(sizeCopied); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(newArray, (jchar const *)window->offsetToPtr(field.data.buffer.offset), size); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(dst, (jchar const *)window->offsetToPtr(field.data.buffer.offset), size); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 34803d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_INTEGER) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t value; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getLong(row, column, &value)) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buf[32]; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(buf, sizeof(buf), "%lld", value); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jchar* dst = env->GetCharArrayElements(buffer, NULL); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeCopied = charToJchar(buf, dst, bufferSize); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_FLOAT) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double value; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getDouble(row, column, &value)) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char tempbuf[32]; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(tempbuf, sizeof(tempbuf), "%g", value); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jchar* dst = env->GetCharArrayElements(buffer, NULL); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeCopied = charToJchar(tempbuf, dst, bufferSize); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_NULL) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_BLOB) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "Unable to convert BLOB to string"); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unknown field type %d", type); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "UNKNOWN type in copyStringToBuffer_native()"); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_SIZE_COPIED(env, buf, sizeCopied); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(buffer, dst, JNI_OK); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newArray; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jdouble getDouble_native(JNIEnv* env, jobject object, jint row, jint column) 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t err; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLOG_WINDOW("Getting double for %d,%d from %p", row, column, window); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t field; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = window->read_field_slot(row, column, &field); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwExceptionWithRowCol(env, row, column); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t type = field.type; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == FIELD_TYPE_FLOAT) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double value; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getDouble(row, column, &value)) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_STRING) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t size = field.data.buffer.size; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size > 0) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return strtod((char const *)window->offsetToPtr(field.data.buffer.offset), NULL); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 ascii((char16_t *) window->offsetToPtr(field.data.buffer.offset), size / 2); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char const * str = ascii.string(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return strtod(str, NULL); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_INTEGER) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t value; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getLong(row, column, &value)) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (double) value; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_NULL) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == FIELD_TYPE_BLOB) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw_sqlite3_exception(env, "Unable to convert BLOB to double"); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throwUnknowTypeException(env, type); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0.0; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4280a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Noribool isNull_native(CursorWindow *window, jint row, jint column) 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4300a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori LOG_WINDOW("Checking for NULL at %d,%d from %p", row, column, window); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isNull; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window->getNull(row, column, &isNull)) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return isNull; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //TODO throw execption? 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint getNumRows(JNIEnv * env, jobject object) 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return window->getNumRows(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean setNumColumns(JNIEnv * env, jobject object, jint columnNum) 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return window->setNumColumns(columnNum); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean allocRow(JNIEnv * env, jobject object) 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return window->allocRow() != NULL; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean putBlob_native(JNIEnv * env, jobject object, jbyteArray value, jint row, jint col) 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!value) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("How did a null value send to here"); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t * fieldSlot = window->getFieldSlotWithCheck(row, col); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fieldSlot == NULL) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW(" getFieldSlotWithCheck error "); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint len = env->GetArrayLength(value); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset = window->alloc(len); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!offset) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("Failed allocating %u bytes", len); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte * bytes = env->GetByteArrayElements(value, NULL); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project window->copyIn(offset, (uint8_t const *)bytes, len); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This must be updated after the call to alloc(), since that 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // may move the field around in the window 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->type = FIELD_TYPE_BLOB; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->data.buffer.offset = offset; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->data.buffer.size = len; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseByteArrayElements(value, bytes, JNI_ABORT); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("%d,%d is BLOB with %u bytes @ %d", row, col, len, offset); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean putString_native(JNIEnv * env, jobject object, jstring value, jint row, jint col) 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!value) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("How did a null value send to here"); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project field_slot_t * fieldSlot = window->getFieldSlotWithCheck(row, col); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fieldSlot == NULL) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW(" getFieldSlotWithCheck error "); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = env->GetStringUTFLength(value) + 1; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char const * valStr = env->GetStringUTFChars(value, NULL); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = env->GetStringLength(value); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // GetStringLength return number of chars and one char takes 2 bytes 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len *= 2; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* valStr = env->GetStringChars(value, NULL); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!valStr) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("value can't be transfer to UTFChars"); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset = window->alloc(len); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!offset) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("Failed allocating %u bytes", len); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(value, valStr); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(value, valStr); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project window->copyIn(offset, (uint8_t const *)valStr, len); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This must be updated after the call to alloc(), since that 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // may move the field around in the window 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->type = FIELD_TYPE_STRING; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->data.buffer.offset = offset; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fieldSlot->data.buffer.size = len; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("%d,%d is TEXT with %u bytes @ %d", row, col, len, offset); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if WINDOW_STORAGE_UTF8 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(value, valStr); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(value, valStr); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean putLong_native(JNIEnv * env, jobject object, jlong value, jint row, jint col) 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window->putLong(row, col, value)) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW(" getFieldSlotWithCheck error "); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("%d,%d is INTEGER 0x%016llx", row, col, value); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean putDouble_native(JNIEnv * env, jobject object, jdouble value, jint row, jint col) 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window->putDouble(row, col, value)) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW(" getFieldSlotWithCheck error "); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("%d,%d is FLOAT %lf", row, col, value); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean putNull_native(JNIEnv * env, jobject object, jint row, jint col) 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!window->putNull(row, col)) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW(" getFieldSlotWithCheck error "); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_WINDOW("%d,%d is NULL", row, col); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// free the last row 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void freeLastRow(JNIEnv * env, jobject object) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWindow * window = GET_WINDOW(env, object); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project window->freeLastRow(); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5928b0dd7da360d70920a37802eb455ba41500d3b45Vasu Noristatic jint getType_native(JNIEnv* env, jobject object, jint row, jint column) 5938b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori{ 5948b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori int32_t err; 5958b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori CursorWindow * window = GET_WINDOW(env, object); 5968b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori LOG_WINDOW("returning column type affinity for %d,%d from %p", row, column, window); 5978b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori 5980a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori if (isNull_native(window, row, column)) { 5990a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori return FIELD_TYPE_NULL; 6000a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori } 6010a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori 6028b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori field_slot_t field; 6038b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori err = window->read_field_slot(row, column, &field); 6048b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori if (err != 0) { 6058b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori throwExceptionWithRowCol(env, row, column); 6068b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori return NULL; 6078b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori } 6088b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori 6098b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori return field.type; 6108b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori} 6118b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod sMethods[] = 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 6156141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori {"native_init", "(IZ)I", (void *)native_init_empty}, 6166141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori {"native_init", "(Landroid/os/IBinder;)I", (void *)native_init_memory}, 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getBinder", "()Landroid/os/IBinder;", (void *)native_getBinder}, 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_clear", "()V", (void *)native_clear}, 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"close_native", "()V", (void *)native_close}, 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getLong_native", "(II)J", (void *)getLong_native}, 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getBlob_native", "(II)[B", (void *)getBlob_native}, 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getString_native", "(II)Ljava/lang/String;", (void *)getString_native}, 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"copyStringToBuffer_native", "(IIILandroid/database/CharArrayBuffer;)[C", (void *)copyStringToBuffer_native}, 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getDouble_native", "(II)D", (void *)getDouble_native}, 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getNumRows_native", "()I", (void *)getNumRows}, 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setNumColumns_native", "(I)Z", (void *)setNumColumns}, 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"allocRow_native", "()Z", (void *)allocRow}, 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"putBlob_native", "([BII)Z", (void *)putBlob_native}, 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"putString_native", "(Ljava/lang/String;II)Z", (void *)putString_native}, 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"putLong_native", "(JII)Z", (void *)putLong_native}, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"putDouble_native", "(DII)Z", (void *)putDouble_native}, 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"freeLastRow_native", "()V", (void *)freeLastRow}, 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"putNull_native", "(II)Z", (void *)putNull_native}, 6348b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori {"getType_native", "(II)I", (void *)getType_native}, 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_database_CursorWindow(JNIEnv * env) 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/database/CursorWindow"); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find android/database/CursorWindow"); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gWindowField = env->GetFieldID(clazz, "nWindow", "I"); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gWindowField == NULL) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error locating fields"); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65303d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/database/CharArrayBuffer"); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Can't find android/database/CharArrayBuffer"); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBufferField = env->GetFieldID(clazz, "data", "[C"); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gBufferField == NULL) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error locating fields data in CharArrayBuffer"); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gSizeCopiedField = env->GetFieldID(clazz, "sizeCopied", "I"); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gSizeCopiedField == NULL) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Error locating fields sizeCopied in CharArrayBuffer"); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, "android/database/CursorWindow", 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sMethods, NELEM(sMethods)); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 679