|
97 | 97 | #error "eek! DBVER can't handle minor versions > 9" |
98 | 98 | #endif |
99 | 99 |
|
100 | | -#define PY_BSDDB_VERSION "4.3.1" |
| 100 | +#define PY_BSDDB_VERSION "4.3.2" |
101 | 101 | static char *rcs_id = "$Id$"; |
102 | 102 |
|
103 | 103 |
|
@@ -153,7 +153,7 @@ static PyInterpreterState* _db_interpreterState = NULL; |
153 | 153 |
|
154 | 154 | static PyObject* DBError; /* Base class, all others derive from this */ |
155 | 155 | static PyObject* DBCursorClosedError; /* raised when trying to use a closed cursor object */ |
156 | | -static PyObject* DBKeyEmptyError; /* DB_KEYEMPTY */ |
| 156 | +static PyObject* DBKeyEmptyError; /* DB_KEYEMPTY: also derives from KeyError */ |
157 | 157 | static PyObject* DBKeyExistError; /* DB_KEYEXIST */ |
158 | 158 | static PyObject* DBLockDeadlockError; /* DB_LOCK_DEADLOCK */ |
159 | 159 | static PyObject* DBLockNotGrantedError; /* DB_LOCK_NOTGRANTED */ |
@@ -212,10 +212,10 @@ static PyObject* DBPermissionsError; /* EPERM */ |
212 | 212 |
|
213 | 213 | struct behaviourFlags { |
214 | 214 | /* What is the default behaviour when DB->get or DBCursor->get returns a |
215 | | - DB_NOTFOUND error? Return None or raise an exception? */ |
| 215 | + DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise an exception? */ |
216 | 216 | unsigned int getReturnsNone : 1; |
217 | 217 | /* What is the default behaviour for DBCursor.set* methods when DBCursor->get |
218 | | - * returns a DB_NOTFOUND error? Return None or raise an exception? */ |
| 218 | + * returns a DB_NOTFOUND || DB_KEYEMPTY error? Return None or raise? */ |
219 | 219 | unsigned int cursorSetReturnsNone : 1; |
220 | 220 | }; |
221 | 221 |
|
@@ -673,7 +673,8 @@ static PyObject* _DBCursor_get(DBCursorObject* self, int extra_flags, |
673 | 673 | err = self->dbc->c_get(self->dbc, &key, &data, flags); |
674 | 674 | MYDB_END_ALLOW_THREADS; |
675 | 675 |
|
676 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) { |
| 676 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 677 | + && self->mydb->moduleFlags.getReturnsNone) { |
677 | 678 | Py_INCREF(Py_None); |
678 | 679 | retval = Py_None; |
679 | 680 | } |
@@ -1285,7 +1286,8 @@ _DB_consume(DBObject* self, PyObject* args, PyObject* kwargs, int consume_flag) |
1285 | 1286 | err = self->db->get(self->db, txn, &key, &data, flags|consume_flag); |
1286 | 1287 | MYDB_END_ALLOW_THREADS; |
1287 | 1288 |
|
1288 | | - if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) { |
| 1289 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 1290 | + && self->moduleFlags.getReturnsNone) { |
1289 | 1291 | err = 0; |
1290 | 1292 | Py_INCREF(Py_None); |
1291 | 1293 | retval = Py_None; |
@@ -1430,12 +1432,13 @@ DB_get(DBObject* self, PyObject* args, PyObject* kwargs) |
1430 | 1432 | err = self->db->get(self->db, txn, &key, &data, flags); |
1431 | 1433 | MYDB_END_ALLOW_THREADS; |
1432 | 1434 |
|
1433 | | - if ((err == DB_NOTFOUND) && (dfltobj != NULL)) { |
| 1435 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) { |
1434 | 1436 | err = 0; |
1435 | 1437 | Py_INCREF(dfltobj); |
1436 | 1438 | retval = dfltobj; |
1437 | 1439 | } |
1438 | | - else if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) { |
| 1440 | + else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 1441 | + && self->moduleFlags.getReturnsNone) { |
1439 | 1442 | err = 0; |
1440 | 1443 | Py_INCREF(Py_None); |
1441 | 1444 | retval = Py_None; |
@@ -1499,12 +1502,13 @@ DB_pget(DBObject* self, PyObject* args, PyObject* kwargs) |
1499 | 1502 | err = self->db->pget(self->db, txn, &key, &pkey, &data, flags); |
1500 | 1503 | MYDB_END_ALLOW_THREADS; |
1501 | 1504 |
|
1502 | | - if ((err == DB_NOTFOUND) && (dfltobj != NULL)) { |
| 1505 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && (dfltobj != NULL)) { |
1503 | 1506 | err = 0; |
1504 | 1507 | Py_INCREF(dfltobj); |
1505 | 1508 | retval = dfltobj; |
1506 | 1509 | } |
1507 | | - else if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) { |
| 1510 | + else if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 1511 | + && self->moduleFlags.getReturnsNone) { |
1508 | 1512 | err = 0; |
1509 | 1513 | Py_INCREF(Py_None); |
1510 | 1514 | retval = Py_None; |
@@ -1629,7 +1633,8 @@ DB_get_both(DBObject* self, PyObject* args, PyObject* kwargs) |
1629 | 1633 | err = self->db->get(self->db, txn, &key, &data, flags); |
1630 | 1634 | MYDB_END_ALLOW_THREADS; |
1631 | 1635 |
|
1632 | | - if ((err == DB_NOTFOUND) && self->moduleFlags.getReturnsNone) { |
| 1636 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 1637 | + && self->moduleFlags.getReturnsNone) { |
1633 | 1638 | err = 0; |
1634 | 1639 | Py_INCREF(Py_None); |
1635 | 1640 | retval = Py_None; |
@@ -2745,7 +2750,15 @@ DB_has_key(DBObject* self, PyObject* args) |
2745 | 2750 | err = self->db->get(self->db, txn, &key, &data, 0); |
2746 | 2751 | MYDB_END_ALLOW_THREADS; |
2747 | 2752 | FREE_DBT(key); |
2748 | | - return PyInt_FromLong((err == DB_BUFFER_SMALL) || (err == 0)); |
| 2753 | + |
| 2754 | + if (err == DB_BUFFER_SMALL || err == 0) { |
| 2755 | + return PyInt_FromLong(1); |
| 2756 | + } else if (err == DB_NOTFOUND || err == DB_KEYEMPTY) { |
| 2757 | + return PyInt_FromLong(0); |
| 2758 | + } |
| 2759 | + |
| 2760 | + makeDBError(err); |
| 2761 | + return NULL; |
2749 | 2762 | } |
2750 | 2763 |
|
2751 | 2764 |
|
@@ -2843,8 +2856,8 @@ _DB_make_list(DBObject* self, DB_TXN* txn, int type) |
2843 | 2856 | Py_DECREF(item); |
2844 | 2857 | } |
2845 | 2858 |
|
2846 | | - /* DB_NOTFOUND is okay, it just means we got to the end */ |
2847 | | - if (err != DB_NOTFOUND && makeDBError(err)) { |
| 2859 | + /* DB_NOTFOUND || DB_KEYEMPTY is okay, it means we got to the end */ |
| 2860 | + if (err != DB_NOTFOUND && err != DB_KEYEMPTY && makeDBError(err)) { |
2848 | 2861 | Py_DECREF(list); |
2849 | 2862 | list = NULL; |
2850 | 2863 | } |
@@ -3051,7 +3064,8 @@ DBC_get(DBCursorObject* self, PyObject* args, PyObject *kwargs) |
3051 | 3064 | err = self->dbc->c_get(self->dbc, &key, &data, flags); |
3052 | 3065 | MYDB_END_ALLOW_THREADS; |
3053 | 3066 |
|
3054 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) { |
| 3067 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3068 | + && self->mydb->moduleFlags.getReturnsNone) { |
3055 | 3069 | Py_INCREF(Py_None); |
3056 | 3070 | retval = Py_None; |
3057 | 3071 | } |
@@ -3138,7 +3152,8 @@ DBC_pget(DBCursorObject* self, PyObject* args, PyObject *kwargs) |
3138 | 3152 | err = self->dbc->c_pget(self->dbc, &key, &pkey, &data, flags); |
3139 | 3153 | MYDB_END_ALLOW_THREADS; |
3140 | 3154 |
|
3141 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) { |
| 3155 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3156 | + && self->mydb->moduleFlags.getReturnsNone) { |
3142 | 3157 | Py_INCREF(Py_None); |
3143 | 3158 | retval = Py_None; |
3144 | 3159 | } |
@@ -3305,7 +3320,8 @@ DBC_set(DBCursorObject* self, PyObject* args, PyObject *kwargs) |
3305 | 3320 | MYDB_BEGIN_ALLOW_THREADS; |
3306 | 3321 | err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET); |
3307 | 3322 | MYDB_END_ALLOW_THREADS; |
3308 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) { |
| 3323 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3324 | + && self->mydb->moduleFlags.cursorSetReturnsNone) { |
3309 | 3325 | Py_INCREF(Py_None); |
3310 | 3326 | retval = Py_None; |
3311 | 3327 | } |
@@ -3377,7 +3393,8 @@ DBC_set_range(DBCursorObject* self, PyObject* args, PyObject* kwargs) |
3377 | 3393 | MYDB_BEGIN_ALLOW_THREADS; |
3378 | 3394 | err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET_RANGE); |
3379 | 3395 | MYDB_END_ALLOW_THREADS; |
3380 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) { |
| 3396 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3397 | + && self->mydb->moduleFlags.cursorSetReturnsNone) { |
3381 | 3398 | Py_INCREF(Py_None); |
3382 | 3399 | retval = Py_None; |
3383 | 3400 | } |
@@ -3432,7 +3449,7 @@ _DBC_get_set_both(DBCursorObject* self, PyObject* keyobj, PyObject* dataobj, |
3432 | 3449 | MYDB_BEGIN_ALLOW_THREADS; |
3433 | 3450 | err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_GET_BOTH); |
3434 | 3451 | MYDB_END_ALLOW_THREADS; |
3435 | | - if ((err == DB_NOTFOUND) && returnsNone) { |
| 3452 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) && returnsNone) { |
3436 | 3453 | Py_INCREF(Py_None); |
3437 | 3454 | retval = Py_None; |
3438 | 3455 | } |
@@ -3572,7 +3589,8 @@ DBC_set_recno(DBCursorObject* self, PyObject* args, PyObject *kwargs) |
3572 | 3589 | MYDB_BEGIN_ALLOW_THREADS; |
3573 | 3590 | err = self->dbc->c_get(self->dbc, &key, &data, flags|DB_SET_RECNO); |
3574 | 3591 | MYDB_END_ALLOW_THREADS; |
3575 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.cursorSetReturnsNone) { |
| 3592 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3593 | + && self->mydb->moduleFlags.cursorSetReturnsNone) { |
3576 | 3594 | Py_INCREF(Py_None); |
3577 | 3595 | retval = Py_None; |
3578 | 3596 | } |
@@ -3640,7 +3658,8 @@ DBC_join_item(DBCursorObject* self, PyObject* args) |
3640 | 3658 | MYDB_BEGIN_ALLOW_THREADS; |
3641 | 3659 | err = self->dbc->c_get(self->dbc, &key, &data, flags | DB_JOIN_ITEM); |
3642 | 3660 | MYDB_END_ALLOW_THREADS; |
3643 | | - if ((err == DB_NOTFOUND) && self->mydb->moduleFlags.getReturnsNone) { |
| 3661 | + if ((err == DB_NOTFOUND || err == DB_KEYEMPTY) |
| 3662 | + && self->mydb->moduleFlags.getReturnsNone) { |
3644 | 3663 | Py_INCREF(Py_None); |
3645 | 3664 | retval = Py_None; |
3646 | 3665 | } |
@@ -3941,6 +3960,23 @@ DBEnv_set_lg_max(DBEnvObject* self, PyObject* args) |
3941 | 3960 | } |
3942 | 3961 |
|
3943 | 3962 |
|
| 3963 | +static PyObject* |
| 3964 | +DBEnv_set_lg_regionmax(DBEnvObject* self, PyObject* args) |
| 3965 | +{ |
| 3966 | + int err, lg_max; |
| 3967 | + |
| 3968 | + if (!PyArg_ParseTuple(args, "i:set_lg_regionmax", &lg_max)) |
| 3969 | + return NULL; |
| 3970 | + CHECK_ENV_NOT_CLOSED(self); |
| 3971 | + |
| 3972 | + MYDB_BEGIN_ALLOW_THREADS; |
| 3973 | + err = self->db_env->set_lg_regionmax(self->db_env, lg_max); |
| 3974 | + MYDB_END_ALLOW_THREADS; |
| 3975 | + RETURN_IF_ERR(); |
| 3976 | + RETURN_NONE(); |
| 3977 | +} |
| 3978 | + |
| 3979 | + |
3944 | 3980 | static PyObject* |
3945 | 3981 | DBEnv_set_lk_detect(DBEnvObject* self, PyObject* args) |
3946 | 3982 | { |
@@ -4651,6 +4687,7 @@ static PyMethodDef DBEnv_methods[] = { |
4651 | 4687 | {"set_lg_bsize", (PyCFunction)DBEnv_set_lg_bsize, METH_VARARGS}, |
4652 | 4688 | {"set_lg_dir", (PyCFunction)DBEnv_set_lg_dir, METH_VARARGS}, |
4653 | 4689 | {"set_lg_max", (PyCFunction)DBEnv_set_lg_max, METH_VARARGS}, |
| 4690 | + {"set_lg_regionmax",(PyCFunction)DBEnv_set_lg_regionmax, METH_VARARGS}, |
4654 | 4691 | {"set_lk_detect", (PyCFunction)DBEnv_set_lk_detect, METH_VARARGS}, |
4655 | 4692 | {"set_lk_max", (PyCFunction)DBEnv_set_lk_max, METH_VARARGS}, |
4656 | 4693 | #if (DBVER >= 32) |
@@ -5279,12 +5316,15 @@ DL_EXPORT(void) init_bsddb(void) |
5279 | 5316 | DBError = PyErr_NewException("bsddb._db.DBError", NULL, NULL); |
5280 | 5317 | PyDict_SetItemString(d, "DBError", DBError); |
5281 | 5318 |
|
5282 | | - /* Some magic to make DBNotFoundError derive from both DBError and |
5283 | | - KeyError, since the API only supports using one base class. */ |
| 5319 | + /* Some magic to make DBNotFoundError and DBKeyEmptyError derive |
| 5320 | + * from both DBError and KeyError, since the API only supports |
| 5321 | + * using one base class. */ |
5284 | 5322 | PyDict_SetItemString(d, "KeyError", PyExc_KeyError); |
5285 | | - PyRun_String("class DBNotFoundError(DBError, KeyError): pass", |
| 5323 | + PyRun_String("class DBNotFoundError(DBError, KeyError): pass\n" |
| 5324 | + "class DBKeyEmptyError(DBError, KeyError): pass", |
5286 | 5325 | Py_file_input, d, d); |
5287 | 5326 | DBNotFoundError = PyDict_GetItemString(d, "DBNotFoundError"); |
| 5327 | + DBKeyEmptyError = PyDict_GetItemString(d, "DBKeyEmptyError"); |
5288 | 5328 | PyDict_DelItemString(d, "KeyError"); |
5289 | 5329 |
|
5290 | 5330 |
|
|
0 commit comments