summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2003-10-01 06:48:51 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2003-10-01 06:48:51 (GMT)
commitbe0db8b125951adb475fc388de9aebabcabbf6e3 (patch)
treedbfbc01617f45a987f58a809d9784ed8974c8cd7 /Modules
parentefb3a161c3636c121261c4334ce151ef5d51418e (diff)
downloadcpython-be0db8b125951adb475fc388de9aebabcabbf6e3.zip
cpython-be0db8b125951adb475fc388de9aebabcabbf6e3.tar.gz
cpython-be0db8b125951adb475fc388de9aebabcabbf6e3.tar.bz2
bsddb3 4.2.2, adds DBCursor.get_current_size() method to return the length
of the current value without reading the value itself.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_bsddb.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c
index c6b569c..e705526 100644
--- a/Modules/_bsddb.c
+++ b/Modules/_bsddb.c
@@ -93,7 +93,7 @@
/* 40 = 4.0, 33 = 3.3; this will break if the second number is > 9 */
#define DBVER (DB_VERSION_MAJOR * 10 + DB_VERSION_MINOR)
-#define PY_BSDDB_VERSION "4.2.1"
+#define PY_BSDDB_VERSION "4.2.2"
static char *rcs_id = "$Id$";
@@ -2981,6 +2981,39 @@ DBC_get_both(DBCursorObject* self, PyObject* args)
self->mydb->moduleFlags.getReturnsNone);
}
+/* Return size of entry */
+static PyObject*
+DBC_get_current_size(DBCursorObject* self, PyObject* args)
+{
+ int err, flags=DB_CURRENT;
+ PyObject* retval = NULL;
+ DBT key, data;
+
+ if (!PyArg_ParseTuple(args, ":get_current_size"))
+ return NULL;
+ CHECK_CURSOR_NOT_CLOSED(self);
+ CLEAR_DBT(key);
+ CLEAR_DBT(data);
+
+ /* We don't allocate any memory, forcing a ENOMEM error and thus
+ getting the record size. */
+ data.flags = DB_DBT_USERMEM;
+ data.ulen = 0;
+ MYDB_BEGIN_ALLOW_THREADS;
+ err = self->dbc->c_get(self->dbc, &key, &data, flags);
+ MYDB_END_ALLOW_THREADS;
+ if (err == ENOMEM || !err) {
+ /* ENOMEM means positive size, !err means zero length value */
+ retval = PyInt_FromLong((long)data.size);
+ err = 0;
+ }
+
+ FREE_DBT(key);
+ FREE_DBT(data);
+ RETURN_IF_ERR();
+ return retval;
+}
+
static PyObject*
DBC_set_both(DBCursorObject* self, PyObject* args)
{
@@ -4079,6 +4112,7 @@ static PyMethodDef DBCursor_methods[] = {
{"set", (PyCFunction)DBC_set, METH_VARARGS|METH_KEYWORDS},
{"set_range", (PyCFunction)DBC_set_range, METH_VARARGS|METH_KEYWORDS},
{"get_both", (PyCFunction)DBC_get_both, METH_VARARGS},
+ {"get_current_size",(PyCFunction)DBC_get_current_size, METH_VARARGS},
{"set_both", (PyCFunction)DBC_set_both, METH_VARARGS},
{"set_recno", (PyCFunction)DBC_set_recno, METH_VARARGS|METH_KEYWORDS},
{"consume", (PyCFunction)DBC_consume, METH_VARARGS|METH_KEYWORDS},