- bsddb: the __len__ method of a DB object has been fixed to return correct

results.  It could previously incorrectly return 0 in some cases.
  Fixes SF bug 1493322 (pybsddb bug 1184012).
This commit is contained in:
Gregory P. Smith 2006-06-05 23:59:37 +00:00
parent 4f7a7220c1
commit 3c228b19f0
2 changed files with 21 additions and 6 deletions

View File

@ -115,6 +115,10 @@ Extension Modules
- bsddb: fix DBCursor.pget() bug with keyword argument names when no data
parameter is supplied. [SF pybsddb bug #1477863]
- bsddb: the __len__ method of a DB object has been fixed to return correct
results. It could previously incorrectly return 0 in some cases.
Fixes SF bug 1493322 (pybsddb bug 1184012).
Library
-------

View File

@ -2684,7 +2684,7 @@ DB_set_encrypt(DBObject* self, PyObject* args, PyObject* kwargs)
Py_ssize_t DB_length(DBObject* self)
{
int err;
long size = 0;
Py_ssize_t size = 0;
int flags = 0;
void* sp;
@ -2697,10 +2697,11 @@ Py_ssize_t DB_length(DBObject* self)
if (self->haveStat) { /* Has the stat function been called recently? If
so, we can use the cached value. */
flags = DB_CACHED_COUNTS;
flags = DB_FAST_STAT;
}
MYDB_BEGIN_ALLOW_THREADS;
redo_stat_for_length:
#if (DBVER >= 43)
err = self->db->stat(self->db, /*txnid*/ NULL, &sp, flags);
#elif (DBVER >= 33)
@ -2708,6 +2709,20 @@ Py_ssize_t DB_length(DBObject* self)
#else
err = self->db->stat(self->db, &sp, NULL, flags);
#endif
/* All the stat structures have matching fields upto the ndata field,
so we can use any of them for the type cast */
size = ((DB_BTREE_STAT*)sp)->bt_ndata;
/* A size of 0 could mean that BerkeleyDB no longer had the stat values cached.
* redo a full stat to make sure.
* Fixes SF python bug 1493322, pybsddb bug 1184012
*/
if (size == 0 && (flags & DB_FAST_STAT)) {
flags = 0;
goto redo_stat_for_length;
}
MYDB_END_ALLOW_THREADS;
if (err)
@ -2715,9 +2730,6 @@ Py_ssize_t DB_length(DBObject* self)
self->haveStat = 1;
/* All the stat structures have matching fields upto the ndata field,
so we can use any of them for the type cast */
size = ((DB_BTREE_STAT*)sp)->bt_ndata;
free(sp);
return size;
}
@ -5252,7 +5264,6 @@ static PyMethodDef DBSequence_methods[] = {
{"get", (PyCFunction)DBSequence_get, METH_VARARGS|METH_KEYWORDS},
{"get_dbp", (PyCFunction)DBSequence_get_dbp, METH_VARARGS},
{"get_key", (PyCFunction)DBSequence_get_key, METH_VARARGS},
//should it be called "initial_value" as in c code?
{"init_value", (PyCFunction)DBSequence_init_value, METH_VARARGS},
{"open", (PyCFunction)DBSequence_open, METH_VARARGS|METH_KEYWORDS},
{"remove", (PyCFunction)DBSequence_remove, METH_VARARGS|METH_KEYWORDS},