Commit 6a2b9187 authored by Jim Fulton's avatar Jim Fulton

Added a C API for calling readCurrent.

(This is indirectly tested by the BTree tests.)
parent b66cbcc0
...@@ -223,6 +223,29 @@ changed(cPersistentObject *self) ...@@ -223,6 +223,29 @@ changed(cPersistentObject *self)
return 0; return 0;
} }
static int
readCurrent(cPersistentObject *self)
{
if ((self->state == cPersistent_UPTODATE_STATE ||
self->state == cPersistent_STICKY_STATE)
&& self->jar && self->oid)
{
static PyObject *s_readCurrent=NULL;
PyObject *r;
if (s_readCurrent == NULL)
s_readCurrent = PyString_InternFromString("readCurrent");
r = PyObject_CallMethodObjArgs(self->jar, s_readCurrent, self, NULL);
if (r == NULL)
return -1;
Py_DECREF(r);
}
return 0;
}
static PyObject * static PyObject *
Per__p_deactivate(cPersistentObject *self) Per__p_deactivate(cPersistentObject *self)
{ {
...@@ -1262,9 +1285,10 @@ truecPersistenceCAPI = { ...@@ -1262,9 +1285,10 @@ truecPersistenceCAPI = {
accessed, accessed,
ghostify, ghostify,
(intfunctionwithpythonarg)Per_setstate, (intfunctionwithpythonarg)Per_setstate,
NULL /* The percachedel slot is initialized in cPickleCache.c when NULL, /* The percachedel slot is initialized in cPickleCache.c when
the module is loaded. It uses a function in a different the module is loaded. It uses a function in a different
shared library. */ shared library. */
readCurrent
}; };
void void
......
...@@ -103,6 +103,7 @@ typedef struct { ...@@ -103,6 +103,7 @@ typedef struct {
void (*ghostify)(cPersistentObject*); void (*ghostify)(cPersistentObject*);
int (*setstate)(PyObject*); int (*setstate)(PyObject*);
percachedelfunc percachedel; percachedelfunc percachedel;
int (*readCurrent)(cPersistentObject*);
} cPersistenceCAPIstruct; } cPersistenceCAPIstruct;
#define cPersistenceType cPersistenceCAPI->pertype #define cPersistenceType cPersistenceCAPI->pertype
...@@ -119,6 +120,9 @@ static cPersistenceCAPIstruct *cPersistenceCAPI; ...@@ -119,6 +120,9 @@ static cPersistenceCAPIstruct *cPersistenceCAPI;
#define PER_CHANGED(O) (cPersistenceCAPI->changed((cPersistentObject*)(O))) #define PER_CHANGED(O) (cPersistenceCAPI->changed((cPersistentObject*)(O)))
#define PER_READCURRENT(O, E) \
if (cPersistenceCAPI->readCurrent((cPersistentObject*)(O)) < 0) { E; }
#define PER_GHOSTIFY(O) (cPersistenceCAPI->ghostify((cPersistentObject*)(O))) #define PER_GHOSTIFY(O) (cPersistenceCAPI->ghostify((cPersistentObject*)(O)))
/* If the object is sticky, make it non-sticky, so that it can be ghostified. /* If the object is sticky, make it non-sticky, so that it can be ghostified.
......
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