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:
jingsam
2018-03-27 23:23:48 +08:00
committed by Sam Matthews
parent 6febf74d62
commit 9e9a1ebbb9
3 changed files with 51 additions and 2 deletions

View File

@@ -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)`**

View File

@@ -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
View 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();
})
})