Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
686 changes: 424 additions & 262 deletions lib/mbtiles.js

Large diffs are not rendered by default.

70 changes: 41 additions & 29 deletions lib/zxystream.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,52 +22,64 @@ ZXYStream.prototype._read = function() {

// Check for the existence of a map table that is indexed.
if (!stream.table) {
return this.source._db.get("select count(1) as count from sqlite_master where type = 'index' and tbl_name = 'map';", function(err, row) {
if (err) return stream.emit('error', err);
stream.table = row.count >= 1 ? 'map' : 'tiles';
return stream._read();
setImmediate(function() {
try {
var stmt = stream.source._db.prepare("select count(1) as count from sqlite_master where type = 'index' and tbl_name = 'map';");
var row = stmt.get();
stream.table = row.count >= 1 ? 'map' : 'tiles';
return stream._read();
} catch (err) {
return stream.emit('error', err);
}
});
return;
}

// Prepare sql statement
if (!stream.statement) {
var query = 'SELECT zoom_level AS z, tile_column AS x, tile_row AS y FROM ' + this.table;
if (this.table === 'map') query += ' WHERE tile_id is not null';

stream.statement = this.source._db.prepare(query, function(err) {
if (err && err.code === 'SQLITE_ERROR' && /no such table/.test(err.message)) return stream.push(null);
return stream._read();
setImmediate(function() {
try {
stream.statement = stream.source._db.prepare(query);
stream.statementIterator = stream.statement.iterate();
return stream._read();
} catch (err) {
if (err.code === 'ERR_SQLITE_ERROR' && /no such table/.test(err.message)) {
return stream.push(null);
}
return stream.emit('error', err);
}
});
return;
}

var lines = '';
var error;
var remaining = stream.batch;
for (var i = 0; i < stream.batch; i++) stream.statement.get(afterGet);

function afterGet(err, row) {
if (err && err.code === 'SQLITE_ERROR' && /no such table/.test(err.message)) {
// no-op
} else if (err) {
error = err;
} else if (!row) {
// no-op
} else {
lines += toLine(row);
}
if (!--remaining) {
if (error) {
stream.emit('error', error);
} else {
if (lines) stream.push(lines);
else {
stream.statement.finalize();
var count = 0;

setImmediate(function() {
try {
for (var i = 0; i < stream.batch; i++) {
var result = stream.statementIterator.next();
if (result.done) {
if (lines) stream.push(lines);
stream.push(null);
return;
}
lines += toLine(result.value);
count++;
}

if (lines) stream.push(lines);
} catch (err) {
if (err.code === 'ERR_SQLITE_ERROR' && /no such table/.test(err.message)) {
stream.push(null);
} else {
stream.emit('error', err);
}
}
}
});
};

function toLine(row) {
Expand Down
9 changes: 3 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
{
"name": "@mapbox/mbtiles",
"name": "@signalk/node-mbtiles",
"version": "0.12.2",
"description": "Utilities and tilelive integration for the MBTiles format.",
"url": "http://github.com/mapbox/node-mbtiles",
"author": "Mapbox (https://www.mapbox.com)",
"keywords": [
"map",
"mbtiles"
Expand All @@ -30,8 +28,7 @@
"dependencies": {
"@mapbox/sphericalmercator": "~1.1.0",
"@mapbox/tiletype": "0.3.x",
"d3-queue": "~3.0.7",
"sqlite3": "^5.0.0"
"d3-queue": "~3.0.7"
},
"devDependencies": {
"eslint": "~5.16.0",
Expand All @@ -40,7 +37,7 @@
"tape": "~4.10.1"
},
"engines": {
"node": ">= 10"
"node": ">= 22.5.0"
},
"scripts": {
"test": "eslint lib && tape test/*.js"
Expand Down
2 changes: 0 additions & 2 deletions test/commit.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var tape = require('tape');
var fs = require('fs');
var MBTiles = require('..');
Expand Down
2 changes: 0 additions & 2 deletions test/info.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var tape = require('tape');
var MBTiles = require('..');
Expand Down
2 changes: 0 additions & 2 deletions test/list.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var tape = require('tape');
var MBTiles = require('..');
Expand Down
2 changes: 0 additions & 2 deletions test/mode.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var MBTiles = require('..');
var tape = require('tape');
Expand Down
4 changes: 1 addition & 3 deletions test/read.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var MBTiles = require('..');
var tape = require('tape');
Expand Down Expand Up @@ -137,7 +135,7 @@ fs.readdirSync(__dirname + '/fixtures/grids/').forEach(function(file) {
loaded.non_existent.getTile(coords[0], coords[1], coords[2], yieldsError(assert, 'error', 'Tile does not exist', assert.end));
});
tape('corrupt ' + coords.join('/'), function(assert) {
loaded.corrupt.getTile(coords[0], coords[1], coords[2], yieldsError(assert, 'error', 'SQLITE_CORRUPT: database disk image is malformed', assert.end));
loaded.corrupt.getTile(coords[0], coords[1], coords[2], yieldsError(assert, 'error', 'database disk image is malformed', assert.end));
});
});

Expand Down
2 changes: 0 additions & 2 deletions test/write.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var tape = require('tape');
var MBTiles = require('..');
Expand Down
2 changes: 0 additions & 2 deletions test/write_grids.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
require('sqlite3').verbose();

var fs = require('fs');
var tape = require('tape');
var MBTiles = require('..');
Expand Down
1 change: 0 additions & 1 deletion test/zztile.sqkm.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
'use strict';
require('sqlite3').verbose();
var tape = require('tape');
var fs = require('fs');
var os = require('os');
Expand Down
Loading