~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
17
from trace import mutter
18
from bzrlib.store import ImmutableStore
19
20
class CachedStore:
21
    """A store that caches data locally, to avoid repeated downloads.
22
    The precacache method should be used to avoid server round-trips for
23
    every piece of data.
24
    """
25
    def __init__(self, store, cache_dir):
26
        self.source_store = store
27
        self.cache_store = ImmutableStore(cache_dir)
28
29
    def __getitem__(self, id):
30
        mutter("Cache add %s" % id)
31
        if id not in self.cache_store:
32
            self.cache_store.add(self.source_store[id], id)
33
        return self.cache_store[id]
34
35
    def prefetch(self, ids):
36
        """Copy a series of ids into the cache, before they are used.
37
        For remote stores that support pipelining or async downloads, this can
38
        increase speed considerably.
1185.3.11 by Martin Pool
- merge pull & missing-revision improvements from aaron
39
40
        Failures while prefetching are ignored.
790 by Martin Pool
Merge from aaron:
41
        """
42
        mutter("Prefetch of ids %s" % ",".join(ids))
1185.3.11 by Martin Pool
- merge pull & missing-revision improvements from aaron
43
        self.cache_store.copy_multi(self.source_store, ids, 
44
                                    permit_failure=True)