Skip to content

Commit 23368e4

Browse files
committed
Initial commit: high-performance Java driver for Stoolap
JNI-based Java driver calling stoolap::api directly via jni-rs (no C FFI layer). Includes a full JDBC driver, persistence tests, a benchmark suite matching the Python benchmark.py, and CI/publish workflows for Maven Central. Highlights: - io.stoolap package, groupId io.stoolap, version 0.4.0 - jni/ Rust crate (stoolap = "0.4.0" from crates.io) - 115 tests: 57 core API + 47 JDBC + 11 persistence - Benchmark vs SQLite JDBC (xerial) - GitHub Actions CI: build on macOS/Linux/Windows, test on Java 17/21/25 - Publish workflow: 5 platform binaries, GPG signed, central-publishing-maven-plugin
0 parents  commit 23368e4

26 files changed

Lines changed: 9481 additions & 0 deletions

.github/workflows/ci.yml

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
tags-ignore: ['**']
7+
pull_request:
8+
workflow_dispatch:
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
14+
jobs:
15+
build:
16+
strategy:
17+
fail-fast: false
18+
matrix:
19+
settings:
20+
- host: macos-latest
21+
target: aarch64-apple-darwin
22+
lib_file: libstoolap_jni.dylib
23+
resource_dir: darwin-aarch64
24+
- host: ubuntu-latest
25+
target: x86_64-unknown-linux-gnu
26+
lib_file: libstoolap_jni.so
27+
resource_dir: linux-x86_64
28+
- host: windows-latest
29+
target: x86_64-pc-windows-msvc
30+
lib_file: stoolap_jni.dll
31+
resource_dir: windows-x86_64
32+
33+
name: Build - ${{ matrix.settings.target }}
34+
runs-on: ${{ matrix.settings.host }}
35+
steps:
36+
- uses: actions/checkout@v4
37+
38+
- name: Install Rust
39+
uses: dtolnay/rust-toolchain@stable
40+
with:
41+
targets: ${{ matrix.settings.target }}
42+
43+
- name: Rust cache
44+
uses: Swatinem/rust-cache@v2
45+
with:
46+
workspaces: jni
47+
key: ${{ matrix.settings.target }}
48+
49+
- name: Build stoolap-jni
50+
working-directory: jni
51+
run: cargo build --release --target ${{ matrix.settings.target }}
52+
53+
- name: Strip shared library (macOS)
54+
if: runner.os == 'macOS'
55+
run: strip -x jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
56+
57+
- name: Strip shared library (Linux)
58+
if: runner.os == 'Linux'
59+
run: strip jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
60+
61+
- name: Upload native library
62+
uses: actions/upload-artifact@v4
63+
with:
64+
name: native-${{ matrix.settings.resource_dir }}
65+
path: jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
66+
if-no-files-found: error
67+
68+
test:
69+
name: Test - Java ${{ matrix.java }} (${{ matrix.settings.os }})
70+
needs: build
71+
strategy:
72+
fail-fast: false
73+
matrix:
74+
settings:
75+
- os: macos-latest
76+
artifact: native-darwin-aarch64
77+
lib_file: libstoolap_jni.dylib
78+
- os: ubuntu-latest
79+
artifact: native-linux-x86_64
80+
lib_file: libstoolap_jni.so
81+
- os: windows-latest
82+
artifact: native-windows-x86_64
83+
lib_file: stoolap_jni.dll
84+
java: ['17', '21', '25']
85+
runs-on: ${{ matrix.settings.os }}
86+
steps:
87+
- uses: actions/checkout@v4
88+
89+
- name: Set up JDK
90+
uses: actions/setup-java@v4
91+
with:
92+
distribution: 'temurin'
93+
java-version: ${{ matrix.java }}
94+
cache: maven
95+
96+
- name: Download native library
97+
uses: actions/download-artifact@v4
98+
with:
99+
name: ${{ matrix.settings.artifact }}
100+
path: native-lib
101+
102+
- name: Run tests
103+
shell: bash
104+
env:
105+
STOOLAP_LIB: ${{ github.workspace }}/native-lib/${{ matrix.settings.lib_file }}
106+
run: mvn -B test
107+
108+
format:
109+
name: Format check
110+
runs-on: ubuntu-latest
111+
steps:
112+
- uses: actions/checkout@v4
113+
114+
- name: Install Rust
115+
uses: dtolnay/rust-toolchain@stable
116+
with:
117+
components: rustfmt, clippy
118+
119+
- name: Check Rust formatting
120+
working-directory: jni
121+
run: cargo fmt --check
122+
123+
- name: Run clippy
124+
working-directory: jni
125+
run: cargo clippy --release -- -D warnings
126+
continue-on-error: true
127+
128+
- name: Set up JDK
129+
uses: actions/setup-java@v4
130+
with:
131+
distribution: 'temurin'
132+
java-version: '21'
133+
134+
- name: Install google-java-format
135+
run: |
136+
curl -sL -o google-java-format.jar \
137+
https://github.com/google/google-java-format/releases/download/v1.22.0/google-java-format-1.22.0-all-deps.jar
138+
139+
- name: Check Java formatting
140+
run: |
141+
find src -name "*.java" -print0 | xargs -0 java -jar google-java-format.jar --dry-run --set-exit-if-changed

