Revision 83dd59c5 pithos/backends/simple.py

b/pithos/backends/simple.py
81 81
        self.con.execute(sql)
82 82
        self.con.commit()
83 83
    
84
    def delete_account(self, account):
84
    def delete_account(self, user, account):
85 85
        """Delete the account with the given name."""
86 86
        
87 87
        logger.debug("delete_account: %s", account)
......
90 90
            raise IndexError('Account is not empty')
91 91
        self._del_path(account) # Point of no return.
92 92
    
93
    def get_account_meta(self, account, until=None):
93
    def get_account_meta(self, user, account, until=None):
94 94
        """Return a dictionary with the account metadata."""
95 95
        
96 96
        logger.debug("get_account_meta: %s %s", account, until)
......
124 124
            meta.update({'until_timestamp': tstamp})
125 125
        return meta
126 126
    
127
    def update_account_meta(self, account, meta, replace=False):
127
    def update_account_meta(self, user, account, meta, replace=False):
128 128
        """Update the metadata associated with the account."""
129 129
        
130 130
        logger.debug("update_account_meta: %s %s %s", account, meta, replace)
131 131
        self._put_metadata(account, meta, replace)
132 132
    
133
    def list_containers(self, account, marker=None, limit=10000, until=None):
133
    def list_containers(self, user, account, marker=None, limit=10000, until=None):
134 134
        """Return a list of containers existing under an account."""
135 135
        
136 136
        logger.debug("list_containers: %s %s %s %s", account, marker, limit, until)
137 137
        return self._list_objects(account, '', '/', marker, limit, False, [], until)
138 138
    
139
    def put_container(self, account, container):
139
    def put_container(self, user, account, container):
140 140
        """Create a new container with the given name."""
141 141
        
142 142
        logger.debug("put_container: %s %s", account, container)
......
148 148
        else:
149 149
            raise NameError('Container already exists')
150 150
    
151
    def delete_container(self, account, container):
151
    def delete_container(self, user, account, container):
152 152
        """Delete the container with the given name."""
153 153
        
154 154
        logger.debug("delete_container: %s %s", account, container)
......
159 159
        self._del_path(path) # Point of no return.
160 160
        self._copy_version(account, account, True, True) # New account version.
161 161
    
162
    def get_container_meta(self, account, container, until=None):
162
    def get_container_meta(self, user, account, container, until=None):
163 163
        """Return a dictionary with the container metadata."""
164 164
        
165 165
        logger.debug("get_container_meta: %s %s %s", account, container, until)
......
181 181
            meta.update({'until_timestamp': tstamp})
182 182
        return meta
183 183
    
184
    def update_container_meta(self, account, container, meta, replace=False):
184
    def update_container_meta(self, user, account, container, meta, replace=False):
185 185
        """Update the metadata associated with the container."""
186 186
        
187 187
        logger.debug("update_container_meta: %s %s %s %s", account, container, meta, replace)
188 188
        path, version_id, mtime = self._get_containerinfo(account, container)
189 189
        self._put_metadata(path, meta, replace)
190 190
    
191
    def list_objects(self, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, keys=[], until=None):
191
    def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, keys=[], until=None):
192 192
        """Return a list of objects existing under a container."""
193 193
        
