Core: support multiple active transactions

This commit is contained in:
theo-vt
2026-03-14 12:15:46 -04:00
parent d90c88f0fc
commit f4665aa7b5
245 changed files with 3541 additions and 2040 deletions
+9 -8
View File
@@ -242,9 +242,7 @@ PyMethodDef ApplicationPy::Methods[] = {
METH_VARARGS,
"setActiveTransaction(name, persist=False) -- setup active transaction with the given name\n\n"
"name: the transaction name\n"
"persist(False): by default, if the calling code is inside any invocation of a command, it\n"
" will be auto closed once all commands within the current stack exists. To\n"
" disable auto closing, set persist=True\n"
"persist(False): This parameter has no effect and is kept for compatibility reasonss"
"Returns the transaction ID for the active transaction. An application-wide\n"
"active transaction causes any document changes to open a transaction with\n"
"the given name and ID."},
@@ -1201,14 +1199,14 @@ PyObject* ApplicationPy::sGetDependentObjects(PyObject* /*self*/, PyObject* args
PyObject* ApplicationPy::sSetActiveTransaction(PyObject* /*self*/, PyObject* args)
{
char* name {};
PyObject* persist = Py_False;
PyObject* persist = Py_False; // Not used
if (!PyArg_ParseTuple(args, "s|O!", &name, &PyBool_Type, &persist)) {
return nullptr;
}
PY_TRY
{
Py::Long ret(GetApplication().setActiveTransaction(name, Base::asBoolean(persist)));
Py::Long ret(GetApplication().setActiveTransaction(TransactionName {.name=name, .temporary=false}));
return Py::new_reference_to(ret);
}
PY_CATCH;
@@ -1223,8 +1221,8 @@ PyObject* ApplicationPy::sGetActiveTransaction(PyObject* /*self*/, PyObject* arg
PY_TRY
{
int id = 0;
const char* name = GetApplication().getActiveTransaction(&id);
if (!name || id <= 0) {
std::string name = GetApplication().getActiveTransaction(&id);
if (name.empty() || id <= 0) {
Py_Return;
}
Py::Tuple ret(2);
@@ -1245,7 +1243,10 @@ PyObject* ApplicationPy::sCloseActiveTransaction(PyObject* /*self*/, PyObject* a
PY_TRY
{
GetApplication().closeActiveTransaction(Base::asBoolean(abort), id);
TransactionCloseMode mode = Base::asBoolean(abort)
? TransactionCloseMode::Abort
: TransactionCloseMode::Commit;
GetApplication().closeActiveTransaction(mode, id);
Py_Return;
}
PY_CATCH;