aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslomo <steve.harrison@gmx.net>2011-01-09 02:27:43 +0100
committerslomo <steve.harrison@gmx.net>2011-01-09 02:27:43 +0100
commit9adc1a65ba87963db5de9c3aa15604cf56121794 (patch)
tree501770239ee5216eaa58fc6e3cdb42d75310b315
parent4212cdd8d414512ed8169163dd22a7c18767e117 (diff)
downloadosm-xapi-9adc1a65ba87963db5de9c3aa15604cf56121794.tar.gz
osm-xapi-9adc1a65ba87963db5de9c3aa15604cf56121794.tar.xz
osm-xapi-9adc1a65ba87963db5de9c3aa15604cf56121794.zip
first node.js code
-rw-r--r--src/nodejs/start.js105
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/')