#error "eek! DBVER can't handle minor versions > 9"
#endif
-#define PY_BSDDB_VERSION "4.3.1"
+#define PY_BSDDB_VERSION "4.3.2"
static char *rcs_id = "$Id$";
static PyObject* DBError; /* Base class, all others derive from this */
static PyObject* DBCursorClosedError; /* raised when trying to use a closed cursor object */
-static PyObject* DBKeyEmptyError; /* DB_KEYEMPTY */
+static PyObject* DBKeyEmptyError; /* DB_KEYEMPTY: also derives from KeyError */
static PyObject* DBKeyExistError; /* DB_KEYEXIST */
static PyObject* DBLockDeadlockError; /* DB_LOCK_DEADLOCK */
static PyObject* DBLockNotGrantedError; /* DB_LOCK_NOTGRANTED */
struct behaviourFlags {
/* What is the default behaviour when DB->get or DBCursor->get returns a
- DB_NOTFOUND error? Return None or raise an exception? */
+ DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise an exception? */
unsigned int getReturnsNone : 1;
/* What is the default behaviour for DBCursor.set* methods when DBCursor->get
- * returns a DB_NOTFOUND error? Return None or raise an exception? */
+ * returns a DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise? */
unsigned int cursorSetReturnsNone : 1;
};
err = self->dbc->c_get(self->dbc, &key, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.getReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
err = self->db->get(self->db, txn, &key, &data, flags|consume_flag);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->moduleFlags.getReturnsNone) {
err = 0;
Py_INCREF(Py_None);
retval = Py_None;
err = self->db->get(self->db, txn, &key, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && (dfltobj != NULL)) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) {
err = 0;
Py_INCREF(dfltobj);
retval = dfltobj;
}
- else if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) {
+ else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->moduleFlags.getReturnsNone) {
err = 0;
Py_INCREF(Py_None);
retval = Py_None;
err = self->db->pget(self->db, txn, &key, &pkey, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && (dfltobj != NULL)) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) {
err = 0;
Py_INCREF(dfltobj);
retval = dfltobj;
}
- else if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) {
+ else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->moduleFlags.getReturnsNone) {
err = 0;
Py_INCREF(Py_None);
retval = Py_None;
err = self->db->get(self->db, txn, &key, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->moduleFlags.getReturnsNone) {
err = 0;
Py_INCREF(Py_None);
retval = Py_None;
err = self->db->get(self->db, txn, &key, &data, 0);
MYDB_END_ALLOW_THREADS;
FREE_DBT(key);
- return PyInt_FromLong((err == DB_BUFFER_SMALL) || (err == 0));
+
+ if (err == DB_BUFFER_SMALL || err == 0) {
+ return PyInt_FromLong(1);
+ } else if (err == DB_NOTFOUND || err == DB_KEYEMPTY) {
+ return PyInt_FromLong(0);
+ }
+
+ makeDBError(err);
+ return NULL;
}
Py_DECREF(item);
}
- /* DB_NOTFOUND is okay, it just means we got to the end */
- if (err != DB_NOTFOUND && makeDBError(err)) {
+ /* DB_NOTFOUND || DB_KEYEMPTY is okay, it means we got to the end */
+ if (err != DB_NOTFOUND && err != DB_KEYEMPTY && makeDBError(err)) {
Py_DECREF(list);
list = NULL;
}
err = self->dbc->c_get(self->dbc, &key, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.getReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
err = self->dbc->c_pget(self->dbc, &key, &pkey, &data, flags);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.getReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.cursorSetReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET_RANGE);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.cursorSetReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_GET_BOTH);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && returnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && returnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET_RECNO);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.cursorSetReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_get(self->dbc, &key, &data, flags | DB_JOIN_ITEM);
MYDB_END_ALLOW_THREADS;
- if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) {
+ if ((err == DB_NOTFOUND || err == DB_KEYEMPTY)
+ && self->mydb->moduleFlags.getReturnsNone) {
Py_INCREF(Py_None);
retval = Py_None;
}
}
+static PyObject*
+DBEnv_set_lg_regionmax(DBEnvObject* self, PyObject* args)
+{
+ int err, lg_max;
+
+ if (!PyArg_ParseTuple(args, "i:set_lg_regionmax", &lg_max))
+ return NULL;
+ CHECK_ENV_NOT_CLOSED(self);
+
+ MYDB_BEGIN_ALLOW_THREADS;
+ err = self->db_env->set_lg_regionmax(self->db_env, lg_max);
+ MYDB_END_ALLOW_THREADS;
+ RETURN_IF_ERR();
+ RETURN_NONE();
+}
+
+
static PyObject*
DBEnv_set_lk_detect(DBEnvObject* self, PyObject* args)
{
{"set_lg_bsize", (PyCFunction)DBEnv_set_lg_bsize, METH_VARARGS},
{"set_lg_dir", (PyCFunction)DBEnv_set_lg_dir, METH_VARARGS},
{"set_lg_max", (PyCFunction)DBEnv_set_lg_max, METH_VARARGS},
+ {"set_lg_regionmax",(PyCFunction)DBEnv_set_lg_regionmax, METH_VARARGS},
{"set_lk_detect", (PyCFunction)DBEnv_set_lk_detect, METH_VARARGS},
{"set_lk_max", (PyCFunction)DBEnv_set_lk_max, METH_VARARGS},
#if (DBVER >= 32)
DBError = PyErr_NewException("bsddb._db.DBError", NULL, NULL);
PyDict_SetItemString(d, "DBError", DBError);
- /* Some magic to make DBNotFoundError derive from both DBError and
- KeyError, since the API only supports using one base class. */
+ /* Some magic to make DBNotFoundError and DBKeyEmptyError derive
+ * from both DBError and KeyError, since the API only supports
+ * using one base class. */
PyDict_SetItemString(d, "KeyError", PyExc_KeyError);
- PyRun_String("class DBNotFoundError(DBError, KeyError): pass",
+ PyRun_String("class DBNotFoundError(DBError, KeyError): pass\n"
+ "class DBKeyEmptyError(DBError, KeyError): pass",
Py_file_input, d, d);
DBNotFoundError = PyDict_GetItemString(d, "DBNotFoundError");
+ DBKeyEmptyError = PyDict_GetItemString(d, "DBKeyEmptyError");
PyDict_DelItemString(d, "KeyError");