Require strict bytes objects for all bsddb.db input values.

This commit is contained in:
Gregory P. Smith 2007-08-23 07:32:27 +00:00
parent e5a8dc684c
commit 361ed15383
5 changed files with 80 additions and 77 deletions

View File

@ -88,9 +88,9 @@ class TableDBTestCase(unittest.TestCase):
col1 = 'but can it fly?'
col2 = 'Species'
testinfo = [
{col0: pickle.dumps(8, 1), col1: 'no', col2: 'Penguin'},
{col0: pickle.dumps(-1, 1), col1: 'no', col2: 'Turkey'},
{col0: pickle.dumps(9, 1), col1: 'yes', col2: 'SR-71A Blackbird'}
{col0: pickle.dumps(8, 1), col1: b'no', col2: b'Penguin'},
{col0: pickle.dumps(-1, 1), col1: b'no', col2: b'Turkey'},
{col0: pickle.dumps(9, 1), col1: b'yes', col2: b'SR-71A Blackbird'}
]
try:
@ -150,22 +150,22 @@ class TableDBTestCase(unittest.TestCase):
pass
self.tdb.Insert(tabname,
{'a': '42',
'b': "bad",
'c': "meep",
'e': 'Fuzzy wuzzy was a bear'})
{'a': b'42',
'b': b'bad',
'c': b'meep',
'e': b'Fuzzy wuzzy was a bear'})
self.tdb.Insert(tabname,
{'a': '581750',
'b': "good",
'd': "bla",
'c': "black",
'e': 'fuzzy was here'})
{'a': b'581750',
'b': b'good',
'd': b'bla',
'c': b'black',
'e': b'fuzzy was here'})
self.tdb.Insert(tabname,
{'a': '800000',
'b': "good",
'd': "bla",
'c': "black",
'e': 'Fuzzy wuzzy is a bear'})
{'a': b'800000',
'b': b'good',
'd': b'bla',
'c': b'black',
'e': b'Fuzzy wuzzy is a bear'})
if verbose:
self.tdb._db_print()
@ -202,19 +202,19 @@ class TableDBTestCase(unittest.TestCase):
try:
self.tdb.Insert(tabname,
{'a': "",
{'a': b"",
'e': pickle.dumps([{4:5, 6:7}, 'foo'], 1),
'f': "Zero"})
'f': b"Zero"})
self.fail("exception not raised")
except dbtables.TableDBError:
pass
self.tdb.Insert(tabname, {'a': "A", 'b': "B", 'c': "C", 'd': "D",
'e': "E"})
self.tdb.Insert(tabname, {'a': "-A", 'b': "-B", 'c': "-C", 'd': "-D",
'e': "-E"})
self.tdb.Insert(tabname, {'a': "A-", 'b': "B-", 'c': "C-", 'd': "D-",
'e': "E-"})
self.tdb.Insert(tabname, {'a': b"A", 'b': b"B", 'c': b"C",
'd': b"D", 'e': b"E"})
self.tdb.Insert(tabname, {'a': b"-A", 'b': b"-B", 'c': b"-C",
'd': b"-D", 'e': b"-E"})
self.tdb.Insert(tabname, {'a': b"A-", 'b': b"B-", 'c': b"C-",
'd': b"D-", 'e': b"E-"})
if verbose:
self.tdb._db_print()
@ -239,9 +239,9 @@ class TableDBTestCase(unittest.TestCase):
tabname, ['name', 'taste', 'filling', 'alcohol content', 'price'])
try:
self.tdb.Insert(tabname,
{'taste': 'crap',
'filling': 'no',
'is it Guinness?': 'no'})
{'taste': b'crap',
'filling': b'no',
'is it Guinness?': b'no'})
self.fail("Insert should've failed due to bad column name")
except:
pass
@ -249,11 +249,11 @@ class TableDBTestCase(unittest.TestCase):
['name', 'taste', 'is it Guinness?'])
# these should both succeed as the table should contain the union of both sets of columns.
self.tdb.Insert(tabname, {'taste': 'crap', 'filling': 'no',
'is it Guinness?': 'no'})
self.tdb.Insert(tabname, {'taste': 'great', 'filling': 'yes',
'is it Guinness?': 'yes',
'name': 'Guinness'})
self.tdb.Insert(tabname, {'taste': b'crap', 'filling': b'no',
'is it Guinness?': b'no'})
self.tdb.Insert(tabname, {'taste': b'great', 'filling': b'yes',
'is it Guinness?': b'yes',
'name': b'Guinness'})
def test_CondObjs(self):
@ -261,17 +261,17 @@ class TableDBTestCase(unittest.TestCase):
self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e', 'p'])
self.tdb.Insert(tabname, {'a': "the letter A",
'b': "the letter B",
'c': "is for cookie"})
self.tdb.Insert(tabname, {'a': "is for aardvark",
'e': "the letter E",
'c': "is for cookie",
'd': "is for dog"})
self.tdb.Insert(tabname, {'a': "the letter A",
'e': "the letter E",
'c': "is for cookie",
'p': "is for Python"})
self.tdb.Insert(tabname, {'a': b"the letter A",
'b': b"the letter B",
'c': b"is for cookie"})
self.tdb.Insert(tabname, {'a': b"is for aardvark",
'e': b"the letter E",
'c': b"is for cookie",
'd': b"is for dog"})
self.tdb.Insert(tabname, {'a': b"the letter A",
'e': b"the letter E",
'c': b"is for cookie",
'p': b"is for Python"})
values = self.tdb.Select(
tabname, ['p', 'e'],
@ -309,8 +309,8 @@ class TableDBTestCase(unittest.TestCase):
# fail if it encountered any rows that did not have values in
# every column.
# Hunted and Squashed by <Donwulff> (Jukka Santala - donwulff@nic.fi)
self.tdb.Insert(tabname, {'x': 'X1', 'y':'Y1'})
self.tdb.Insert(tabname, {'x': 'X2', 'y':'Y2', 'z': 'Z2'})
self.tdb.Insert(tabname, {'x': b'X1', 'y':b'Y1'})
self.tdb.Insert(tabname, {'x': b'X2', 'y':b'Y2', 'z': b'Z2'})
self.tdb.Delete(tabname, conditions={'x': dbtables.PrefixCond('X')})
values = self.tdb.Select(tabname, ['y'],
@ -321,18 +321,18 @@ class TableDBTestCase(unittest.TestCase):
tabname = "test_Modify"
self.tdb.CreateTable(tabname, ['Name', 'Type', 'Access'])
self.tdb.Insert(tabname, {'Name': 'Index to MP3 files.doc',
'Type': 'Word', 'Access': '8'})
self.tdb.Insert(tabname, {'Name': 'Nifty.MP3', 'Access': '1'})
self.tdb.Insert(tabname, {'Type': 'Unknown', 'Access': '0'})
self.tdb.Insert(tabname, {'Name': b'Index to MP3 files.doc',
'Type': b'Word', 'Access': b'8'})
self.tdb.Insert(tabname, {'Name': b'Nifty.MP3', 'Access': b'1'})
self.tdb.Insert(tabname, {'Type': b'Unknown', 'Access': b'0'})
def set_type(type):
if type == None:
return 'MP3'
return b'MP3'
return type
def increment_access(count):
return str(int(count)+1)
return bytes(str(int(count)+1))
def remove_value(value):
return None
@ -350,7 +350,7 @@ class TableDBTestCase(unittest.TestCase):
try:
self.tdb.Modify(tabname,
conditions={'Name': dbtables.LikeCond('%')},
mappings={'Access': 'What is your quest?'})
mappings={'Access': b'What is your quest?'})
except TypeError:
# success, the string value in mappings isn't callable
pass

View File

@ -55,7 +55,7 @@ class LockingTestCase(unittest.TestCase):
anID = self.env.lock_id()
if verbose:
print("locker ID: %s" % anID)
lock = self.env.lock_get(anID, "some locked thing", db.DB_LOCK_WRITE)
lock = self.env.lock_get(anID, b"some locked thing", db.DB_LOCK_WRITE)
if verbose:
print("Aquired lock: %s" % lock)
time.sleep(1)
@ -115,7 +115,7 @@ class LockingTestCase(unittest.TestCase):
if verbose:
print("%s: locker ID: %s" % (name, anID))
lock = self.env.lock_get(anID, "some locked thing", lockType)
lock = self.env.lock_get(anID, b"some locked thing", lockType)
if verbose:
print("%s: Aquired %s lock: %s" % (name, lt, lock))

View File

@ -47,14 +47,14 @@ class SimpleQueueTestCase(unittest.TestCase):
pprint(d.stat())
for x in letters:
d.append(x * 40)
d.append(bytes(x) * 40)
assert len(d) == 52
d.put(100, "some more data")
d.put(101, "and some more ")
d.put(75, "out of order")
d.put(1, "replacement data")
d.put(100, b"some more data")
d.put(101, b"and some more ")
d.put(75, b"out of order")
d.put(1, b"replacement data")
assert len(d) == 55
@ -71,7 +71,7 @@ class SimpleQueueTestCase(unittest.TestCase):
print("after open" + '-' * 30)
pprint(d.stat())
d.append("one more")
d.append(b"one more")
c = d.cursor()
if verbose:
@ -119,14 +119,14 @@ class SimpleQueueTestCase(unittest.TestCase):
pprint(d.stat())
for x in letters:
d.append(x * 40)
d.append(bytes(x) * 40)
assert len(d) == 52
d.put(100, "some more data")
d.put(101, "and some more ")
d.put(75, "out of order")
d.put(1, "replacement data")
d.put(100, b"some more data")
d.put(101, b"and some more ")
d.put(75, b"out of order")
d.put(1, b"replacement data")
assert len(d) == 55
@ -144,7 +144,7 @@ class SimpleQueueTestCase(unittest.TestCase):
print("after open" + '-' * 30)
pprint(d.stat())
d.append("one more")
d.append(b"one more")
if verbose:
print("after append" + '-' * 30)

View File

@ -41,7 +41,7 @@ class SimpleRecnoTestCase(unittest.TestCase):
d.open(self.filename, db.DB_RECNO, db.DB_CREATE)
for x in letters:
recno = d.append(x * 60)
recno = d.append(bytes(x) * 60)
assert type(recno) == type(0)
assert recno >= 1
if verbose:
@ -219,7 +219,7 @@ class SimpleRecnoTestCase(unittest.TestCase):
data = "The quick brown fox jumped over the lazy dog".split()
for datum in data:
d.append(datum)
d.append(bytes(datum))
d.sync()
d.close()
@ -238,8 +238,8 @@ class SimpleRecnoTestCase(unittest.TestCase):
d.set_re_source(source)
d.open(self.filename, db.DB_RECNO)
d[3] = 'reddish-brown'
d[8] = 'comatose'
d[3] = b'reddish-brown'
d[8] = b'comatose'
d.sync()
d.close()
@ -261,12 +261,12 @@ class SimpleRecnoTestCase(unittest.TestCase):
d.open(self.filename, db.DB_RECNO, db.DB_CREATE)
for x in letters:
d.append(x * 35) # These will be padded
d.append(bytes(x) * 35) # These will be padded
d.append('.' * 40) # this one will be exact
d.append(b'.' * 40) # this one will be exact
try: # this one will fail
d.append('bad' * 20)
d.append(b'bad' * 20)
except db.DBInvalidArgError as val:
assert val.args[0] == db.EINVAL
if verbose: print(val)

View File

@ -380,11 +380,13 @@ static int make_dbt(PyObject* obj, DBT* dbt)
if (obj == Py_None) {
/* no need to do anything, the structure has already been zeroed */
}
else if (!PyArg_Parse(obj, "s#", &dbt->data, &dbt->size)) {
else if (!PyBytes_Check(obj)) {
PyErr_SetString(PyExc_TypeError,
"Data values must be of type string or None.");
"Data values must be of type bytes or None.");
return 0;
}
dbt->data = PyBytes_AS_STRING(obj);
dbt->size = PyBytes_GET_SIZE(obj);
return 1;
}
@ -4737,7 +4739,7 @@ DBTxn_prepare(DBTxnObject* self, PyObject* args)
char* gid=NULL;
int gid_size=0;
if (!PyArg_ParseTuple(args, "s#:prepare", &gid, &gid_size))
if (!PyArg_ParseTuple(args, "y#:prepare", &gid, &gid_size))
return NULL;
if (gid_size != DB_XIDDATASIZE) {
@ -5915,6 +5917,7 @@ PyMODINIT_FUNC init_bsddb(void)
#if (DBVER >= 33)
ADD_INT(d, DB_DONOTINDEX);
ADD_INT(d, DB_XIDDATASIZE);
#endif
#if (DBVER >= 41)