import re
import sys
import copy
-import xdrlib
+import struct
import random
from types import ListType, StringType
import cPickle as pickle
# 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:
try:
dataitem = self.db.get(
_data_key(table, column, rowid),
- txn)
+ txn=txn)
self.db.delete(
_data_key(table, column, rowid),
txn)
# $Id$
import sys, os, re
+import shutil
+import tempfile
try:
- import cPickle
- pickle = cPickle
+ import cPickle as pickle
except ImportError:
import pickle
#----------------------------------------------------------------------
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(
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"
- 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.