From 69ba7cbbb1618bd77a85f05381fa8397d7fcabc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Mon, 11 Jul 2011 17:51:39 +0200 Subject: [PATCH] add reloading of database and test --- lib/mbtiles.js | 11 ++++- test/reloading.test.js | 109 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 test/reloading.test.js diff --git a/lib/mbtiles.js b/lib/mbtiles.js index ebdeac5..f0fc03b 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -71,7 +71,7 @@ MBTiles.prototype._open = function(uri) { this.filename = uri.pathname; Step(function() { - mbtiles._db = new sqlite3.cached.Database(mbtiles.filename, this); + mbtiles._db = new sqlite3.Database(mbtiles.filename, this); }, function(err) { if (err) return error(err); mbtiles._setup(this); @@ -81,6 +81,11 @@ MBTiles.prototype._open = function(uri) { }, function(err, stat) { if (err) return error(err); mbtiles._stat = stat; + fs.watchFile(mbtiles.filename, { interval: 1000 }, function(cur, prev) { + if (cur.mtime != prev.mtime) { + delete cache[uri.pathname]; + } + }); mbtiles.open = true; mbtiles.emit('open', null, mbtiles); }); @@ -138,6 +143,10 @@ MBTiles.prototype._exists = function(table, callback) { } }; +MBTiles.prototype._close = function() { + fs.unwatchFile(this.filename); +}; + // DB integrity check. // // - @param {Function(err)} callback diff --git a/test/reloading.test.js b/test/reloading.test.js new file mode 100644 index 0000000..9cda09e --- /dev/null +++ b/test/reloading.test.js @@ -0,0 +1,109 @@ +process.env.NODE_ENV = 'test'; + +var fs = require('fs'); +var assert = require('assert'); +var MBTiles = require('..'); + +var fixtureDir = __dirname + '/fixtures/output'; +var fixtures = { + source: __dirname + '/fixtures/plain_1.mbtiles', + destination: fixtureDir + '/write_3.mbtiles' +}; + +// Load entire database as buffer. +var file = fs.readFileSync(fixtures.source); + +// Recreate output directory to remove previous tests. +try { fs.unlinkSync(fixtures.destination); } catch(err) {} +try { fs.mkdirSync(fixtureDir, 0755); } catch(err) {} + +exports['test file reloading during copying'] = function(beforeExit) { + var completed = false; + var status = { + success: 0, + error: 0 + }; + + var tiles = [ + [ 0, 0, 0 ], + [ 1, 0, 1 ], + [ 4, 0, 5 ], + [ 4, 0, 4 ], + [ 1, 0, 0 ], + [ 3, 6, 3 ], + [ 4, 8, 6 ], + [ 4, 9, 1 ], + [ 4, 9, 10 ], + [ 4, 9, 7 ], + [ 4, 9, 6 ] + ]; + + var fd = fs.openSync(fixtures.destination, 'w'); + // Start copying the file. Write first 100 KB and last 100 KB, then wait. + fs.writeSync(fd, file, 0, 100000, 0); + fs.writeSync(fd, file, 461152, 100000, 461152); + + function writeRest() { + setTimeout(function() { + fs.writeSync(fd, file, 100000, 461152, 100000); + fs.closeSync(fd); + + setTimeout(function() { + new MBTiles(fixtures.destination, function(err, mbtiles) { + var returned = 0; + tiles.forEach(function(c) { + mbtiles.getTile(c[0], c[1], c[2], function(err, tile) { + if (++returned === tiles.length) mbtiles._close(); + if (err) assert.ok(false, "Couldn't load tile " + c[0] + '/' + c[1] + '/' + c[2]); + else status.success++; + }); + }); + }); + + }, 2000); + }, 1000); + } + + // Try reading. + new MBTiles(fixtures.destination, 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: 'write_3', + basename: 'write_3.mbtiles' + }, data); + }); + + var returned = 0; + tiles.forEach(function(c) { + mbtiles.getTile(c[0], c[1], c[2], function(err, tile) { + if (++returned === tiles.length) writeRest(); + if (err) status.error++; + else assert.ok(false, "Could unexpectedly load tile " + c[0] + '/' + c[1] + '/' + c[2]); + }); + }); + }); + + + beforeExit(function() { + assert.ok(completed); + assert.equal(status.error, 11); + assert.equal(status.success, 11); + }); +}; \ No newline at end of file