diff options
3 files changed, 23 insertions, 26 deletions
| diff --git a/puppet/modules/site_couchdb/files/designs/shared/docs.json b/puppet/modules/site_couchdb/files/designs/shared/docs.json index 4aad02aa..004180cd 100644 --- a/puppet/modules/site_couchdb/files/designs/shared/docs.json +++ b/puppet/modules/site_couchdb/files/designs/shared/docs.json @@ -1,12 +1,8 @@  { -   "views" : { -      "get" : { -         "map" : "function(doc) {\n    if (doc.u1db_rev) {\n        var is_tombstone = true;\n        var has_conflicts = false;\n        if (doc._attachments) {\n            if (doc._attachments.u1db_content)\n                is_tombstone = false;\n            if (doc._attachments.u1db_conflicts)\n                has_conflicts = true;\n        }\n        emit(doc._id,\n            {\n                \"couch_rev\": doc._rev,\n                \"u1db_rev\": doc.u1db_rev,\n                \"is_tombstone\": is_tombstone,\n                \"has_conflicts\": has_conflicts,\n            }\n        );\n    }\n}\n" +   "_id": "_design/docs",  +   "views": { +      "get": { +         "map": "function(doc) {\n    if (doc.u1db_rev) {\n        var is_tombstone = true;\n        var has_conflicts = false;\n        if (doc._attachments) {\n            if (doc._attachments.u1db_content)\n                is_tombstone = false;\n            if (doc._attachments.u1db_conflicts)\n                has_conflicts = true;\n        }\n        emit(doc._id,\n            {\n                \"couch_rev\": doc._rev,\n                \"u1db_rev\": doc.u1db_rev,\n                \"is_tombstone\": is_tombstone,\n                \"has_conflicts\": has_conflicts,\n            }\n        );\n    }\n}\n"        } -   }, -   "_id" : "_design/docs", -   "updates" : { -      "resolve_doc" : "function(doc, req){\n    /* we expect to receive the following in `req.body`:\n     * {\n     *     'couch_rev': '<couch_rev>',\n     *     'conflicts': '<base64 encoded conflicts>',\n     * }\n     */\n    var body = JSON.parse(req.body);\n\n    // fail if no document was given\n    if (!doc) {\n        return [null, 'document does not exist']\n    } \n\n    // fail if couch revisions do not match\n    if (body['couch_rev'] != null\n        && doc['_rev'] != body['couch_rev']) {\n        return [null, 'revision conflict']\n    }\n\n    // fail if conflicts were not sent\n    if (body['conflicts'] == null)\n        return [null, 'missing conflicts']\n\n    // save conflicts as attachment if they were sent\n    if (body['conflicts'] != null) {\n        if (!doc._attachments)\n            doc._attachments = {};\n        doc._attachments.u1db_conflicts = {\n            content_type: \"application/octet-stream\",\n            data: body['conflicts']  // should be base64 encoded\n        }\n    }\n    // or delete attachment if there are no conflicts\n    else if (doc._attachments && doc._attachments.u1db_conflicts)\n        delete doc._attachments.u1db_conflicts;\n\n    return [doc, 'ok'];\n}\n", -      "put" : "function(doc, req){\n    /* we expect to receive the following in `req.body`:\n     * {\n     *     'couch_rev': '<couch_rev>',\n     *     'u1db_rev': '<u1db_rev>',\n     *     'content': '<base64 encoded content>',\n     *     'trans_id': '<reansaction_id>'\n     *     'conflicts': '<base64 encoded conflicts>',\n     *     'update_conflicts': <boolean>\n     * }\n     */\n    var body = JSON.parse(req.body);\n\n    // create a new document document\n    if (!doc) {\n        doc = {}\n        doc['_id'] = req['id'];\n    }\n    // or fail if couch revisions do not match\n    else if (doc['_rev'] != body['couch_rev']) {\n        // of fail if revisions do not match\n        return [null, 'revision conflict']\n    }\n\n    // store u1db rev\n    doc.u1db_rev = body['u1db_rev'];\n\n    // save content as attachment\n    if (body['content'] != null) {\n        // save u1db content as attachment\n        if (!doc._attachments)\n            doc._attachments = {};\n        doc._attachments.u1db_content =  {\n            content_type: \"application/octet-stream\",\n            data: body['content']  // should be base64 encoded\n        };\n    }\n    // or delete the attachment if document is tombstone\n    else if (doc._attachments &&\n             doc._attachments.u1db_content)\n        delete doc._attachments.u1db_content;\n\n    // store the transaction id\n    if (!doc.u1db_transactions)\n        doc.u1db_transactions = [];\n    var d = new Date();\n    doc.u1db_transactions.push([d.getTime(), body['trans_id']]);\n\n    // save conflicts as attachment if they were sent\n    if (body['update_conflicts'])\n        if (body['conflicts'] != null) {\n            if (!doc._attachments)\n                doc._attachments = {};\n            doc._attachments.u1db_conflicts = {\n                content_type: \"application/octet-stream\",\n                data: body['conflicts']  // should be base64 encoded\n            }\n        } else {\n            if(doc._attachments && doc._attachments.u1db_conflicts)\n                delete doc._attachments.u1db_conflicts\n        }\n\n    return [doc, 'ok'];\n}\n"     } -} +}
\ No newline at end of file diff --git a/puppet/modules/site_couchdb/files/designs/shared/syncs.json b/puppet/modules/site_couchdb/files/designs/shared/syncs.json index 0df5ff74..bab5622f 100644 --- a/puppet/modules/site_couchdb/files/designs/shared/syncs.json +++ b/puppet/modules/site_couchdb/files/designs/shared/syncs.json @@ -1,11 +1,11 @@  { -   "views" : { -      "log" : { -         "map" : "function(doc) {\n    if (doc._id == 'u1db_sync_log') {\n        if (doc.syncs)\n            doc.syncs.forEach(function (entry) {\n                emit(entry[0],\n                    {\n                        'known_generation': entry[1],\n                        'known_transaction_id': entry[2]\n                    });\n            });\n    }\n}\n" +   "_id": "_design/syncs",  +   "updates": { +      "put": "function(doc, req){\n    if (!doc) {\n        doc = {}\n        doc['_id'] = 'u1db_sync_log';\n        doc['syncs'] = [];\n    }\n    body = JSON.parse(req.body);\n    // remove outdated info\n    doc['syncs'] = doc['syncs'].filter(\n        function (entry) {\n            return entry[0] != body['other_replica_uid'];\n        }\n    );\n    // store u1db rev\n    doc['syncs'].push([\n        body['other_replica_uid'],\n        body['other_generation'],\n        body['other_transaction_id']\n    ]);\n    return [doc, 'ok'];\n}\n\n" +   },  +   "views": { +      "log": { +         "map": "function(doc) {\n    if (doc._id == 'u1db_sync_log') {\n        if (doc.syncs)\n            doc.syncs.forEach(function (entry) {\n                emit(entry[0],\n                    {\n                        'known_generation': entry[1],\n                        'known_transaction_id': entry[2]\n                    });\n            });\n    }\n}\n"        } -   }, -   "_id" : "_design/syncs", -   "updates" : { -      "put" : "function(doc, req){\n    if (!doc) {\n        doc = {}\n        doc['_id'] = 'u1db_sync_log';\n        doc['syncs'] = [];\n    }\n    body = JSON.parse(req.body);\n    // remove outdated info\n    doc['syncs'] = doc['syncs'].filter(\n        function (entry) {\n            return entry[0] != body['other_replica_uid'];\n        }\n    );\n    // store u1db rev\n    doc['syncs'].push([\n        body['other_replica_uid'],\n        body['other_generation'],\n        body['other_transaction_id']\n    ]);\n    return [doc, 'ok'];\n}\n\n"     } -} +}
\ No newline at end of file diff --git a/puppet/modules/site_couchdb/files/designs/shared/transactions.json b/puppet/modules/site_couchdb/files/designs/shared/transactions.json index 8fcb84d1..106ad46c 100644 --- a/puppet/modules/site_couchdb/files/designs/shared/transactions.json +++ b/puppet/modules/site_couchdb/files/designs/shared/transactions.json @@ -1,12 +1,13 @@  { -   "lists" : { -      "generation" : "function(head, req) {\n    var row;\n    var rows=[];\n    // fetch all rows\n    while(row = getRow()) {\n        rows.push(row);\n    }\n    if (rows.length > 0)\n        send(JSON.stringify({\n            \"generation\": rows.length,\n            \"doc_id\": rows[rows.length-1]['id'],\n            \"transaction_id\": rows[rows.length-1]['value']\n        }));\n    else\n        send(JSON.stringify({\n            \"generation\": 0,\n            \"doc_id\": \"\",\n            \"transaction_id\": \"\",\n        }));\n}\n", -      "whats_changed" : "function(head, req) {\n    var row;\n    var gen = 1;\n    var old_gen = 0;\n    if (req.query.old_gen)\n        old_gen = parseInt(req.query['old_gen']);\n    send('{\"transactions\":[\\n');\n    // fetch all rows\n    while(row = getRow()) {\n        if (gen > old_gen) {\n            if (gen > old_gen+1)\n                send(',\\n');\n            send(JSON.stringify({\n                \"generation\": gen,\n                \"doc_id\": row[\"id\"],\n                \"transaction_id\": row[\"value\"]\n            }));\n        }\n        gen++;\n    }\n    send('\\n]}');\n}\n", -      "trans_id_for_gen" : "function(head, req) {\n    var row;\n    var rows=[];\n    var i = 1;\n    var gen = 1;\n    if (req.query.gen)\n        gen = parseInt(req.query['gen']);\n    // fetch all rows\n    while(row = getRow())\n        rows.push(row);\n    if (gen <= rows.length)\n        send(JSON.stringify({\n            \"generation\": gen,\n            \"doc_id\": rows[gen-1]['id'],\n            \"transaction_id\": rows[gen-1]['value'],\n        }));\n    else\n        send('{}');\n}\n" -   }, -   "views" : { -      "log" : { -         "map" : "function(doc) {\n    if (doc.u1db_transactions)\n        doc.u1db_transactions.forEach(function(t) {\n            emit(t[0],  // use timestamp as key so the results are ordered\n                 t[1]); // value is the transaction_id\n        });\n}\n" +   "_id": "_design/transactions",  +   "lists": { +      "generation": "function(head, req) {\n    var row;\n    var rows=[];\n    // fetch all rows\n    while(row = getRow()) {\n        rows.push(row);\n    }\n    if (rows.length > 0)\n        send(JSON.stringify({\n            \"generation\": rows.length,\n            \"doc_id\": rows[rows.length-1]['id'],\n            \"transaction_id\": rows[rows.length-1]['value']\n        }));\n    else\n        send(JSON.stringify({\n            \"generation\": 0,\n            \"doc_id\": \"\",\n            \"transaction_id\": \"\",\n        }));\n}\n",  +      "trans_id_for_gen": "function(head, req) {\n    var row;\n    var rows=[];\n    var i = 1;\n    var gen = 1;\n    if (req.query.gen)\n        gen = parseInt(req.query['gen']);\n    // fetch all rows\n    while(row = getRow())\n        rows.push(row);\n    if (gen <= rows.length)\n        send(JSON.stringify({\n            \"generation\": gen,\n            \"doc_id\": rows[gen-1]['id'],\n            \"transaction_id\": rows[gen-1]['value'],\n        }));\n    else\n        send('{}');\n}\n",  +      "whats_changed": "function(head, req) {\n    var row;\n    var gen = 1;\n    var old_gen = 0;\n    if (req.query.old_gen)\n        old_gen = parseInt(req.query['old_gen']);\n    send('{\"transactions\":[\\n');\n    // fetch all rows\n    while(row = getRow()) {\n        if (gen > old_gen) {\n            if (gen > old_gen+1)\n                send(',\\n');\n            send(JSON.stringify({\n                \"generation\": gen,\n                \"doc_id\": row[\"id\"],\n                \"transaction_id\": row[\"value\"]\n            }));\n        }\n        gen++;\n    }\n    send('\\n]}');\n}\n" +   },  +   "views": { +      "log": { +         "map": "function(doc) {\n    if (doc.u1db_transactions)\n        doc.u1db_transactions.forEach(function(t) {\n            emit(t[0],  // use timestamp as key so the results are ordered\n                 t[1]); // value is the transaction_id\n        });\n}\n"        }     } -} +}
\ No newline at end of file | 
