diff options
Diffstat (limited to 'src/nodejs/start.js')
-rw-r--r-- | src/nodejs/start.js | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/nodejs/start.js b/src/nodejs/start.js new file mode 100644 index 0000000..2cf923e --- /dev/null +++ b/src/nodejs/start.js @@ -0,0 +1,105 @@ +// imports +var http = require('http'), + querystring = require('querystring'), + pg = require('pg'), + url = require('url'), + querystring = require('querystring'); + +// config +var connectionString = "pg://user:pass@localhost/xapi" + + +function getDataBaseResult(tag,bbox,res){ +pg.connect(connectionString,function(err,client){ + var the_result; + if(err){ + console.log(err); + } else { + client.query(createQuery(tag,bbox),function(err,result){ + if (err) { + console.log(err); + } else { + console.log(result); + res.write(result.rows); + res.end("/n"); + } + + }); + } +}); +} + + +function createQuery(tag,bbox){ + // FIXME: validate + var table = tag[0] + "#" + tag[1]; + var filter = ""; + + // input validation + for(i=0;i<bbox.length;i++){ + bbox[i] = parseFloat(bbox[i]); + } + + if(bbox){ + filter = "WHERE longitude > " + bbox[0] + " AND longitude < " + bbox[1] + + " AND latitude > " + bbox[2] + " AND latitude < " + bbox[3]; + } + return "SELECT * FROM \"" + table + "\" " + filter + ";"; +} + + +RegExp.escape= function(s) { + return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') +}; + + +var PATH_PREFIX = '/api/'; +var base_url_re = new RegExp('^' + RegExp.escape(PATH_PREFIX) + + '(node|way|relation|\\*)(.*)$') +var filter_re = /\[(\w+=[^\]]+)\]/g; + + +http.createServer(function (req, res) { + + if (!base_url_re.test(req.url)) { + res.writeHead(404, {'Content-Type': 'text/plain; charset=utf8'}); + res.end('Not Found\n'); + } + base_url_re.exec(req.url); + var type = RegExp.$1, url_rest = querystring.unescape(RegExp.$2); + + var filters = []; + while (v = filter_re.exec(url_rest)) { + filters.push(v[1]); + } + console.log(filters); + + var tag; + var bbox; + + for(i=0;i<filters.length;i++){ + filters[i]=filters[i].split(/=/); + if(filters[i][0]=="bbox"){ + bbox = filters[i][1].split(/,/); + } + else { + tag = filters[i]; + } + } + + console.log(tag); + console.log(bbox); + + getDataBaseResult(tag,bbox,res); + + res.writeHead(200, {'Content-Type': 'text/plain; charset=utf8', }); + + res.write('URL was: ' + req.url + '\n'); + res.write('type: ' + type + '\n'); + res.write('filters:\n'); + filters.forEach(function(x) { res.write(' ' + x + '\n'); }) + //res.end('\n'); + +}).listen(8124, "127.0.0.1"); + +console.log('Listening on http://127.0.0.1:8124/') |