changeset 96b0dad112d2 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=96b0dad112d2
description:
Add cache management on RPC
issue8233
review257231002
diffstat:
src/rpc.js | 28 ++++++++++++++++++++++++++--
src/screen.js | 5 ++++-
src/session.js | 36 ++++++++++++++++++++++++++++++++++++
src/window.js | 4 ++++
4 files changed, 70 insertions(+), 3 deletions(-)
diffs (137 lines):
diff -r c8f383ca8201 -r 96b0dad112d2 src/rpc.js
--- a/src/rpc.js Sat Apr 06 17:38:58 2019 +0200
+++ b/src/rpc.js Mon Apr 08 10:10:40 2019 +0200
@@ -15,9 +15,22 @@
var params = jQuery.extend([], args.params);
params.push(jQuery.extend({}, session.context, params.pop()));
+ if (session.cache && session.cache.cached(args.method)) {
+ result = session.cache.get(
+ args.method,
+ JSON.stringify(Sao.rpc.prepareObject(params)));
+ if (result !== undefined) {
+ if (async) {
+ return jQuery.when(result);
+ } else {
+ return result;
+ }
+ }
+ }
+
var timeoutID = Sao.common.processing.show();
- var ajax_success = function(data) {
+ var ajax_success = function(data, status_, query) {
if (data === null) {
Sao.common.warning.run('',
Sao.i18n.gettext('Unable to reach the server'));
@@ -76,8 +89,19 @@
}
dfd.reject();
} else {
- dfd.resolve(data.result);
result = data.result;
+ if (session.cache) {
+ var cache = query.getResponseHeader('X-Tryton-Cache');
+ if (cache) {
+ cache = parseInt(cache, 10);
+ session.cache.set(
+ args.method,
+ JSON.stringify(Sao.rpc.prepareObject(params)),
+ cache,
+ result);
+ }
+ }
+ dfd.resolve(result);
}
};
diff -r c8f383ca8201 -r 96b0dad112d2 src/screen.js
--- a/src/screen.js Sat Apr 06 17:38:58 2019 +0200
+++ b/src/screen.js Mon Apr 08 10:10:40 2019 +0200
@@ -1997,7 +1997,10 @@
}
}
}
- return jQuery.when.apply(jQuery, prms);
+ return jQuery.when.apply(jQuery, prms).then(function() {
+ Sao.Session.current_session.cache.clear(
+ 'model.ir.ui.view_tree_state.get');
+ });
},
get_tree_domain: function(parent_) {
var domain;
diff -r c8f383ca8201 -r 96b0dad112d2 src/session.js
--- a/src/session.js Sat Apr 06 17:38:58 2019 +0200
+++ b/src/session.js Mon Apr 08 10:10:40 2019 +0200
@@ -12,6 +12,7 @@
init: function(database, login) {
this.user_id = null;
this.session = null;
+ this.cache = new Cache();
this.prm = jQuery.when(); // renew promise
this.database = database;
this.login = login;
@@ -335,6 +336,41 @@
},
});
+ var Cache = Sao.class_(Object, {
+ init: function() {
+ this.store = {};
+ },
+ cached: function(prefix) {
+ return prefix in this.store;
+ },
+ set: function(prefix, key, expire, value) {
+ expire = new Date(new Date().getTime() + expire * 1000);
+ Sao.setdefault(this.store, prefix, {})[key] = {
+ 'expire': expire,
+ 'value': value,
+ };
+ },
+ get: function(prefix, key) {
+ var now = new Date();
+ var data = Sao.setdefault(this.store, prefix, {})[key];
+ if (!data) {
+ return undefined;
+ }
+ if (data.expire < now) {
+ delete this.store[prefix][key];
+ return undefined;
+ }
+ return data.value;
+ },
+ clear: function(prefix) {
+ if (prefix) {
+ this.store[prefix] = {};
+ } else {
+ this.store = {};
+ }
+ },
+ });
+
Sao.DB = {};
Sao.DB.list = function() {
diff -r c8f383ca8201 -r 96b0dad112d2 src/window.js
--- a/src/window.js Sat Apr 06 17:38:58 2019 +0200
+++ b/src/window.js Mon Apr 08 10:10:40 2019 +0200
@@ -1708,6 +1708,8 @@
})]]
}], {}]
}, this.session).then(function(new_id) {
+ this.session.cache.clear(
+ 'model.' + this.screen.model_name + '.view_toolbar_get');
this.predef_exports[new_id] = fields;
if (selection.length === 0) {
this.add_to_predef(new_id, name);
@@ -1728,6 +1730,8 @@
'method': 'model.ir.export.delete',
'params': [[export_id], {}]
}, this.session).then(function() {
+ this.session.cache.clear(
+ 'model.' + this.screen.model_name + '.view_toolbar_get');
delete this.predef_exports[export_id];
selection.remove();
}.bind(this));