From 64888c7e56945f865e3de37b18a3fe69d1aabdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Mon, 18 Jul 2011 16:36:11 +0200 Subject: [PATCH] fix handling of empty files --- lib/mbtiles.js | 11 +++++++- test/info.test.js | 70 +++++++++++++++++++++++++++++++++++++++++++++++ test/read.test.js | 33 ---------------------- 3 files changed, 80 insertions(+), 34 deletions(-) create mode 100644 test/info.test.js diff --git a/lib/mbtiles.js b/lib/mbtiles.js index 823ecbc..ddf614a 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -376,14 +376,23 @@ MBTiles.prototype.getInfo = function(callback) { if (err) return callback(err); var range = parseInt(info.maxzoom, 10) - parseInt(info.minzoom, 10); info.minzoom = parseInt(info.minzoom, 10); + if (isNaN(info.minzoom) || typeof info.minzoom !== 'number') delete info.minzoom; info.maxzoom = parseInt(info.maxzoom, 10); + if (isNaN(info.maxzoom) || typeof info.maxzoom !== 'number') delete info.maxzoom; + info.bounds = _((info.bounds || '').split(',')).map(parseFloat); + if (info.bounds.length !== 4 || info.bounds[0] === null) delete info.bounds; + if (info.center) info.center = _((info.center).split(',')).map(parseFloat); - if (!info.center || info.center.length !== 3) info.center = [ + if ((!info.center || info.center.length !== 3) && info.bounds) info.center = [ (info.bounds[2] - info.bounds[0]) / 2 + info.bounds[0], (info.bounds[3] - info.bounds[1]) / 2 + info.bounds[1], (range <= 1) ? info.maxzoom : Math.floor(range * 0.5) + info.minzoom ]; + if (info.center && (info.center.length !== 3 || info.center[0] === null)) { + delete info.center; + } + return callback(null, info); }); }; diff --git a/test/info.test.js b/test/info.test.js new file mode 100644 index 0000000..0c442a3 --- /dev/null +++ b/test/info.test.js @@ -0,0 +1,70 @@ +process.env.NODE_ENV = 'test'; + +var fs = require('fs'); +var Step = require('step'); +var assert = require('assert'); +var MBTiles = require('..'); + +var fixtures = { + plain_1: __dirname + '/fixtures/plain_1.mbtiles', + empty: __dirname + '/fixtures/empty.mbtiles' +}; + +try { fs.unlink(fixtures.empty); } catch (err) {} + + +exports['get metadata'] = function(beforeExit) { + var completed = false; + + new MBTiles(fixtures.plain_1, function(err, mbtiles) { + if (err) throw err; + + mbtiles.getInfo(function(err, data) { + completed = true; + if (err) throw err; + + assert.deepEqual({ + name: 'plain_1', + description: 'demo description', + version: '1.0.3', + scheme: 'tms', + minzoom: 0, + maxzoom: 4, + formatter: null, + center: [ 0, 7.500000001278025, 2 ], + bounds: [ -179.9999999749438, -69.99999999526695, 179.9999999749438, 84.99999999782301 ], + + // These aren't part of TileJSON, but exist in an MBTiles file. + filesize: 561152, + type: 'baselayer', + id: 'plain_1', + basename: 'plain_1.mbtiles' + }, data); + }) + }); + + beforeExit(function() { + assert.ok(completed); + }); +}; + +exports['get/put metadata from empty file'] = function(beforeExit) { + var completed = false; + + new MBTiles(fixtures.empty, function(err, mbtiles) { + if (err) throw err; + + mbtiles.getInfo(function(err, data) { + completed = true; + if (err) throw err; + + assert.deepEqual({ + basename: "empty.mbtiles", + filesize: 16384, + id: "empty", + scheme: "tms" + }, data); + }) + }); +}; + diff --git a/test/read.test.js b/test/read.test.js index efecaef..f005b83 100644 --- a/test/read.test.js +++ b/test/read.test.js @@ -15,39 +15,6 @@ var fixtures = { try { fs.unlink(fixtures.non_existent); } catch (err) {} -exports['get metadata'] = function(beforeExit) { - var completed = false; - - new MBTiles(fixtures.plain_1, function(err, mbtiles) { - mbtiles.getInfo(function(err, data) { - completed = true; - if (err) throw err; - - assert.deepEqual({ - name: 'plain_1', - description: 'demo description', - version: '1.0.3', - scheme: 'tms', - minzoom: 0, - maxzoom: 4, - formatter: null, - center: [ 0, 7.500000001278025, 2 ], - bounds: [ -179.9999999749438, -69.99999999526695, 179.9999999749438, 84.99999999782301 ], - - // These aren't part of TileJSON, but exist in an MBTiles file. - filesize: 561152, - type: 'baselayer', - id: 'plain_1', - basename: 'plain_1.mbtiles' - }, data); - }) - }); - - beforeExit(function() { - assert.ok(completed); - }); -}; - function yieldsError(status, error, msg) { return function(err) { assert.ok(err);