No sql param in generateCacheChannel

This commit is contained in:
Raul Ochoa 2015-03-23 17:56:51 +01:00
parent 415d0c42d5
commit ea3d2124dc

View File

@ -2,7 +2,6 @@ var _ = require('underscore');
var step = require('step'); var step = require('step');
var QueryTablesApi = require('./api/query_tables_api'); var QueryTablesApi = require('./api/query_tables_api');
var PgConnection = require('./backends/pg_connection'); var PgConnection = require('./backends/pg_connection');
var crypto = require('crypto');
var LZMA = require('lzma').LZMA; var LZMA = require('lzma').LZMA;
var TemplateMaps = require('./template_maps.js'); var TemplateMaps = require('./template_maps.js');
var MapConfigNamedLayersAdapter = require('./models/mapconfig_named_layers_adapter'); var MapConfigNamedLayersAdapter = require('./models/mapconfig_named_layers_adapter');
@ -120,106 +119,78 @@ module.exports = function(redisPool) {
return dbName + ':' + tableNames.join(','); return dbName + ':' + tableNames.join(',');
}; };
me.generateMD5 = function(data){
var hash = crypto.createHash('md5');
hash.update(data);
return hash.digest('hex');
};
me.generateCacheChannel = function(app, req, callback){ me.generateCacheChannel = function(app, req, callback){
// Build channelCache key
var dbName = req.params.dbname;
var cacheKey = [ dbName, req.params.token ].join(':');
// Build channelCache key step(
var dbName = req.params.dbname; function checkCached() {
var cacheKey = [ dbName ]; if ( me.channelCache.hasOwnProperty(cacheKey) ) {
if ( req.params.token ) cacheKey.push(req.params.token); return callback(null, me.channelCache[cacheKey]);
else if ( req.params.sql ) cacheKey.push( me.generateMD5(req.params.sql) ); }
cacheKey = cacheKey.join(':'); return null;
},
function extractSQL(err) {
assert.ifError(err);
var that = this; // TODO: cached cache channel for token-based access should
// be constructed at renderer cache creation time
// See http://github.com/CartoDB/Windshaft-cartodb/issues/152
if ( ! app.mapStore ) {
throw new Error('missing channel cache for token ' + req.params.token);
}
var next = this;
var mapStore = app.mapStore;
step(
function loadFromStore() {
mapStore.load(req.params.token, this);
},
function getSQL(err, mapConfig) {
if (req.profiler) {
req.profiler.done('mapStore_load');
}
assert.ifError(err);
step ( return mapConfig.obj().layers.map(function(lyr) {
function checkCached() { return lyr.options.sql;
if ( me.channelCache.hasOwnProperty(cacheKey) ) { }).join(';');
callback(null, me.channelCache[cacheKey]); },
return; function finish(err, sql) {
} next(err, sql);
return null; }
}, );
function extractSQL(err) { },
if ( err ) throw err; function findAffectedTables(err, sql) {
assert.ifError(err);
if ( ! sql ) {
if ( ! req.params.table ) {
throw new Error("this request doesn't need an X-Cache-Channel generated");
}
return [req.params.table];
}
if ( req.params.token ) { queryTablesApi.getAffectedTablesInQuery(cdbRequest.userByReq(req), sql, this); // in addCacheChannel
// TODO: cached cache channel for token-based access should },
// be constructed at renderer cache creation time function buildCacheChannel(err, tableNames) {
// See http://github.com/CartoDB/Windshaft-cartodb/issues/152 assert.ifError(err);
if ( ! app.mapStore ) {
throw new Error('missing channel cache for token ' + req.params.token); if (req.profiler && ! req.params.table ) {
req.profiler.done('affectedTables');
}
var cacheChannel = me.buildCacheChannel(dbName,tableNames);
// store for caching from me.generateCacheChannel
// (not worth when table was specified in params)
if ( ! req.params.table ) {
me.channelCache[cacheKey] = cacheChannel;
}
return cacheChannel;
},
function finish(err, cacheChannel) {
callback(err, cacheChannel);
} }
var next = this; );
var mapStore = app.mapStore;
step(
function loadFromStore() {
mapStore.load(req.params.token, this);
},
function getSQL(err, mapConfig) {
if (req.profiler) req.profiler.done('mapStore_load');
if ( err ) throw err;
var sql = [];
_.each(mapConfig.obj().layers, function(lyr) {
sql.push(lyr.options.sql);
});
sql = sql.join(';');
return sql;
},
function finish(err, sql) {
next(err, sql);
}
);
return;
}
if ( ! req.params.sql ) {
return null; // no sql
}
// We have sql, and no token...
// strip out windshaft/mapnik inserted sql if present
var sql = req.params.sql.match(/^\((.*)\)\sas\scdbq$/);
sql = (sql !== null) ? sql[1] : req.params.sql;
return sql;
},
function findAffectedTables(err, sql) {
if ( err ) throw err;
if ( ! sql ) {
if ( ! req.params.table ) {
throw new Error("this request doesn't need an X-Cache-Channel generated");
}
return [req.params.table];
}
queryTablesApi.getAffectedTablesInQuery(cdbRequest.userByReq(req), sql, this); // in addCacheChannel
},
function buildCacheChannel(err, tableNames) {
if ( err ) throw err;
if (req.profiler && ! req.params.table ) {
req.profiler.done('affectedTables');
}
var dbName = req.params.dbname;
var cacheChannel = me.buildCacheChannel(dbName,tableNames);
// store for caching from me.generateCacheChannel
// (not worth when table was specified in params)
if ( ! req.params.table ) {
me.channelCache[cacheKey] = cacheChannel;
}
return cacheChannel;
},
function finish(err, cacheChannel) {
callback(err, cacheChannel);
}
);
}; };
// Set the cache chanel info to invalidate the cache on the frontend server // Set the cache chanel info to invalidate the cache on the frontend server