diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2007-11-05 02:32:26 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2007-11-05 02:32:26 (GMT) |
commit | ec10a4a402e5b6845b247f688fc157be45414cdd (patch) | |
tree | 99112af225bd76faa84bad94a826406bf77c7065 | |
parent | 9c466baa014fa32474f338cc153caea8236a0555 (diff) | |
download | cpython-ec10a4a402e5b6845b247f688fc157be45414cdd.zip cpython-ec10a4a402e5b6845b247f688fc157be45414cdd.tar.gz cpython-ec10a4a402e5b6845b247f688fc157be45414cdd.tar.bz2 |
Fixes bug 477182 on pybsddb.sf.net. DB objects now load the flags and
pay attention to them when opening an existing database. This means
that d[] behaves properly even on databases previously created with DB_DUP
or DB_DUPSORT flags to allow duplicate keys.
http://sourceforge.net/tracker/index.php?func=detail&aid=477182&group_id=13900&atid=113900
Do not backport, this bugfix could be considered an API change.
-rw-r--r-- | Lib/bsddb/test/test_misc.py | 24 | ||||
-rw-r--r-- | Misc/NEWS | 8 | ||||
-rw-r--r-- | Modules/_bsddb.c | 17 |
3 files changed, 34 insertions, 15 deletions
diff --git a/Lib/bsddb/test/test_misc.py b/Lib/bsddb/test/test_misc.py index 1212581..598e626 100644 --- a/Lib/bsddb/test/test_misc.py +++ b/Lib/bsddb/test/test_misc.py @@ -90,6 +90,30 @@ class MiscTestCase(unittest.TestCase): db1.close() os.unlink(self.filename) + def test_DB_set_flags_persists(self): + try: + db1 = db.DB() + db1.set_flags(db.DB_DUPSORT) + db1.open(self.filename, db.DB_HASH, db.DB_CREATE) + db1['a'] = 'eh' + db1['a'] = 'A' + self.assertEqual([('a', 'A')], db1.items()) + db1.put('a', 'Aa') + self.assertEqual([('a', 'A'), ('a', 'Aa')], db1.items()) + db1.close() + db1 = db.DB() + # no set_flags call, we're testing that it reads and obeys + # the flags on open. + db1.open(self.filename, db.DB_HASH) + self.assertEqual([('a', 'A'), ('a', 'Aa')], db1.items()) + # if it read the flags right this will replace all values + # for key 'a' instead of adding a new one. (as a dict should) + db1['a'] = 'new A' + self.assertEqual([('a', 'new A')], db1.items()) + finally: + db1.close() + os.unlink(self.filename) + #---------------------------------------------------------------------- @@ -822,6 +822,14 @@ Extension Modules - Bug #1233: fix bsddb.dbshelve.DBShelf append method to work as intended for RECNO databases. +- pybsddb.sf.net Bug #477182: Load the database flags at database open + time so that opening a database previously created with the DB_DUP or + DB_DUPSORT flag set will keep the proper behavior on subsequent opens. + Specifically: dictionary assignment to a DB object will replace all + values for a given key when the database allows duplicate values. + DB users should use DB.put(k, v) when they want to store duplicates; not + DB[k] = v. + - Bug #1686475: Support stat'ing open files on Windows again. - Patch #1185447: binascii.b2a_qp() now correctly quotes binary characters diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c index d03f72b..95ccb43 100644 --- a/Modules/_bsddb.c +++ b/Modules/_bsddb.c @@ -1836,21 +1836,6 @@ DB_open(DBObject* self, PyObject* args, PyObject* kwargs) return NULL; } -#if 0 && (DBVER >= 41) - if ((!txn) && (txnobj != Py_None) && self->myenvobj - && (self->myenvobj->flags & DB_INIT_TXN)) - { - /* If no 'txn' parameter was supplied (no DbTxn object and None was not - * explicitly passed) but we are in a transaction ready environment: - * add DB_AUTO_COMMIT to allow for older pybsddb apps using transactions - * to work on BerkeleyDB 4.1 without needing to modify their - * DBEnv or DB open calls. - * TODO make this behaviour of the library configurable. - */ - flags |= DB_AUTO_COMMIT; - } -#endif - MYDB_BEGIN_ALLOW_THREADS; #if (DBVER >= 41) err = self->db->open(self->db, txn, filename, dbname, type, flags, mode); @@ -1864,6 +1849,8 @@ DB_open(DBObject* self, PyObject* args, PyObject* kwargs) return NULL; } + self->db->get_flags(self->db, &self->setflags); + self->flags = flags; RETURN_NONE(); } |