-
-
Notifications
You must be signed in to change notification settings - Fork 214
/
interface.py
116 lines (91 loc) · 3.72 KB
/
interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from abc import ABCMeta, abstractmethod
from .metadata import MetaDB
NOT_SET = object()
class AbstractBlobDB(metaclass=ABCMeta):
"""Storage interface for large binary data objects
The constructor of this class creates a `MetaDB` instance for managing
blob metadata, so it is important that subclass constructors call it.
"""
def __init__(self):
self.metadb = MetaDB()
@abstractmethod
def put(self, content, **blob_meta_args):
"""Put a blob in persistent storage
:param content: A file-like object in binary read mode.
:param **blob_meta_args: A single `"meta"` argument (`BlobMeta`
object) or arguments used to construct a `BlobMeta` object:
- domain - (required, text) domain name.
- parent_id - (required, text) parent identifier, used for
sharding.
- type_code - (required, int) blob type code. See
`corehq.blobs.CODES`.
- key - (optional, text) globally unique blob identifier. A
new key will be generated with `uuid4().hex` if missing or
`None`. This is the key used to store the blob in the external
blob store.
- name - (optional, text) blob name.
- content_length - (optional, int) content length. Will be
calculated from the given content if not given.
- content_type - (optional, text) content type.
- timeout - minimum number of minutes the object will live in
the blobdb. `None` means forever. There are no guarantees on the
maximum time it may live in blob storage.
NOTE: it is important to delete any blobs saved with this method
if it is called within a database transaction that ends up being
rolled back. Otherwise those blobs will be orphaned, meaning
they will be stored in the blob db backend indefinitely, but
their metadata will be lost.
:returns: A `BlobMeta` object. The returned object has a
`key` attribute that may be used to get or delete the blob.
"""
raise NotImplementedError
@abstractmethod
def get(self, key):
"""Get a blob
:param key: Blob key.
:returns: A file-like object in binary read mode. The returned
object should be closed when finished reading.
"""
raise NotImplementedError
@abstractmethod
def exists(self, key):
"""Check if blob exists
:param key: Blob key.
:returns: True if the object exists else false.
"""
raise NotImplementedError
@abstractmethod
def size(self, key):
"""Gets the size of a blob in bytes
:param key: Blob key.
:returns: The number of bytes of a blob
"""
raise NotImplementedError
@abstractmethod
def delete(self, key):
"""Delete a blob
:param key: Blob key.
:returns: True if the blob was deleted else false. None if it is
not known if the blob was deleted or not.
"""
raise NotImplementedError
@abstractmethod
def bulk_delete(self, metas):
"""Delete multiple blobs.
:param metas: The list of `BlobMeta` objects for blobs to delete.
:returns: True if all the blobs were deleted else false. `None` if
it is not known if the blob was deleted or not.
"""
raise NotImplementedError
def expire(self, *args, **kw):
"""Set blob expiration
See `metadata.MetaDB.expire` for more details
"""
self.metadb.expire(*args, **kw)
@abstractmethod
def copy_blob(self, content, key):
"""Copy blob from other blob database
:param content: File-like blob content object.
:param key: Blob key.
"""
raise NotImplementedError