示例#1
0
    def test_creation(self):
        """Tests record creation and low level
        scanning to retrieve records from the database."""

        rec = wgdb.create_record(self.d, 3)
        self.assertTrue(wgdb.is_record(rec))
        l = wgdb.get_record_len(self.d, rec)
        self.assertEqual(l, 3)
        rec2 = wgdb.create_raw_record(self.d, 678)
        self.assertTrue(wgdb.is_record(rec2))
        l = wgdb.get_record_len(self.d, rec2)
        self.assertEqual(l, 678)
        
        # wgdb module only allows comparing records by contents
        # so we need to use recognizable data for this test.
        wgdb.set_field(self.d, rec, 0, 99531179)
        wgdb.set_field(self.d, rec2, 0, 55498756)

        # XXX: the following relies on certain assumptions on memory
        # management of WhiteDB. By the API description, the records
        # are not necessarily fetched in order of creation, it is just
        # useful for the current test case that it happens to be the case.
        #
        cand = wgdb.get_first_record(self.d)
        self.assertEqual(wgdb.get_field(self.d, cand, 0), 99531179)
        cand = wgdb.get_next_record(self.d, cand)
        self.assertEqual(wgdb.get_field(self.d, cand, 0), 55498756)

        # This, however, should always work correctly
        wgdb.delete_record(self.d, rec)
        cand = wgdb.get_first_record(self.d)
        self.assertEqual(wgdb.get_field(self.d, cand, 0), 55498756)
示例#2
0
 def delete_record(self, rec):
     """Delete record."""
     if self.locking:
         self.start_write()
     try:
         r = wgdb.delete_record(self._db, rec.get__rec())
     finally:
         if self.locking:
             self.end_write()
     rec.set__rec(None)  # prevent future usage
示例#3
0
    def test_query(self):
        """Tests various queries:
            - read pre-generated content;
            - update content;
            - read updated content;
            - delete rows;
            - check row count after deleting.
        """

        dbsize = 10 # use a fairly small database
        self.make_testdata(dbsize)

        # Content check read queries
        for i in range(dbsize):
            val = str(10 * i)
            self.check_matching_rows(0, wgdb.COND_EQUAL, val, 50*50)

        for i in range(50):
            val = 100 * i
            self.check_matching_rows(1, wgdb.COND_EQUAL, val, dbsize*50)

        for i in range(50):
            val = float(1000 * i)
            self.check_matching_rows(2, wgdb.COND_EQUAL, val, dbsize*50)

        # Update queries
        for i in range(dbsize):
            c1 = str(10 * i)

            query = wgdb.make_query(self.d,
                arglist = [(0, wgdb.COND_EQUAL, c1)])
            rec = self.fetch(query)
            while rec is not None:
                c2 = wgdb.get_field(self.d, rec, 1)
                wgdb.set_field(self.d, rec, 1, c2 - 34555)
                rec = self.fetch(query)

        for i in range(50):
            c2 = 100 * i - 34555

            query = wgdb.make_query(self.d,
                arglist = [(1, wgdb.COND_EQUAL, c2)])
            rec = self.fetch(query)
            while rec is not None:
                c3 = wgdb.get_field(self.d, rec, 2)
                wgdb.set_field(self.d, rec, 2, c3 + 177889.576)
                rec = self.fetch(query)

        for i in range(50):
            c3 = 1000 * i + 177889.576

            query = wgdb.make_query(self.d,
                arglist = [(2, wgdb.COND_EQUAL, c3)])
            rec = self.fetch(query)
            while rec is not None:
                c1val = int(wgdb.get_field(self.d, rec, 0))
                c1 = str(c1val + 99)
                wgdb.set_field(self.d, rec, 0, c1)
                rec = self.fetch(query)

        # Content check read queries, iteration 2
        for i in range(dbsize):
            val = str(10 * i + 99)
            self.check_matching_rows(0, wgdb.COND_EQUAL, val, 50*50)

        for i in range(50):
            val = 100 * i - 34555
            self.check_matching_rows(1, wgdb.COND_EQUAL, val, dbsize*50)

        for i in range(50):
            val = 1000 * i + 177889.576
            self.check_matching_rows(2, wgdb.COND_EQUAL, val, dbsize*50)

        # Delete query
        for i in range(dbsize):
            c1 = str(10 * i + 99)
            arglist = [ (0, wgdb.COND_EQUAL, c1),
                        (1, wgdb.COND_GREATER, -30556), # 10 matching
                        (2, wgdb.COND_LESSTHAN, 217889.575) # 40 matching
            ]
            query = wgdb.make_query(self.d, arglist = arglist)
            rec = self.fetch(query)
            while rec is not None:
                wgdb.delete_record(self.d, rec)
                rec = self.fetch(query)

        # Database scan
        self.check_db_rows(dbsize * (50 * 50 - 10 * 40))