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
This commit is contained in:
@@ -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)`**
|
||||
|
||||
@@ -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);
|
||||
|
||||
32
test/mode.test.js
Normal file
32
test/mode.test.js
Normal file
@@ -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();
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user