change language APIs to match the new Rust API

main
Ziyang Hu 2 years ago
parent ec65c8e6c8
commit a5ad6b5633

@ -7,6 +7,7 @@
*/
use std::collections::{BTreeMap, BTreeSet};
use std::fmt::{Display, Formatter};
use smartstring::{LazyCompact, SmartString};
@ -21,6 +22,15 @@ pub enum CallbackOp {
Rm,
}
impl Display for CallbackOp {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
CallbackOp::Put => f.write_str("Put"),
CallbackOp::Rm => f.write_str("Rm"),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub struct CallbackDeclaration {
pub(crate) dependent: SmartString<LazyCompact>,

@ -7,7 +7,7 @@
*/
use std::collections::BTreeMap;
use std::sync::atomic::{AtomicI32, Ordering};
use std::sync::Mutex;
use std::sync::{Arc, Mutex};
use jni::objects::{JClass, JString};
use jni::sys::{jboolean, jint, jstring};
@ -19,7 +19,7 @@ use cozo::*;
#[derive(Default)]
struct Handles {
current: AtomicI32,
dbs: Mutex<BTreeMap<i32, DbInstance>>,
dbs: Mutex<BTreeMap<i32, Arc<DbInstance>>>,
}
lazy_static! {
@ -29,7 +29,7 @@ lazy_static! {
};
}
fn get_db(id: i32) -> Option<DbInstance> {
fn get_db(id: i32) -> Option<Arc<DbInstance>> {
let dbs = HANDLES.dbs.lock().unwrap();
dbs.get(&id).cloned()
}
@ -49,7 +49,7 @@ pub extern "system" fn Java_org_cozodb_CozoJavaBridge_openDb(
Ok(db) => {
let id = HANDLES.current.fetch_add(1, Ordering::AcqRel);
let mut dbs = HANDLES.dbs.lock().unwrap();
dbs.insert(id, db);
dbs.insert(id, Arc::new(db));
id
}
Err(err) => {

@ -7,7 +7,7 @@
*/
use std::collections::BTreeMap;
use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::Mutex;
use std::sync::{Arc, Mutex};
use lazy_static::lazy_static;
use neon::prelude::*;
@ -17,7 +17,7 @@ use cozo::*;
#[derive(Default)]
struct Handles {
current: AtomicU32,
dbs: Mutex<BTreeMap<u32, DbInstance>>,
dbs: Mutex<BTreeMap<u32, Arc<DbInstance>>>,
}
lazy_static! {
@ -32,7 +32,7 @@ fn open_db(mut cx: FunctionContext) -> JsResult<JsNumber> {
Ok(db) => {
let id = HANDLES.current.fetch_add(1, Ordering::AcqRel);
let mut dbs = HANDLES.dbs.lock().unwrap();
dbs.insert(id, db);
dbs.insert(id, Arc::new(db));
Ok(cx.number(id))
}
Err(err) => {

@ -127,6 +127,25 @@ impl CozoDbPy {
Err(PyException::new_err(DB_CLOSED_MSG))
}
}
pub fn register_callback(&self, rel: &str, callback: &PyAny) -> PyResult<u32> {
if let Some(db) = &self.db {
let cb: Py<PyAny> = callback.into();
match db.register_callback(rel, move |op, new, old| {
Python::with_gil(|py| {
let callable = cb.as_ref(py);
let _ = callable.call0();
})
}) {
Ok(id) => Ok(id),
Err(err) => {
let reports = format_error_as_json(err, None).to_string();
Err(PyException::new_err(reports))
}
}
} else {
Err(PyException::new_err(DB_CLOSED_MSG))
}
}
pub fn run_query(&self, py: Python<'_>, query: &str, params: &str) -> String {
if let Some(db) = &self.db {
py.allow_threads(|| db.run_script_str(query, params))

Loading…
Cancel
Save