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::collections::{BTreeMap, BTreeSet};
use std::fmt::{Display, Formatter};
use smartstring::{LazyCompact, SmartString}; use smartstring::{LazyCompact, SmartString};
@ -21,6 +22,15 @@ pub enum CallbackOp {
Rm, 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"))] #[cfg(not(target_arch = "wasm32"))]
pub struct CallbackDeclaration { pub struct CallbackDeclaration {
pub(crate) dependent: SmartString<LazyCompact>, pub(crate) dependent: SmartString<LazyCompact>,

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

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

@ -127,6 +127,25 @@ impl CozoDbPy {
Err(PyException::new_err(DB_CLOSED_MSG)) 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 { pub fn run_query(&self, py: Python<'_>, query: &str, params: &str) -> String {
if let Some(db) = &self.db { if let Some(db) = &self.db {
py.allow_threads(|| db.run_script_str(query, params)) py.allow_threads(|| db.run_script_str(query, params))

Loading…
Cancel
Save