[Checkins] SVN: persistent/trunk/persistent/cPersistence.c Expose '_p_status' and '_p_sticky' from C Persistent.
Tres Seaver
tseaver at palladion.com
Tue Feb 22 19:32:21 EST 2011
Log message for revision 120524:
Expose '_p_status' and '_p_sticky' from C Persistent.
Changed:
U persistent/trunk/persistent/cPersistence.c
-=-
Modified: persistent/trunk/persistent/cPersistence.c
===================================================================
--- persistent/trunk/persistent/cPersistence.c 2011-02-22 22:53:41 UTC (rev 120523)
+++ persistent/trunk/persistent/cPersistence.c 2011-02-23 00:32:20 UTC (rev 120524)
@@ -32,6 +32,7 @@
static PyObject *py___getattr__, *py___setattr__, *py___delattr__;
static PyObject *py___slotnames__, *copy_reg_slotnames, *__newobj__;
static PyObject *py___getnewargs__, *py___getstate__;
+static PyObject *py_unsaved, *py_ghost, *py_saved, *py_changed, *py_sticky;
static int
@@ -52,6 +53,11 @@
INIT_STRING(__slotnames__);
INIT_STRING(__getnewargs__);
INIT_STRING(__getstate__);
+ INIT_STRING(unsaved);
+ INIT_STRING(ghost);
+ INIT_STRING(saved);
+ INIT_STRING(changed);
+ INIT_STRING(sticky);
#undef INIT_STRING
return 0;
}
@@ -1135,6 +1141,62 @@
return 0;
}
+static PyObject *
+Per_get_status(cPersistentObject *self)
+{
+ PyObject *result = NULL;
+
+ if (!self->jar) {
+ result = py_unsaved;
+ } else {
+ switch (self->state) {
+ case cPersistent_GHOST_STATE:
+ result = py_ghost;
+ break;
+ case cPersistent_STICKY_STATE:
+ result = py_sticky;
+ break;
+ case cPersistent_UPTODATE_STATE:
+ result = py_saved;
+ break;
+ case cPersistent_CHANGED_STATE:
+ result = py_changed;
+ break;
+ }
+ }
+
+ if (result) {
+ Py_INCREF(result);
+ }
+ return result;
+}
+
+static PyObject*
+Per_get_sticky(cPersistentObject *self)
+{
+ return PyBool_FromLong(self->state == cPersistent_STICKY_STATE);
+}
+
+static int
+Per_set_sticky(cPersistentObject *self, PyObject* value)
+{
+ if (self->state < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "can't set sticky flag on a ghost");
+ return -1;
+ }
+ if (self->jar)
+ {
+ if (PyObject_IsTrue(value))
+ {
+ self->state = cPersistent_STICKY_STATE;
+ } else {
+ self->state = cPersistent_UPTODATE_STATE;
+ }
+ }
+ return 0;
+}
+
static PyGetSetDef Per_getsets[] = {
{"_p_changed", (getter)Per_get_changed, (setter)Per_set_changed},
{"_p_jar", (getter)Per_get_jar, (setter)Per_set_jar},
@@ -1145,6 +1207,8 @@
{"_p_estimated_size",
(getter)Per_get_estimated_size, (setter)Per_set_estimated_size
},
+ {"_p_status", (getter)Per_get_status},
+ {"_p_sticky", (getter)Per_get_sticky, (setter)Per_set_sticky},
{NULL}
};
More information about the checkins
mailing list