dmsc/java/classes/
cache.rs

1//! Copyright © 2025-2026 Wenze Wei. All Rights Reserved.
2//!
3//! This file is part of DMSC.
4//! The DMSC project belongs to the Dunimd Team.
5//!
6//! Licensed under the Apache License, Version 2.0 (the "License");
7//! You may not use this file except in compliance with the License.
8//! You may obtain a copy of the License at
9//!
10//!     http://www.apache.org/licenses/LICENSE-2.0
11//!
12//! Unless required by applicable law or agreed to in writing, software
13//! distributed under the License is distributed on an "AS IS" BASIS,
14//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15//! See the License for the specific language governing permissions and
16//! limitations under the License.
17
18//! # Cache Module JNI Bindings
19//!
20//! JNI bindings for DMSC cache classes.
21
22use jni::JNIEnv;
23use jni::objects::{JClass, JString};
24use jni::sys::{jlong, jboolean, jint, jstring};
25use crate::cache::{DMSCCacheModule, DMSCCacheConfig, DMSCCacheBackendType, DMSCCacheStats};
26use crate::java::exception::check_not_null;
27
28// =============================================================================
29// DMSCCacheModule JNI Bindings
30// =============================================================================
31
32#[no_mangle]
33pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_new0(
34    mut env: JNIEnv,
35    _class: JClass,
36    config_ptr: jlong,
37) -> jlong {
38    if !check_not_null(&mut env, config_ptr, "DMSCCacheConfig") {
39        return 0;
40    }
41    
42    let config = unsafe { &*(config_ptr as *const DMSCCacheConfig) };
43    let module = Box::new(DMSCCacheModule::new(config.clone()));
44    Box::into_raw(module) as jlong
45}
46
47#[no_mangle]
48pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_set(
49    mut env: JNIEnv,
50    _class: JClass,
51    ptr: jlong,
52    key: JString,
53    value: JString,
54    _ttl_secs: jlong,
55) {
56    if !check_not_null(&mut env, ptr, "DMSCCacheModule") {
57        return;
58    }
59    
60    let _module = unsafe { &*(ptr as *const DMSCCacheModule) };
61    let _key_str: String = env.get_string(&key)
62        .expect("Failed to get key")
63        .into();
64    let _value_str: String = env.get_string(&value)
65        .expect("Failed to get value")
66        .into();
67}
68
69#[no_mangle]
70pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_get(
71    mut env: JNIEnv,
72    _class: JClass,
73    ptr: jlong,
74    key: JString,
75) -> jstring {
76    if !check_not_null(&mut env, ptr, "DMSCCacheModule") {
77        return std::ptr::null_mut();
78    }
79    
80    let _module = unsafe { &*(ptr as *const DMSCCacheModule) };
81    let _key_str: String = env.get_string(&key)
82        .expect("Failed to get key")
83        .into();
84    
85    std::ptr::null_mut()
86}
87
88#[no_mangle]
89pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_delete(
90    mut env: JNIEnv,
91    _class: JClass,
92    ptr: jlong,
93    key: JString,
94) {
95    if !check_not_null(&mut env, ptr, "DMSCCacheModule") {
96        return;
97    }
98    
99    let _module = unsafe { &*(ptr as *const DMSCCacheModule) };
100    let _key_str: String = env.get_string(&key)
101        .expect("Failed to get key")
102        .into();
103}
104
105#[no_mangle]
106pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_exists(
107    mut env: JNIEnv,
108    _class: JClass,
109    ptr: jlong,
110    key: JString,
111) -> jboolean {
112    if !check_not_null(&mut env, ptr, "DMSCCacheModule") {
113        return 0;
114    }
115    
116    let _module = unsafe { &*(ptr as *const DMSCCacheModule) };
117    let _key_str: String = env.get_string(&key)
118        .expect("Failed to get key")
119        .into();
120    
121    0
122}
123
124#[no_mangle]
125pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_getStats(
126    mut env: JNIEnv,
127    _class: JClass,
128    ptr: jlong,
129) -> jlong {
130    if !check_not_null(&mut env, ptr, "DMSCCacheModule") {
131        return 0;
132    }
133    
134    let _module = unsafe { &*(ptr as *const DMSCCacheModule) };
135    
136    let stats = Box::new(DMSCCacheStats::default());
137    Box::into_raw(stats) as jlong
138}
139
140#[no_mangle]
141pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheModule_free0(
142    _env: JNIEnv,
143    _class: JClass,
144    ptr: jlong,
145) {
146    if ptr != 0 {
147        unsafe {
148            let _ = Box::from_raw(ptr as *mut DMSCCacheModule);
149        }
150    }
151}
152
153// =============================================================================
154// DMSCCacheConfig JNI Bindings
155// =============================================================================
156
157#[no_mangle]
158pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_new0(
159    _env: JNIEnv,
160    _class: JClass,
161) -> jlong {
162    let config = Box::new(DMSCCacheConfig::default());
163    Box::into_raw(config) as jlong
164}
165
166#[no_mangle]
167pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_setEnabled(
168    mut env: JNIEnv,
169    _class: JClass,
170    ptr: jlong,
171    enabled: jboolean,
172) {
173    if !check_not_null(&mut env, ptr, "DMSCCacheConfig") {
174        return;
175    }
176    
177    let config = unsafe { &mut *(ptr as *mut DMSCCacheConfig) };
178    config.enabled = enabled != 0;
179}
180
181#[no_mangle]
182pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_setDefaultTtlSecs(
183    mut env: JNIEnv,
184    _class: JClass,
185    ptr: jlong,
186    ttl: jlong,
187) {
188    if !check_not_null(&mut env, ptr, "DMSCCacheConfig") {
189        return;
190    }
191    
192    let config = unsafe { &mut *(ptr as *mut DMSCCacheConfig) };
193    config.default_ttl_secs = ttl as u64;
194}
195
196#[no_mangle]
197pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_setBackendType(
198    mut env: JNIEnv,
199    _class: JClass,
200    ptr: jlong,
201    backend_type: jint,
202) {
203    if !check_not_null(&mut env, ptr, "DMSCCacheConfig") {
204        return;
205    }
206    
207    let config = unsafe { &mut *(ptr as *mut DMSCCacheConfig) };
208    config.backend_type = match backend_type {
209        0 => DMSCCacheBackendType::Memory,
210        1 => DMSCCacheBackendType::Redis,
211        2 => DMSCCacheBackendType::Hybrid,
212        _ => DMSCCacheBackendType::Memory,
213    };
214}
215
216#[no_mangle]
217pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_setRedisUrl(
218    mut env: JNIEnv,
219    _class: JClass,
220    ptr: jlong,
221    url: JString,
222) {
223    if !check_not_null(&mut env, ptr, "DMSCCacheConfig") {
224        return;
225    }
226    
227    let config = unsafe { &mut *(ptr as *mut DMSCCacheConfig) };
228    config.redis_url = env.get_string(&url)
229        .expect("Failed to get redis url")
230        .into();
231}
232
233#[no_mangle]
234pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheConfig_free0(
235    _env: JNIEnv,
236    _class: JClass,
237    ptr: jlong,
238) {
239    if ptr != 0 {
240        unsafe {
241            let _ = Box::from_raw(ptr as *mut DMSCCacheConfig);
242        }
243    }
244}
245
246// =============================================================================
247// DMSCCacheStats JNI Bindings
248// =============================================================================
249
250#[no_mangle]
251pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheStats_getHits(
252    mut env: JNIEnv,
253    _class: JClass,
254    ptr: jlong,
255) -> jlong {
256    if !check_not_null(&mut env, ptr, "DMSCCacheStats") {
257        return 0;
258    }
259    
260    let stats = unsafe { &*(ptr as *const DMSCCacheStats) };
261    stats.hits as jlong
262}
263
264#[no_mangle]
265pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheStats_getMisses(
266    mut env: JNIEnv,
267    _class: JClass,
268    ptr: jlong,
269) -> jlong {
270    if !check_not_null(&mut env, ptr, "DMSCCacheStats") {
271        return 0;
272    }
273    
274    let stats = unsafe { &*(ptr as *const DMSCCacheStats) };
275    stats.misses as jlong
276}
277
278#[no_mangle]
279pub extern "system" fn Java_com_dunimd_dmsc_cache_DMSCCacheStats_free0(
280    _env: JNIEnv,
281    _class: JClass,
282    ptr: jlong,
283) {
284    if ptr != 0 {
285        unsafe {
286            let _ = Box::from_raw(ptr as *mut DMSCCacheStats);
287        }
288    }
289}