~bzr/bzr/bzr.1.5

« back to all changes in this revision

Viewing changes to bzrlib/store/versioned/__init__.py

Reinstate the transaction cache for bzr 1.5rc1

Show diffs side-by-side

added added

removed removed

Lines of Context:
57
57
        # Used for passing get_scope to versioned file constructors;
58
58
        self.get_scope = None
59
59
 
 
60
    def _clear_cache_id(self, file_id, transaction):
 
61
        """WARNING may lead to inconsistent object references for file_id.
 
62
 
 
63
        Remove file_id from the transaction map. 
 
64
 
 
65
        NOT in the transaction api because theres no reliable way to clear
 
66
        callers. So its here for very specialised use rather than having an
 
67
        'api' that isn't.
 
68
        """
 
69
        weave = transaction.map.find_weave(file_id)
 
70
        if weave is not None:
 
71
            mutter("old data in transaction in %s for %s", self, file_id)
 
72
            # FIXME abstraction violation - transaction now has stale data.
 
73
            transaction.map.remove_object(weave)
 
74
 
60
75
    def filename(self, file_id):
61
76
        """Return the path relative to the transport root."""
62
77
        return self._relpath(file_id)
95
110
        filename = self.filename(file_id)
96
111
        for suffix in suffixes:
97
112
            self._transport.delete(filename + suffix)
 
113
        self._clear_cache_id(file_id, transaction)
98
114
 
99
115
    def _get(self, file_id):
100
116
        return self._transport.get(self.filename(file_id))
116
132
        file_id. This is used to reduce duplicate filename calculations when
117
133
        using 'get_weave_or_empty'. FOR INTERNAL USE ONLY.
118
134
        """
 
135
        weave = transaction.map.find_weave(file_id)
 
136
        if weave is not None:
 
137
            #mutter("cache hit in %s for %s", self, file_id)
 
138
            return weave
119
139
        if _filename is None:
120
140
            _filename = self.filename(file_id)
121
141
        if transaction.writeable():
122
142
            w = self._versionedfile_class(_filename, self._transport, self._file_mode,
123
143
                get_scope=self.get_scope, **self._versionedfile_kwargs)
 
144
            transaction.map.add_weave(file_id, w)
 
145
            transaction.register_dirty(w)
124
146
        else:
125
147
            w = self._versionedfile_class(_filename,
126
148
                                          self._transport,
129
151
                                          access_mode='r',
130
152
                                          get_scope=self.get_scope,
131
153
                                          **self._versionedfile_kwargs)
 
154
            transaction.map.add_weave(file_id, w)
 
155
            transaction.register_clean(w, precious=self._precious)
132
156
        return w
133
157
 
134
158
    def _make_new_versionedfile(self, file_id, transaction,
173
197
        except errors.NoSuchFile:
174
198
            weave = self._make_new_versionedfile(file_id, transaction,
175
199
                known_missing=True, _filename=_filename)
 
200
            transaction.map.add_weave(file_id, weave)
 
201
            # has to be dirty - its able to mutate on its own.
 
202
            transaction.register_dirty(weave)
176
203
            return weave
177
204
 
178
205
    def _put_weave(self, file_id, weave, transaction):
182
209
 
183
210
    def copy(self, source, result_id, transaction):
184
211
        """Copy the source versioned file to result_id in this store."""
 
212
        self._clear_cache_id(result_id, transaction)
185
213
        source.copy_to(self.filename(result_id), self._transport)
186
214
 
187
215
    def copy_all_ids(self, store_from, pb=None, from_transaction=None,