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));

Reply via email to