Skip to content

Commit 140eb1b

Browse files
Fix encoding of UTF-16 data to long and double values
1 parent 541479e commit 140eb1b

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

jni/net_sqlcipher_CursorWindow.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ static jlong getLong_native(JNIEnv * env, jobject object, jint row, jint column)
145145
{
146146
int32_t err;
147147
CursorWindow * window = GET_WINDOW(env, object);
148-
LOG_WINDOW("Getting long for %d,%d from %p", row, column, window);
148+
LOG_WINDOW("Getting long for %d,%d from %p", row, column, window);
149149

150150
field_slot_t field;
151151
err = window->read_field_slot(row, column, &field);
@@ -164,14 +164,13 @@ LOG_WINDOW("Getting long for %d,%d from %p", row, column, window);
164164
} else if (type == FIELD_TYPE_STRING) {
165165
uint32_t size = field.data.buffer.size;
166166
if (size > 0) {
167-
#if WINDOW_STORAGE_UTF8
168-
return strtoll((char const *)window->offsetToPtr(field.data.buffer.offset), NULL, 0);
169-
#else
170-
return strtoll((char const *)window->offsetToPtr(field.data.buffer.offset), NULL, 0);
171-
// String8 ascii((char16_t *) window->offsetToPtr(field.data.buffer.offset), size / 2);
172-
// char const * str = ascii.string();
173-
// return strtoll(str, NULL, 0);
174-
#endif
167+
long long int result;
168+
jstring data = env->NewString((const jchar*)window->offsetToPtr(field.data.buffer.offset), (jsize)size);
169+
const char* utf8data = env->GetStringUTFChars(data, NULL);
170+
result = strtoll(utf8data, NULL, 0);
171+
if(utf8data) env->ReleaseStringUTFChars(data, utf8data);
172+
if(data) env->DeleteLocalRef(data);
173+
return result;
175174
} else {
176175
return 0;
177176
}
@@ -373,7 +372,7 @@ static jcharArray copyStringToBuffer_native(JNIEnv* env, jobject object, jint ro
373372
{
374373
int32_t err;
375374
CursorWindow * window = GET_WINDOW(env, object);
376-
LOG_WINDOW("Copying string for %d,%d from %p", row, column, window);
375+
LOG_WINDOW("Copying string for %d,%d from %p", row, column, window);
377376

378377
field_slot_t field;
379378
err = window->read_field_slot(row, column, &field);
@@ -495,14 +494,13 @@ LOG_WINDOW("Getting double for %d,%d from %p", row, column, window);
495494
} else if (type == FIELD_TYPE_STRING) {
496495
uint32_t size = field.data.buffer.size;
497496
if (size > 0) {
498-
#if WINDOW_STORAGE_UTF8
499-
return strtod((char const *)window->offsetToPtr(field.data.buffer.offset), NULL);
500-
#else
501-
return strtod((char const *)window->offsetToPtr(field.data.buffer.offset), NULL);
502-
// String8 ascii((char16_t *) window->offsetToPtr(field.data.buffer.offset), size / 2);
503-
// char const * str = ascii.string();
504-
// return strtod(str, NULL);
505-
#endif
497+
double result;
498+
jstring data = env->NewString((const jchar*)window->offsetToPtr(field.data.buffer.offset), (jsize)size);
499+
const char* utf8data = env->GetStringUTFChars(data, NULL);
500+
result = strtod(utf8data, NULL);
501+
if(utf8data) env->ReleaseStringUTFChars(data, utf8data);
502+
if(data) env->DeleteLocalRef(data);
503+
return result;
506504
} else {
507505
return 0.0;
508506
}

0 commit comments

Comments
 (0)