From a5ad6b56332c27dfa435ab26c60d65f3798c9368 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Fri, 13 Jan 2023 18:22:46 +0800 Subject: [PATCH] change language APIs to match the new Rust API --- cozo-core/src/runtime/callback.rs | 10 ++++++++++ cozo-lib-java/src/lib.rs | 8 ++++---- cozo-lib-nodejs/src/lib.rs | 6 +++--- cozo-lib-python/src/lib.rs | 19 +++++++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cozo-core/src/runtime/callback.rs b/cozo-core/src/runtime/callback.rs index c04f20e1..075574be 100644 --- a/cozo-core/src/runtime/callback.rs +++ b/cozo-core/src/runtime/callback.rs @@ -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, diff --git a/cozo-lib-java/src/lib.rs b/cozo-lib-java/src/lib.rs index c42a4e17..d61ea221 100644 --- a/cozo-lib-java/src/lib.rs +++ b/cozo-lib-java/src/lib.rs @@ -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>, + dbs: Mutex>>, } lazy_static! { @@ -29,7 +29,7 @@ lazy_static! { }; } -fn get_db(id: i32) -> Option { +fn get_db(id: i32) -> Option> { 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) => { diff --git a/cozo-lib-nodejs/src/lib.rs b/cozo-lib-nodejs/src/lib.rs index fc18dfde..ddc2e81d 100644 --- a/cozo-lib-nodejs/src/lib.rs +++ b/cozo-lib-nodejs/src/lib.rs @@ -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>, + dbs: Mutex>>, } lazy_static! { @@ -32,7 +32,7 @@ fn open_db(mut cx: FunctionContext) -> JsResult { 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) => { diff --git a/cozo-lib-python/src/lib.rs b/cozo-lib-python/src/lib.rs index 7d749b17..aedfa8a2 100644 --- a/cozo-lib-python/src/lib.rs +++ b/cozo-lib-python/src/lib.rs @@ -127,6 +127,25 @@ impl CozoDbPy { Err(PyException::new_err(DB_CLOSED_MSG)) } } + pub fn register_callback(&self, rel: &str, callback: &PyAny) -> PyResult { + if let Some(db) = &self.db { + let cb: Py = 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))