Python 2.5 compatibility
[trackgit.git] / dbcache.py
blobe1f2869a21d2c61b0c3063c41251ba2c9942c008
1 import db
2 from sqlalchemy.orm import eagerload
4 class Cache(object):
6 def __init__(self, cls, attr, prefetch=None):
7 self.cls = cls
8 self.attr = attr
9 self._cache = {}
10 q = db.session.query(self.attr, self.cls)
11 if prefetch:
12 q.options(eagerload(prefetch))
13 for k,v in q:
14 self._cache[k] = v
15 self._new = set()
17 def __getitem__(self, key):
18 return self._cache[key]
20 def __contains__(self, key):
21 return key in self._cache
23 def __setitem__(self, key, value):
24 self._cache[key] = value
25 self._new.add(value)
27 def get(self, key):
28 try:
29 v = self[key]
30 except KeyError:
31 v = self.cls(key)
32 self[key] = v
33 return v
35 def flush(self):
36 db.session.add_all(self._new)
37 self._new = set()
38 db.session.flush()
40 print "generating blob cache ...",
41 blob_cache = Cache(db.Blob, db.Blob.sha1, db.Blob.newest_commit)
42 print len(blob_cache._cache)
44 print "generating file cache ...",
45 file_cache = Cache(db.Filename, db.Filename.name)
46 print len(file_cache._cache)
48 print "generating mail cache ...",
49 mail_cache = Cache(db.Mail, db.Mail.message_id)
50 print len(mail_cache._cache)