[Zodb-checkins] CVS: Zope/lib/python/Persistence - PersistentList.py:1.5 PersistentMapping.py:1.22 _Persistence.c:1.2 __init__.py:1.5

Jim Fulton cvs-admin at zope.org
Fri Nov 28 11:45:18 EST 2003


Update of /cvs-repository/Zope/lib/python/Persistence
In directory cvs.zope.org:/tmp/cvs-serv3783/lib/python/Persistence

Modified Files:
	__init__.py 
Added Files:
	PersistentList.py PersistentMapping.py _Persistence.c 
Log Message:
Merged Jeremy and Tim's changes from the zodb33-devel-branch.


=== Zope/lib/python/Persistence/PersistentList.py 1.4 => 1.5 ===
--- /dev/null	Fri Nov 28 11:45:18 2003
+++ Zope/lib/python/Persistence/PersistentList.py	Fri Nov 28 11:44:46 2003
@@ -0,0 +1,33 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+"""Python implementation of persistent list.
+
+$Id$"""
+
+__version__='$Revision$'[11:-2]
+
+import Persistence
+import persistent
+from persistent.list import PersistentList
+
+if Persistence.Persistent is not persistent.Persistent:
+    class PersistentList(Persistence.Persistent, PersistentList):
+        """Legacy persistent list class
+        
+        This class mixes in ExtensionClass Base if it is present.
+        
+        Unless you actually want ExtensionClass semantics, use
+        persistent.list.PersistentList instead.
+        """


=== Zope/lib/python/Persistence/PersistentMapping.py 1.21 => 1.22 ===
--- /dev/null	Fri Nov 28 11:45:18 2003
+++ Zope/lib/python/Persistence/PersistentMapping.py	Fri Nov 28 11:44:46 2003
@@ -0,0 +1,33 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+"""Python implementation of persistent base types
+
+$Id$"""
+
+__version__='$Revision$'[11:-2]
+
+import Persistence
+import persistent
+from persistent.mapping import PersistentMapping
+
+if Persistence.Persistent is not persistent.Persistent:
+    class PersistentMapping(Persistence.Persistent, PersistentMapping):
+        """Legacy persistent mapping class
+        
+        This class mixes in ExtensionClass Base if it is present.
+        
+        Unless you actually want ExtensionClass semantics, use
+        persistent.mapping.PersistentMapping instead.
+        """


