From 9e9a1ebbb995ac28de255e27dd313b50c519f5ff Mon Sep 17 00:00:00 2001 From: jingsam Date: Tue, 27 Mar 2018 23:23:48 +0800 Subject: [PATCH] Support sqlite mode flags (#73) * Update mbtiles.js * some reading * remove seemingly unused/dead code * core api functionality * test note * grids * remove index test * add tilelive example * vNext * follow sqlite3 URI filenames * add mode test * add mode test * fix ci * fix ci * Update mbtiles.js * follow sqlite3 URI filenames * add mode test * add mode test * fix ci * fix ci * Update readme on mode flags --- README.md | 8 +++++++- lib/mbtiles.js | 13 ++++++++++++- test/mode.test.js | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/mode.test.js diff --git a/README.md b/README.md index 9647c13..d9096f8 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,17 @@ var MBTiles = require('@mapbox/mbtiles'); All MBTiles instances need to be constructed before any of the methods become available. *NOTE: All methods described below assume you've taken this step.* ```javascript -new MBTiles('./path/to/file.mbtiles', function(err, mbtiles) { +new MBTiles('./path/to/file.mbtiles?mode={ro, rw, rwc}', function(err, mbtiles) { console.log(mbtiles) // mbtiles object with methods listed below }); ``` +The `mode` query parameter is a opening flag of mbtiles. It is optional, default as `rwc`. Available flags are: + +- `ro`: readonly mode, will throw error if the mbtiles is not existed. +- `rw`: read and write mode, will throw error if the mbtiles is not existed. +- `rwc`: read, write and create mode, will create a new mbtiles if the mbtiles is not existed. + ### Reading **`getTile(z, x, y, callback)`** diff --git a/lib/mbtiles.js b/lib/mbtiles.js index ebde7d9..27bc535 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -51,11 +51,22 @@ function MBTiles(uri, callback) { uri.query = uri.query || {}; if (!uri.query.batch) uri.query.batch = 100; + if (!uri.query.mode) uri.query.mode = 'rwc'; + var flagEnum = { + ro: sqlite3.OPEN_READONLY, + rw: sqlite3.OPEN_READWRITE, + rwc: sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE + }; + var mode = flagEnum[uri.query.mode]; + if (!mode) { + return callback(new Error('Only supports "ro", "rw", or "rwc" mode.')); + } + var mbtiles = this; this.setMaxListeners(0); this.filename = uri.pathname; this._batchSize = +uri.query.batch; - mbtiles._db = new sqlite3.Database(mbtiles.filename, function(err) { + mbtiles._db = new sqlite3.Database(mbtiles.filename, mode, function(err) { if (err) return callback(err); fs.stat(mbtiles.filename, function(err, stat) { if (err) return callback(err); diff --git a/test/mode.test.js b/test/mode.test.js new file mode 100644 index 0000000..ed77ced --- /dev/null +++ b/test/mode.test.js @@ -0,0 +1,32 @@ +require('sqlite3').verbose(); + +var fs = require('fs'); +var MBTiles = require('..'); +var tape = require('tape'); + +var non_existent = __dirname + '/fixtures/non_existent.mbtiles'; + +try { fs.unlinkSync(non_existent); } catch (err) {} + +tape('Open with ro mode', function(assert) { + new MBTiles(non_existent + '?mode=ro', function(err, mbtiles) { + assert.ok(err); + assert.ok(err.message.match(/SQLITE_CANTOPEN: unable to open database file/)); + assert.end(); + }) +}) + +tape('Open with rw mode', function(assert) { + new MBTiles(non_existent + '?mode=rw', function(err, mbtiles) { + assert.ok(err); + assert.ok(err.message.match(/SQLITE_CANTOPEN: unable to open database file/)); + assert.end(); + }) +}) + +tape('Open with rwc mode', function(assert) { + new MBTiles(non_existent + '?mode=rwc', function(err, mbtiles) { + assert.notOk(err); + assert.end(); + }) +})