#-----------------------------------------------------------------------
# A test suite for the table interface built on bsddb.db
#-----------------------------------------------------------------------
# Copyright (C) 2000, 2001 by Autonomous Zone Industries
# Copyright (C) 2002 Gregory P. Smith
# License: This is free software. You may use this software for any
# purpose including modification/redistribution, so long as
# this header remains intact and that you do not claim any
# rights of ownership or authorship of this software. This
# software has been tested, but no warranty is expressed or
# -- Gregory P. Smith <greg@electricrain.com>
# $Id: test_dbtables.py,v 1.7 2004/02/12 17:35:08 doerwalter Exp $
from test_all
import verbose
# For Pythons w/distutils pybsddb
from bsddb3
import db
, dbtables
from bsddb
import db
, dbtables
#----------------------------------------------------------------------
class TableDBTestCase(unittest
.TestCase
):
db_name
= 'test-table.db'
homeDir
= os
.path
.join(os
.path
.dirname(sys
.argv
[0]), 'db_home')
self
.tdb
= dbtables
.bsdTableDB(
filename
='tabletest.db', dbhome
=homeDir
, create
=1)
files
= glob
.glob(os
.path
.join(self
.homeDir
, '*'))
except dbtables
.TableDBError
:
self
.tdb
.CreateTable(tabname
, [colname
])
self
.tdb
.Insert(tabname
, {colname
: pickle
.dumps(3.14159, 1)})
values
= self
.tdb
.Select(
tabname
, [colname
], conditions
={colname
: None})
colval
= pickle
.loads(values
[0][colname
])
assert(colval
> 3.141 and colval
< 3.142)
{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'}
except dbtables
.TableDBError
:
self
.tdb
.CreateTable(tabname
, [col0
, col1
, col2
])
self
.tdb
.Insert(tabname
, row
)
values
= self
.tdb
.Select(tabname
, [col2
],
conditions
={col0
: lambda x
: pickle
.loads(x
) >= 8})
if values
[0]['Species'] == 'Penguin' :
assert values
[1]['Species'] == 'SR-71A Blackbird'
elif values
[0]['Species'] == 'SR-71A Blackbird' :
assert values
[1]['Species'] == 'Penguin'
print "values= %r" % (values
,)
raise "Wrong values returned!"
except dbtables
.TableDBError
:
print '...before CreateTable...'
self
.tdb
.CreateTable(tabname
, ['a', 'b', 'c', 'd', 'e'])
print '...after CreateTable...'
self
.tdb
.CreateTable(tabname
, ['a', 'b', 'c', 'd', 'e'])
'e': pickle
.dumps([{4:5, 6:7}, 'foo'], 1),
except dbtables
.TableDBError
:
self
.tdb
.Select(tabname
, [], conditions
={'foo': '123'})
except dbtables
.TableDBError
:
'e': 'Fuzzy wuzzy was a bear'})
'e': 'Fuzzy wuzzy is a bear'})
# this should return two rows
values
= self
.tdb
.Select(tabname
, ['b', 'a', 'd'],
conditions
={'e': re
.compile('wuzzy').search
,
'a': re
.compile('^[0-9]+$').match
})
# now lets delete one of them and try again
self
.tdb
.Delete(tabname
, conditions
={'b': dbtables
.ExactCond('good')})
values
= self
.tdb
.Select(
tabname
, ['a', 'd', 'b'],
conditions
={'e': dbtables
.PrefixCond('Fuzzy')})
assert values
[0]['d'] == None
values
= self
.tdb
.Select(tabname
, ['b'],
conditions
={'c': lambda c
: c
== 'meep'})
assert values
[0]['b'] == "bad"
def test04_MultiCondSelect(self
):
tabname
= "test04_MultiCondSelect"
except dbtables
.TableDBError
:
self
.tdb
.CreateTable(tabname
, ['a', 'b', 'c', 'd', 'e'])
'e': pickle
.dumps([{4:5, 6:7}, 'foo'], 1),
except dbtables
.TableDBError
:
self
.tdb
.Insert(tabname
, {'a': "A", 'b': "B", 'c': "C", 'd': "D",
self
.tdb
.Insert(tabname
, {'a': "-A", 'b': "-B", 'c': "-C", 'd': "-D",
self
.tdb
.Insert(tabname
, {'a': "A-", 'b': "B-", 'c': "C-", 'd': "D-",
# This select should return 0 rows. it is designed to test
# the bug identified and fixed in sourceforge bug # 590449
# (Big Thanks to "Rob Tillotson (n9mtb)" for tracking this down
# and supplying a fix!! This one caused many headaches to say
values
= self
.tdb
.Select(tabname
, ['b', 'a', 'd'],
conditions
={'e': dbtables
.ExactCond('E'),
'a': dbtables
.ExactCond('A'),
'd': dbtables
.PrefixCond('-')
assert len(values
) == 0, values
def test_CreateOrExtend(self
):
tabname
= "test_CreateOrExtend"
self
.tdb
.CreateOrExtendTable(
tabname
, ['name', 'taste', 'filling', 'alcohol content', 'price'])
'is it Guinness?': 'no'})
assert 0, "Insert should've failed due to bad column name"
self
.tdb
.CreateOrExtendTable(tabname
,
['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',
tabname
= "test_CondObjs"
self
.tdb
.CreateTable(tabname
, ['a', 'b', 'c', 'd', 'e', 'p'])
self
.tdb
.Insert(tabname
, {'a': "the letter A",
self
.tdb
.Insert(tabname
, {'a': "is for aardvark",
self
.tdb
.Insert(tabname
, {'a': "the letter A",
values
= self
.tdb
.Select(
conditions
={'e': dbtables
.PrefixCond('the l')})
assert len(values
) == 2, values
assert values
[0]['e'] == values
[1]['e'], values
assert values
[0]['p'] != values
[1]['p'], values
values
= self
.tdb
.Select(
conditions
={'a': dbtables
.LikeCond('%aardvark%')})
assert len(values
) == 1, values
assert values
[0]['d'] == "is for dog", values
assert values
[0]['a'] == "is for aardvark", values
values
= self
.tdb
.Select(tabname
, None,
'e':dbtables
.LikeCond('%letter%'),
'a':dbtables
.PrefixCond('is'),
'd':dbtables
.ExactCond('is for dog'),
'c':dbtables
.PrefixCond('is for'),
assert len(values
) == 1, values
assert values
[0]['d'] == "is for dog", values
assert values
[0]['a'] == "is for aardvark", values
self
.tdb
.CreateTable(tabname
, ['x', 'y', 'z'])
# prior to 2001-05-09 there was a bug where Delete() would
# fail if it encountered any rows that did not have values in
# 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
.Delete(tabname
, conditions
={'x': dbtables
.PrefixCond('X')})
values
= self
.tdb
.Select(tabname
, ['y'],
conditions
={'x': dbtables
.PrefixCond('X')})
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'})
def increment_access(count
):
conditions
={'Access': dbtables
.ExactCond('0')},
mappings
={'Access': remove_value
})
conditions
={'Name': dbtables
.LikeCond('%MP3%')},
mappings
={'Type': set_type
})
conditions
={'Name': dbtables
.LikeCond('%')},
mappings
={'Access': increment_access
})
# Delete key in select conditions
values
= self
.tdb
.Select(
conditions
={'Type': dbtables
.ExactCond('Unknown')})
assert len(values
) == 1, values
assert values
[0]['Name'] == None, values
assert values
[0]['Access'] == None, values
# Modify value by select conditions
values
= self
.tdb
.Select(
conditions
={'Name': dbtables
.ExactCond('Nifty.MP3')})
assert len(values
) == 1, values
assert values
[0]['Type'] == "MP3", values
assert values
[0]['Access'] == "2", values
# Make sure change applied only to select conditions
values
= self
.tdb
.Select(
tabname
, None, conditions
={'Name': dbtables
.LikeCond('%doc%')})
assert len(values
) == 1, values
assert values
[0]['Type'] == "Word", values
assert values
[0]['Access'] == "9", values
suite
= unittest
.TestSuite()
suite
.addTest(unittest
.makeSuite(TableDBTestCase
))
if __name__
== '__main__':
unittest
.main(defaultTest
='test_suite')