Commit b9395035 authored by Romain Courteaud's avatar Romain Courteaud

Release 3.38.0

Fix query.

Improve IndexedDB storage.

Improve ajax in node.
parent 1ffefba4
...@@ -26,7 +26,7 @@ TESTDIR = test ...@@ -26,7 +26,7 @@ TESTDIR = test
EXAMPLEDIR = examples EXAMPLEDIR = examples
EXTERNALDIR = external EXTERNALDIR = external
VERSION = 3.37.0 VERSION = 3.38.0
JIOVERSION = ${DISTDIR}/jio-v${VERSION}.js JIOVERSION = ${DISTDIR}/jio-v${VERSION}.js
JIOLATEST = ${DISTDIR}/jio-latest.js JIOLATEST = ${DISTDIR}/jio-latest.js
JIONODEVERSION = ${DISTDIR}/jio-v${VERSION}-node.js JIONODEVERSION = ${DISTDIR}/jio-v${VERSION}-node.js
......
...@@ -7883,6 +7883,8 @@ var arrayExtend = function () { ...@@ -7883,6 +7883,8 @@ var arrayExtend = function () {
return true; return true;
} }
return false; return false;
}, parseQuotedString = function (string) {
return string.replace(/(?:\\(")|(\\[^"]))/g, '$1$2');
}, },
error_offsets = [], error_offsets = [],
error_lookaheads = [], error_lookaheads = [],
...@@ -8004,7 +8006,7 @@ case 17: ...@@ -8004,7 +8006,7 @@ case 17:
this.$ = mkSimpleQuery('', $$[$0]); this.$ = mkSimpleQuery('', $$[$0]);
break; break;
case 18: case 18:
this.$ = mkSimpleQuery('', $$[$0-1]); this.$ = mkSimpleQuery('', parseQuotedString($$[$0-1]));
break; break;
} }
}, },
...@@ -8708,6 +8710,9 @@ return new Parser; ...@@ -8708,6 +8710,9 @@ return new Parser;
throw new TypeError("jioquery.sortOn(): " + throw new TypeError("jioquery.sortOn(): " +
"Argument 1 is not of type 'array'"); "Argument 1 is not of type 'array'");
} }
if (sort_on_option.length === 0) {
return list;
}
list.sort(generateSortFunction( list.sort(generateSortFunction(
key_schema, key_schema,
sort_on_option sort_on_option
...@@ -9223,6 +9228,16 @@ return new Parser; ...@@ -9223,6 +9228,16 @@ return new Parser;
"Argument 1 is not a search text or a parsable object"); "Argument 1 is not a search text or a parsable object");
}; };
function ensureString(value) {
if (value === undefined) { return "undefined"; }
if (value === null) { return "null"; }
return value.toString();
}
function renderSearchTextValue(value) {
return '"' + ensureString(value).replace(/"/g, '\\"') + '"';
}
function objectToSearchText(query) { function objectToSearchText(query) {
var i = 0, var i = 0,
query_list = null, query_list = null,
...@@ -9231,7 +9246,8 @@ return new Parser; ...@@ -9231,7 +9246,8 @@ return new Parser;
common_key = ""; common_key = "";
if (query.type === "simple") { if (query.type === "simple") {
return (query.key ? query.key + ": " : "") + return (query.key ? query.key + ": " : "") +
(query.operator || "") + ' "' + query.value + '"'; (query.operator || "") + ' ' +
renderSearchTextValue(query.value);
} }
if (query.type === "complex") { if (query.type === "complex") {
query_list = query.query_list; query_list = query.query_list;
...@@ -9262,7 +9278,7 @@ return new Parser; ...@@ -9262,7 +9278,7 @@ return new Parser;
for (i = 0; i < query_list.length; i += 1) { for (i = 0; i < query_list.length; i += 1) {
string_list.push( string_list.push(
(query_list[i].operator || "") + (query_list[i].operator || "") +
' "' + query_list[i].value + '"' ' ' + renderSearchTextValue(query_list[i].value)
); );
} }
} else { } else {
...@@ -9849,11 +9865,10 @@ return new Parser; ...@@ -9849,11 +9865,10 @@ return new Parser;
try { try {
return window.atob(str); return window.atob(str);
} catch (err) { } catch (err) {
var buffer; var buffer = Buffer.from(str.toString(), 'base64');
if (str instanceof Buffer) { // Provide the same behaviour than the browser atob
buffer = str; if (buffer.toString('base64') !== str) {
} else { throw new Error('The string to be decoded is not correctly encoded.');
buffer = Buffer.from(str.toString(), 'base64');
} }
return buffer.toString('binary'); return buffer.toString('binary');
} }
...@@ -9865,13 +9880,7 @@ return new Parser; ...@@ -9865,13 +9880,7 @@ return new Parser;
try { try {
return window.btoa(str); return window.btoa(str);
} catch (err) { } catch (err) {
var buffer; return Buffer.from(str.toString(), 'binary').toString('base64');
if (str instanceof Buffer) {
buffer = str;
} else {
buffer = Buffer.from(str.toString(), 'binary');
}
return buffer.toString('base64');
} }
} }
...@@ -9879,8 +9888,8 @@ return new Parser; ...@@ -9879,8 +9888,8 @@ return new Parser;
}(window, WeakMap, ArrayBuffer, Uint8Array)); }(window, WeakMap, ArrayBuffer, Uint8Array));
var XMLHttpRequest = global.XMLHttpRequest || module.exports, global.XMLHttpRequest = module.exports;
Blob = window.Blob, var Blob = window.Blob,
atob = window.atob, atob = window.atob,
btoa = window.btoa, btoa = window.btoa,
FileReader = window.FileReader, FileReader = window.FileReader,
...@@ -10674,7 +10683,7 @@ var XMLHttpRequest = global.XMLHttpRequest || module.exports, ...@@ -10674,7 +10683,7 @@ var XMLHttpRequest = global.XMLHttpRequest || module.exports,
*/ */
/*global window */ /*global window */
(function (window, jIO, Blob) { (function (window, jIO, Blob, RSVP) {
"use strict"; "use strict";
var FormData, var FormData,
...@@ -10696,32 +10705,71 @@ var XMLHttpRequest = global.XMLHttpRequest || module.exports, ...@@ -10696,32 +10705,71 @@ var XMLHttpRequest = global.XMLHttpRequest || module.exports,
}; };
window.FormData = FormData; window.FormData = FormData;
function convertToBlob(promise, convert) {
if (!convert) {
return promise;
}
var result;
if (promise instanceof RSVP.Queue) {
result = promise;
} else {
result = new RSVP.Queue()
.push(function () {
return promise;
});
}
return result
.push(function (evt) {
evt.target.response = new Blob(
[evt.target.response || evt.target.responseText],
{type: evt.target.getResponseHeader('Content-Type')}
);
return evt;
});
}
originalAjax = jIO.util.ajax; originalAjax = jIO.util.ajax;
jIO.util.ajax = function ajax(param) { jIO.util.ajax = function ajax(param) {
var result,
need_convertion = (param.dataType === 'blob');
// Copy the param dict document (no need for deep copy) to
// allow tests to check them
param = Object.assign({}, param);
if (need_convertion) {
param.dataType = 'arraybuffer';
}
if (param.data instanceof Blob) { if (param.data instanceof Blob) {
// Blob is not supported by xhr2, so convert to ArrayBuffer instead // Blob is not supported by xhr2, so convert to ArrayBuffer instead
return jIO.util.readBlobAsArrayBuffer(param.data).then(function (data) { result = new RSVP.Queue()
param.data = data.target.result; .push(function () {
return originalAjax(param); return jIO.util.readBlobAsArrayBuffer(param.data);
}); })
} .push(function (evt) {
param.data = evt.target.result;
if (param.data instanceof FormData) { return originalAjax(param);
});
} else if (param.data instanceof FormData) {
// Implement minimal FormData for erp5storage // Implement minimal FormData for erp5storage
if (!param.hasOwnProperty('headers')) { if (!param.hasOwnProperty('headers')) {
param.headers = {}; param.headers = {};
} else {
// Copy the param dict document (no need for deep copy) to
// allow tests to check them
param.headers = Object.assign({}, param.headers);
} }
param.headers["Content-Type"] = "multipart\/form-data; boundary=" + param.headers["Content-Type"] = "multipart\/form-data; boundary=" +
param.data.boundary; param.data.boundary;
param.data.body += '--' + param.data.boundary + '--\r\n'; param.data.body += '--' + param.data.boundary + '--\r\n';
param.data = param.data.body; param.data = param.data.body;
return originalAjax(param); result = originalAjax(param);
} else {
result = originalAjax(param);
} }
return originalAjax(param); return convertToBlob(result, need_convertion);
}; };
}(window, window.jIO, window.Blob)); }(window, window.jIO, window.Blob, window.RSVP));
// Define a global variable to allow storages to access jIO // Define a global variable to allow storages to access jIO
var jIO = window.jIO, var jIO = window.jIO,
...@@ -12024,7 +12072,8 @@ var jIO = window.jIO, ...@@ -12024,7 +12072,8 @@ var jIO = window.jIO,
}); });
} }
report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT : report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT :
LOG_UNEXPECTED_LOCAL_ATTACHMENT); LOG_UNEXPECTED_LOCAL_ATTACHMENT,
JSON.stringify(attachment_dict));
}, function (error) { }, function (error) {
if ((error instanceof jIO.util.jIOError) && if ((error instanceof jIO.util.jIOError) &&
(error.status_code === 404)) { (error.status_code === 404)) {
......
...@@ -6105,6 +6105,8 @@ var arrayExtend = function () { ...@@ -6105,6 +6105,8 @@ var arrayExtend = function () {
return true; return true;
} }
return false; return false;
}, parseQuotedString = function (string) {
return string.replace(/(?:\\(")|(\\[^"]))/g, '$1$2');
}, },
error_offsets = [], error_offsets = [],
error_lookaheads = [], error_lookaheads = [],
...@@ -6226,7 +6228,7 @@ case 17: ...@@ -6226,7 +6228,7 @@ case 17:
this.$ = mkSimpleQuery('', $$[$0]); this.$ = mkSimpleQuery('', $$[$0]);
break; break;
case 18: case 18:
this.$ = mkSimpleQuery('', $$[$0-1]); this.$ = mkSimpleQuery('', parseQuotedString($$[$0-1]));
break; break;
} }
}, },
...@@ -6930,6 +6932,9 @@ return new Parser; ...@@ -6930,6 +6932,9 @@ return new Parser;
throw new TypeError("jioquery.sortOn(): " + throw new TypeError("jioquery.sortOn(): " +
"Argument 1 is not of type 'array'"); "Argument 1 is not of type 'array'");
} }
if (sort_on_option.length === 0) {
return list;
}
list.sort(generateSortFunction( list.sort(generateSortFunction(
key_schema, key_schema,
sort_on_option sort_on_option
...@@ -7445,6 +7450,16 @@ return new Parser; ...@@ -7445,6 +7450,16 @@ return new Parser;
"Argument 1 is not a search text or a parsable object"); "Argument 1 is not a search text or a parsable object");
}; };
function ensureString(value) {
if (value === undefined) { return "undefined"; }
if (value === null) { return "null"; }
return value.toString();
}
function renderSearchTextValue(value) {
return '"' + ensureString(value).replace(/"/g, '\\"') + '"';
}
function objectToSearchText(query) { function objectToSearchText(query) {
var i = 0, var i = 0,
query_list = null, query_list = null,
...@@ -7453,7 +7468,8 @@ return new Parser; ...@@ -7453,7 +7468,8 @@ return new Parser;
common_key = ""; common_key = "";
if (query.type === "simple") { if (query.type === "simple") {
return (query.key ? query.key + ": " : "") + return (query.key ? query.key + ": " : "") +
(query.operator || "") + ' "' + query.value + '"'; (query.operator || "") + ' ' +
renderSearchTextValue(query.value);
} }
if (query.type === "complex") { if (query.type === "complex") {
query_list = query.query_list; query_list = query.query_list;
...@@ -7484,7 +7500,7 @@ return new Parser; ...@@ -7484,7 +7500,7 @@ return new Parser;
for (i = 0; i < query_list.length; i += 1) { for (i = 0; i < query_list.length; i += 1) {
string_list.push( string_list.push(
(query_list[i].operator || "") + (query_list[i].operator || "") +
' "' + query_list[i].value + '"' ' ' + renderSearchTextValue(query_list[i].value)
); );
} }
} else { } else {
...@@ -10357,7 +10373,8 @@ return new Parser; ...@@ -10357,7 +10373,8 @@ return new Parser;
}); });
} }
report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT : report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT :
LOG_UNEXPECTED_LOCAL_ATTACHMENT); LOG_UNEXPECTED_LOCAL_ATTACHMENT,
JSON.stringify(attachment_dict));
}, function (error) { }, function (error) {
if ((error instanceof jIO.util.jIOError) && if ((error instanceof jIO.util.jIOError) &&
(error.status_code === 404)) { (error.status_code === 404)) {
...@@ -14916,13 +14933,19 @@ return new Parser; ...@@ -14916,13 +14933,19 @@ return new Parser;
} }
function waitForOpenIndexedDB(db_name, callback) { function waitForOpenIndexedDB(db_name, callback) {
var request;
function canceller() {
if ((request !== undefined) && (request.result !== undefined)) {
request.result.close();
}
}
function resolver(resolve, reject) { function resolver(resolve, reject) {
// Open DB // // Open DB //
var request = indexedDB.open(db_name); request = indexedDB.open(db_name);
request.onerror = function (error) { request.onerror = function (error) {
if (request.result) { canceller();
request.result.close();
}
if ((error !== undefined) && if ((error !== undefined) &&
(error.target instanceof IDBOpenDBRequest) && (error.target instanceof IDBOpenDBRequest) &&
(error.target.error instanceof DOMError)) { (error.target.error instanceof DOMError)) {
...@@ -14934,17 +14957,16 @@ return new Parser; ...@@ -14934,17 +14957,16 @@ return new Parser;
}; };
request.onabort = function () { request.onabort = function () {
request.result.close(); canceller();
reject("Aborting connection to: " + db_name); reject("Aborting connection to: " + db_name);
}; };
request.ontimeout = function () { request.ontimeout = function () {
request.result.close();
reject("Connection to: " + db_name + " timeout"); reject("Connection to: " + db_name + " timeout");
}; };
request.onblocked = function () { request.onblocked = function () {
request.result.close(); canceller();
reject("Connection to: " + db_name + " was blocked"); reject("Connection to: " + db_name + " was blocked");
}; };
...@@ -14952,26 +14974,32 @@ return new Parser; ...@@ -14952,26 +14974,32 @@ return new Parser;
request.onupgradeneeded = handleUpgradeNeeded; request.onupgradeneeded = handleUpgradeNeeded;
request.onversionchange = function () { request.onversionchange = function () {
request.result.close(); canceller();
reject(db_name + " was upgraded"); reject(db_name + " was upgraded");
}; };
request.onsuccess = function () { request.onsuccess = function () {
var result;
try {
result = callback(request.result);
} catch (error) {
reject(error);
}
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return callback(request.result); return result;
}) })
.push(function (result) { .push(function (final_result) {
request.result.close(); canceller();
resolve(result); resolve(final_result);
}, function (error) { }, function (error) {
request.result.close(); canceller();
reject(error); reject(error);
}); });
}; };
} }
return new RSVP.Promise(resolver); return new RSVP.Promise(resolver, canceller);
} }
function waitForTransaction(db, stores, flag, callback) { function waitForTransaction(db, stores, flag, callback) {
...@@ -15001,14 +15029,8 @@ return new Parser; ...@@ -15001,14 +15029,8 @@ return new Parser;
reject(error); reject(error);
}); });
}; };
tx.onerror = function (error) { tx.onerror = reject;
canceller(); tx.onabort = reject;
reject(error);
};
tx.onabort = function (evt) {
reject(evt.target);
};
return tx;
} }
return new RSVP.Promise(resolver, canceller); return new RSVP.Promise(resolver, canceller);
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"name": "jio", "name": "jio",
"version": "v3.37.0", "version": "v3.38.0",
"license": "GPLv3+", "license": "GPLv3+",
"author": "Nexedi SA", "author": "Nexedi SA",
"contributors": [ "contributors": [
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment