Backout "[entity,storage] remove hackish code from the bfss path
authorJulien Cristau <julien.cristau@logilab.fr>
Wed, 09 Dec 2015 18:21:55 +0100
changeset 10996 dc572d116731
parent 10995 c449f4415d0c
child 10997 da712d3f0601
Backout "[entity,storage] remove hackish code from the bfss path The merge of the repo-side and web-side entity caches doesn't actually work, because entities have a _cw attribute which is sometimes a connection and sometimes a web request, and whose nature changes not-really-predictably whenever ResultSet.get_entity() is called and brings it out of the cache. This reverts commit 59a79300f213.
entity.py
server/sources/storages.py
--- a/entity.py	Thu Dec 17 15:34:05 2015 +0100
+++ b/entity.py	Wed Dec 09 18:21:55 2015 +0100
@@ -559,6 +559,28 @@
             return self.eid
         return super(Entity, self).__hash__()
 
+    def _cw_update_attr_cache(self, attrcache):
+        trdata = self._cw.transaction_data
+        uncached_attrs = trdata.get('%s.storage-special-process-attrs' % self.eid, set())
+        for attr in uncached_attrs:
+            attrcache.pop(attr, None)
+            self.cw_attr_cache.pop(attr, None)
+        self.cw_attr_cache.update(attrcache)
+
+    def _cw_dont_cache_attribute(self, attr, repo_side=False):
+        """Called when some attribute has been transformed by a *storage*,
+        hence the original value should not be cached **by anyone**.
+
+        For example we have a special "fs_importing" mode in BFSS
+        where a file path is given as attribute value and stored as is
+        in the data base. Later access to the attribute will provide
+        the content of the file at the specified path. We do not want
+        the "filepath" value to be cached.
+
+        """
+        trdata = self._cw.transaction_data
+        trdata.setdefault('%s.storage-special-process-attrs' % self.eid, set()).add(attr)
+
     def __json_encode__(self):
         """custom json dumps hook to dump the entity's eid
         which is not part of dict structure itself
--- a/server/sources/storages.py	Thu Dec 17 15:34:05 2015 +0100
+++ b/server/sources/storages.py	Wed Dec 09 18:21:55 2015 +0100
@@ -154,6 +154,7 @@
         """an entity using this storage for attr has been added"""
         if entity._cw.transaction_data.get('fs_importing'):
             binary = Binary.from_file(entity.cw_edited[attr].getvalue())
+            entity._cw_dont_cache_attribute(attr)
         else:
             binary = entity.cw_edited.pop(attr)
             fd, fpath = self.new_fs_path(entity, attr)
@@ -173,6 +174,7 @@
             # We do not need to create it but we need to fetch the content of
             # the file as the actual content of the attribute
             fpath = entity.cw_edited[attr].getvalue()
+            entity._cw_dont_cache_attribute(attr)
             assert fpath is not None
             binary = Binary.from_file(fpath)
         else: