~jerith/entropy-store/arbitrary-object-id

« back to all changes in this revision

Viewing changes to entropy/store.py

  • Committer: Tristan Seligmann
  • Date: 2010-10-19 03:21:05 UTC
  • Revision ID: mithrandi@mithrandi.net-20101019032105-3vpdn3tcfit1j3af
Reformat.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
from nevow.rend import NotFound
35
35
from nevow.url import URL
36
36
 
37
 
from entropy.ientropy import IContentStore, IContentObject, ISiblingStore
 
37
from entropy.ientropy import (IContentStore, IContentObject, ISiblingStore,
 
38
    IBackendStore)
38
39
from entropy.errors import CorruptObject, NonexistentObject
39
40
from entropy.hash import getHash
40
41
from entropy.util import deferred, getPageWithHeaders
78
79
    def verify(self):
79
80
        digest = self._getDigest()
80
81
        if self.contentDigest != digest:
81
 
            raise CorruptObject('expected: %r actual: %r' % (self.contentDigest, digest))
 
82
            raise CorruptObject(
 
83
                'expected: %r actual: %r' % (self.contentDigest, digest))
82
84
 
83
85
 
84
86
    def getContent(self):
114
116
        if metadata != {}:
115
117
            raise NotImplementedError('metadata not yet supported')
116
118
 
117
 
        contentDigest = unicode(getHash(self.hash)(content).hexdigest(), 'ascii')
 
119
        contentDigest = getHash(self.hash)(content).hexdigest()
 
120
        contentDigest = unicode(contentDigest, 'ascii')
118
121
 
119
122
        if created is None:
120
123
            created = Time()
121
124
 
122
 
        obj = self.store.findUnique(ImmutableObject,
123
 
                                    AND(ImmutableObject.hash == self.hash,
124
 
                                        ImmutableObject.contentDigest == contentDigest),
125
 
                                    default=None)
 
125
        obj = self.store.findUnique(
 
126
            ImmutableObject,
 
127
            AND(ImmutableObject.hash == self.hash,
 
128
                ImmutableObject.contentDigest == contentDigest),
 
129
            default=None)
126
130
        if obj is None:
127
 
            contentFile = self.store.newFile('objects', 'immutable', '%s:%s' % (self.hash, contentDigest))
 
131
            contentFile = self.store.newFile(
 
132
                'objects', 'immutable', '%s:%s' % (self.hash, contentDigest))
128
133
            contentFile.write(content)
129
134
            contentFile.close()
130
135
 
162
167
        @returns: the local imported object.
163
168
        @type obj: ImmutableObject
164
169
        """
165
 
        siblings = iter(list(self.store.powerupsFor(ISiblingStore)))
 
170
        siblings = list(self.store.powerupsFor(ISiblingStore))
 
171
        siblings.extend(self.store.powerupsFor(IBackendStore))
 
172
        siblings = iter(siblings)
166
173
 
167
174
        def _eb(f):
168
175
            f.trap(NonexistentObject)
171
178
            except StopIteration:
172
179
                raise NonexistentObject(objectId)
173
180
 
174
 
            return remoteStore.getObject(objectId).addCallbacks(self.importObject, _eb)
 
181
            d = remoteStore.getObject(objectId)
 
182
            d.addCallbacks(self.importObject, _eb)
 
183
            return d
175
184
 
176
185
        return self.getObject(objectId).addErrback(_eb)
177
186
 
188
197
    @transacted
189
198
    def getObject(self, objectId):
190
199
        hash, contentDigest = objectId.split(u':', 1)
191
 
        obj = self.store.findUnique(ImmutableObject,
192
 
                                    AND(ImmutableObject.hash == hash,
193
 
                                        ImmutableObject.contentDigest == contentDigest),
194
 
                                    default=None)
 
200
        obj = self.store.findUnique(
 
201
            ImmutableObject,
 
202
            AND(ImmutableObject.hash == hash,
 
203
                ImmutableObject.contentDigest == contentDigest),
 
204
            default=None)
195
205
        if obj is None:
196
206
            raise NonexistentObject(objectId)
197
207
        return obj
304
314
 
305
315
 
306
316
 
307
 
class MemoryObject(record('content hash contentDigest contentType created metadata', metadata={})):
 
317
class MemoryObject(record('content hash contentDigest contentType created '
 
318
                          'metadata', metadata={})):
308
319
    implements(IContentObject)
309
320
 
310
321
 
324
335
    """
325
336
    implements(IContentStore)
326
337
 
327
 
    entropyURI = text(allowNone=False, doc="""The URI of the Entropy service in use.""")
 
338
    entropyURI = text(allowNone=False,
 
339
                      doc="""The URI of the Entropy service in use.""")
328
340
 
329
341
    def getURI(self, documentId):
330
342
        """
350
362
 
351
363
        def _makeContentObject((data, headers)):
352
364
            # XXX: Actually get the real creation time
353
 
            return MemoryObject(content=data,
354
 
                                hash=hash,
355
 
                                contentDigest=contentDigest,
356
 
                                contentType=unicode(headers['content-type'][0], 'ascii'),
357
 
                                metadata={},
358
 
                                created=Time())
 
365
            return MemoryObject(
 
366
                content=data,
 
367
                hash=hash,
 
368
                contentDigest=contentDigest,
 
369
                contentType=unicode(headers['content-type'][0], 'ascii'),
 
370
                metadata={},
 
371
                created=Time())
359
372
 
360
373
        def _eb(f):
361
374
            f.trap(eweb.Error)