=== Zope/lib/python/Persistence/_Persistence.c 1.1 => 1.2 ===
--- /dev/null	Fri Nov 28 11:45:18 2003
+++ Zope/lib/python/Persistence/_Persistence.c	Fri Nov 28 11:44:46 2003
@@ -0,0 +1,175 @@
+/*
+
+ Copyright (c) 2003 Zope Corporation and Contributors.
+ All Rights Reserved.
+
+ This software is subject to the provisions of the Zope Public License,
+ Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+ WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+ FOR A PARTICULAR PURPOSE.
+
+*/
+static char _Persistence_module_documentation[] = 
+"Persistent ExtensionClass\n"
+"\n"
+"$Id$\n"
+;
+
+#include "ExtensionClass.h"
+#include "cPersistence.h"
+
+
+/* convert_name() returns a new reference to a string name
+   or sets an exception and returns NULL.
+*/
+
+static PyObject *
+convert_name(PyObject *name)
+{
+#ifdef Py_USING_UNICODE
+    /* The Unicode to string conversion is done here because the
+       existing tp_setattro slots expect a string object as name
+       and we wouldn't want to break those. */
+    if (PyUnicode_Check(name)) {
+	name = PyUnicode_AsEncodedString(name, NULL, NULL);
+    }
+    else
+#endif
+    if (!PyString_Check(name)) {
+	PyErr_SetString(PyExc_TypeError, "attribute name must be a string");
+	return NULL;
+    } else
+	Py_INCREF(name);
+    return name;
+}
+
+/* Returns true if the object requires unghostification.
+
+   There are several special attributes that we allow access to without
+   requiring that the object be unghostified:
+   __class__
+   __del__
+   __dict__
+   __of__
+   __setstate__
+*/
+
+static int
+unghost_getattr(const char *s)
+{
+    if (*s++ != '_')
+	return 1;
+    if (*s == 'p') {
+	s++;
+	if (*s == '_')
+	    return 0; /* _p_ */
+	else
+	    return 1;
+    }
+    else if (*s == '_') {
+	s++;
+	switch (*s) {
+	case 'c':
+	    return strcmp(s, "class__");
+	case 'd':
+	    s++;
+	    if (!strcmp(s, "el__"))
+		return 0; /* __del__ */
+	    if (!strcmp(s, "ict__"))
+		return 0; /* __dict__ */
+	    return 1;
+	case 'o':
+	    return strcmp(s, "of__");
+	case 's':
+	    return strcmp(s, "setstate__");
+	default:
+	    return 1;
+	}
+    }
+    return 1;
+}
+
+static PyObject *
+P_getattr(cPersistentObject *self, PyObject *name)
+{
+  PyObject *v=NULL;
+  char *s;
+
+  name = convert_name(name);
+  if (!name)
+    return NULL;
+
+  s = PyString_AS_STRING(name);
+
+  if (*s != '_' || unghost_getattr(s)) 
+    {
+      if (PER_USE(self))
+        {
+          v = Py_FindAttr((PyObject*)self, name);
+          PER_ALLOW_DEACTIVATION(self);
+          PER_ACCESSED(self);
+        }
+    }
+  else
+    v = Py_FindAttr((PyObject*)self, name);
+
+  Py_DECREF(name);
+
+  return v;
+}
+
+
+static PyTypeObject Ptype = {
+	PyObject_HEAD_INIT(NULL)
+	/* ob_size           */ 0,
+	/* tp_name           */ "Persistence.Persistent",
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        /* tp_getattro       */ (getattrofunc)P_getattr,
+        0, 0,
+        /* tp_flags          */ Py_TPFLAGS_DEFAULT
+				| Py_TPFLAGS_BASETYPE ,
+	/* tp_doc            */ "Persistent ExtensionClass",
+};
+
+static struct PyMethodDef _Persistence_methods[] = {
+	{NULL,	 (PyCFunction)NULL, 0, NULL}		/* sentinel */
+};
+
+#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
+#define PyMODINIT_FUNC void
+#endif
+PyMODINIT_FUNC
+init_Persistence(void)
+{
+  PyObject *m;
+        
+  if (! ExtensionClassImported)
+    return;
+
+  cPersistenceCAPI = PyCObject_Import("persistent.cPersistence", "CAPI");
+  if (cPersistenceCAPI == NULL)
+    return;
+
+  Ptype.tp_bases = Py_BuildValue("OO", cPersistenceCAPI->pertype, ECBaseType);
+  if (Ptype.tp_bases == NULL)
+    return;
+  Ptype.tp_base = cPersistenceCAPI->pertype;
+  
+  Ptype.ob_type = ECExtensionClassType;
+  if (PyType_Ready(&Ptype) < 0)
+    return;
+        
+  /* Create the module and add the functions */
+  m = Py_InitModule3("_Persistence", _Persistence_methods,
+                     _Persistence_module_documentation);
+  
+  if (m == NULL)
+    return;
+  
+  /* Add types: */
+  if (PyModule_AddObject(m, "Persistent", (PyObject *)&Ptype) < 0)
+    return;
+}
+


=== Zope/lib/python/Persistence/__init__.py 1.4 => 1.5 ===
--- Zope/lib/python/Persistence/__init__.py:1.4	Wed Aug 14 17:43:18 2002
+++ Zope/lib/python/Persistence/__init__.py	Fri Nov 28 11:44:46 2003
@@ -1,6 +1,6 @@
 ##############################################################################
 #
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# Copyright (c) 2001, 2002, 2003 Zope Corporation and Contributors.
 # All Rights Reserved.
 #
 # This software is subject to the provisions of the Zope Public License,
@@ -11,10 +11,38 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
-"""Provide access to Persistent and PersistentMapping
+"""Persistence and ExtensionClass combined
 
-This avoids dependency on the database package name.
-
-While obviously there is nothing in this module, the correct names are
-inserted by the __init__.py in ZODB, jumpstarting the process.
+$Id$
 """
+
+from persistent import PickleCache
+
+try:
+    from _Persistence import Persistent
+except:
+    from warnings import warn
+    warn("""Couldn't import the ExtensionClass-based base class
+
+    There are two possibilities:
+
+    1. You don't care about ExtensionClass. You are importing
+       Persistence because that's what you imported in the past.
+       In this case, you should really use the persistent package
+       instead:
+
+          >>> from persistent import Persistent
+          >>> from persistent.list import PersistentList
+          >>> from persistent.mapping import PersistentMapping
+
+    2. You want your classes to be ExtensionClasses. In this case,
+       you need to install the ExtensionClass package
+       separately. ExtensionClass is no-longer included with ZODB3.
+
+    """)
+
+    from persistent import Persistent
+
+Overridable = Persistent
+
+from PersistentMapping import PersistentMapping




More information about the Zodb-checkins mailing list