multi-transactions for Python

main
Ziyang Hu 2 years ago
parent 99a12b6868
commit f14140f786

@ -149,6 +149,11 @@ struct CozoDbPy {
db: Option<DbInstance>, db: Option<DbInstance>,
} }
#[pyclass]
struct CozoDbMulTx {
tx: MultiTransaction,
}
const DB_CLOSED_MSG: &str = r##"{"ok":false,"message":"database closed"}"##; const DB_CLOSED_MSG: &str = r##"{"ok":false,"message":"database closed"}"##;
#[pymethods] #[pymethods]
@ -303,10 +308,48 @@ impl CozoDbPy {
pub fn close(&mut self) -> bool { pub fn close(&mut self) -> bool {
self.db.take().is_some() self.db.take().is_some()
} }
pub fn multi_transact(&self, write: bool) -> PyResult<CozoDbMulTx> {
if let Some(db) = &self.db {
Ok(CozoDbMulTx {
tx: db.multi_transaction(write),
})
} else {
Err(PyException::new_err(DB_CLOSED_MSG.to_string()))
}
}
}
#[pymethods]
impl CozoDbMulTx {
pub fn abort(&self) -> PyResult<()> {
self.tx
.abort()
.map_err(|err| PyException::new_err(err.to_string()))
}
pub fn commit(&self) -> PyResult<()> {
self.tx
.commit()
.map_err(|err| PyException::new_err(err.to_string()))
}
pub fn run_script(&self, py: Python<'_>, query: &str, params: &PyDict) -> PyResult<PyObject> {
let params = convert_params(params)?;
match py.allow_threads(|| self.tx.run_script(query, params)) {
Ok(rows) => Ok(named_rows_to_py(rows, py)),
Err(err) => {
let reports = format_error_as_json(err, Some(query)).to_string();
let json_mod = py.import("json")?;
let loads_fn = json_mod.getattr("loads")?;
let args = PyTuple::new(py, [PyString::new(py, &reports)]);
let msg = loads_fn.call1(args)?;
Err(PyException::new_err(PyObject::from(msg)))
}
}
}
} }
#[pymodule] #[pymodule]
fn cozo_embedded(_py: Python<'_>, m: &PyModule) -> PyResult<()> { fn cozo_embedded(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
m.add_class::<CozoDbPy>()?; m.add_class::<CozoDbPy>()?;
m.add_class::<CozoDbMulTx>()?;
Ok(()) Ok(())
} }

Loading…
Cancel
Save