Author: gregory.p.smith Date: Thu Oct 18 19:15:20 2007 New Revision: 58536 Modified: python/branches/release25-maint/Lib/bsddb/dbtables.py python/branches/release25-maint/Lib/bsddb/test/test_dbtables.py python/branches/release25-maint/Misc/NEWS Log: Backport 58532, 58533, 58534: - Fix bsddb.dbtables: Don't randomly corrupt newly inserted rows by picking a rowid string with null bytes in it. Such rows could not later be deleted, modified or individually selected. Existing bsdTableDb databases created with such rows are out of luck. - Use mkdtemp for the test_dbtables test database environment and clean it up afterwards using shutil.rmtree. Modified: python/branches/release25-maint/Lib/bsddb/dbtables.py ============================================================================== --- python/branches/release25-maint/Lib/bsddb/dbtables.py (original) +++ python/branches/release25-maint/Lib/bsddb/dbtables.py Thu Oct 18 19:15:20 2007 @@ -20,7 +20,7 @@ import re import sys import copy -import xdrlib +import struct import random from types import ListType, StringType import cPickle as pickle @@ -362,10 +362,11 @@ # Generate a random 64-bit row ID string # (note: this code has <64 bits of randomness # but it's plenty for our database id needs!) - p = xdrlib.Packer() - p.pack_int(int(random.random()*2147483647)) - p.pack_int(int(random.random()*2147483647)) - newid = p.get_buffer() + # We must ensure that no null bytes are in the id value. + blist = [] + for x in xrange(_rowid_str_len): + blist.append(random.randint(1,255)) + newid = struct.pack('B'*_rowid_str_len, *blist) # Guarantee uniqueness by adding this key to the database try: @@ -444,7 +445,7 @@ try: dataitem = self.db.get( _data_key(table, column, rowid), - txn) + txn=txn) self.db.delete( _data_key(table, column, rowid), txn) Modified: python/branches/release25-maint/Lib/bsddb/test/test_dbtables.py ============================================================================== --- python/branches/release25-maint/Lib/bsddb/test/test_dbtables.py (original) +++ python/branches/release25-maint/Lib/bsddb/test/test_dbtables.py Thu Oct 18 19:15:20 2007 @@ -21,9 +21,10 @@ # $Id$ import sys, os, re +import shutil +import tempfile try: - import cPickle - pickle = cPickle + import cPickle as pickle except ImportError: import pickle @@ -42,12 +43,9 @@ #---------------------------------------------------------------------- class TableDBTestCase(unittest.TestCase): - db_home = 'db_home' - db_name = 'test-table.db' - def setUp(self): - homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home') - self.homeDir = homeDir + homeDir = tempfile.mkdtemp() + self.testHomeDir = homeDir try: os.mkdir(homeDir) except os.error: pass self.tdb = dbtables.bsdTableDB( @@ -55,10 +53,7 @@ def tearDown(self): self.tdb.close() - import glob - files = glob.glob(os.path.join(self.homeDir, '*')) - for file in files: - os.remove(file) + shutil.rmtree(self.testHomeDir) def test01(self): tabname = "test01" Modified: python/branches/release25-maint/Misc/NEWS ============================================================================== --- python/branches/release25-maint/Misc/NEWS (original) +++ python/branches/release25-maint/Misc/NEWS Thu Oct 18 19:15:20 2007 @@ -118,6 +118,10 @@ - Bug #1233: fix bsddb.dbshelve.DBShelf append method to work as intended for RECNO databases. +- Fix bsddb.dbtables: Don't randomly corrupt newly inserted rows by + picking a rowid string with null bytes in it. Such rows could not + later be deleted, modified or individually selected. + - Bug #1726026: Correct the field names of WIN32_FIND_DATAA and WIN32_FIND_DATAW structures in the ctypes.wintypes module.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4