diff options
-rw-r--r-- | backends/couch.py | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/backends/couch.py b/backends/couch.py index 5586ea9c..ed356fdd 100644 --- a/backends/couch.py +++ b/backends/couch.py @@ -5,6 +5,11 @@ from couchdb.http import ResourceNotFound from soledad.backends.objectstore import ObjectStore from soledad.backends.leap import LeapDocument +try: + import simplejson as json +except ImportError: + import json # noqa + class CouchDatabase(ObjectStore): """A U1DB implementation that uses Couch as its persistence layer.""" @@ -40,12 +45,11 @@ class CouchDatabase(ObjectStore): cdoc = self._database.get(doc_id) if cdoc is None: return None - content = {} - for (key, value) in cdoc.items(): - if key not in ['_id', '_rev', 'u1db_rev']: - content[key] = value doc = self._factory(doc_id=doc_id, rev=cdoc['u1db_rev']) - doc.content = content + if cdoc['u1db_json'] is not None: + doc.content = json.loads(cdoc['u1db_json']) + else: + doc.make_tombstone() return doc def get_all_docs(self, include_deleted=False): @@ -60,13 +64,20 @@ class CouchDatabase(ObjectStore): return (generation, results) def _put_doc(self, doc): - # map u1db metadata to couch - content = doc.content + # prepare couch's Document cdoc = Document() cdoc['_id'] = doc.doc_id + # we have to guarantee that couch's _rev is cosistent + old_cdoc = self._database.get(doc.doc_id) + if old_cdoc is not None: + cdoc['_rev'] = old_cdoc['_rev'] + # store u1db's rev cdoc['u1db_rev'] = doc.rev - for (key, value) in content.items(): - cdoc[key] = value + # store u1db's content as json string + if not doc.is_tombstone(): + cdoc['u1db_json'] = doc.get_json() + else: + cdoc['u1db_json'] = None self._database.save(cdoc) def get_sync_target(self): @@ -83,9 +94,10 @@ class CouchDatabase(ObjectStore): def _get_u1db_data(self): cdoc = self._database.get(self.U1DB_DATA_DOC_ID) - self._sync_log.log = cdoc['sync_log'] - self._transaction_log.log = cdoc['transaction_log'] - self._replica_uid = cdoc['replica_uid'] + content = json.loads(cdoc['u1db_json']) + self._sync_log.log = content['sync_log'] + self._transaction_log.log = content['transaction_log'] + self._replica_uid = content['replica_uid'] self._couch_rev = cdoc['_rev'] #------------------------------------------------------------------------- |