diff --git a/lib/mbtiles.js b/lib/mbtiles.js index ddf614a..8bee19a 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -602,3 +602,22 @@ MBTiles.prototype.putGrid = function(z, x, y, data, callback) { if (++this._pending < 100) return this._commit(callback); else return callback(null); }; + +MBTiles.prototype.putInfo = function(data, callback) { + if (typeof callback !== 'function') throw new Error('Callback needed'); + if (!this.open) return callback(new Error('MBTiles not yet loaded')); + if (!this._isWritable) return callback(new Error('MBTiles not in write mode')); + + // Valid keys. + var keys = [ 'name', 'type', 'description', 'version', 'formatter', + 'bounds', 'center', 'minzoom', 'maxzoom' ]; + for (var key in data) { + if (keys.indexOf(key) < 0) return callback("Can't set key " + key); + } + var stmt = this._db.prepare('REPLACE INTO metadata (name, value) VALUES (?, ?)'); + stmt.on('error', callback); + for (var key in data) { + stmt.run(key, String(data[key])); + } + stmt.finalize(callback); +}; diff --git a/test/info.test.js b/test/info.test.js index 0c442a3..2c269d7 100644 --- a/test/info.test.js +++ b/test/info.test.js @@ -49,14 +49,15 @@ exports['get metadata'] = function(beforeExit) { }; exports['get/put metadata from empty file'] = function(beforeExit) { - var completed = false; + var completion = {}; new MBTiles(fixtures.empty, function(err, mbtiles) { if (err) throw err; + completion.open = true; mbtiles.getInfo(function(err, data) { - completed = true; if (err) throw err; + completion.info = true; assert.deepEqual({ basename: "empty.mbtiles", @@ -64,7 +65,53 @@ exports['get/put metadata from empty file'] = function(beforeExit) { id: "empty", scheme: "tms" }, data); - }) + + mbtiles.putInfo({ version: '1.0.0' }, function(err) { + assert.ok(err); + assert.equal(err.message, 'MBTiles not in write mode'); + completion.putFail = true; + + mbtiles.startWriting(function(err) { + if (err) throw err; + completion.startWriting = true; + + mbtiles.putInfo({ version: '1.0.0' }, function(err) { + if (err) throw err; + completion.written = true; + + mbtiles.stopWriting(function(err) { + if (err) throw err; + completion.stopWriting = true; + + mbtiles.getInfo(function(err, data) { + if (err) throw err; + completion.updatedInfo = true; + + assert.deepEqual({ + basename: "empty.mbtiles", + filesize: 16384, + id: "empty", + scheme: "tms", + version: "1.0.0" + }, data); + }); + }); + }); + }); + }); + }); + }); + + beforeExit(function() { + assert.deepEqual(completion, { + info: true, + open: true, + putFail: true, + startWriting: true, + stopWriting: true, + updatedInfo: true, + written: true + }); }); };