Fix "what's cooking" processing
[trackgit.git] / dbcache.py
blob17de4e74783ab98200dd2460087497fa1e340f71
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 db.session.flush()
39 print "generating blob cache ...",
40 blob_cache = Cache(db.Blob, db.Blob.sha1, db.Blob.newest_commit)
41 print len(blob_cache._cache)
43 print "generating file cache ...",
44 file_cache = Cache(db.Filename, db.Filename.name)
45 print len(file_cache._cache)
47 print "generating mail cache ...",
48 mail_cache = Cache(db.Mail, db.Mail.message_id)
49 print len(mail_cache._cache)