mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-01-06 05:59:15 +01:00
Backport commit r47984 committed by Nathan Gray.
- Use timestamp to give cached dataFetch data a lifetime, currently 29 seconds. - Add another callback for cache registration, called whenever the cache is used.
This commit is contained in:
parent
aebfd22aff
commit
a3d9df3d53
@ -24,6 +24,17 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
|
|||||||
*/
|
*/
|
||||||
var KNOWN_UID_LIMIT = 200;
|
var KNOWN_UID_LIMIT = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache lifetime
|
||||||
|
*
|
||||||
|
* If cached results are used, we check their timestamp. If the timestamp
|
||||||
|
* is older than this, we will also ask for fresh data. For cached data
|
||||||
|
* younger than this, we only return the cache
|
||||||
|
*
|
||||||
|
* 29 seconds, 1 less then the fastest nextmatch autorefresh option
|
||||||
|
*/
|
||||||
|
var CACHE_LIFETIME = 29; // seconds
|
||||||
|
|
||||||
var lastModification = null;
|
var lastModification = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,7 +172,7 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if we need long-term caching of the query and its results
|
// Check to see if we need long-term caching of the query and its results
|
||||||
if(window.localStorage && _context.prefix && cacheCallback[_context.prefix])
|
if(window.localStorage && _context.prefix && cacheCallback[_context.prefix] && !_context.no_cache)
|
||||||
{
|
{
|
||||||
// Ask registered callbacks if we should cache this
|
// Ask registered callbacks if we should cache this
|
||||||
for(var i = 0; i < cacheCallback[_context.prefix].length; i++)
|
for(var i = 0; i < cacheCallback[_context.prefix].length; i++)
|
||||||
@ -318,10 +329,39 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
|
|||||||
var cached = window.localStorage.getItem(cache_key);
|
var cached = window.localStorage.getItem(cache_key);
|
||||||
if(cached)
|
if(cached)
|
||||||
{
|
{
|
||||||
egw.debug('log', 'Data cached query: ' + cache_key + "\nprocessing...");
|
cached = JSON.parse(cached);
|
||||||
// Call right away with cached data. We'll still ask the server
|
var needs_update = true;
|
||||||
// though.
|
|
||||||
parseServerResponse(JSON.parse(cached), _callback, _context);
|
// Check timestamp
|
||||||
|
if(cached.lastModification && ((Date.now()/1000) - cached.lastModification) < CACHE_LIFETIME)
|
||||||
|
{
|
||||||
|
needs_update = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
egw.debug('log', 'Data cached query from ' + new Date(cached.lastModification*1000)+': ' + cache_key + '('+
|
||||||
|
(needs_update ? 'will be' : 'will not be')+" updated)\nprocessing...");
|
||||||
|
|
||||||
|
// Call right away with cached data, but set no_cache flag
|
||||||
|
// to avoid re-caching this data with a new timestamp.
|
||||||
|
// We may still ask the server though.
|
||||||
|
var no_cache = _context.no_cache;
|
||||||
|
_context.no_cache = true;
|
||||||
|
parseServerResponse(cached, _callback, _context);
|
||||||
|
_context.no_cache = no_cache;
|
||||||
|
|
||||||
|
|
||||||
|
// If cache registrant wants notification of cache useage,
|
||||||
|
// let it know
|
||||||
|
if(cc.notification)
|
||||||
|
{
|
||||||
|
cc.notification.call(cc.context, needs_update);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!needs_update)
|
||||||
|
{
|
||||||
|
// Cached data is new enough, skip the server call
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -356,20 +396,25 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
|
|||||||
*
|
*
|
||||||
* @param {string} prefix UID / Application prefix should match the
|
* @param {string} prefix UID / Application prefix should match the
|
||||||
* individual record prefix
|
* individual record prefix
|
||||||
* @param {function} callback A function that will analize the provided fetch
|
* @param {function} callback_function A function that will analize the provided fetch
|
||||||
* parameters and return a reproducable cache key, or false to not cache
|
* parameters and return a reproducable cache key, or false to not cache
|
||||||
* the request.
|
* the request.
|
||||||
|
* @param {function} notice_function A function that will be called whenever
|
||||||
|
* cached data is used. It is passed one parameter, a boolean that indicates
|
||||||
|
* if the server is or will be queried to refresh the cache. Do not fetch additional data
|
||||||
|
* inside this callback, and return quickly.
|
||||||
* @param {object} context Context for callback function.
|
* @param {object} context Context for callback function.
|
||||||
*/
|
*/
|
||||||
dataCacheRegister: function(prefix, callback, context)
|
dataCacheRegister: function(prefix, callback_function, notice_function, context)
|
||||||
{
|
{
|
||||||
if(typeof cacheCallback[prefix] == 'undefined')
|
if(typeof cacheCallback[prefix] == 'undefined')
|
||||||
{
|
{
|
||||||
cacheCallback[prefix] = [];
|
cacheCallback[prefix] = [];
|
||||||
}
|
}
|
||||||
cacheCallback[prefix].push({
|
cacheCallback[prefix].push({
|
||||||
callback: callback,
|
callback: callback_function,
|
||||||
context: context
|
notification: notice_function || false,
|
||||||
|
context: context || null
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user