Mercurial > moin-2.0-moinboot
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)
