~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/meta_store.py

  • Committer: Robert Collins
  • Date: 2005-10-02 01:53:46 UTC
  • mfrom: (1393.1.23)
  • Revision ID: robertc@robertcollins.net-20051002015346-587422189352289e
merge from upstream newformat

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
from bzrlib.trace import mutter
18
 
from bzrlib.store import ImmutableStore
19
 
 
20
 
 
21
 
class CachedStore:
 
18
from bzrlib.store import Store
 
19
from bzrlib.transport.local import LocalTransport
 
20
 
 
21
class CachedStore(Store):
22
22
    """A store that caches data locally, to avoid repeated downloads.
23
23
    The precacache method should be used to avoid server round-trips for
24
24
    every piece of data.
25
25
    """
26
26
    def __init__(self, store, cache_dir):
27
27
        self.source_store = store
28
 
        self.cache_store = ImmutableStore(cache_dir)
 
28
        self.cache_store = store.__class__(LocalTransport(cache_dir))
29
29
 
30
30
    def __getitem__(self, id):
31
31
        mutter("Cache add %s" % id)
33
33
            self.cache_store.add(self.source_store[id], id)
34
34
        return self.cache_store[id]
35
35
 
 
36
    def __contains__(self, fileid):
 
37
        if fileid in self.cache_store:
 
38
            return True
 
39
        if fileid in self.source_store:
 
40
            # We could copy at this time
 
41
            return True
 
42
        return False
 
43
 
 
44
    def get(self, fileids, permit_failure=False, pb=None):
 
45
        fileids = list(fileids)
 
46
        hasids = self.cache_store.has(fileids)
 
47
        needs = set()
 
48
        for has, fileid in zip(hasids, fileids):
 
49
            if not has:
 
50
                needs.add(fileid)
 
51
        if needs:
 
52
            self.cache_store.copy_multi(self.source_store, needs,
 
53
                    permit_failure=permit_failure)
 
54
        return self.cache_store.get(fileids,
 
55
                permit_failure=permit_failure, pb=pb)
 
56
 
36
57
    def prefetch(self, ids):
37
58
        """Copy a series of ids into the cache, before they are used.
38
59
        For remote stores that support pipelining or async downloads, this can
43
64
        mutter("Prefetch of ids %s" % ",".join(ids))
44
65
        self.cache_store.copy_multi(self.source_store, ids, 
45
66
                                    permit_failure=True)
 
67