diff --git a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js index 4310ca3443dfa098f6f9097197d60a8cbf2a2c55..466482ffe14037d6c52205b4a8e742b23306120f 100644 --- a/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js +++ b/product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/jio.js.js @@ -8462,6 +8462,12 @@ return new Parser; }); this._use_remote_post = spec.use_remote_post || false; + // Number of request we allow browser execution for attachments + this._parallel_operation_attachment_amount = + spec.parallel_operation_attachment_amount || 1; + // Number of request we allow browser execution for documents + this._parallel_operation_amount = + spec.parallel_operation_amount || 1; this._conflict_handling = spec.conflict_handling || 0; // 0: no resolution (ie, throw an Error) @@ -8604,6 +8610,32 @@ return new Parser; // Do not sync the signature document skip_document_dict[context._signature_hash] = null; + function dispatchQueue(function_used, argument_list, number_queue) { + var result_promise_list = [], + i; + + function pushAndExecute(queue) { + queue + .push(function () { + if (argument_list.length > 0) { + var argument_array = argument_list.shift(), + sub_queue = new RSVP.Queue(); + argument_array[0] = sub_queue; + function_used.apply(context, argument_array); + pushAndExecute(queue); + return sub_queue; + } + }); + } + for (i = 0; i < number_queue; i += 1) { + result_promise_list.push(new RSVP.Queue()); + pushAndExecute(result_promise_list[i]); + } + if (number_queue > 1) { + return RSVP.all(result_promise_list); + } + return result_promise_list[0]; + } function propagateAttachmentDeletion(skip_attachment_dict, destination, @@ -8724,8 +8756,8 @@ return new Parser; }); } - function checkAttachmentSignatureDifference(skip_attachment_dict, - queue, source, + function checkAttachmentSignatureDifference(queue, skip_attachment_dict, + source, destination, id, name, conflict_force, conflict_revert, @@ -8775,8 +8807,8 @@ return new Parser; }); } - function checkAttachmentLocalDeletion(skip_attachment_dict, - queue, destination, id, name, source, + function checkAttachmentLocalDeletion(queue, skip_attachment_dict, + destination, id, name, source, conflict_force, conflict_revert, conflict_ignore) { var status_hash; @@ -8797,7 +8829,9 @@ return new Parser; function pushDocumentAttachment(skip_attachment_dict, id, source, destination, options) { - var queue = new RSVP.Queue(); + var queue = new RSVP.Queue(), + local_dict = {}, + signature_dict = {}; return queue .push(function () { @@ -8821,11 +8855,10 @@ return new Parser; ]); }) .push(function (result_list) { - var local_dict = {}, - signature_dict = {}, - is_modification, + var is_modification, is_creation, - key; + key, + argument_list = []; for (key in result_list[0]) { if (result_list[0].hasOwnProperty(key)) { if (!skip_attachment_dict.hasOwnProperty(key)) { @@ -8848,30 +8881,45 @@ return new Parser; is_creation = !signature_dict.hasOwnProperty(key) && options.check_creation; if (is_modification === true || is_creation === true) { - checkAttachmentSignatureDifference(skip_attachment_dict, - queue, source, - destination, id, key, - options.conflict_force, - options.conflict_revert, - options.conflict_ignore, - is_creation, - is_modification); + argument_list.push([undefined, + skip_attachment_dict, + source, + destination, id, key, + options.conflict_force, + options.conflict_revert, + options.conflict_ignore, + is_creation, + is_modification]); } } } + return dispatchQueue( + checkAttachmentSignatureDifference, + argument_list, + context._parallel_operation_attachment_amount + ); + }) + .push(function () { + var key, argument_list = []; if (options.check_deletion === true) { for (key in signature_dict) { if (signature_dict.hasOwnProperty(key)) { if (!local_dict.hasOwnProperty(key)) { - checkAttachmentLocalDeletion(skip_attachment_dict, - queue, destination, id, key, + argument_list.push([undefined, + skip_attachment_dict, + destination, id, key, source, options.conflict_force, options.conflict_revert, - options.conflict_ignore); + options.conflict_ignore]); } } } + return dispatchQueue( + checkAttachmentLocalDeletion, + argument_list, + context._parallel_operation_attachment_amount + ); } }); } @@ -9184,7 +9232,7 @@ return new Parser; }) .push(function (result_list) { var i, - sub_queue = new RSVP.Queue(); + argument_list = []; function getResult(j) { return function (id) { @@ -9196,20 +9244,26 @@ return new Parser; } for (i = 0; i < result_list.length; i += 1) { - checkSignatureDifference(sub_queue, source, destination, + argument_list[i] = [undefined, source, destination, id_list[i].parameter_list[0], conflict_force, conflict_revert, conflict_ignore, document_status_list[i].is_creation, document_status_list[i].is_modification, - getResult(i), options); + getResult(i), options]; } - return sub_queue; + return dispatchQueue( + checkSignatureDifference, + argument_list, + options.operation_amount + ); }); } function pushStorage(source, destination, options) { - var queue = new RSVP.Queue(); + var queue = new RSVP.Queue(), + argument_list = [], + argument_list_deletion = []; if (!options.hasOwnProperty("use_post")) { options.use_post = false; } @@ -9246,6 +9300,7 @@ return new Parser; signature_dict[result_list[1].data.rows[i].id] = i; } } + i = 0; for (key in local_dict) { if (local_dict.hasOwnProperty(key)) { is_modification = signature_dict.hasOwnProperty(key) @@ -9263,29 +9318,50 @@ return new Parser; is_modification: is_modification }); } else { - checkSignatureDifference(queue, source, destination, key, - options.conflict_force, - options.conflict_revert, - options.conflict_ignore, - is_creation, is_modification, - source.get.bind(source), - options); + argument_list[i] = [undefined, source, destination, + key, + options.conflict_force, + options.conflict_revert, + options.conflict_ignore, + is_creation, is_modification, + source.get.bind(source), + options]; + i += 1; } } } } + queue + .push(function () { + return dispatchQueue( + checkSignatureDifference, + argument_list, + options.operation_amount + ); + }); if (options.check_deletion === true) { + i = 0; for (key in signature_dict) { if (signature_dict.hasOwnProperty(key)) { if (!local_dict.hasOwnProperty(key)) { - checkLocalDeletion(queue, destination, key, source, - options.conflict_force, - options.conflict_revert, - options.conflict_ignore, - options); + argument_list_deletion[i] = [undefined, + destination, key, + source, + options.conflict_force, + options.conflict_revert, + options.conflict_ignore, + options]; + i += 1; } } } + queue.push(function () { + return dispatchQueue( + checkLocalDeletion, + argument_list_deletion, + options.operation_amount + ); + }); } if ((options.use_bulk_get === true) && (document_list.length !== 0)) { checkBulkSignatureDifference(queue, source, destination, @@ -9298,6 +9374,12 @@ return new Parser; }); } + function repairDocument(queue, id) { + queue.push(function () { + return repairDocumentAttachment(id); + }); + } + return new RSVP.Queue() .push(function () { // Ensure that the document storage is usable @@ -9350,7 +9432,8 @@ return new Parser; CONFLICT_CONTINUE), check_modification: context._check_local_modification, check_creation: context._check_local_creation, - check_deletion: context._check_local_deletion + check_deletion: context._check_local_deletion, + operation_amount: context._parallel_operation_amount }); } }) @@ -9381,7 +9464,8 @@ return new Parser; CONFLICT_CONTINUE), check_modification: context._check_remote_modification, check_creation: context._check_remote_creation, - check_deletion: context._check_remote_deletion + check_deletion: context._check_remote_deletion, + operation_amount: context._parallel_operation_amount }); } }) @@ -9397,19 +9481,19 @@ return new Parser; return context._signature_sub_storage.allDocs() .push(function (result) { var i, - repair_document_queue = new RSVP.Queue(); + argument_list = [], + len = result.data.total_rows; - function repairDocument(id) { - repair_document_queue - .push(function () { - return repairDocumentAttachment(id); - }); - } - - for (i = 0; i < result.data.total_rows; i += 1) { - repairDocument(result.data.rows[i].id); + for (i = 0; i < len; i += 1) { + argument_list.push( + [undefined, result.data.rows[i].id] + ); } - return repair_document_queue; + return dispatchQueue( + repairDocument, + argument_list, + context._parallel_operation_amount + ); }); } }); @@ -11335,6 +11419,7 @@ return new Parser; "type": "POST", "url": name, "data": data, + "dataType": "blob", "xhrFields": { withCredentials: true }