[Zope3-checkins] CVS: Zope3/src/zodb/btrees - BTreeModuleTemplate.c:1.3 BTreeTemplate.c:1.3 BucketTemplate.c:1.4 SetOpTemplate.c:1.3 SetTemplate.c:1.3 TreeSetTemplate.c:1.3 interfaces.py:1.8

Tim Peters tim.one@comcast.net
Fri, 21 Feb 2003 12:33:32 -0500


Update of /cvs-repository/Zope3/src/zodb/btrees
In directory cvs.zope.org:/tmp/cvs-serv15826/src/zodb/btrees

Modified Files:
	BTreeModuleTemplate.c BTreeTemplate.c BucketTemplate.c 
	SetOpTemplate.c SetTemplate.c TreeSetTemplate.c interfaces.py 
Log Message:
Steve Alexander made a strong case to Jim Fulton for extending BTree-ish
range searches to allow for the optional exclusion of an endpoint (like
finding all the items in a BTree with key strictly less than some path-
like string -- it can be very difficult to express this as a "less than
or equal to" range search).

This checkin doesn't implement that yet, but does the large amount of
mostly-mechanical fiddling needed just to give these methods keyword
arguments:

    keys()
for
    BTree, TreeSet, Bucket, Set

and

    values(), items()
for
    BTree, Bucket

and
    itervalues(), iteritems()
for
    BTree

and
    iterkeys()
for
    BTree, TreeSet

btrees/interfaces.py also documents the new interface (although, again,
it isn't yet implemented).


=== Zope3/src/zodb/btrees/BTreeModuleTemplate.c 1.2 => 1.3 ===
--- Zope3/src/zodb/btrees/BTreeModuleTemplate.c:1.2	Wed Dec 25 09:12:16 2002
+++ Zope3/src/zodb/btrees/BTreeModuleTemplate.c	Fri Feb 21 12:33:01 2003
@@ -332,6 +332,11 @@
     return r;
 }
 
+/* Shared keyword-argument list for BTree/Bucket
+ * (iter)?(keys|values|items)
+ */
+static char *search_keywords[] = {"min", "max", 0};
+
 #include "BTreeItemsTemplate.c"
 #include "BucketTemplate.c"
 #include "SetTemplate.c"


=== Zope3/src/zodb/btrees/BTreeTemplate.c 1.2 => 1.3 ===
--- Zope3/src/zodb/btrees/BTreeTemplate.c:1.2	Wed Dec 25 09:12:16 2002
+++ Zope3/src/zodb/btrees/BTreeTemplate.c	Fri Feb 21 12:33:01 2003
@@ -1374,7 +1374,7 @@
 **
 */
 static PyObject *
-BTree_rangeSearch(BTree *self, PyObject *args, char type)
+BTree_rangeSearch(BTree *self, PyObject *args, PyObject *kw, char type)
 {
   PyObject *f=0, *l=0;
   int rc;
@@ -1383,7 +1383,12 @@
   int lowoffset;
   int highoffset;
 
-  UNLESS (! args || PyArg_ParseTuple(args,"|OO",&f, &l)) return NULL;
+  if (args) {
+      if (! PyArg_ParseTupleAndKeywords(args, kw, "|OO",
+					search_keywords,
+					&f, &l))
+ 	  return NULL;
+  }
 
   PyPersist_INCREF(self);
   if (!PyPersist_IS_STICKY(self))
@@ -1501,27 +1506,27 @@
 ** BTree_keys
 */
 static PyObject *
-BTree_keys(BTree *self, PyObject *args)
+BTree_keys(BTree *self, PyObject *args, PyObject *kw)
 {
-    return BTree_rangeSearch(self, args, 'k');
+    return BTree_rangeSearch(self, args, kw, 'k');
 }
 
 /*
 ** BTree_values
 */
 static PyObject *
-BTree_values(BTree *self, PyObject *args)
+BTree_values(BTree *self, PyObject *args, PyObject *kw)
 {
-    return BTree_rangeSearch(self, args, 'v');
+    return BTree_rangeSearch(self, args, kw, 'v');
 }
 
 /*
 ** BTree_items
 */
 static PyObject *
-BTree_items(BTree *self, PyObject *args)
+BTree_items(BTree *self, PyObject *args, PyObject *kw)
 {
-    return BTree_rangeSearch(self, args, 'i');
+    return BTree_rangeSearch(self, args, kw, 'i');
 }
 
 static PyObject *
@@ -1542,7 +1547,7 @@
 
   UNLESS (r=PyList_New(0)) goto err;
 
-  it.set=BTree_rangeSearch(self, NULL, 'i');
+  it.set=BTree_rangeSearch(self, NULL, NULL, 'i');
   UNLESS(it.set) goto err;
 
   if (nextBTreeItems(&it) < 0) goto err;
@@ -1660,10 +1665,10 @@
  * Returns a BTreeIter object, or NULL if error.
  */
 static PyObject *
-buildBTreeIter(BTree *self, PyObject *args, char kind)
+buildBTreeIter(BTree *self, PyObject *args, PyObject *kw, char kind)
 {
     BTreeIter *result = NULL;
-    BTreeItems *items = (BTreeItems *)BTree_rangeSearch(self, args, kind);
+    BTreeItems *items = (BTreeItems *)BTree_rangeSearch(self, args, kw, kind);
 
     if (items) {
         result = BTreeIter_new(items);
@@ -1676,28 +1681,28 @@
 static PyObject *
 BTree_getiter(BTree *self)
 {
-    return buildBTreeIter(self, NULL, 'k');
+    return buildBTreeIter(self, NULL, NULL, 'k');
 }
 
 /* The implementation of BTree.iterkeys(). */
 static PyObject *
-BTree_iterkeys(BTree *self, PyObject *args)
+BTree_iterkeys(BTree *self, PyObject *args, PyObject *kw)
 {
-    return buildBTreeIter(self, args, 'k');
+    return buildBTreeIter(self, args, kw, 'k');
 }
 
 /* The implementation of BTree.itervalues(). */
 static PyObject *
-BTree_itervalues(BTree *self, PyObject *args)
+BTree_itervalues(BTree *self, PyObject *args, PyObject *kw)
 {
-    return buildBTreeIter(self, args, 'v');
+    return buildBTreeIter(self, args, kw, 'v');
 }
 
 /* The implementation of BTree.iteritems(). */
 static PyObject *
-BTree_iteritems(BTree *self, PyObject *args)
+BTree_iteritems(BTree *self, PyObject *args, PyObject *kw)
 {
-    return buildBTreeIter(self, args, 'i');
+    return buildBTreeIter(self, args, kw, 'i');
 }
 
 /* End of iterator support. */
@@ -1720,61 +1725,79 @@
     {"__getstate__", (PyCFunction) BTree_getstate,	METH_NOARGS,
      "__getstate__() -> state\n\n"
      "Return the picklable state of the BTree."},
+
     {"__setstate__", (PyCFunction) BTree_setstate,	METH_O,
      "__setstate__(state)\n\n"
      "Set the state of the BTree."},
+
     {"has_key",	(PyCFunction) BTree_has_key,	METH_O,
      "has_key(key)\n\n"
      "Return true if the BTree contains the given key."},
-    {"keys",	(PyCFunction) BTree_keys,	METH_VARARGS,
+
+    {"keys",	(PyCFunction) BTree_keys,	METH_KEYWORDS,
      "keys([min, max]) -> list of keys\n\n"
      "Returns the keys of the BTree.  If min and max are supplied, only\n"
      "keys greater than min and less than max are returned."},
-    {"values",	(PyCFunction) BTree_values,	METH_VARARGS,
+
+    {"values",	(PyCFunction) BTree_values,	METH_KEYWORDS,
      "values([min, max]) -> list of values\n\n"
      "Returns the values of the BTree.  If min and max are supplied, only\n"
      "values corresponding to keys greater than min and less than max are\n"
      "returned."},
-    {"items",	(PyCFunction) BTree_items,	METH_VARARGS,
+
+    {"items",	(PyCFunction) BTree_items,	METH_KEYWORDS,
      "items([min, max]) -> -- list of key, value pairs\n\n"
      "Returns the items of the BTree.  If min and max are supplied, only\n"
      "items with keys greater than min and less than max are returned."},
+
     {"byValue",	(PyCFunction) BTree_byValue,	METH_O,
      "byValue(min) ->  list of value, key pairs\n\n"
      "Returns list of value, key pairs where the value is >= min.  The\n"
      "list is sorted by value.  Note that items() returns keys in the\n"
      "opposite order."},
+
     {"get",	(PyCFunction) BTree_getm,	METH_VARARGS,
      "get(key[, default=None]) -> Value for key or default\n\n"
      "Return the value or the default if the key is not found."},
+
     {"maxKey", (PyCFunction) BTree_maxKey,	METH_VARARGS,
      "maxKey([max]) -> key\n\n"
      "Return the largest key in the BTree.  If max is specified, return\n"
      "the largest key <= max."},
+
     {"minKey", (PyCFunction) BTree_minKey,	METH_VARARGS,
      "minKey([mi]) -> key\n\n"
      "Return the smallest key in the BTree.  If min is specified, return\n"
      "the smallest key >= min."},
+
     {"clear",	(PyCFunction) BTree_clear,	METH_NOARGS,
      "clear()\n\nRemove all of the items from the BTree."},
+
     {"insert", (PyCFunction)BTree_addUnique, METH_VARARGS,
      "insert(key, value) -> 0 or 1\n\n"
      "Add an item if the key is not already used. Return 1 if the item was\n"
      "added, or 0 otherwise."},
+
     {"update",	(PyCFunction) Mapping_update,	METH_O,
      "update(collection)\n\n Add the items from the given collection."},
-    {"iterkeys", (PyCFunction) BTree_iterkeys,  METH_VARARGS,
+
+    {"iterkeys", (PyCFunction) BTree_iterkeys,  METH_KEYWORDS,
      "B.iterkeys([min[,max]]) -> an iterator over the keys of B"},
-    {"itervalues", (PyCFunction) BTree_itervalues,  METH_VARARGS,
+
+    {"itervalues", (PyCFunction) BTree_itervalues,  METH_KEYWORDS,
      "B.itervalues([min[,max]]) -> an iterator over the values of B"},
-    {"iteritems", (PyCFunction) BTree_iteritems,    METH_VARARGS,
+
+    {"iteritems", (PyCFunction) BTree_iteritems,    METH_KEYWORDS,
      "B.iteritems([min[,max]]) -> an iterator over the (key, value) items of B"},
+
     {"_check", (PyCFunction) BTree_check,       METH_NOARGS,
      "Perform sanity check on BTree, and raise exception if flawed."},
+
 #ifdef PERSISTENT
     {"_p_resolveConflict", (PyCFunction) BTree__p_resolveConflict,
      METH_VARARGS,
      "_p_resolveConflict() -- Reinitialize from a newly created copy"},
+
     {"_p_deactivate", (PyCFunction) BTree__p_deactivate,	METH_NOARGS,
      "_p_deactivate()\n\nReinitialize from a newly created copy."},
 #endif


=== Zope3/src/zodb/btrees/BucketTemplate.c 1.3 => 1.4 ===
--- Zope3/src/zodb/btrees/BucketTemplate.c:1.3	Sat Jan 11 01:35:04 2003
+++ Zope3/src/zodb/btrees/BucketTemplate.c	Fri Feb 21 12:33:01 2003
@@ -709,12 +709,17 @@
 }
 
 static int
-Bucket_rangeSearch(Bucket *self, PyObject *args, int *low, int *high)
+Bucket_rangeSearch(Bucket *self, PyObject *args, PyObject *kw,
+		   int *low, int *high)
 {
   PyObject *f=0, *l=0;
   int rc;
 
-  if (args && ! PyArg_ParseTuple(args,"|OO",&f, &l)) return -1;
+  if (args) {
+      if (! PyArg_ParseTupleAndKeywords(args, kw, "|OO", search_keywords,
+      					&f,  &l))
+      return -1;
+  }
 
   UNLESS (self->len) goto empty;
 
@@ -761,14 +766,14 @@
 ** Returns:	list of bucket keys
 */
 static PyObject *
-bucket_keys(Bucket *self, PyObject *args)
+bucket_keys(Bucket *self, PyObject *args, PyObject *kw)
 {
   PyObject *r = NULL, *key;
   int i, low, high;
 
   PER_USE_OR_RETURN(self, NULL);
 
-  if (Bucket_rangeSearch(self, args, &low, &high) < 0)
+  if (Bucket_rangeSearch(self, args, kw, &low, &high) < 0)
       goto err;
 
   r = PyList_New(high-low+1);
@@ -803,14 +808,14 @@
 ** Returns	list of values
 */
 static PyObject *
-bucket_values(Bucket *self, PyObject *args)
+bucket_values(Bucket *self, PyObject *args, PyObject *kw)
 {
   PyObject *r=0, *v;
   int i, low, high;
 
   PER_USE_OR_RETURN(self, NULL);
 
-  if (Bucket_rangeSearch(self, args, &low, &high) < 0) goto err;
+  if (Bucket_rangeSearch(self, args, kw, &low, &high) < 0) goto err;
 
   UNLESS (r=PyList_New(high-low+1)) goto err;
 
@@ -843,14 +848,14 @@
 ** Returns:	list of all items in the bucket
 */
 static PyObject *
-bucket_items(Bucket *self, PyObject *args)
+bucket_items(Bucket *self, PyObject *args, PyObject *kw)
 {
   PyObject *r=0, *o=0, *item=0;
   int i, low, high;
 
   PER_USE_OR_RETURN(self, NULL);
 
-  if (Bucket_rangeSearch(self, args, &low, &high) < 0) goto err;
+  if (Bucket_rangeSearch(self, args, kw, &low, &high) < 0) goto err;
 
   UNLESS (r=PyList_New(high-low+1)) goto err;
 
@@ -1246,14 +1251,15 @@
  * Returns a BTreeIter object, or NULL if error.
  */
 static PyObject *
-buildBucketIter(Bucket *self, PyObject *args, char kind)
+buildBucketIter(Bucket *self, PyObject *args, PyObject *kw, char kind)
 {
     BTreeItems *items;
     int lowoffset, highoffset;
     BTreeIter *result = NULL;
 
     PER_USE_OR_RETURN(self, NULL);
-    if (Bucket_rangeSearch(self, args, &lowoffset, &highoffset) < 0) goto Done;
+    if (Bucket_rangeSearch(self, args, kw, &lowoffset, &highoffset) < 0)
+        goto Done;
 
     items = (BTreeItems *)newBTreeItems(kind, self, lowoffset,
                                               self, highoffset);
@@ -1271,28 +1277,28 @@
 static PyObject *
 Bucket_getiter(Bucket *self)
 {
-    return buildBucketIter(self, NULL, 'k');
+    return buildBucketIter(self, NULL, NULL, 'k');
 }
 
 /* The implementation of Bucket.iterkeys(). */
 static PyObject *
-Bucket_iterkeys(Bucket *self, PyObject *args)
+Bucket_iterkeys(Bucket *self, PyObject *args, PyObject *kw)
 {
-    return buildBucketIter(self, args, 'k');
+    return buildBucketIter(self, args, kw, 'k');
 }
 
 /* The implementation of Bucket.itervalues(). */
 static PyObject *
-Bucket_itervalues(Bucket *self, PyObject *args)
+Bucket_itervalues(Bucket *self, PyObject *args, PyObject *kw)
 {
-    return buildBucketIter(self, args, 'v');
+    return buildBucketIter(self, args, kw, 'v');
 }
 
 /* The implementation of Bucket.iteritems(). */
 static PyObject *
-Bucket_iteritems(Bucket *self, PyObject *args)
+Bucket_iteritems(Bucket *self, PyObject *args, PyObject *kw)
 {
-    return buildBucketIter(self, args, 'i');
+    return buildBucketIter(self, args, kw, 'i');
 }
 
 /* End of iterator support. */
@@ -1378,42 +1384,58 @@
 static struct PyMethodDef Bucket_methods[] = {
     {"__getstate__", (PyCFunction) bucket_getstate,	METH_NOARGS,
      "__getstate__() -- Return the picklable state of the object"},
+
     {"__setstate__", (PyCFunction) bucket_setstate,	METH_O,
      "__setstate__() -- Set the state of the object"},
-    {"keys",	(PyCFunction) bucket_keys,	METH_VARARGS,
+
+    {"keys",	(PyCFunction) bucket_keys,	METH_KEYWORDS,
      "keys([min, max]) -- Return the keys"},
+
     {"has_key",	(PyCFunction) bucket_has_key,	METH_O,
      "has_key(key) -- Test whether the bucket contains the given key"},
+
     {"clear",	(PyCFunction) bucket_clear,	METH_VARARGS,
      "clear() -- Remove all of the items from the bucket"},
+
     {"update",	(PyCFunction) Mapping_update,	METH_O,
      "update(collection) -- Add the items from the given collection"},
+
     {"maxKey", (PyCFunction) Bucket_maxKey,	METH_VARARGS,
      "maxKey([key]) -- Fine the maximum key\n\n"
      "If an argument is given, find the maximum <= the argument"},
+
     {"minKey", (PyCFunction) Bucket_minKey,	METH_VARARGS,
      "minKey([key]) -- Fine the minimum key\n\n"
      "If an argument is given, find the minimum >= the argument"},
-    {"values",	(PyCFunction) bucket_values,	METH_VARARGS,
+
+    {"values",	(PyCFunction) bucket_values,	METH_KEYWORDS,
      "values([min, max]) -- Return the values"},
-    {"items",	(PyCFunction) bucket_items,	METH_VARARGS,
+
+    {"items",	(PyCFunction) bucket_items,	METH_KEYWORDS,
      "items([min, max])) -- Return the items"},
+
     {"byValue",	(PyCFunction) bucket_byValue,	METH_O,
      "byValue(min) -- "
      "Return value-keys with values >= min and reverse sorted by values"},
+
     {"get",	(PyCFunction) bucket_getm,	METH_VARARGS,
      "get(key[,default]) -- Look up a value\n\n"
      "Return the default (or None) if the key is not found."},
-    {"iterkeys", (PyCFunction) Bucket_iterkeys,  METH_VARARGS,
+
+    {"iterkeys", (PyCFunction) Bucket_iterkeys,  METH_KEYWORDS,
      "B.iterkeys([min[,max]]) -> an iterator over the keys of B"},
-    {"itervalues", (PyCFunction) Bucket_itervalues,  METH_VARARGS,
+
+    {"itervalues", (PyCFunction) Bucket_itervalues,  METH_KEYWORDS,
      "B.itervalues([min[,max]]) -> an iterator over the values of B"},
-    {"iteritems", (PyCFunction) Bucket_iteritems,    METH_VARARGS,
+
+    {"iteritems", (PyCFunction) Bucket_iteritems,    METH_KEYWORDS,
      "B.iteritems([min[,max]]) -> an iterator over the (key, value) items of B"},
+
 #ifdef PERSISTENT
     {"_p_resolveConflict", (PyCFunction) bucket__p_resolveConflict,
      METH_VARARGS,
      "_p_resolveConflict() -- Reinitialize from a newly created copy"},
+
     {"_p_deactivate", (PyCFunction) bucket__p_deactivate, METH_NOARGS,
      "_p_deactivate() -- Reinitialize from a newly created copy"},
 #endif
@@ -1551,7 +1573,7 @@
     char repr[10000];
     int rv;
 
-    i = bucket_items(self, NULL);
+    i = bucket_items(self, NULL, NULL);
     if (!i)
 	return NULL;
     r = PyObject_Repr(i);


=== Zope3/src/zodb/btrees/SetOpTemplate.c 1.2 => 1.3 ===
--- Zope3/src/zodb/btrees/SetOpTemplate.c:1.2	Wed Dec 25 09:12:16 2002
+++ Zope3/src/zodb/btrees/SetOpTemplate.c	Fri Feb 21 12:33:01 2003
@@ -124,7 +124,7 @@
     }
   else if (PyObject_IsInstance(s, (PyObject *)&BTreeType))
     {
-      i->set = BTree_rangeSearch(BTREE(s), NULL, 'i');
+      i->set = BTree_rangeSearch(BTREE(s), NULL, NULL, 'i');
       UNLESS(i->set) return -1;
 
       if (useValues)
@@ -137,7 +137,7 @@
     }
   else if (PyObject_IsInstance(s, (PyObject *)&TreeSetType))
     {
-      i->set = BTree_rangeSearch(BTREE(s), NULL, 'k');
+      i->set = BTree_rangeSearch(BTREE(s), NULL, NULL, 'k');
       UNLESS(i->set) return -1;
       i->next = nextTreeSetItems;
     }


=== Zope3/src/zodb/btrees/SetTemplate.c 1.2 => 1.3 ===
--- Zope3/src/zodb/btrees/SetTemplate.c:1.2	Wed Dec 25 09:12:16 2002
+++ Zope3/src/zodb/btrees/SetTemplate.c	Fri Feb 21 12:33:01 2003
@@ -168,30 +168,41 @@
 static struct PyMethodDef Set_methods[] = {
   {"__getstate__", (PyCFunction) bucket_getstate,	METH_VARARGS,
    "__getstate__() -- Return the picklable state of the object"},
+
   {"__setstate__", (PyCFunction) set_setstate,	METH_VARARGS,
    "__setstate__() -- Set the state of the object"},
-  {"keys",	(PyCFunction) bucket_keys,	METH_VARARGS,
+
+  {"keys",	(PyCFunction) bucket_keys,	METH_KEYWORDS,
      "keys() -- Return the keys"},
+
   {"has_key",	(PyCFunction) bucket_has_key,	METH_O,
      "has_key(key) -- Test whether the bucket contains the given key"},
+
   {"clear",	(PyCFunction) bucket_clear,	METH_VARARGS,
    "clear() -- Remove all of the items from the bucket"},
+
   {"maxKey", (PyCFunction) Bucket_maxKey,	METH_VARARGS,
-   "maxKey([key]) -- Fine the maximum key\n\n"
+   "maxKey([key]) -- Find the maximum key\n\n"
    "If an argument is given, find the maximum <= the argument"},
+
   {"minKey", (PyCFunction) Bucket_minKey,	METH_VARARGS,
-   "minKey([key]) -- Fine the minimum key\n\n"
+   "minKey([key]) -- Find the minimum key\n\n"
    "If an argument is given, find the minimum >= the argument"},
+
 #ifdef PERSISTENT
   {"_p_resolveConflict", (PyCFunction) bucket__p_resolveConflict, METH_VARARGS,
    "_p_resolveConflict() -- Reinitialize from a newly created copy"},
+
   {"_p_deactivate", (PyCFunction) bucket__p_deactivate, METH_VARARGS,
    "_p_deactivate() -- Reinitialize from a newly created copy"},
 #endif
+
   {"insert",	(PyCFunction)Set_insert,	METH_VARARGS,
    "insert(id,[ignored]) -- Add a key to the set"},
+
   {"update",	(PyCFunction)Set_update,	METH_VARARGS,
    "update(seq) -- Add the items from the given sequence to the set"},
+
   {"remove",	(PyCFunction)Set_remove,	METH_VARARGS,
    "remove(id) -- Remove an id from the set"},
 
@@ -222,11 +233,11 @@
 
   UNLESS (format) UNLESS (format=PyString_FromString(MOD_NAME_PREFIX "Set(%s)"))
     return NULL;
-  UNLESS (t=PyTuple_New(1)) return NULL;
-  UNLESS (r=bucket_keys(self,NULL)) goto err;
-  PyTuple_SET_ITEM(t,0,r);
-  r=t;
-  ASSIGN(r,PyString_Format(format,r));
+  UNLESS (t = PyTuple_New(1)) return NULL;
+  UNLESS (r = bucket_keys(self, NULL, NULL)) goto err;
+  PyTuple_SET_ITEM(t, 0, r);
+  r = t;
+  ASSIGN(r, PyString_Format(format, r));
   return r;
 err:
   Py_DECREF(t);


=== Zope3/src/zodb/btrees/TreeSetTemplate.c 1.2 => 1.3 ===
--- Zope3/src/zodb/btrees/TreeSetTemplate.c:1.2	Wed Dec 25 09:12:16 2002
+++ Zope3/src/zodb/btrees/TreeSetTemplate.c	Fri Feb 21 12:33:01 2003
@@ -118,37 +118,49 @@
   {"__getstate__", (PyCFunction) BTree_getstate,	METH_NOARGS,
    "__getstate__() -> state\n\n"
    "Return the picklable state of the TreeSet."},
+
   {"__setstate__", (PyCFunction) TreeSet_setstate,	METH_VARARGS,
    "__setstate__(state)\n\n"
    "Set the state of the TreeSet."},
+
   {"has_key",	(PyCFunction) BTree_has_key,	METH_O,
    "has_key(key)\n\n"
    "Return true if the TreeSet contains the given key."},
-  {"keys",	(PyCFunction) BTree_keys,	METH_VARARGS,
+
+  {"keys",	(PyCFunction) BTree_keys,	METH_KEYWORDS,
    "keys([min, max]) -> list of keys\n\n"
    "Returns the keys of the TreeSet.  If min and max are supplied, only\n"
    "keys greater than min and less than max are returned."},
+
   {"maxKey", (PyCFunction) BTree_maxKey,	METH_VARARGS,
    "maxKey([max]) -> key\n\n"
    "Return the largest key in the BTree.  If max is specified, return\n"
    "the largest key <= max."},
+
   {"minKey", (PyCFunction) BTree_minKey,	METH_VARARGS,
    "minKey([mi]) -> key\n\n"
    "Return the smallest key in the BTree.  If min is specified, return\n"
    "the smallest key >= min."},
+
   {"clear",	(PyCFunction) BTree_clear,	METH_NOARGS,
    "clear()\n\nRemove all of the items from the BTree."},
+
   {"insert",	(PyCFunction)TreeSet_insert,	METH_VARARGS,
    "insert(id,[ignored]) -- Add an id to the set"},
+
   {"update",	(PyCFunction)TreeSet_update,	METH_VARARGS,
    "update(collection)\n\n Add the items from the given collection."},
+
   {"remove",	(PyCFunction)TreeSet_remove,	METH_VARARGS,
    "remove(id) -- Remove a key from the set"},
+
   {"_check", (PyCFunction) BTree_check,       METH_NOARGS,
    "Perform sanity check on TreeSet, and raise exception if flawed."},
+
 #ifdef PERSISTENT
   {"_p_resolveConflict", (PyCFunction) BTree__p_resolveConflict, METH_VARARGS,
    "_p_resolveConflict() -- Reinitialize from a newly created copy"},
+
   {"_p_deactivate", (PyCFunction) BTree__p_deactivate,	METH_NOARGS,
    "_p_deactivate()\n\nReinitialize from a newly created copy."},
 #endif


=== Zope3/src/zodb/btrees/interfaces.py 1.7 => 1.8 ===
--- Zope3/src/zodb/btrees/interfaces.py:1.7	Fri Jan 17 11:44:33 2003
+++ Zope3/src/zodb/btrees/interfaces.py	Fri Feb 21 12:33:01 2003
@@ -98,20 +98,26 @@
     def has_key(key):
         """Check whether the object has an item with the given key"""
 
-    def keys(min=None, max=None):
-        """Return an IReadSequence containing the keys in the collection
+    def keys(min=None, max=None, excludemin=False, excludemax=False):
+        """Return an IReadSequence containing the keys in the collection.
 
-        The type of the IReadSequence is not specified. It could be a
-        list or a tuple or some other type.
+        The type of the IReadSequence is not specified. It could be a list
+        or a tuple or some other type.
 
-        If a min is specified, then output is constrained to
-        items having keys greater than or equal to the given min.
-        A min value of None is ignored.
-
-        If a max is specified, then output is constrained to
-        items having keys less than or equal to the given min.
-        A max value of None is ignored.
-        """
+        All arguments are optional, and may be specified as keyword
+        arguments, or by position.
+
+        If a min is specified, then output is constrained to keys greater
+        than or equal to the given min, and, if excludemin is specified and
+        true, is further constrained to keys strictly greater than min.  A
+        min value of None is ignored.  If min is None or not specified, and
+        excludemin is true, the smallest key is excluded.
+
+        If a max is specified, then output is constrained to keys less than
+        or equal to the given max, and, if excludemax is specified and
+        true, is further constrained to keys strictly less than max.  A max
+        value of None is ignored.  If max is None or not specified, and
+        excludemax is true, the largest key is excluded. """
 
     def maxKey(key=None):
         """Return the maximum key
@@ -167,36 +173,54 @@
         key-value tuples.
         """
 
-    def values(min=None, max=None):
-        """Return a IReadSequence containing the values in the collection
-
-        The type of the IReadSequence is not specified. It could be a
-        list or a tuple or some other type.
-
-        If a min is specified, then output is constrained to
-        items having keys greater than or equal to the given min.
-        A min value of None is ignored.
-
-        If a max is specified, then output is constrained to
-        items having keys less than or equal to the given max.
-        A max value of None is ignored.
-        """
-
-    def items(min=None, max=None):
-        """Return a IReadSequence containing the items in the collection
-
-        An item is a key-value tuple.
+    def values(min=None, max=None, excludemin=False, excludemax=False):
+        """Return an IReadSequence containing the values in the collection.
 
-        The type of the IReadSequence is not specified. It could be a
-        list or a tuple or some other type.
+        The type of the IReadSequence is not specified. It could be a list
+        or a tuple or some other type.
 
-        If a min is specified, then output is constrained to
-        items having keys greater than or equal to the given min.
-        A min value of None is ignored.
+        All arguments are optional, and may be specified as keyword
+        arguments, or by position.
 
-        If a max is specified, then output is constrained to
-        items having keys less than or equal to the given max.
-        A max value of None is ignored.
+        If a min is specified, then output is constrained to values whose
+        keys are greater than or equal to the given min, and, if excludemin
+        is specified and true, is further constrained to values whose keys
+        are strictly greater than min.  A min value of None is ignored.  If
+        min is None or not specified, and excludemin is true, the value
+        corresponding to the smallest key is excluded.
+
+        If a max is specified, then output is constrained to values whose
+        keys are less than or equal to the given max, and, if excludemax is
+        specified and true, is further constrained to values whose keys are
+        strictly less than max.  A max value of None is ignored.  If max is
+        None or not specified, and excludemax is true, the value
+        corresponding to the largest key is excluded.
+        """
+
+    def items(min=None, max=None, excludemin=False, excludemax=False):
+        """Return an IReadSequence containing the items in the collection.
+
+        An item is a 2-tuple, a (key, value) pair.
+
+        The type of the IReadSequence is not specified.  It could be a list
+        or a tuple or some other type.
+
+        All arguments are optional, and may be specified as keyword
+        arguments, or by position.
+
+        If a min is specified, then output is constrained to items whose
+        keys are greater than or equal to the given min, and, if excludemin
+        is specified and true, is further constrained to items whose keys
+        are strictly greater than min.  A min value of None is ignored.  If
+        min is None or not specified, and excludemin is true, the item with
+        the smallest key is excluded.
+
+        If a max is specified, then output is constrained to items whose
+        keys are less than or equal to the given max, and, if excludemax is
+        specified and true, is further constrained to items whose keys are
+        strictly less than max.  A max value of None is ignored.  If max is
+        None or not specified, and excludemax is true, the item with the
+        largest key is excluded.
         """
 
     def byValue(minValue):