Add support for nested json metadata.
This commit is contained in:
+23
-1
@@ -229,6 +229,18 @@ MBTiles.prototype.getInfo = function(callback) {
|
|||||||
if (err && err.errno !== 1) return callback(err);
|
if (err && err.errno !== 1) return callback(err);
|
||||||
if (rows) rows.forEach(function(row) {
|
if (rows) rows.forEach(function(row) {
|
||||||
switch (row.name) {
|
switch (row.name) {
|
||||||
|
// The special "json" key/value pair allows JSON to be serialized
|
||||||
|
// and merged into the metadata of an MBTiles based source. This
|
||||||
|
// enables nested properties and non-string datatypes to be
|
||||||
|
// captured by the MBTiles metadata table.
|
||||||
|
case 'json':
|
||||||
|
try { var jsondata = JSON.parse(row.value); }
|
||||||
|
catch (err) { return callback(err); }
|
||||||
|
Object.keys(jsondata).reduce(function(memo, key) {
|
||||||
|
memo[key] = memo[key] || jsondata[key];
|
||||||
|
return memo;
|
||||||
|
}, info);
|
||||||
|
break;
|
||||||
case 'minzoom':
|
case 'minzoom':
|
||||||
case 'maxzoom':
|
case 'maxzoom':
|
||||||
info[row.name] = parseInt(row.value, 10);
|
info[row.name] = parseInt(row.value, 10);
|
||||||
@@ -537,11 +549,21 @@ MBTiles.prototype.putInfo = function(data, callback) {
|
|||||||
if (!this.open) return callback(new Error('MBTiles not yet loaded'));
|
if (!this.open) return callback(new Error('MBTiles not yet loaded'));
|
||||||
if (!this._isWritable) return callback(new Error('MBTiles not in write mode'));
|
if (!this._isWritable) return callback(new Error('MBTiles not in write mode'));
|
||||||
|
|
||||||
|
var jsondata;
|
||||||
var stmt = this._db.prepare('REPLACE INTO metadata (name, value) VALUES (?, ?)');
|
var stmt = this._db.prepare('REPLACE INTO metadata (name, value) VALUES (?, ?)');
|
||||||
stmt.on('error', callback);
|
stmt.on('error', callback);
|
||||||
for (var key in data) {
|
for (var key in data) {
|
||||||
stmt.run(key, String(data[key]));
|
// If a data property is a javascript hash/object, slip it into
|
||||||
|
// the 'json' field which contains stringified JSON to be merged
|
||||||
|
// in at read time. Allows nested/deep metadata to be recorded.
|
||||||
|
if (typeof data[key] === 'object' && !Array.isArray(data[key])) {
|
||||||
|
jsondata = jsondata || {};
|
||||||
|
jsondata[key] = data[key];
|
||||||
|
} else {
|
||||||
|
stmt.run(key, String(data[key]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (jsondata) stmt.run('json', JSON.stringify(jsondata));
|
||||||
|
|
||||||
var mbtiles = this;
|
var mbtiles = this;
|
||||||
stmt.finalize(function(err) {
|
stmt.finalize(function(err) {
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
+11
-4
@@ -30,7 +30,8 @@ describe('info', function() {
|
|||||||
formatter: null,
|
formatter: null,
|
||||||
center: [ 0, 7.500000001278025, 2 ],
|
center: [ 0, 7.500000001278025, 2 ],
|
||||||
bounds: [ -179.9999999749438, -69.99999999526695, 179.9999999749438, 84.99999999782301 ],
|
bounds: [ -179.9999999749438, -69.99999999526695, 179.9999999749438, 84.99999999782301 ],
|
||||||
|
// Test that json data is merged in.
|
||||||
|
level1: { level2: 'property' },
|
||||||
// These aren't part of TileJSON, but exist in an MBTiles file.
|
// These aren't part of TileJSON, but exist in an MBTiles file.
|
||||||
filesize: 561152,
|
filesize: 561152,
|
||||||
type: 'baselayer',
|
type: 'baselayer',
|
||||||
@@ -45,6 +46,11 @@ describe('info', function() {
|
|||||||
it('get/put metadata from empty file', function(done) {
|
it('get/put metadata from empty file', function(done) {
|
||||||
this.timeout(10e3);
|
this.timeout(10e3);
|
||||||
|
|
||||||
|
var info = {
|
||||||
|
version: '1.0.0',
|
||||||
|
level1: { level2: 'property' }
|
||||||
|
};
|
||||||
|
|
||||||
new MBTiles(fixtures.empty, function(err, mbtiles) {
|
new MBTiles(fixtures.empty, function(err, mbtiles) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
|
|
||||||
@@ -58,14 +64,14 @@ describe('info', function() {
|
|||||||
scheme: "tms"
|
scheme: "tms"
|
||||||
}, data);
|
}, data);
|
||||||
|
|
||||||
mbtiles.putInfo({ version: '1.0.0' }, function(err) {
|
mbtiles.putInfo(info, function(err) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.equal(err.message, 'MBTiles not in write mode');
|
assert.equal(err.message, 'MBTiles not in write mode');
|
||||||
|
|
||||||
mbtiles.startWriting(function(err) {
|
mbtiles.startWriting(function(err) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
|
|
||||||
mbtiles.putInfo({ version: '1.0.0' }, function(err) {
|
mbtiles.putInfo(info, function(err) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
|
|
||||||
mbtiles.stopWriting(function(err) {
|
mbtiles.stopWriting(function(err) {
|
||||||
@@ -79,7 +85,8 @@ describe('info', function() {
|
|||||||
filesize: 0,
|
filesize: 0,
|
||||||
id: "empty",
|
id: "empty",
|
||||||
scheme: "tms",
|
scheme: "tms",
|
||||||
version: "1.0.0"
|
version: "1.0.0",
|
||||||
|
level1: { level2: "property" },
|
||||||
}, data);
|
}, data);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
|
|||||||
Reference in New Issue
Block a user