194 194
        logger.debug("list_objects: %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, until)
195 195
        path, version_id, mtime = self._get_containerinfo(account, container, until)
196 196
        return self._list_objects(path, prefix, delimiter, marker, limit, virtual, keys, until)
197 197
    
198
    def list_object_meta(self, account, container, until=None):
198
    def list_object_meta(self, user, account, container, until=None):
199 199
        """Return a list with all the container's object meta keys."""
200 200
        
201 201
        logger.debug("list_object_meta: %s %s %s", account, container, until)
......
206 206
        c = self.con.execute(sql, (path + '/%',))
207 207
        return [x[0] for x in c.fetchall()]
208 208
    
209
    def get_object_meta(self, account, container, name, version=None):
209
    def get_object_meta(self, user, account, container, name, version=None):
210 210
        """Return a dictionary with the object metadata."""
211 211
        
212 212
        logger.debug("get_object_meta: %s %s %s %s", account, container, name, version)
......
220 220
        meta.update({'name': name, 'bytes': size, 'version': version_id, 'version_timestamp': mtime, 'modified': modified})
221 221
        return meta
222 222
    
223
    def update_object_meta(self, account, container, name, meta, replace=False):
223
    def update_object_meta(self, user, account, container, name, meta, replace=False):
224 224
        """Update the metadata associated with the object."""
225 225
        
226 226
        logger.debug("update_object_meta: %s %s %s %s %s", account, container, name, meta, replace)
227 227
        path, version_id, mtime, size = self._get_objectinfo(account, container, name)
228 228
        self._put_metadata(path, meta, replace)
229 229
    
230
    def get_object_hashmap(self, account, container, name, version=None):
230
    def get_object_hashmap(self, user, account, container, name, version=None):
231 231
        """Return the object's size and a list with partial hashes."""
232 232
        
233 233
        logger.debug("get_object_hashmap: %s %s %s %s", account, container, name, version)
......
237 237
        hashmap = [x[0] for x in c.fetchall()]
238 238
        return size, hashmap
239 239
    
240
    def update_object_hashmap(self, account, container, name, size, hashmap):
240
    def update_object_hashmap(self, user, account, container, name, size, hashmap, meta={}, replace_meta=False):
241 241
        """Create/update an object with the specified size and partial hashes."""
242 242
        
243 243
        logger.debug("update_object_hashmap: %s %s %s %s %s", account, container, name, size, hashmap)
244 244
        path = self._get_containerinfo(account, container)[0]
245 245
        path = os.path.join(path, name)
246
        src_version_id, dest_version_id = self._copy_version(path, path, True, False)
246
        src_version_id, dest_version_id = self._copy_version(path, path, not replace_meta, False)
247 247
        sql = 'update versions set size = ? where version_id = ?'
248 248
        self.con.execute(sql, (size, dest_version_id))
249 249
        # TODO: Check for block_id existence.
250 250
        for i in range(len(hashmap)):
251 251
            sql = 'insert or replace into hashmaps (version_id, pos, block_id) values (?, ?, ?)'
252 252
            self.con.execute(sql, (dest_version_id, i, hashmap[i]))
253
        for k, v in meta.iteritems():
254
            sql = 'insert or replace into metadata (version_id, key, value) values (?, ?, ?)'
255
            self.con.execute(sql, (dest_version_id, k, v))
253 256
        self.con.commit()
254 257
    
255
    def copy_object(self, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, src_version=None):
258
    def copy_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, src_version=None):
256 259
        """Copy an object's data and metadata."""
257 260
        
258 261
        logger.debug("copy_object: %s %s %s %s %s %s %s %s", account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, src_version)
......
268 271
            self.con.execute(sql, (dest_version_id, k, v))
269 272
        self.con.commit()
270 273
    
271
    def move_object(self, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, src_version=None):
274
    def move_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, src_version=None):
272 275
        """Move an object's data and metadata."""
273 276
        
274 277
        logger.debug("move_object: %s %s %s %s, %s %s %s %s", account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, src_version)
275
        self.copy_object(account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, src_version)
276
        self.delete_object(account, src_container, src_name)
278
        self.copy_object(user, account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, src_version)
279
        self.delete_object(user, account, src_container, src_name)
277 280
    
278
    def delete_object(self, account, container, name):
281
    def delete_object(self, user, account, container, name):
279 282
        """Delete an object."""
280 283
        
281 284
        logger.debug("delete_object: %s %s %s", account, container, name)
282 285
        path, version_id, mtime, size = self._get_objectinfo(account, container, name)
283 286
        self._put_version(path, 0, 1)
284 287
    
285
    def list_versions(self, account, container, name):
286
        """Return a list of version (version_id, version_modified) tuples for an object."""
288
    def list_versions(self, user, account, container, name):
289
        """Return a list of all (version, version_timestamp) tuples for an object."""
287 290
        
291
        logger.debug("list_versions: %s %s %s", account, container, name)
288 292
        # This will even show deleted versions.
289 293
        path = os.path.join(account, container, name)
290 294
        sql = '''select distinct version_id, strftime('%s', tstamp) from versions where name = ?'''
......
472 476
                    if i != -1:
473 477
                        pseudo_name = pseudo_name[:i + len(delimiter)]
474 478
                    if pseudo_name not in [y[0] for y in pseudo_objects]:
475
                        pseudo_objects.append((pseudo_name, x[1]))
479
                        if pseudo_name == x[0]:
480
                            pseudo_objects.append(x)
481
                        else:
482
                            pseudo_objects.append((pseudo_name, None))
476 483
            objects = pseudo_objects
477 484
        
478 485
        start = 0

Also available in: Unified diff