changeset 2097:cd0d3f576ca6

Solution for issues 250, 334, 207 which involves calling a refcheck( whether there is any reference to the given DATAID or not) before destroying the DATAID
author Ashutosh Singla <ashu1461@gmail.com>
date Sat, 13 Apr 2013 00:54:03 +0530
parents 7c00da767896
children ce204ae5e52d
files MoinMoin/storage/backends/_tests/__init__.py MoinMoin/storage/backends/stores.py MoinMoin/storage/middleware/_tests/test_routing.py MoinMoin/storage/middleware/indexing.py MoinMoin/storage/middleware/routing.py
diffstat 5 files changed, 15 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/MoinMoin/storage/backends/_tests/__init__.py	Thu Apr 11 21:21:30 2013 +0200
+++ b/MoinMoin/storage/backends/_tests/__init__.py	Sat Apr 13 00:54:03 2013 +0530
@@ -62,7 +62,7 @@
         assert m == meta
         assert d.read() == data
         d.close()
-        self.be.remove(metaid)
+        self.be.remove(metaid, destroy_data=True)
         with pytest.raises(KeyError):
             self.be.retrieve(metaid)
 
--- a/MoinMoin/storage/backends/stores.py	Thu Apr 11 21:21:30 2013 +0200
+++ b/MoinMoin/storage/backends/stores.py	Sat Apr 13 00:54:03 2013 +0530
@@ -168,8 +168,9 @@
     def _del_data(self, dataid):
         del self.data_store[dataid]
 
-    def remove(self, metaid):
+    def remove(self, metaid, destroy_data):
         meta = self._get_meta(metaid)
         dataid = meta[DATAID]
         self._del_meta(metaid)
-        self._del_data(dataid)
+        if destroy_data:
+            self._del_data(dataid)
--- a/MoinMoin/storage/middleware/_tests/test_routing.py	Thu Apr 11 21:21:30 2013 +0200
+++ b/MoinMoin/storage/middleware/_tests/test_routing.py	Sat Apr 13 00:54:03 2013 +0530
@@ -63,8 +63,8 @@
     assert other_name.split(':')[1] == other_meta[NAME][0]
 
     # delete revs:
-    router.remove(default_backend_name, default_revid)
-    router.remove(other_backend_name, other_revid)
+    router.remove(default_backend_name, default_revid, destroy_data=True)
+    router.remove(other_backend_name, other_revid, destroy_data=True)
 
 
 def test_store_readonly_fails(router):
--- a/MoinMoin/storage/middleware/indexing.py	Thu Apr 11 21:21:30 2013 +0200
+++ b/MoinMoin/storage/middleware/indexing.py	Sat Apr 13 00:54:03 2013 +0530
@@ -75,7 +75,7 @@
 from MoinMoin.constants.keys import (WIKINAME, NAMESPACE, NAME, NAME_EXACT, MTIME, CONTENTTYPE, TAGS, LANGUAGE,
                                      USERID, ADDRESS, HOSTNAME, SIZE, ACTION, COMMENT, SUMMARY, CONTENT,
                                      EXTERNALLINKS, ITEMLINKS, ITEMTRANSCLUSIONS, ACL, DISABLED, EMAIL, OPENID,
-                                     ITEMID, REVID, CURRENT, PARENTID, PTIME, LATEST_REVS, ALL_REVS, BACKENDNAME)
+                                     ITEMID, REVID, CURRENT, PARENTID, PTIME, LATEST_REVS, ALL_REVS, BACKENDNAME, DATAID)
 from MoinMoin.constants.contenttypes import CONTENTTYPE_USER
 from MoinMoin.constants.namespaces import NAMESPACE_DEFAULT
 from MoinMoin.constants import keys
@@ -301,6 +301,8 @@
             COMMENT: TEXT(stored=True),
             # SUMMARY from metadata
             SUMMARY: TEXT(stored=True),
+            # DATAID from metadata
+            DATAID: ID(stored=True),
             # data (content), converted to text/plain and tokenized
             CONTENT: TEXT(stored=True),
         }
@@ -1111,7 +1113,10 @@
         Destroy revision <revid>.
         """
         rev = Revision(self, revid)
-        self.backend.remove(rev.backend_name, revid)
+        query = {DATAID: rev.meta[DATAID]}
+        with flaskg.storage.indexer.ix[ALL_REVS].searcher() as searcher:
+            refcount = len(list(searcher.document_numbers(**query)))
+        self.backend.remove(rev.backend_name, revid, destroy_data=refcount == 1)
         self.indexer.remove_revision(revid)
 
     def destroy_all_revisions(self):
--- a/MoinMoin/storage/middleware/routing.py	Thu Apr 11 21:21:30 2013 +0200
+++ b/MoinMoin/storage/middleware/routing.py	Sat Apr 13 00:54:03 2013 +0530
@@ -132,8 +132,8 @@
         meta[BACKENDNAME] = backend_name
         return backend_name, revid
 
-    def remove(self, backend_name, revid):
+    def remove(self, backend_name, revid, destroy_data):
         backend = self.backends[backend_name]
         if not isinstance(backend, MutableBackendBase):
             raise TypeError('backend {0} is readonly'.format(backend_name))
-        backend.remove(revid)
+        backend.remove(revid, destroy_data)