diff --git a/.github/workflows/cross.yml b/.github/workflows/cross.yml index 6060717a..73259c61 100644 --- a/.github/workflows/cross.yml +++ b/.github/workflows/cross.yml @@ -32,16 +32,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - name: Install dependencies run: sudo apt-get update -y - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable targets: ${{ matrix.target }} @@ -55,7 +55,7 @@ jobs: run: cargo ndk -t ${{ matrix.ndk }} build --release - name: Upload so lib - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: ${{ matrix.target }} path: target/${{ matrix.target }}/release/*.so @@ -81,10 +81,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - name: Install dependencies run: | @@ -92,7 +92,7 @@ jobs: sudo apt-get install -y ${{ matrix.apt-get }} - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable targets: ${{ matrix.target }} @@ -105,7 +105,7 @@ jobs: cargo build --target ${{ matrix.target }} --release - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: ${{ matrix.target }} path: target/${{ matrix.target }}/release/*.so @@ -117,13 +117,13 @@ jobs: runs-on: windows-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable target: ${{ matrix.arch }}-pc-windows-msvc @@ -134,7 +134,7 @@ jobs: run: cargo build --target ${{ matrix.arch }}-pc-windows-msvc --release - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: ${{ matrix.arch }}-pc-windows-msvc path: target/${{ matrix.arch }}-pc-windows-msvc/release/*.dll @@ -150,13 +150,13 @@ jobs: runs-on: ${{ matrix.runs-on }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable @@ -166,7 +166,7 @@ jobs: run: cargo build --target ${{ matrix.arch }}-apple-darwin --release - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: ${{ matrix.arch }}-apple-darwin path: target/${{ matrix.arch }}-apple-darwin/release/*.dylib @@ -183,13 +183,13 @@ jobs: run: sudo apt-get update - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - name: Set up JDK 22 - uses: actions/setup-java@v4 + - name: Set up JDK + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: 'temurin' - java-version: 22 + java-version: 25 - name: Gradle run: chmod +x gradlew @@ -210,74 +210,74 @@ jobs: mkdir -p src/main/resources/natives/windows_32 - name: Download Android 64 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: x86_64-linux-android path: src/main/resources/natives/android_64 - name: Download Android 32 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: i686-linux-android path: src/main/resources/natives/android_32 - name: Download Android 64 arm - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: aarch64-linux-android path: src/main/resources/natives/android_arm64 - name: Download Android 32 arm - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: armv7-linux-androideabi path: src/main/resources/natives/android_arm32 - name: Download Linux 64 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: x86_64-unknown-linux-gnu path: src/main/resources/natives/linux_64 - name: Download Linux 32 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 continue-on-error: true with: name: i686-unknown-linux-gnu path: src/main/resources/natives/linux_32 - name: Download Linux 64 arm - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: aarch64-unknown-linux-gnu path: src/main/resources/natives/linux_arm64 - name: Download Linux 32 arm - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: armv7-unknown-linux-gnueabihf path: src/main/resources/natives/linux_arm32 - name: Download Darwin 64 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: x86_64-apple-darwin path: src/main/resources/natives/osx_64 - name: Download Darwin 64 arm - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: aarch64-apple-darwin path: src/main/resources/natives/osx_arm64 - name: Download Windows 64 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: x86_64-pc-windows-msvc path: src/main/resources/natives/windows_64 - name: Download Windows 32 intel - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: i686-pc-windows-msvc path: src/main/resources/natives/windows_32 @@ -290,13 +290,13 @@ jobs: run: ./gradlew jar - name: Upload JAR artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: surrealdb path: build/libs/surrealdb-${{ steps.version.outputs.VERSION }}.jar - name: Start SurrealDB - uses: surrealdb/setup-surreal@v2 + uses: surrealdb/setup-surreal@7c103070ba4f544240cd287432ba70d6f50163a5 # v2 with: surrealdb_version: v3.0.4 surrealdb_port: 8000 @@ -319,13 +319,13 @@ jobs: - aggregated-jar steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - name: Set up JDK 22 - uses: actions/setup-java@v4 + - name: Set up JDK + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: 'temurin' - java-version: 22 + java-version: 25 - name: Gradle run: chmod +x gradlew @@ -334,14 +334,14 @@ jobs: run: mkdir -p native - name: Download JAR - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: surrealdb path: native - name: Start SurrealDB if: runner.os != 'Windows' - uses: surrealdb/setup-surreal@v2 + uses: surrealdb/setup-surreal@7c103070ba4f544240cd287432ba70d6f50163a5 # v2 with: surrealdb_version: v3.0.4 surrealdb_port: 8000 @@ -364,19 +364,19 @@ jobs: contents: read packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - name: Set up JDK 22 - uses: actions/setup-java@v4 + - name: Set up JDK + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: 'temurin' - java-version: 22 + java-version: 25 - name: Create directory native run: mkdir -p native - name: Download JAR - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: surrealdb path: native diff --git a/.github/workflows/reports.yml b/.github/workflows/reports.yml index 3812c352..c9182c56 100644 --- a/.github/workflows/reports.yml +++ b/.github/workflows/reports.yml @@ -17,20 +17,20 @@ jobs: run: sudo apt-get update - name: Install Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - - name: Set up JDK 22 - uses: actions/setup-java@v4 + - name: Set up JDK + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: 'temurin' - java-version: 22 + java-version: 25 - name: Build native lib env: @@ -41,7 +41,7 @@ jobs: run: chmod +x gradlew - name: Start SurrealDB - uses: surrealdb/setup-surreal@v2 + uses: surrealdb/setup-surreal@7c103070ba4f544240cd287432ba70d6f50163a5 # v2 with: surrealdb_version: v3.0.4 surrealdb_port: 8000 @@ -64,7 +64,7 @@ jobs: run: ./gradlew -i clean createCombinedReport - name: Deploy - uses: peaceiris/actions-gh-pages@v4 + uses: peaceiris/actions-gh-pages@e9c66a37f080288a11235e32cbe2dc5fb3a679cc # v4 if: github.ref == 'refs/heads/main' with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 09a57613..a2cd7e56 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,25 +17,25 @@ jobs: strategy: fail-fast: false matrix: - java: [ '8', '11', '17', '21', '22' ] + java: [ '8', '11', '17', '21', '25' ] steps: - name: Install Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable with: toolchain: stable components: clippy,rustfmt - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Cache Rust - uses: Swatinem/rust-cache@v2 + uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2 - name: Install dependencies run: sudo apt-get update - name: Set up JDK ${{ matrix.java }} - uses: actions/setup-java@v4 + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: 'temurin' java-version: ${{ matrix.java }} @@ -44,7 +44,7 @@ jobs: run: cargo build - name: Start SurrealDB - uses: surrealdb/setup-surreal@v2 + uses: surrealdb/setup-surreal@7c103070ba4f544240cd287432ba70d6f50163a5 # v2 with: surrealdb_version: v3.0.4 surrealdb_port: 8000 diff --git a/Cargo.lock b/Cargo.lock index 424e0fc2..d4c51ae3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2415,9 +2415,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "openssl-probe" diff --git a/Cargo.toml b/Cargo.toml index fc77bc45..d18b27e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,19 +12,24 @@ path = "src/main/rust/lib.rs" [profile.release] opt-level = 3 +# Shared dependencies (surrealdb, serde, serde_json, rust_decimal, tokio, parking_lot, +# chrono, dashmap, futures, async-channel) should be kept aligned with the versions used +# by SurrealDB's workspace Cargo.toml for the matching surrealdb crate version. +# See: https://github.com/surrealdb/surrealdb/blob//Cargo.toml +# Driver-specific dependencies (jni, once_cell, cargo-lock) are independent. [dependencies] jni = "0.21.1" surrealdb = { version = "3.0.4", default-features = false, features = ["rustls", "protocol-http", "protocol-ws"] } serde = "1.0.228" -serde_json = "1.0" +serde_json = "1.0.149" rust_decimal = "1.40.0" -tokio = "1.50.0" +tokio = "1.49.0" parking_lot = "0.12.5" -once_cell = "1.21.3" -chrono = "0.4.44" +once_cell = "1.21.4" +chrono = "0.4.43" dashmap = "6.1.0" -futures = "0.3" -async-channel = "2.0" +futures = "0.3.31" +async-channel = "2.5.0" [build-dependencies] cargo-lock = "11.0.1" diff --git a/README.md b/README.md index 40fb4f67..272acc09 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ View the SDK documentation [here](https://surrealdb.com/docs/integration/librari - Simple API: [see docs](https://surrealdb.com/docs/integration/libraries/java). - Support of 'memory' (embedded SurrealDB). - Support of remote connection to SurrealDB. -- Supported on JAVA JDK 8, 11, 17, 21, 22. +- Supported on JAVA JDK 8, 11, 17, 21, 25. - Supported architectures: - Linux (ARM) aarch64 - Linux (INTEL) x86_64 diff --git a/build.gradle b/build.gradle index c73ff85f..4683420c 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { } group 'com.surrealdb' -version '2.0.0' +version '2.0.0-SNAPSHOT' repositories { mavenCentral() @@ -51,6 +51,16 @@ java { withSourcesJar() } +// Use --release to enforce both bytecode version and API surface at compile time. +// This prevents accidental use of APIs introduced after Java 8 (e.g. String.isBlank()), +// which would compile fine on a modern JDK but fail at runtime on Java 8. +// Note: --release flag is only supported on JDK 9+. +if (JavaVersion.current() > JavaVersion.VERSION_1_8) { + tasks.withType(JavaCompile).configureEach { + options.release = 8 + } +} + sourceSets { integrationTest { java @@ -108,6 +118,7 @@ tasks.named('jar') { tasks.withType(PublishToMavenRepository).configureEach { dependsOn 'stageNativeJar' } + // Metadata / POM generation tasks must wait as well tasks.matching { it.name.startsWith('generate') && it.name.endsWith('Publication') } .configureEach { dependsOn 'stageNativeJar' } @@ -304,7 +315,6 @@ publishing { url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } - developers { developer { id = 'tobiemh' @@ -312,9 +322,14 @@ publishing { email = 'tobie@surrealdb.com' } developer { - id = 'phughk' - name = 'Hugh Kaznowski' - email = 'hugh@surrealdb.com' + id = 'macjuul' + name = 'Julian Mills' + email = 'julian.mills@surrealdb.com' + } + developer { + id = 'kearfy' + name = 'Micha de Vries' + email = 'micha.de.vries@surrealdb.com' } developer { id = 'emmanuel-keller' diff --git a/build.rs b/build.rs index ba57b578..f78416f8 100644 --- a/build.rs +++ b/build.rs @@ -12,8 +12,10 @@ fn main() { }) .expect("Failed to find surrealdb in Cargo.lock"); - let version = - format!("{}.{}.{}", package.version.major, package.version.minor, package.version.patch); + let version = format!( + "{}.{}.{}", + package.version.major, package.version.minor, package.version.patch + ); println!("cargo:rustc-env=SURREALDB_VERSION={}", version); } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4413138..aaaabb3c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/rust/entrymut.rs b/src/main/rust/entrymut.rs index f2faf3d2..1a23b37b 100644 --- a/src/main/rust/entrymut.rs +++ b/src/main/rust/entrymut.rs @@ -3,7 +3,8 @@ use std::ptr::null_mut; use crate::error::SurrealError; use crate::{ - get_entry_mut_instance, get_rust_string, new_string, release_instance, take_value_mut_instance, JniTypes, + get_entry_mut_instance, get_rust_string, new_string, release_instance, take_value_mut_instance, + JniTypes, }; use jni::objects::{JClass, JString}; use jni::sys::{jboolean, jint, jlong, jstring}; diff --git a/src/main/rust/error.rs b/src/main/rust/error.rs index f5be788b..0f1f9a9c 100644 --- a/src/main/rust/error.rs +++ b/src/main/rust/error.rs @@ -50,10 +50,15 @@ fn value_to_jobject<'a>(env: &mut JNIEnv<'a>, value: &Value) -> Option { let class = env.find_class("java/lang/Boolean").ok()?; let z = if *b { 1u8 } else { 0u8 }; - env.call_static_method(class, "valueOf", "(Z)Ljava/lang/Boolean;", &[JValue::Bool(z)]) - .ok() - .and_then(|v| v.l().ok()) - .map(JObject::from) + env.call_static_method( + class, + "valueOf", + "(Z)Ljava/lang/Boolean;", + &[JValue::Bool(z)], + ) + .ok() + .and_then(|v| v.l().ok()) + .map(JObject::from) } Value::Object(map) => { let class = env.find_class("java/util/LinkedHashMap").ok()?; @@ -75,7 +80,12 @@ fn value_to_jobject<'a>(env: &mut JNIEnv<'a>, value: &Value) -> Option(env: &mut JNIEnv<'a>, n: &Number) -> Option } Number::Float(f) => { let class = env.find_class("java/lang/Double").ok()?; - env.call_static_method(class, "valueOf", "(D)Ljava/lang/Double;", &[JValue::Double(*f)]) - .ok() - .and_then(|v| v.l().ok()) - .map(JObject::from) + env.call_static_method( + class, + "valueOf", + "(D)Ljava/lang/Double;", + &[JValue::Double(*f)], + ) + .ok() + .and_then(|v| v.l().ok()) + .map(JObject::from) } Number::Decimal(d) => { let class = env.find_class("java/lang/Double").ok()?; let f: f64 = d.to_string().parse().unwrap_or(0.0); - env.call_static_method(class, "valueOf", "(D)Ljava/lang/Double;", &[JValue::Double(f)]) - .ok() - .and_then(|v| v.l().ok()) - .map(JObject::from) + env.call_static_method( + class, + "valueOf", + "(D)Ljava/lang/Double;", + &[JValue::Double(f)], + ) + .ok() + .and_then(|v| v.l().ok()) + .map(JObject::from) } } } @@ -134,13 +154,25 @@ fn build_server_exception<'a>( // Match on the Rust SDK's ErrorDetails enum to align with the typed API. let (class_name, enum_name, raw_kind_for_unknown) = match error.details() { ErrorDetails::Validation(_) => ("com/surrealdb/ValidationException", "VALIDATION", None), - ErrorDetails::Configuration(_) => ("com/surrealdb/ConfigurationException", "CONFIGURATION", None), + ErrorDetails::Configuration(_) => ( + "com/surrealdb/ConfigurationException", + "CONFIGURATION", + None, + ), ErrorDetails::Thrown => ("com/surrealdb/ThrownException", "THROWN", None), ErrorDetails::Query(_) => ("com/surrealdb/QueryException", "QUERY", None), - ErrorDetails::Serialization(_) => ("com/surrealdb/SerializationException", "SERIALIZATION", None), + ErrorDetails::Serialization(_) => ( + "com/surrealdb/SerializationException", + "SERIALIZATION", + None, + ), ErrorDetails::NotAllowed(_) => ("com/surrealdb/NotAllowedException", "NOT_ALLOWED", None), ErrorDetails::NotFound(_) => ("com/surrealdb/NotFoundException", "NOT_FOUND", None), - ErrorDetails::AlreadyExists(_) => ("com/surrealdb/AlreadyExistsException", "ALREADY_EXISTS", None), + ErrorDetails::AlreadyExists(_) => ( + "com/surrealdb/AlreadyExistsException", + "ALREADY_EXISTS", + None, + ), ErrorDetails::Connection(_) => (SERVER_EXCEPTION, "CONNECTION", None), ErrorDetails::Internal => ("com/surrealdb/InternalException", "INTERNAL", None), _ => (SERVER_EXCEPTION, "UNKNOWN", Some(error.kind_str())), @@ -172,7 +204,11 @@ fn build_server_exception<'a>( .ok() .map(JObject::from)?; let raw_kind_jstr = match raw_kind_for_unknown { - Some(s) => env.new_string(s).ok().map(JObject::from).unwrap_or(JObject::null()), + Some(s) => env + .new_string(s) + .ok() + .map(JObject::from) + .unwrap_or(JObject::null()), None => JObject::null(), }; let sig = "(Lcom/surrealdb/ErrorKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Lcom/surrealdb/ServerException;)V"; diff --git a/src/main/rust/lib.rs b/src/main/rust/lib.rs index 0398b584..159ff1d2 100644 --- a/src/main/rust/lib.rs +++ b/src/main/rust/lib.rs @@ -44,9 +44,9 @@ mod object; mod recordid; mod response; mod surreal; -mod transaction; mod syncentryiterator; mod syncvalueiterator; +mod transaction; mod value; mod valueiterator; mod valuemut; diff --git a/src/main/rust/live.rs b/src/main/rust/live.rs index f0393065..f3f888df 100644 --- a/src/main/rust/live.rs +++ b/src/main/rust/live.rs @@ -5,9 +5,7 @@ use jni::sys::{jlong, jobject}; use jni::JNIEnv; use crate::error::SurrealError; -use crate::{ - get_instance, new_string, take_instance, JniTypes, LiveStreamChannel, TOKIO_RUNTIME, -}; +use crate::{get_instance, new_string, take_instance, JniTypes, LiveStreamChannel, TOKIO_RUNTIME}; #[no_mangle] pub extern "system" fn Java_com_surrealdb_LiveStream_nextNative<'local>( @@ -35,14 +33,14 @@ pub extern "system" fn Java_com_surrealdb_LiveStream_nextNative<'local>( Err(e) => return SurrealError::from(e).exception(&mut env, || std::ptr::null_mut()), }; // Build Java LiveNotification(action, valuePtr, queryId) - let action_raw = new_string!(&mut env, notification.action.to_string(), || std::ptr::null_mut()); + let action_raw = new_string!(&mut env, notification.action.to_string(), || { + std::ptr::null_mut() + }); let action_str = unsafe { JObject::from_raw(action_raw) }; let value_ptr = JniTypes::new_value(Arc::new(notification.data)); - let query_id_raw = new_string!( - &mut env, - notification.query_id.to_string(), - || std::ptr::null_mut() - ); + let query_id_raw = new_string!(&mut env, notification.query_id.to_string(), || { + std::ptr::null_mut() + }); let query_id_str = unsafe { JObject::from_raw(query_id_raw) }; let class = match env.find_class("com/surrealdb/LiveNotification") { Ok(c) => c, @@ -83,5 +81,6 @@ pub extern "system" fn Java_com_surrealdb_LiveStream_releaseNative<'local>( let _recv_guard = recv_mutex.lock(); // wait until any thread in nextNative has left recv() let _rx = rx_mux.lock().take(); // take and drop receiver while holding recv_guard drop(_recv_guard); - let _ = take_instance::(handle_ptr, JniTypes::LiveStream); // free the box + let _ = take_instance::(handle_ptr, JniTypes::LiveStream); + // free the box } diff --git a/src/main/rust/macros.rs b/src/main/rust/macros.rs index 7b4ec7d8..fe762a99 100644 --- a/src/main/rust/macros.rs +++ b/src/main/rust/macros.rs @@ -45,7 +45,10 @@ macro_rules! get_surreal_ref { #[macro_export] macro_rules! get_transaction_ref { ($env:expr, $id:expr, $default_fn:expr) => { - match $crate::get_instance::>($id, JniTypes::Transaction) { + match $crate::get_instance::>( + $id, + JniTypes::Transaction, + ) { Ok(t) => t, Err(e) => return e.exception($env, $default_fn), } @@ -55,7 +58,10 @@ macro_rules! get_transaction_ref { #[macro_export] macro_rules! get_response_instance { ($env:expr, $id:expr, $default_fn:expr) => { - match $crate::get_instance::>>($id, JniTypes::Response) { + match $crate::get_instance::>>( + $id, + JniTypes::Response, + ) { Ok(s) => s.clone(), Err(e) => return e.exception($env, $default_fn), } diff --git a/src/main/rust/surreal.rs b/src/main/rust/surreal.rs index e3a9548d..e0579630 100644 --- a/src/main/rust/surreal.rs +++ b/src/main/rust/surreal.rs @@ -5,20 +5,19 @@ use std::sync::Arc; use crate::error::SurrealError; use crate::{ - check_query_result, convert_up_type, get_long_array, get_rust_string, - get_rust_string_array, get_surreal_ref, get_value_instance, - get_value_mut_instance, new_jlong_array, new_string, release_instance, return_unexpected_result, - return_value_array_first, return_value_array_iter, return_value_array_iter_sync, - take_one_result, JniTypes, TOKIO_RUNTIME, + check_query_result, convert_up_type, get_long_array, get_rust_string, get_rust_string_array, + get_surreal_ref, get_value_instance, get_value_mut_instance, new_jlong_array, new_string, + release_instance, return_unexpected_result, return_value_array_first, return_value_array_iter, + return_value_array_iter_sync, take_one_result, JniTypes, TOKIO_RUNTIME, }; -use jni::objects::{JClass, JObject, JLongArray, JObjectArray, JString, JValue}; +use futures::StreamExt; +use jni::objects::{JClass, JLongArray, JObject, JObjectArray, JString, JValue}; use jni::sys::{jboolean, jint, jlong, jlongArray, jobject, jstring}; use jni::JNIEnv; -use std::result::Result as StdResult; use parking_lot::Mutex; use serde::Serialize; -use futures::StreamExt; use std::ops::Bound; +use std::result::Result as StdResult; use surrealdb::engine::any::Any; use surrealdb::opt::auth::{Database, Namespace, Record as AuthRecord, Root}; use surrealdb::types::{RecordId, RecordIdKey, RecordIdKeyRange, SurrealValue, ToSql, Value}; @@ -31,9 +30,7 @@ pub extern "system" fn Java_com_surrealdb_Surreal_beginTransaction<'local>( ptr: jlong, ) -> jlong { let surreal = get_surreal_ref!(&mut env, ptr, || 0); - match TOKIO_RUNTIME.block_on(async { - surreal.clone().begin().await - }) { + match TOKIO_RUNTIME.block_on(async { surreal.clone().begin().await }) { Ok(txn) => JniTypes::new_transaction(txn), Err(e) => SurrealError::from(e).exception(&mut env, || 0), } @@ -117,7 +114,9 @@ fn new_token_object<'local>( access: String, refresh: Option, ) -> StdResult { - let token_class = env.find_class("com/surrealdb/signin/Token").map_err(SurrealError::from)?; + let token_class = env + .find_class("com/surrealdb/signin/Token") + .map_err(SurrealError::from)?; let access_jstr = env.new_string(access).map_err(SurrealError::from)?; let refresh_jobj: JObject<'local> = match refresh { Some(s) => env.new_string(s).map_err(SurrealError::from)?.into(), @@ -128,7 +127,11 @@ fn new_token_object<'local>( JValue::Object(refresh_jobj.as_ref()), ]; let token_obj = env - .new_object(token_class, "(Ljava/lang/String;Ljava/lang/String;)V", &args) + .new_object( + token_class, + "(Ljava/lang/String;Ljava/lang/String;)V", + &args, + ) .map_err(SurrealError::from)?; Ok(token_obj.into_raw()) } @@ -138,7 +141,9 @@ fn new_ns_db_object<'local>( namespace: Option, database: Option, ) -> StdResult { - let ns_db_class = env.find_class("com/surrealdb/NsDb").map_err(SurrealError::from)?; + let ns_db_class = env + .find_class("com/surrealdb/NsDb") + .map_err(SurrealError::from)?; let ns_jobj: JObject<'local> = match namespace { Some(s) => env.new_string(s).map_err(SurrealError::from)?.into(), None => JObject::null(), @@ -152,7 +157,11 @@ fn new_ns_db_object<'local>( JValue::Object(db_jobj.as_ref()), ]; let ns_db_obj = env - .new_object(ns_db_class, "(Ljava/lang/String;Ljava/lang/String;)V", &args) + .new_object( + ns_db_class, + "(Ljava/lang/String;Ljava/lang/String;)V", + &args, + ) .map_err(SurrealError::from)?; Ok(ns_db_obj.into_raw()) } @@ -168,14 +177,7 @@ pub extern "system" fn Java_com_surrealdb_Surreal_signinRoot<'local>( let surreal = get_surreal_ref!(&mut env, ptr, null_mut); let username = get_rust_string!(&mut env, username, null_mut); let password = get_rust_string!(&mut env, password, null_mut); - match TOKIO_RUNTIME.block_on(async { - surreal - .signin(Root { - username, - password, - }) - .await - }) { + match TOKIO_RUNTIME.block_on(async { surreal.signin(Root { username, password }).await }) { Ok(token) => { let access = token.access.into_insecure_token(); let refresh = token.refresh.map(|r| r.into_insecure_token()); @@ -336,9 +338,7 @@ pub extern "system" fn Java_com_surrealdb_Surreal_authenticate<'local>( ) -> jboolean { let surreal = get_surreal_ref!(&mut env, ptr, || false as jboolean); let token_str = get_rust_string!(&mut env, token, || false as jboolean); - if let Err(err) = TOKIO_RUNTIME.block_on(async { - surreal.authenticate(token_str).await - }) { + if let Err(err) = TOKIO_RUNTIME.block_on(async { surreal.authenticate(token_str).await }) { return SurrealError::from(err).exception(&mut env, || false as jboolean); } true as jboolean @@ -743,7 +743,11 @@ pub extern "system" fn Java_com_surrealdb_Surreal_insertRelationTargetValues<'lo let value = get_value_mut_instance!(&mut env, *value_ptr, null_mut); records.push(value.to_sql()); } - let query = format!("INSERT RELATION INTO {} [ {} ]", target, records.join(" , ")); + let query = format!( + "INSERT RELATION INTO {} [ {} ]", + target, + records.join(" , ") + ); // Execute the query let res = surrealdb_query::<()>(&surreal, &query, None); // Check the result @@ -816,7 +820,11 @@ pub extern "system" fn Java_com_surrealdb_Surreal_relateContent<'local>( let to_value = get_value_instance!(&mut env, to_ptr, || 0); let content_value = get_value_mut_instance!(&mut env, content_ptr, || 0); // Execute the query - let query = format!("RELATE $from->{}->$to CONTENT {}", target, content_value.to_sql()); + let query = format!( + "RELATE $from->{}->$to CONTENT {}", + target, + content_value.to_sql() + ); let params = BTreeMap::from([ ("from".to_string(), from_value), ("to".to_string(), to_value), @@ -1107,10 +1115,7 @@ fn build_range_value( start: start_bound, end: end_bound, }; - let range_record_id = RecordId::new( - table.to_string(), - RecordIdKey::Range(Box::new(range)), - ); + let range_record_id = RecordId::new(table.to_string(), RecordIdKey::Range(Box::new(range))); Ok(Value::RecordId(range_record_id)) } @@ -1153,7 +1158,14 @@ pub extern "system" fn Java_com_surrealdb_Surreal_updateRecordIdValue<'local>( up_type: jint, value_ptr: jlong, ) -> jlong { - up_record_id_value(env, surreal_ptr, record_id_ptr, up_type, value_ptr, "update") + up_record_id_value( + env, + surreal_ptr, + record_id_ptr, + up_type, + value_ptr, + "update", + ) } #[no_mangle] @@ -1165,7 +1177,14 @@ pub extern "system" fn Java_com_surrealdb_Surreal_upsertRecordIdValue<'local>( up_type: jint, value_ptr: jlong, ) -> jlong { - up_record_id_value(env, surreal_ptr, record_id_ptr, up_type, value_ptr, "upsert") + up_record_id_value( + env, + surreal_ptr, + record_id_ptr, + up_type, + value_ptr, + "upsert", + ) } fn up_record_id_range_value( @@ -1216,7 +1235,14 @@ pub extern "system" fn Java_com_surrealdb_Surreal_updateRecordIdRangeValue<'loca value_ptr: jlong, ) -> jlong { up_record_id_range_value( - env, surreal_ptr, table, start_id_ptr, end_id_ptr, up_type, value_ptr, "update", + env, + surreal_ptr, + table, + start_id_ptr, + end_id_ptr, + up_type, + value_ptr, + "update", ) } @@ -1232,7 +1258,14 @@ pub extern "system" fn Java_com_surrealdb_Surreal_upsertRecordIdRangeValue<'loca value_ptr: jlong, ) -> jlong { up_record_id_range_value( - env, surreal_ptr, table, start_id_ptr, end_id_ptr, up_type, value_ptr, "upsert", + env, + surreal_ptr, + table, + start_id_ptr, + end_id_ptr, + up_type, + value_ptr, + "upsert", ) } diff --git a/src/main/rust/valuemut.rs b/src/main/rust/valuemut.rs index d7dbb32a..e258e547 100644 --- a/src/main/rust/valuemut.rs +++ b/src/main/rust/valuemut.rs @@ -8,7 +8,9 @@ use jni::objects::{JClass, JLongArray, JString}; use jni::sys::{jboolean, jdouble, jint, jlong, jstring}; use jni::JNIEnv; use rust_decimal::Decimal; -use surrealdb::types::{Array, Datetime, Duration, File, Number, Object, Table, ToSql, Uuid, Value}; +use surrealdb::types::{ + Array, Datetime, Duration, File, Number, Object, Table, ToSql, Uuid, Value, +}; use crate::error::SurrealError; use crate::{ @@ -133,8 +135,9 @@ pub extern "system" fn Java_com_surrealdb_ValueMut_newId<'local>( surrealdb::types::RecordIdKey::Object(o) => Value::Object(o.clone()), surrealdb::types::RecordIdKey::Range(_) => { return SurrealError::SurrealDBJni( - "Range-based IDs are not supported for Id serialization".to_string() - ).exception(&mut env, || 0); + "Range-based IDs are not supported for Id serialization".to_string(), + ) + .exception(&mut env, || 0); } }; return JniTypes::new_value_mut(key_value);