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