~bzr-pqm/bzr/bzr.dev

790 by Martin Pool
Merge from aaron:
1
# Copyright (C) 2005 by Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
17
from bzrlib.trace import mutter
1185.11.13 by John Arbash Meinel
Cleaned up meta_store to handle the new store and transport layout.
18
from bzrlib.store import Store
19
from bzrlib.transport.local import LocalTransport
790 by Martin Pool
Merge from aaron:
20
1185.11.13 by John Arbash Meinel
Cleaned up meta_store to handle the new store and transport layout.
21
class CachedStore(Store):
790 by Martin Pool
Merge from aaron:
22
    """A store that caches data locally, to avoid repeated downloads.
23
    The precacache method should be used to avoid server round-trips for
24
    every piece of data.
25
    """
26
    def __init__(self, store, cache_dir):
27
        self.source_store = store
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
28
        self.cache_store = store.__class__(LocalTransport(cache_dir))
790 by Martin Pool
Merge from aaron:
29
30
    def __getitem__(self, id):
31
        mutter("Cache add %s" % id)
32
        if id not in self.cache_store:
907.1.43 by John Arbash Meinel
Restoring compatibility for Storage.add(file, fileid), it is a little arbitrary, and compatibility is better
33
            self.cache_store.add(self.source_store[id], id)
790 by Martin Pool
Merge from aaron:
34
        return self.cache_store[id]
35
907.1.38 by John Arbash Meinel
Updating the CachedStore to support all of the Store functionality.
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
1185.11.15 by John Arbash Meinel
Got HttpTransport tests to pass. Check for EAGAIN, pass permit_failure around, etc
44
    def get(self, fileids, permit_failure=False, pb=None):
907.1.38 by John Arbash Meinel
Updating the CachedStore to support all of the Store functionality.
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:
1185.11.15 by John Arbash Meinel
Got HttpTransport tests to pass. Check for EAGAIN, pass permit_failure around, etc
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)
907.1.38 by John Arbash Meinel
Updating the CachedStore to support all of the Store functionality.
56
790 by Martin Pool
Merge from aaron:
57
    def prefetch(self, ids):
58
        """Copy a series of ids into the cache, before they are used.
59
        For remote stores that support pipelining or async downloads, this can
60
        increase speed considerably.
974.1.77 by Aaron Bentley
Fixed branch handling of missing revisions
61
62
        Failures while prefetching are ignored.
790 by Martin Pool
Merge from aaron:
63
        """
64
        mutter("Prefetch of ids %s" % ",".join(ids))
974.1.77 by Aaron Bentley
Fixed branch handling of missing revisions
65
        self.cache_store.copy_multi(self.source_store, ids, 
66
                                    permit_failure=True)
1185.11.13 by John Arbash Meinel
Cleaned up meta_store to handle the new store and transport layout.
67