Commit bc697029 authored by matt@zope.com's avatar matt@zope.com

Raise ZODB.POSException.ConflictError inside of resolveConflict routines

instead of any other error that may be raised.
parent 904f8975
...@@ -115,6 +115,7 @@ ...@@ -115,6 +115,7 @@
static PyObject *sort_str, *reverse_str, *items_str, *__setstate___str; static PyObject *sort_str, *reverse_str, *items_str, *__setstate___str;
static PyObject *ConflictError = NULL;
static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;} static void PyVar_Assign(PyObject **v, PyObject *e) { Py_XDECREF(*v); *v=e;}
#define ASSIGN(V,E) PyVar_Assign(&(V),(E)) #define ASSIGN(V,E) PyVar_Assign(&(V),(E))
...@@ -340,7 +341,7 @@ static char BTree_module_documentation[] = ...@@ -340,7 +341,7 @@ static char BTree_module_documentation[] =
"\n" "\n"
MASTER_ID MASTER_ID
BTREEITEMSTEMPLATE_C BTREEITEMSTEMPLATE_C
"$Id: BTreeModuleTemplate.c,v 1.11 2001/04/03 15:02:17 jim Exp $\n" "$Id: BTreeModuleTemplate.c,v 1.12 2001/06/20 14:48:51 matt Exp $\n"
BTREETEMPLATE_C BTREETEMPLATE_C
BUCKETTEMPLATE_C BUCKETTEMPLATE_C
KEYMACROS_H KEYMACROS_H
...@@ -355,7 +356,7 @@ BTREEITEMSTEMPLATE_C ...@@ -355,7 +356,7 @@ BTREEITEMSTEMPLATE_C
void void
INITMODULE (void) INITMODULE (void)
{ {
PyObject *m, *d; PyObject *m, *d, *c;
UNLESS (sort_str=PyString_FromString("sort")) return; UNLESS (sort_str=PyString_FromString("sort")) return;
UNLESS (reverse_str=PyString_FromString("reverse")) return; UNLESS (reverse_str=PyString_FromString("reverse")) return;
...@@ -385,11 +386,28 @@ INITMODULE (void) ...@@ -385,11 +386,28 @@ INITMODULE (void)
TreeSetType.tp_setattro=cPersistenceCAPI->setattro; TreeSetType.tp_setattro=cPersistenceCAPI->setattro;
} }
else return; else return;
/* Grab the ConflictError class */
m = PyImport_ImportModule("ZODB.POSException");
if (m != NULL) {
c = PyObject_GetAttrString(m,"ConflictError");
if (c != NULL)
ConflictError = c;
else
ConflictError = PyExc_ValueError;
Py_DECREF(m);
} else ConflictError = PyExc_ValueError;
#else #else
BTreeType.tp_getattro=PyExtensionClassCAPI->getattro; BTreeType.tp_getattro=PyExtensionClassCAPI->getattro;
BucketType.tp_getattro=PyExtensionClassCAPI->getattro; BucketType.tp_getattro=PyExtensionClassCAPI->getattro;
SetType.tp_getattro=PyExtensionClassCAPI->getattro; SetType.tp_getattro=PyExtensionClassCAPI->getattro;
TreeSetType.tp_getattro=PyExtensionClassCAPI->getattro; TreeSetType.tp_getattro=PyExtensionClassCAPI->getattro;
ConflictError = PyExc_ValueError; /* MergeTemplate checks anyway */
#endif #endif
BTreeItemsType.ob_type=&PyType_Type; BTreeItemsType.ob_type=&PyType_Type;
...@@ -409,7 +427,7 @@ INITMODULE (void) ...@@ -409,7 +427,7 @@ INITMODULE (void)
d = PyModule_GetDict(m); d = PyModule_GetDict(m);
PyDict_SetItemString(d, "__version__", PyDict_SetItemString(d, "__version__",
PyString_FromString("$Revision: 1.11 $")); PyString_FromString("$Revision: 1.12 $"));
PyExtensionClass_Export(d,MOD_NAME_PREFIX "Bucket", BucketType); PyExtensionClass_Export(d,MOD_NAME_PREFIX "Bucket", BucketType);
PyExtensionClass_Export(d,MOD_NAME_PREFIX "BTree", BTreeType); PyExtensionClass_Export(d,MOD_NAME_PREFIX "BTree", BTreeType);
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
****************************************************************************/ ****************************************************************************/
#define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.16 2001/04/03 15:02:17 jim Exp $\n" #define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.17 2001/06/20 14:48:51 matt Exp $\n"
/* /*
** _BTree_get ** _BTree_get
...@@ -862,7 +862,19 @@ BTree__p_resolveConflict(BTree *self, PyObject *args) ...@@ -862,7 +862,19 @@ BTree__p_resolveConflict(BTree *self, PyObject *args)
else else
r = _bucket__p_resolveConflict(OBJECT(&SetType), s); r = _bucket__p_resolveConflict(OBJECT(&SetType), s);
if (r) ASSIGN(r, Py_BuildValue("((O))", r)); if (r) {
ASSIGN(r, Py_BuildValue("((O))", r));
} else {
PyObject *error;
PyObject *value;
PyObject *traceback;
/* Change any errors to ConflictErrors */
PyErr_Fetch(&error, &value, &traceback);
Py_INCREF(ConflictError);
Py_XDECREF(error);
PyErr_Restore(ConflictError, value, traceback);
}
return r; return r;
} }
......
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
****************************************************************************/ ****************************************************************************/
#define BUCKETTEMPLATE_C "$Id: BucketTemplate.c,v 1.14 2001/04/03 15:02:17 jim Exp $\n" #define BUCKETTEMPLATE_C "$Id: BucketTemplate.c,v 1.15 2001/06/20 14:48:51 matt Exp $\n"
/* /*
** _bucket_get ** _bucket_get
...@@ -1120,10 +1120,23 @@ static PyObject * ...@@ -1120,10 +1120,23 @@ static PyObject *
bucket__p_resolveConflict(Bucket *self, PyObject *args) bucket__p_resolveConflict(Bucket *self, PyObject *args)
{ {
PyObject *s[3]; PyObject *s[3];
PyObject *result;
UNLESS(PyArg_ParseTuple(args, "OOO", &s[0], &s[1], &s[2])) return NULL; UNLESS(PyArg_ParseTuple(args, "OOO", &s[0], &s[1], &s[2])) return NULL;
return _bucket__p_resolveConflict(OBJECT(self->ob_type), s); result = _bucket__p_resolveConflict(OBJECT(self->ob_type), s);
/* Change any errors to ConflictErrors */
if (result == NULL) {
PyObject *error;
PyObject *value;
PyObject *traceback;
PyErr_Fetch(&error, &value, &traceback);
Py_INCREF(ConflictError);
Py_XDECREF(error);
PyErr_Restore(ConflictError, value, traceback);
}
} }
#endif #endif
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
****************************************************************************/ ****************************************************************************/
#define MERGETEMPLATE_C "$Id: MergeTemplate.c,v 1.5 2001/04/03 15:02:17 jim Exp $\n" #define MERGETEMPLATE_C "$Id: MergeTemplate.c,v 1.6 2001/06/20 14:48:51 matt Exp $\n"
/**************************************************************************** /****************************************************************************
Set operations Set operations
...@@ -110,7 +110,8 @@ merge_error(int p1, int p2, int p3, int reason) ...@@ -110,7 +110,8 @@ merge_error(int p1, int p2, int p3, int reason)
PyObject *r; PyObject *r;
UNLESS (r=Py_BuildValue("iiii", p1, p2, p3, reason)) r=Py_None; UNLESS (r=Py_BuildValue("iiii", p1, p2, p3, reason)) r=Py_None;
PyErr_SetObject(PyExc_ValueError, r); if (ConflictError == NULL) ConflictError=PyExc_ValueError;
PyErr_SetObject(ConflictError, r);
if (r != Py_None) if (r != Py_None)
{ {
Py_DECREF(r); Py_DECREF(r);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment