From 5c3deb341db21c9b3d22ffcbdd452e20b235f082 Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Mon, 9 Feb 2009 23:08:30 +0100 Subject: [PATCH] Refactor blob cache code into separate module --- blobtracker.py | 20 +++++--------------- dbcache.py | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 dbcache.py diff --git a/blobtracker.py b/blobtracker.py index 0761090..08dffbc 100644 --- a/blobtracker.py +++ b/blobtracker.py @@ -1,31 +1,21 @@ import sys import db +import dbcache from git import git -_blob_cache = {} - -def get_blob(session, sha1): - if sha1 in _blob_cache: - return _blob_cache[sha1] - b = session.query(db.Blob).filter(db.Blob.sha1==sha1).first() - _blob_cache[sha1] = b - return b - -def scan_commit(session, commit): +def scan_commit(commit): for line in git('ls-tree', '-r', commit.sha1, ret_pipe=True): assert line.endswith('\n') rest, name = line[:-1].split('\t', 1) mode, type, sha1 = rest.split(' ') - blob = get_blob(session, sha1) - if not blob: - blob = db.Blob(sha1) - session.add(blob) - _blob_cache[sha1] = blob + blob = blob_cache.get(sha1) blob.update_contained_in(commit) def scan_history(excludes=[]): + global blob_cache session = db.Session() + blob_cache = dbcache.Cache(db.Blob, db.Blob.sha1, session) refdata = git('for-each-ref', '--format=%(objectname)')[0] refs = refdata.split() boundaries = session.query(db.Boundary).all() diff --git a/dbcache.py b/dbcache.py new file mode 100644 index 0000000..0012d4c --- /dev/null +++ b/dbcache.py @@ -0,0 +1,27 @@ +class Cache(object): + + def __init__(self, cls, attr, session): + self.cls = cls + self.attr = attr + self._cache = {} + self.session = session + + def __getitem__(self, key): + try: + return self._cache[key] + except KeyError: + pass + v = session.query(self.cls).filter(self.attr==key).first() + if not v: + raise KeyError + self._cache[key] = v + return v + + def get(self, key): + try: + v = self[key] + except KeyError: + v = cls(key) + self._cache[key] = v + session.add(v) + return v -- 2.11.4.GIT