.github/workflows/publish.yml

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
name: Publish
2+
3+
on:
4+
push:
5+
tags: ['v*']
6+
7+
permissions:
8+
contents: write
9+
10+
jobs:
11+
build:
12+
strategy:
13+
fail-fast: true
14+
matrix:
15+
settings:
16+
- host: macos-latest
17+
target: aarch64-apple-darwin
18+
lib_file: libstoolap_jni.dylib
19+
resource_dir: darwin-aarch64
20+
- host: macos-latest
21+
target: x86_64-apple-darwin
22+
lib_file: libstoolap_jni.dylib
23+
resource_dir: darwin-x86_64
24+
- host: ubuntu-latest
25+
target: x86_64-unknown-linux-gnu
26+
lib_file: libstoolap_jni.so
27+
resource_dir: linux-x86_64
28+
- host: ubuntu-latest
29+
target: aarch64-unknown-linux-gnu
30+
lib_file: libstoolap_jni.so
31+
resource_dir: linux-aarch64
32+
- host: windows-latest
33+
target: x86_64-pc-windows-msvc
34+
lib_file: stoolap_jni.dll
35+
resource_dir: windows-x86_64
36+
37+
name: Build - ${{ matrix.settings.target }}
38+
runs-on: ${{ matrix.settings.host }}
39+
steps:
40+
- uses: actions/checkout@v4
41+
42+
- name: Install Rust
43+
uses: dtolnay/rust-toolchain@stable
44+
with:
45+
targets: ${{ matrix.settings.target }}
46+
47+
- name: Install cross-compilation tools (aarch64-linux)
48+
if: matrix.settings.target == 'aarch64-unknown-linux-gnu'
49+
run: |
50+
sudo apt-get update
51+
sudo apt-get install -y gcc-aarch64-linux-gnu
52+
53+
- name: Rust cache
54+
uses: Swatinem/rust-cache@v2
55+
with:
56+
workspaces: jni
57+
key: ${{ matrix.settings.target }}
58+
59+
- name: Build stoolap-jni
60+
working-directory: jni
61+
env:
62+
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
63+
run: cargo build --release --target ${{ matrix.settings.target }}
64+
65+
- name: Strip shared library (macOS)
66+
if: runner.os == 'macOS'
67+
run: strip -x jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
68+
69+
- name: Strip shared library (Linux)
70+
if: runner.os == 'Linux'
71+
shell: bash
72+
run: |
73+
if [[ "${{ matrix.settings.target }}" == "aarch64-unknown-linux-gnu" ]]; then
74+
aarch64-linux-gnu-strip jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
75+
else
76+
strip jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
77+
fi
78+
79+
- name: Upload native library
80+
uses: actions/upload-artifact@v4
81+
with:
82+
name: native-${{ matrix.settings.resource_dir }}
83+
path: jni/target/${{ matrix.settings.target }}/release/${{ matrix.settings.lib_file }}
84+
if-no-files-found: error
85+
86+
test:
87+
name: Test - Java ${{ matrix.java }} (${{ matrix.settings.os }})
88+
needs: build
89+
strategy:
90+
fail-fast: true
91+
matrix:
92+
settings:
93+
- os: macos-latest
94+
artifact: native-darwin-aarch64
95+
lib_file: libstoolap_jni.dylib
96+
- os: ubuntu-latest
97+
artifact: native-linux-x86_64
98+
lib_file: libstoolap_jni.so
99+
- os: windows-latest
100+
artifact: native-windows-x86_64
101+
lib_file: stoolap_jni.dll
102+
java: ['17', '21', '25']
103+
runs-on: ${{ matrix.settings.os }}
104+
steps:
105+
- uses: actions/checkout@v4
106+
107+
- name: Set up JDK
108+
uses: actions/setup-java@v4
109+
with:
110+
distribution: 'temurin'
111+
java-version: ${{ matrix.java }}
112+
cache: maven
113+
114+
- name: Download native library
115+
uses: actions/download-artifact@v4
116+
with:
117+
name: ${{ matrix.settings.artifact }}
118+
path: native-lib
119+
120+
- name: Run tests
121+
shell: bash
122+
env:
123+
STOOLAP_LIB: ${{ github.workspace }}/native-lib/${{ matrix.settings.lib_file }}
124+
run: mvn -B test
125+
126+
publish:
127+
name: Publish to Maven Central
128+
needs: [build, test]
129+
runs-on: ubuntu-latest
130+
environment: maven-central
131+
steps:
132+
- uses: actions/checkout@v4
133+
134+
- name: Set up JDK
135+
uses: actions/setup-java@v4
136+
with:
137+
distribution: 'temurin'
138+
java-version: '21'
139+
cache: maven
140+
server-id: central
141+
server-username: MAVEN_USERNAME
142+
server-password: MAVEN_PASSWORD
143+
gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
144+
gpg-passphrase: MAVEN_GPG_PASSPHRASE
145+
146+
- name: Extract version
147+
id: version
148+
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
149+
150+
- name: Update pom.xml version
151+
run: mvn -B versions:set -DnewVersion=${{ steps.version.outputs.VERSION }} -DgenerateBackupPoms=false
152+
153+
- name: Download all native libraries
154+
uses: actions/download-artifact@v4
155+
with:
156+
path: artifacts
157+
158+
- name: Bundle native libraries into JAR resources
159+
run: |
160+
mkdir -p src/main/resources/native
161+
for dir in darwin-aarch64 darwin-x86_64 linux-x86_64 linux-aarch64 windows-x86_64; do
162+
mkdir -p src/main/resources/native/$dir
163+
cp artifacts/native-$dir/* src/main/resources/native/$dir/
164+
done
165+
echo "Bundled native libraries:"
166+
find src/main/resources/native -type f
167+
168+
- name: Build, sign, and deploy
169+
env:
170+
MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
171+
MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
172+
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
173+
run: mvn -B -P release deploy
174+
175+
- name: Prepare release assets
176+
run: |
177+
mkdir -p release
178+
declare -A NAMES=(
179+
["darwin-aarch64"]="libstoolap_jni-darwin-arm64.dylib"
180+
["darwin-x86_64"]="libstoolap_jni-darwin-x64.dylib"
181+
["linux-x86_64"]="libstoolap_jni-linux-x64.so"
182+
["linux-aarch64"]="libstoolap_jni-linux-arm64.so"
183+
["windows-x86_64"]="stoolap_jni-windows-x64.dll"
184+
)
185+
for target in "${!NAMES[@]}"; do
186+
src=$(ls artifacts/native-${target}/*)
187+
dest="release/${NAMES[$target]}"
188+
cp "$src" "$dest"
189+
done
190+
# JAR artifacts
191+
cp target/stoolap-java-${{ steps.version.outputs.VERSION }}.jar release/ || true
192+
cp target/stoolap-java-${{ steps.version.outputs.VERSION }}-sources.jar release/ || true
193+
cp target/stoolap-java-${{ steps.version.outputs.VERSION }}-javadoc.jar release/ || true
194+
195+
- name: Create GitHub Release
196+
uses: softprops/action-gh-release@v2
197+
with:
198+
tag_name: v${{ steps.version.outputs.VERSION }}
199+
generate_release_notes: true
200+
files: release/*

.gitignore

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Maven
2+
target/
3+
*.class
4+
*.jar
5+
*.war
6+
*.ear
7+
.mvn/wrapper/maven-wrapper.jar
8+
.mvn/wrapper/maven-wrapper.properties
9+
dependency-reduced-pom.xml
10+
buildNumber.properties
11+
release.properties
12+
13+
# Cargo / Rust
14+
jni/target/
15+
jni/Cargo.lock
16+
**/*.rs.bk
17+
*.pdb
18+
19+
# Native libraries (built locally)
20+
*.dylib
21+
*.so
22+
*.dll
23+
!src/main/resources/native/**/*.dylib
24+
!src/main/resources/native/**/*.so
25+
!src/main/resources/native/**/*.dll
26+
27+
# IDE
28+
.idea/
29+
*.iml
30+
*.ipr
31+
*.iws
32+
.vscode/
33+
.project
34+
.classpath
35+
.settings/
36+
.factorypath
37+
*.swp
38+
.DS_Store
39+
40+
# Logs
41+
*.log
42+
hs_err_pid*.log
43+
replay_pid*.log
44+
45+
# OS
46+
Thumbs.db

0 commit comments

Comments
 (0)