From 8576d2c5a8a297fc653c71ff95b3462951a58a70 Mon Sep 17 00:00:00 2001 From: Tristan Cavelier <tristan.cavelier@tiolive.com> Date: Tue, 5 Feb 2013 11:40:41 +0100 Subject: [PATCH] improve revision storage put method to copy previous attachments --- src/jio.storage/revisionstorage.js | 109 +++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 13 deletions(-) diff --git a/src/jio.storage/revisionstorage.js b/src/jio.storage/revisionstorage.js index c93fbb4..535c5bc 100644 --- a/src/jio.storage/revisionstorage.js +++ b/src/jio.storage/revisionstorage.js @@ -485,7 +485,7 @@ jIO.addStorageType('revision', function (spec, my) { * @param {object} command The JIO command */ that.post = function (command) { - var f = {}, doctree, revs_info, doc, docid; + var f = {}, doctree, revs_info, doc, docid, prev_doc; doc = command.cloneDoc(); docid = command.getDocId(); @@ -514,32 +514,68 @@ jIO.addStorageType('revision', function (spec, my) { priv.substorage, docid + priv.doctree_suffix, option, - function (response) { - doctree = response; - f.postDocument("put"); + f.updateRevsInfo(); + f.getDocument(); }, function (err) { switch (err.status) { case 404: doctree = priv.createDocumentTree(); - f.postDocument("post"); + f.updateRevsInfo(); + f.getDocument(); break; default: err.message = "Cannot get document revision tree"; - that.error(err); + f.error(err); break; } } ); }; - f.postDocument = function (doctree_update_method) { + f.getDocument = function () { + if (revs_info[1] === undefined) { + f.postDocument([]); + } else { + that.addJob( + "get", + priv.substorage, + command.getDocId() + "." + revs_info[1].rev, + command.getOption(), + function (response) { + var attachment_list = [], i; + prev_doc = response; + for (i in response._attachments) { + if (response._attachments.hasOwnProperty(i)) { + attachment_list.push({"id": i, "attachment": { + "_id": command.getDocId() + "." + revs_info[0].rev + "/" + i, + "_mimetype": response._attachments[i].content_type, + "_data": undefined + }}); + } + } + f.postDocument(attachment_list); + }, + function (err) { + if (err.status === 404) { + f.postDocument([]); + return; + } + err.message = "Cannot retrieve document"; + f.error(err); + } + ); + } + }; + f.updateRevsInfo = function () { if (doc._revs) { revs_info = priv.updateDocumentTree(doctree, doc._revs); } else { revs_info = priv.postToDocumentTree(doctree, doc); } + }; + f.postDocument = function (attachment_list) { doc._id = docid + "." + revs_info[0].rev; delete doc._rev; delete doc._revs; @@ -549,26 +585,69 @@ jIO.addStorageType('revision', function (spec, my) { doc, command.cloneOption(), function () { - f.sendDocumentTree(doctree_update_method); + var i; + if (attachment_list.length === 0) { + f.sendDocumentTree(); + } else { + f.send_document_tree_count = attachment_list.length; + for (i = 0; i < attachment_list.length; i += 1) { + f.copyAttachment(attachment_list[i].id, + attachment_list[i].attachment); + } + } }, function (err) { switch (err.status) { case 409: // file already exists - f.sendDocumentTree(doctree_update_method); + f.sendDocumentTree(); break; default: err.message = "Cannot upload document"; - that.error(err); + f.error(err); break; } } ); }; - f.sendDocumentTree = function (method) { + f.copyAttachment = function (attachmentid, attachment) { + console.log(attachmentid); + that.addJob( + "get", + priv.substorage, + prev_doc._id + "/" + attachmentid, + command.cloneOption(), + function (response) { + attachment._data = response; + that.addJob( + "putAttachment", + priv.substorage, + attachment, + command.cloneOption(), + function (response) { + f.sendDocumentTree(); + }, + function (err) { + err.message = "Cannot copy previous attachment"; + f.error(err); + } + ); + }, + function (err) { + err.message = "Cannot get previous attachment"; + f.error(err); + } + ); + }; + f.send_document_tree_count = 0; + f.sendDocumentTree = function () { + f.send_document_tree_count -= 1; + if (f.send_document_tree_count > 0) { + return; + } doctree._id = docid + priv.doctree_suffix; that.addJob( - method, + "put", priv.substorage, doctree, command.cloneOption(), @@ -582,10 +661,14 @@ jIO.addStorageType('revision', function (spec, my) { function (err) { // xxx do we try to delete the posted document ? err.message = "Cannot save document revision tree"; - that.error(err); + f.error(err); } ); }; + f.error = function (err) { + f.error = function () {}; + that.error(err); + }; f.getDocumentTree(); }; -- 2.30.9