def test_CondObjs(self):
        tabname = "test_CondObjs"

        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"
            })

        values = self.tdb.Select(
            tabname, ['p', 'e'],
            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(
            tabname, ['d', 'a'],
            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, {
                'b': dbtables.Cond(),
                'e': dbtables.LikeCond('%letter%'),
                'a': dbtables.PrefixCond('is'),
                'd': dbtables.ExactCond('is for dog'),
                'c': dbtables.PrefixCond('is for'),
                'p': lambda s: not s
            })
        assert len(values) == 1, values
        assert values[0]['d'] == "is for dog", values
        assert values[0]['a'] == "is for aardvark", values
    def test_Delete(self):
        tabname = "test_Delete"
        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
        # every column.
        # Hunted and Squashed by <Donwulff> (Jukka Santala - [email protected])
        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')})
        assert len(values) == 0
    def test04_MultiCondSelect(self):
        tabname = "test04_MultiCondSelect"
        try:
            self.tdb.Drop(tabname)
        except dbtables.TableDBError:
            pass
        self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])

        try:
            self.tdb.Insert(tabname, {
                'a': "",
                'e': pickle.dumps([{
                    4: 5,
                    6: 7
                }, 'foo'], 1),
                'f': "Zero"
            })
            assert 0
        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-"
        })

        if verbose:
            self.tdb._db_print()

        # 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
        # the least...)
        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 test03(self):
        tabname = "test03"
        try:
            self.tdb.Drop(tabname)
        except dbtables.TableDBError:
            pass
        if verbose:
            print '...before CreateTable...'
            self.tdb._db_print()
        self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])
        if verbose:
            print '...after CreateTable...'
            self.tdb._db_print()
        self.tdb.Drop(tabname)
        if verbose:
            print '...after Drop...'
            self.tdb._db_print()
        self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])

        try:
            self.tdb.Insert(tabname, {
                'a': "",
                'e': pickle.dumps([{
                    4: 5,
                    6: 7
                }, 'foo'], 1),
                'f': "Zero"
            })
            assert 0
        except dbtables.TableDBError:
            pass

        try:
            self.tdb.Select(tabname, [], conditions={'foo': '123'})
            assert 0
        except dbtables.TableDBError:
            pass

        self.tdb.Insert(tabname, {
            'a': '42',
            'b': "bad",
            'c': "meep",
            'e': 'Fuzzy wuzzy was a bear'
        })
        self.tdb.Insert(
            tabname, {
                'a': '581750',
                'b': "good",
                'd': "bla",
                'c': "black",
                'e': 'fuzzy was here'
            })
        self.tdb.Insert(
            tabname, {
                'a': '800000',
                'b': "good",
                'd': "bla",
                'c': "black",
                'e': 'Fuzzy wuzzy is a bear'
            })

        if verbose:
            self.tdb._db_print()

        # 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
                                 })
        assert len(values) == 2

        # 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 len(values) == 1
        assert values[0]['d'] == None

        values = self.tdb.Select(tabname, ['b'],
                                 conditions={'c': lambda c: c == 'meep'})
        assert len(values) == 1
        assert values[0]['b'] == "bad"