Skip to content

Instantly share code, notes, and snippets.

@lessandro
Created July 6, 2012 06:53
Show Gist options
  • Select an option

  • Save lessandro/3058494 to your computer and use it in GitHub Desktop.

Select an option

Save lessandro/3058494 to your computer and use it in GitHub Desktop.
dictdb - dict with transactions
class Dictdb:
def __init__(self):
self.db = {}
self.rdb = {}
self.rdiff = []
def rinc(self, val):
if val not in self.rdb:
self.rdb[val] = 0
self.rdb[val] += 1
def rdec(self, val):
self.rdb[val] -= 1
def get(self, key):
return self.db.get(key)
def _set(self, key, val):
if key in self.db:
self.rdec(self.db[key])
del self.db[key]
if val is not None:
self.db[key] = val
self.rinc(val)
def set(self, key, val):
if self.rdiff:
rdiff = self.rdiff[-1]
if key not in rdiff:
rdiff[key] = self.db.get(key)
self._set(key, val)
def unset(self, key):
self.set(key, None)
def count(self, val):
return self.rdb[val] if val in self.rdb else 0
def begin(self):
self.rdiff.append({})
def rollback(self):
if not self.rdiff:
return False
rdiff = self.rdiff.pop()
for key, val in rdiff.iteritems():
self._set(key, val)
return True
def commit(self):
self.rdiff = []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment