diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index 3acde0e3..c77d3f7b 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -1,24 +1,49 @@ var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); +var templateName = require('../backends/template_maps').templateName; function NamedMapProviderCache(templateMaps, pgConnection, userLimitsApi, queryTablesApi) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.userLimitsApi = userLimitsApi; this.queryTablesApi = queryTablesApi; + + this.providerCache = {}; } module.exports = NamedMapProviderCache; NamedMapProviderCache.prototype.get = function(user, templateId, config, authToken, params) { - return new NamedMapMapConfigProvider( - this.templateMaps, - this.pgConnection, - this.userLimitsApi, - this.queryTablesApi, - user, - templateId, - config, - authToken, - params - ); + var namedMapKey = createNamedMapKey(user, templateId); + if (!this.providerCache.hasOwnProperty(namedMapKey)) { + this.providerCache[namedMapKey] = {}; + } + + var providerKey = createProviderKey(config, authToken); + if (!this.providerCache[namedMapKey].hasOwnProperty(providerKey)) { + this.providerCache[namedMapKey][providerKey] = new NamedMapMapConfigProvider( + this.templateMaps, + this.pgConnection, + this.userLimitsApi, + this.queryTablesApi, + user, + templateId, + config, + authToken, + params + ); + } + + return this.providerCache[namedMapKey][providerKey]; }; + +NamedMapProviderCache.prototype.invalidate = function(user, templateId) { + delete this.providerCache[createNamedMapKey(user, templateId)]; +}; + +function createNamedMapKey(user, templateId) { + return user + ':' + templateName(templateId); +} + +function createProviderKey(config, authToken) { + return NamedMapMapConfigProvider.configHash(config) + ':' + authToken; +} diff --git a/lib/cartodb/models/mapconfig/named_map_provider.js b/lib/cartodb/models/mapconfig/named_map_provider.js index aa87613c..59aa1708 100644 --- a/lib/cartodb/models/mapconfig/named_map_provider.js +++ b/lib/cartodb/models/mapconfig/named_map_provider.js @@ -22,6 +22,8 @@ function NamedMapMapConfigProvider(templateMaps, pgConnection, userLimitsApi, qu this.authToken = authToken; this.params = params; + this.cacheBuster = Date.now(); + // use template after call to mapConfig this.template = null; @@ -147,7 +149,7 @@ NamedMapMapConfigProvider.prototype.getKey = function() { }; NamedMapMapConfigProvider.prototype.getCacheBuster = function() { - return 0; + return this.cacheBuster; }; NamedMapMapConfigProvider.prototype.filter = function(key) { @@ -182,6 +184,8 @@ function configHash(config) { return crypto.createHash('md5').update(JSON.stringify(config)).digest('hex').substring(0,8); } +module.exports.configHash = configHash; + NamedMapMapConfigProvider.prototype.setDBParams = function(cdbuser, params, callback) { var self = this; step(