Change conflict (409) replies format to text.
[pithos] / pithos / backends / simple.py
index 98d6a38..6d6efa2 100644 (file)
@@ -40,7 +40,7 @@ import binascii
 
 from base import NotAllowedError, BaseBackend
 from lib.hashfiler import Mapper, Blocker
-
+from django.utils.encoding import smart_unicode, smart_str
 
 logger = logging.getLogger(__name__)
 
@@ -72,7 +72,7 @@ class SimpleBackend(BaseBackend):
     
     # TODO: Create account if not present in all functions.
     
-    def __init__(self, db):
+    def __init__(self, db, db_options):
         self.hash_algorithm = 'sha256'
         self.block_size = 4 * 1024 * 1024 # 4MB
         
@@ -446,7 +446,7 @@ class SimpleBackend(BaseBackend):
         logger.debug("update_object_meta: %s %s %s %s %s", account, container, name, meta, replace)
         self._can_write(user, account, container, name)
         path, version_id, muser, mtime, size = self._get_objectinfo(account, container, name)
-        self._put_metadata(user, path, meta, replace)
+        return self._put_metadata(user, path, meta, replace)
     
     @backend_method
     def get_object_permissions(self, user, account, container, name):
@@ -525,6 +525,7 @@ class SimpleBackend(BaseBackend):
             self.con.execute(sql, (dest_version_id, k, v))
         if permissions is not None:
             self._put_permissions(path, r, w)
+        return dest_version_id
     
     @backend_method
     def copy_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions=None, src_version=None):
@@ -550,14 +551,16 @@ class SimpleBackend(BaseBackend):
             self.con.execute(sql, (dest_version_id, k, v))
         if permissions is not None:
             self._put_permissions(dest_path, r, w)
+        return dest_version_id
     
     @backend_method
     def move_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions=None):
         """Move an object's data and metadata."""
         
         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, permissions)
-        self.copy_object(user, account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, permissions, None)
+        dest_version_id = self.copy_object(user, account, src_container, src_name, dest_container, dest_name, dest_meta, replace_meta, permissions, None)
         self.delete_object(user, account, src_container, src_name)
+        return dest_version_id
     
     @backend_method
     def delete_object(self, user, account, container, name, until=None):
@@ -609,7 +612,7 @@ class SimpleBackend(BaseBackend):
     
     @backend_method(autocommit=0)
     def put_block(self, data):
-        """Create a block and return the hash."""
+        """Store a block and return the hash."""
         
         logger.debug("put_block: %s", len(data))
         hashes, absent = self.blocker.block_stor((data,))
@@ -661,7 +664,7 @@ class SimpleBackend(BaseBackend):
             row = c.fetchone()
             if not row:
                 raise IndexError('Version does not exist')
-        return str(row[0]), str(row[1]), int(row[2]), int(row[3])
+        return smart_str(row[0]), smart_str(row[1]), int(row[2]), int(row[3])
     
     def _put_version(self, path, user, size=0, hide=0):
         tstamp = int(time.time())
@@ -750,6 +753,7 @@ class SimpleBackend(BaseBackend):
             else:
                 sql = 'insert or replace into metadata (version_id, key, value) values (?, ?, ?)'
                 self.con.execute(sql, (dest_version_id, k, v))
+        return dest_version_id
     
     def _check_policy(self, policy):
         for k in policy.keys():
@@ -845,10 +849,10 @@ class SimpleBackend(BaseBackend):
         sql = 'select gname, user from groups where account = ?'
         c = self.con.execute(sql, (account,))
         groups = {}
-        for row in c.fetchall():
-            if row[0] not in groups:
-                groups[row[0]] = []
-            groups[row[0]].append(row[1])
+        for gname, user in c.fetchall():
+            if gname not in groups:
+                groups[gname] = []
+            groups[gname].append(user)
         return groups
     
     def _put_groups(self, account, groups, replace=False):
@@ -870,10 +874,10 @@ class SimpleBackend(BaseBackend):
         sql = '''select name from permissions
                     where name != ? and (name like ? or ? like name || ?)'''
         c = self.con.execute(sql, (path, path + '%', path, '%'))
-        row = c.fetchone()
-        if row:
+        rows = c.fetchall()
+        if rows:
             ae = AttributeError()
-            ae.data = row[0]
+            ae.data = rows
             raise ae
         
         # Format given permissions.
@@ -896,9 +900,11 @@ class SimpleBackend(BaseBackend):
         perms = {} # Return nothing, if nothing is set.
         for row in c.fetchall():
             name = row[0]
-            if row[1] not in perms:
-                perms[row[1]] = []
-            perms[row[1]].append(row[2])
+            op = row[1]
+            user = row[2]
+            if op not in perms:
+                perms[op] = []
+            perms[op].append(user)
         return name, perms
     
     def _put_permissions(self, path, r, w):
@@ -932,7 +938,7 @@ class SimpleBackend(BaseBackend):
         self.con.execute(sql, (path,))
     
     def _is_allowed(self, user, account, container, name, op='read'):
-        if user == account:
+        if smart_unicode(user) == smart_unicode(account):
             return True
         path = '/'.join((account, container, name))
         if op == 'read' and self._get_public(path):
@@ -946,12 +952,13 @@ class SimpleBackend(BaseBackend):
                 if ':' in y:
                     g_account, g_name = y.split(':', 1)
                     groups = self._get_groups(g_account)
-                    if g_name in groups:
+                    if g_name in groups.keys():
                         g_perms.update(groups[g_name])
                 else:
                     g_perms.add(y)
             perms[x] = g_perms
         
+        user = smart_unicode(user, strings_only=True)
         if op == 'read' and ('*' in perms['read'] or user in perms['read']):
             return True
         if '*' in perms['write'] or user in perms['write']: