[Zodb-checkins] SVN: ZODB/trunk/src/BTrees/ Added toString and fromString methods to fsBuckets as a faster

Jim Fulton jim at zope.com
Tue Feb 2 11:50:44 EST 2010


Log message for revision 108719:
  Added toString and fromString methods to fsBuckets as a faster
  alternative to __getstate__ and __setstate__.
  
  Also made it possible to add extra bucket methods.
  

Changed:
  U   ZODB/trunk/src/BTrees/BucketTemplate.c
  U   ZODB/trunk/src/BTrees/_fsBTree.c
  A   ZODB/trunk/src/BTrees/tests/test_fsBTree.py

-=-
Modified: ZODB/trunk/src/BTrees/BucketTemplate.c
===================================================================
--- ZODB/trunk/src/BTrees/BucketTemplate.c	2010-02-02 16:43:24 UTC (rev 108718)
+++ ZODB/trunk/src/BTrees/BucketTemplate.c	2010-02-02 16:50:44 UTC (rev 108719)
@@ -1582,6 +1582,10 @@
     {"iteritems", (PyCFunction) Bucket_iteritems,    METH_KEYWORDS,
      "B.iteritems([min[,max]]) -> an iterator over the (key, value) items of B"},
 
+#ifdef EXTRA_BUCKET_METHODS
+    EXTRA_BUCKET_METHODS
+#endif
+
 #ifdef PERSISTENT
     {"_p_resolveConflict", (PyCFunction) bucket__p_resolveConflict,
      METH_VARARGS,

Modified: ZODB/trunk/src/BTrees/_fsBTree.c
===================================================================
--- ZODB/trunk/src/BTrees/_fsBTree.c	2010-02-02 16:43:24 UTC (rev 108718)
+++ ZODB/trunk/src/BTrees/_fsBTree.c	2010-02-02 16:50:44 UTC (rev 108719)
@@ -67,4 +67,88 @@
       (STATUS)=0; }
 
 #define NORMALIZE_VALUE(V, MIN)
+
+#include "Python.h"
+
+static PyObject *bucket_toString(PyObject *self);
+
+static PyObject *bucket_fromString(PyObject *self, PyObject *state);
+
+#define EXTRA_BUCKET_METHODS \
+    {"toString", (PyCFunction) bucket_toString,	METH_NOARGS, \
+     "toString() -- Return the state as a string"}, \
+    {"fromString", (PyCFunction) bucket_fromString,	METH_O, \
+     "fromString(s) -- Set the state of the object from a string"}, \
+
 #include "BTreeModuleTemplate.c"
+
+static PyObject *
+bucket_toString(PyObject *oself)
+{
+  Bucket *self = (Bucket *)oself;
+  PyObject *items = NULL;
+  int len;
+
+  PER_USE_OR_RETURN(self, NULL);
+
+  len = self->len;
+
+  items = PyString_FromStringAndSize(NULL, len*8);
+  if (items == NULL)
+    goto err;
+  memcpy(PyString_AS_STRING(items),       self->keys,   len*2);
+  memcpy(PyString_AS_STRING(items)+len*2, self->values, len*6);
+  
+  PER_UNUSE(self);
+  return items;
+  
+ err:
+  PER_UNUSE(self);
+  Py_XDECREF(items);
+  return NULL;
+}
+
+static PyObject *
+bucket_fromString(PyObject *oself, PyObject *state)
+{
+  Bucket *self = (Bucket *)oself;
+  int len;
+  KEY_TYPE *keys;
+  VALUE_TYPE *values;
+
+  len = PyString_Size(state);
+  if (len < 0)
+    return NULL;
+  
+  if (len%8)
+    {
+      PyErr_SetString(PyExc_ValueError, "state string of wrong size");
+      return NULL;
+    }
+  len /= 8;
+
+  if (self->next) {
+    Py_DECREF(self->next);
+    self->next = NULL;
+  }
+
+  if (len > self->size) {
+    keys = BTree_Realloc(self->keys, sizeof(KEY_TYPE)*len);
+    if (keys == NULL)
+      return NULL;
+    values = BTree_Realloc(self->values, sizeof(VALUE_TYPE)*len);
+    if (values == NULL)
+      return NULL;
+    self->keys = keys;
+    self->values = values;
+    self->size = len;
+  }
+
+  memcpy(self->keys,   PyString_AS_STRING(state),       len*2);
+  memcpy(self->values, PyString_AS_STRING(state)+len*2, len*6);
+
+  self->len = len;
+
+  Py_INCREF(self);
+  return (PyObject *)self;
+}

Added: ZODB/trunk/src/BTrees/tests/test_fsBTree.py
===================================================================
--- ZODB/trunk/src/BTrees/tests/test_fsBTree.py	                        (rev 0)
+++ ZODB/trunk/src/BTrees/tests/test_fsBTree.py	2010-02-02 16:50:44 UTC (rev 108719)
@@ -0,0 +1,36 @@
+##############################################################################
+#
+# Copyright (c) 2010 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (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.
+#
+##############################################################################
+import unittest
+from zope.testing import doctest
+
+def test_fsbucket_string_conversion():
+    """
+fsBuckets have toString and fromString methods that can be used to
+get and set their state very efficiently:
+
+    >>> from BTrees.fsBTree import fsBucket
+    >>> b = fsBucket([(c*2, c*6) for c in 'abcdef'])
+    >>> import pprint
+    >>> b.toString()
+    'aabbccddeeffaaaaaabbbbbbccccccddddddeeeeeeffffff'
+
+    >>> b2 = fsBucket().fromString(b.toString())
+    >>> b.__getstate__() == b2.__getstate__()
+    True
+
+    """
+
+def test_suite():
+    return doctest.DocTestSuite()
+


Property changes on: ZODB/trunk/src/BTrees/tests/test_fsBTree.py
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native



More information about the Zodb-checkins mailing list