class TestTransaction(BaseVedisTestCase): def setUp(self): self.db = Vedis('test.db') def tearDown(self): try: self.db.close() finally: if os.path.exists('test.db'): os.unlink('test.db') def test_transaction(self): self.db['k1'] = 'v1' @self.db.commit_on_success def succeed(): self.db['k2'] = 'v2' @self.db.commit_on_success def fail(): self.db['k3'] = 'v3' raise Exception('uh-oh') succeed() self.assertEqual(self.db['k2'], b'v2') self.assertRaises(Exception, fail) self.assertFalse(self.db.exists('k3')) def test_base_transaction_methods(self): self.db.begin() self.db['k1'] = 'v1' self.db.rollback() self.assertFalse(self.db.exists('k1'))
class BaseVedisTestCase(unittest.TestCase): def setUp(self): super(BaseVedisTestCase, self).setUp() self.db = Vedis(':memory:') def tearDown(self): self.db.close() super(BaseVedisTestCase, self).tearDown() def set_k1_k2(self): # Short-hand for setting two keys. self.db['k1'] = 'v1' self.db['k2'] = 'v2'
class bulb: def __init__(self): self.path_base = '/usr/local/bin/' self.base = self.path_base + 'bulb' self.dimm_base = self.path_base + 'dimm_bulb' self.ved = Vedis('store.ved') def __del__(self): self.ved.close() def run(self, arg): call(['sudo', self.base, arg]) def dimm(self, level, inc): Popen(['sudo', self.dimm_base, '-l ' + str(level), '-i ' + str(inc)]) def undimm(self, level, inc): Popen(['sudo', self.dimm_base, '-l ' + str(level), '-i ' + str(inc), '-r'])
class VedisBackend(DBPlugin): def connect(self): path = os.path.join(self.project.outdir, DB_NAME) self._db = Vedis(path) def get_sample(self, sha256): s = self._samples[sha256] j = json.loads(s) bs = j.get('base_sample', None) if bs is not None: bs = self.get_sample(bs) #watch out for recursion! return Sample(self.project, j['file'], j['tags'], j['mutations'], bs) @commit_on_success def put_sample(self, sample): self._samples[sample.sha256] = sample.to_json() # keep reference of the sample for each tag :) for t in sample.tags: self.put_tag(t, sample.sha256) @commit_on_success def put_tag(self, tag, sha256): t = self._db.Set('tag_' + tag) t.add(sha256) def get_tagged_samples(self, tag): if isinstance(tag, basestring): tag = [ tag, ] for t in tag: for s in self._db.Set('tag_' + t): yield self.get_sample(s) @property def _samples(self): return self._db.Hash('samples') @property def _scans(self): return self._db.Hash('scans') def _pending_scans(self, scanner): return self._db.Set('{}_pending'.format(scanner)) def _done_scans(self, scanner): return self._db.Set('{}_done'.format(scanner)) def get_pending_scans(self, scanner): pending = self._pending_scans(scanner) if len(pending) == 0: return [] scans = [] for p in pending: d = self._get_scan(p) scans.append( Scan(scanner=scanner, uuid=d['uuid'], sample=d['sample'], scan_id=d['scan_id'], scan_results=d['scan_results'])) return scans @property def all_samples(self): # TODO: fix this for s in self._samples.keys(): yield self.get_sample(s) @commit_on_success def _put_scan_results(self, scan_result): self._scanresults[res.uuid] = scan_result # "update" the set of scanresults for a given scan @staticmethod def res_to_dict(scan): return { 'label': scan.label, 'sample': scan.sample.sha256, 'av': scan.av, 'extra': scan.extra } def _get_scan(self, uuid): return self._db.Hash(uuid) def _get_scan_result(self, scan): return self._db.Set(scan.uuid + '_results') def _res_by_sample(self, sample): return self._db.Set(scan.sample.sha + '_results') def _res_by_av(self, av): return self._db.Set(av + '_results') def _scan_by_sample(self, sample): return self._db.Set(sample.sha256 + '_scans') @commit_on_success def put_scan(self, scan): scanner = scan.scanner.short_name if scan.pending: # add to pending Set self._pending_scans(scanner).add(scan.uuid) else: self._pending_scans(scanner).remove(scan.uuid) self._put_scan_results(scan.scan_results) self._done_scan(scanner).add(scan.uuid) self._scan_by_sample(scan.sample).add(scan.uuid) for res in scan.scan_results: self._results(res.uuid).update(**res.to_dict()) # add its reference to sets for quick querying self._res_by_sample(scan.sample).add(res.uuid) self._res_by_av(res.av).add(res.uuid) self._get_scan(scan.uuid).update(**scan.to_dict()) l.debug("Scan %s stored in database", scan) def get_scan_results(self, av): pass def close(self): self._db.close()