Soledad common package ====================== This package contains Soledad bits used by both server and client. Couch U1DB Backend ------------------ U1DB backends rely on some atomic operations that modify documents contents and metadata (conflicts, transaction ids and indexes). The only atomic operation in Couch is a document put, so every u1db atomic operation has to be mapped to a couch document put. The atomic operations in the U1DB SQLite reference backend implementation may be identified by the use of a context manager to access the underlying database. A listing of the methods involved in each atomic operation are depiced below. The top-level elements correpond to the atomic operations that have to be mapped, and items on deeper levels of the list have to be implemented in a way that all changes will be pushed with just one operation. * _set_replica_uid * put_doc: * _get_doc * _put_and_update_indexes * insert/update the document * insert into transaction log * delete_doc * _get_doc * _put_and_update_indexes * get_doc_conflicts * _get_conflicts * _set_replica_gen_and_trans_id * _do_set_replica_gen_and_trans_id * _put_doc_if_newer * _get_doc * _validate_source (**) * _get_replica_gen_and_trans_id * cases: * is newer: * _prune_conflicts (**) * _has_conflicts * _delete_conflicts * _put_and_update_indexes * same content as: * _put_and_update_indexes * conflicted: * _force_doc_sync_conflict * _prune_conflicts * _add_conflict * _put_and_update_indexes * _do_set_replica_gen_and_trans_id * resolve_doc * _get_doc * cases: * doc is superseded * _put_and_update_indexes * else * _add_conflict * _delete_conflicts * delete_index * create_index Couch views and update functions are used in order to achieve atomicity on the Couch backend. Transactions are stored in the `u1db_transactions` field of the couch document. Document's content and conflicted versions are stored as couch document attachments with names, respectivelly, `u1db_content` and `u1db_conflicts`. A map of methods and couch query URI can be found on the `./ddocs/README.txt` document. Notes: * Currently, the couch backend does not implement indexing, so what is depicted as `_put_and_update_indexes` above will be found as `_put_doc` in the backend. * Conflict updates are part of document put using couch update functions, and as such are part of the same atomic operation as document put.