Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 62 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ opt-level = 3
# See: https://github.com/surrealdb/surrealdb/blob/<version>/Cargo.toml
# Driver-specific dependencies (jni, once_cell, cargo-lock) are independent.
[dependencies]
jni = "0.21.1"
jni = "0.22.4"
surrealdb = { version = "3.0.5", default-features = false, features = ["rustls", "protocol-http", "protocol-ws"] }
serde = "1.0.228"
serde_json = "1.0.149"
Expand Down
147 changes: 82 additions & 65 deletions src/main/rust/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ use std::hash::{DefaultHasher, Hash, Hasher};
use std::ptr::null_mut;
use std::sync::Arc;

use crate::with_env_body;
use jni::objects::{JClass, JLongArray};
use jni::sys::{jboolean, jint, jlong, jstring};
use jni::JNIEnv;
use jni::EnvUnowned;
use parking_lot::Mutex;
use surrealdb::types::{Array, ToSql, Value};

Expand All @@ -16,7 +17,7 @@ use crate::{

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_deleteInstance<'local>(
_env: JNIEnv<'local>,
_env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) {
Expand All @@ -25,121 +26,137 @@ pub extern "system" fn Java_com_surrealdb_Array_deleteInstance<'local>(

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_newOf<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptrs: JLongArray<'local>,
) -> jlong {
let ptrs = get_long_array!(&mut env, &ptrs, || 0);
let mut values = Vec::with_capacity(ptrs.len());
for ptr in ptrs {
let value = take_value_mut_instance!(&mut env, ptr, || 0);
values.push(value);
}
let value = Value::Array(Array::from(values));
JniTypes::new_value(value.into())
with_env_body!(env, env, {
let ptrs = get_long_array!(env, &ptrs, || 0);
let mut values = Vec::with_capacity(ptrs.len());
for ptr in ptrs {
let value = take_value_mut_instance!(env, ptr, || 0);
values.push(value);
}
let value = Value::Array(Array::from(values));
JniTypes::new_value(value.into())
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_len<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) -> jint {
let value = get_value_instance!(&mut env, ptr, || 0 as jint);
if let Value::Array(a) = value.as_ref() {
a.len() as jint
} else {
SurrealError::NullPointerException("Array").exception(&mut env, || 0)
}
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, || 0 as jint);
if let Value::Array(a) = value.as_ref() {
a.len() as jint
} else {
SurrealError::NullPointerException("Array").exception(env, || 0)
}
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_get<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
idx: jint,
) -> jlong {
let value = get_value_instance!(&mut env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let val = a.get(idx as usize).cloned().unwrap_or(Value::None);
JniTypes::new_value(val.into())
} else {
SurrealError::NullPointerException("Array").exception(&mut env, || 0)
}
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let val = a.get(idx as usize).cloned().unwrap_or(Value::None);
JniTypes::new_value(val.into())
} else {
SurrealError::NullPointerException("Array").exception(env, || 0)
}
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_iterator<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) -> jlong {
let value = get_value_instance!(&mut env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let iter = a.clone().into_iter();
JniTypes::new_array_iter(iter)
} else {
SurrealError::NullPointerException("Array").exception(&mut env, || 0)
}
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let iter = a.clone().into_iter();
JniTypes::new_array_iter(iter)
} else {
SurrealError::NullPointerException("Array").exception(env, || 0)
}
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_synchronizedIterator<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) -> jlong {
let value = get_value_instance!(&mut env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let iter = a.clone().into_iter();
JniTypes::new_sync_array_iter(Mutex::new(iter).into())
} else {
SurrealError::NullPointerException("Array").exception(&mut env, || 0)
}
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let iter = a.clone().into_iter();
JniTypes::new_sync_array_iter(Mutex::new(iter).into())
} else {
SurrealError::NullPointerException("Array").exception(env, || 0)
}
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_toString<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) -> jstring {
let value = get_value_instance!(&mut env, ptr, null_mut);
if matches!(value.as_ref(), Value::Array(_)) {
new_string!(&mut env, value.to_sql(), null_mut)
} else {
SurrealError::NullPointerException("Array").exception(&mut env, null_mut)
}
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, null_mut);
if matches!(value.as_ref(), Value::Array(_)) {
new_string!(env, value.to_sql(), null_mut)
} else {
SurrealError::NullPointerException("Array").exception(env, null_mut)
}
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_hashCode<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr: jlong,
) -> jint {
let value = get_value_instance!(&mut env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let mut hasher = DefaultHasher::new();
a.hash(&mut hasher);
let hash64 = hasher.finish();
return (hash64 & 0xFFFFFFFF) as jint;
}
SurrealError::NullPointerException("Array").exception(&mut env, || 0)
with_env_body!(env, env, {
let value = get_value_instance!(env, ptr, || 0);
if let Value::Array(a) = value.as_ref() {
let mut hasher = DefaultHasher::new();
a.hash(&mut hasher);
let hash64 = hasher.finish();
return (hash64 & 0xFFFFFFFF) as jint;
}
SurrealError::NullPointerException("Array").exception(env, || 0)
})
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Array_equals<'local>(
mut env: JNIEnv<'local>,
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
ptr1: jlong,
ptr2: jlong,
) -> jboolean {
let v1 = get_value_instance!(&mut env, ptr1, || false as jboolean);
let v2 = get_value_instance!(&mut env, ptr2, || false as jboolean);
if let (Value::Array(a1), Value::Array(a2)) = (v1.as_ref(), v2.as_ref()) {
return a1.eq(a2) as jboolean;
}
SurrealError::NullPointerException("Array").exception(&mut env, || false as jboolean)
with_env_body!(env, env, {
let v1 = get_value_instance!(env, ptr1, || false as jboolean);
let v2 = get_value_instance!(env, ptr2, || false as jboolean);
if let (Value::Array(a1), Value::Array(a2)) = (v1.as_ref(), v2.as_ref()) {
return a1.eq(a2) as jboolean;
}
SurrealError::NullPointerException("Array").exception(env, || false as jboolean)
})
}
Loading
Loading