add reloading of database and test
This commit is contained in:
@@ -71,7 +71,7 @@ MBTiles.prototype._open = function(uri) {
|
|||||||
|
|
||||||
this.filename = uri.pathname;
|
this.filename = uri.pathname;
|
||||||
Step(function() {
|
Step(function() {
|
||||||
mbtiles._db = new sqlite3.cached.Database(mbtiles.filename, this);
|
mbtiles._db = new sqlite3.Database(mbtiles.filename, this);
|
||||||
}, function(err) {
|
}, function(err) {
|
||||||
if (err) return error(err);
|
if (err) return error(err);
|
||||||
mbtiles._setup(this);
|
mbtiles._setup(this);
|
||||||
@@ -81,6 +81,11 @@ MBTiles.prototype._open = function(uri) {
|
|||||||
}, function(err, stat) {
|
}, function(err, stat) {
|
||||||
if (err) return error(err);
|
if (err) return error(err);
|
||||||
mbtiles._stat = stat;
|
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.open = true;
|
||||||
mbtiles.emit('open', null, mbtiles);
|
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.
|
// DB integrity check.
|
||||||
//
|
//
|
||||||
// - @param {Function(err)} callback
|
// - @param {Function(err)} callback
|
||||||
|
|||||||
109
test/reloading.test.js
Normal file
109
test/reloading.test.js
Normal file
@@ -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);
|
||||||
|
});
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user