Created
July 6, 2012 06:53
-
-
Save lessandro/3058494 to your computer and use it in GitHub Desktop.
dictdb - dict with transactions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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