var clutch = require('clutch');
var pg = require('pg');
var builder = require('xmlbuilder');
// load config
var config = require('./config.json');
process.argv.forEach(
function (val,index, array){
if(val=="-c"){
path = array[index+1];
if( path[0] != '/'){
path = __dirname + '/' + path;
}
config = require(path);
}
});
var connectionString = config['connectionString'];
//set up logger
var log4js = require('log4js')(); //note the need to call the function
//log4js.addAppender(log4js.fileAppender('osm-xapi.log'), 'cheese');
var util = require('util');
var log = log4js.getLogger('global');
log.setLevel('ALL');
log.info("server starting...");
function toISO8601(date) {
//2007-03-31T00:09:22+01:00
var pad_two = function(n) {
return (n < 10 ? '0' : '') + n;
};
return [
date.getUTCFullYear(),
'-',
pad_two(date.getUTCMonth() + 1),
'-',
pad_two(date.getUTCDate()),
'T',
pad_two(date.getUTCHours()),
':',
pad_two(date.getUTCMinutes()),
':',
pad_two(date.getUTCSeconds()),
'+01:00' //FIX ME
].join('');
}
function createWayBboxQuery(key, value, left, bottom, right, top) {
return "SELECT id,tstamp,version,changeset_id, nodes, user_id, hstore_to_array(tags) as tags FROM ways WHERE (tags @> hstore('" + key + "','" + value + "') AND linestring && st_setsrid(st_makebox2d(st_setsrid(st_makepoint(" +
left + "," + bottom + "),4326), st_setsrid(st_makepoint(" + right + "," + top + "),4326)),4326));";
}
function createNodeBboxQuery(key, value, left, bottom, right, top) {
return "SELECT id, user_id,tstamp,version,changeset_id, hstore_to_array(tags) as tags, X(geom) as lat, Y(geom) as lon FROM nodes WHERE (tags @> hstore('" + key + "','" + value + "') AND geom && st_setsrid(st_makebox2d(st_setsrid(st_makepoint(" +
left + "," + bottom + "),4326), st_setsrid(st_makepoint(" + right + "," + top + "),4326)),4326));";
}
function createNodesForWayQuery(nodes) {
return "SELECT id, tstamp, version, changeset_id, hstore_to_array(tags) as tags, X(geom) as lat, Y(geom) as lon FROM nodes WHERE id = ANY('" + nodes + "');";
}
function nodeWorldHandler(req, res, key, value) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(' key:' +key +' value:'+value+'\n');
}
function nodeBboxHandler(req, res, key, value, left, bottom, right, top) {
log.error("nodeBboxHandler");
db_connect(res, function(client) {
log.info(createNodeBboxQuery(key, value, left, bottom, right, top));
var success = false;
var query = client.query(createNodeBboxQuery(key, value, left, bottom, right, top));
query.on('error', function(err) {
log.error(err);
res.writeHead(404,{});
res.end('\n');
});
query.on('end', function() {
//console.log("end event\n");
if(success) {
res.write("");
res.end();
}
else {
//empty response
res.writeHead(404,{});
res.end();
//perhaps write 404? is error also raised?
}
});
query.on('row', function(row) {
if(!success) {
success = true;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write("");
}
res.write(createXmlFromRow(row));
});
});
}
function createXmlFromRow(row) {
log.debug(row);
var node = builder.begin('node')
.att('id', row.id)
.att('timestamp', toISO8601(row.tstamp))
.att('version', row.version)
.att('changeset', row.changeset_id)
.att('lat', row.lat)
.att('lon', row.lon);
if(row.tags != '{}') {
var temp = row.tags.replace("{","").replace("}","").split(",");
for(var x=0;x");
res.end();
}
//res.write("");
//res.end(); //problem!!!
}
else {
res.writeHead(404,{});
res.end();
//perhaps write 404?
}
});
query.on('row', function(row) {
if(!success) {
success = true;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write("");
}
//console.log(row);
if(row.nodes != '{}') {
count++;
var subquery = client.query(createNodesForWayQuery(row.nodes));
subquery.on('error',function(err) {});
subquery.on('end', function() {
count--;
if(count==0)
res.write("");
res.end();
});
subquery.on('row', function(row) {
res.write(createXmlFromRow(row));
});
//console.log(createNodesForWayQuery(row.nodes));
}
var way = builder.begin('way')
.att('id', row.id)
.att('timetamp', toISO8601(row.tstamp))
.att('version', row.version)
.att('changeset', row.changeset_id);
if(row.tags != '{}') {
var temp = row.tags.replace("{","").replace("}","").split(",");
for(var x=0;x