Skip to content

Commit cc4361a

Browse files
authored
Merge pull request #30 from featurist/websql
Websql
2 parents 59ed807 + 5202d2d commit cc4361a

File tree

7 files changed

+349
-119
lines changed

7 files changed

+349
-119
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ services:
99
- mysql
1010
before_script:
1111
- mysql -e 'create database sworm;'
12+
- export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start

index.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var pgDriver = require("./pgDriver");
55
var mysqlDriver = require("./mysqlDriver");
66
var oracleDriver = require("./oracleDriver");
77
var sqliteDriver = require("./sqliteDriver");
8+
var websqlDriver = require("./websqlDriver");
89
var debug = require("debug")("sworm");
910
var debugResults = require("debug")("sworm:results");
1011
var redactConfig = require('./redactConfig');
@@ -459,7 +460,8 @@ exports.db = function(config) {
459460
pg: pgDriver,
460461
mysql: mysqlDriver,
461462
oracle: oracleDriver,
462-
sqlite: sqliteDriver
463+
sqlite: sqliteDriver,
464+
websql: websqlDriver
463465
}[this.config.driver];
464466

465467
if (!driver) {
@@ -568,8 +570,10 @@ exports.escape = function(value) {
568570
}
569571

570572
function configFromUrl(url) {
573+
var isBrowser = typeof window !== 'undefined'
574+
571575
var parsedUrl = urlUtils.parse(url)
572-
var protocol = parsedUrl.protocol? parsedUrl.protocol.replace(/:$/, ''): 'sqlite'
576+
var protocol = parsedUrl.protocol? parsedUrl.protocol.replace(/:$/, ''): (isBrowser? 'websql': 'sqlite')
573577
var driver = {
574578
postgres: 'pg',
575579
file: 'sqlite'

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"devDependencies": {
1515
"chai": "3.5.0",
1616
"chai-as-promised": "5.3.0",
17+
"electron": "1.6.2",
18+
"electron-mocha": "3.3.0",
1719
"es6-promise": "3.2.1",
1820
"fs-promise": "0.5.0",
1921
"mocha": "3.2.0",
@@ -23,7 +25,7 @@
2325
"sqlite3": "3.1.8"
2426
},
2527
"scripts": {
26-
"test": "mocha"
28+
"test": "mocha && electron-mocha --renderer test/browser"
2729
},
2830
"repository": {
2931
"type": "git",

readme.md

+24-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ A very lightweight **write only** Node.js ORM, with support for:
77
* MySQL
88
* Oracle DB
99
* Sqlite 3
10+
* Browser Web SQL
1011

1112
## NPM
1213

@@ -20,6 +21,8 @@ Then install a database driver, one of:
2021
npm install oracledb
2122
npm install sqlite3
2223

24+
There's no need to install a driver for Web SQL, sworm will pick it up from the `window` object.
25+
2326
See [sworm](https://www.npmjs.org/package/sworm) in NPM.
2427

2528
## Write Only?
@@ -158,7 +161,7 @@ sworm.db(url)
158161

159162
* `url`, see urls for databases in respective section below
160163

161-
* `options.driver`, one of `'mssql'`, `'mysql'`, `'pg'`, `'oracle'` or `'sqlite'`.
164+
* `options.driver`, one of `'mssql'`, `'mysql'`, `'pg'`, `'oracle'`, `'sqlite'` or `'websql'`.
162165
* `options.config` see configuration for databases in respective section below
163166

164167
* `url` a connection URL, the following are supported
@@ -301,6 +304,25 @@ sworm.db(url)
301304
}
302305
```
303306

307+
* **websql**
308+
309+
URL: `websql:///db-name` or `db-name`
310+
311+
```js
312+
{
313+
driver: 'websql',
314+
config: {
315+
name: 'db-name',
316+
317+
// the `openDatabase` function to connect to the DB, defaulting to `window.openDatabase`
318+
openDatabase: window.openDatabase,
319+
320+
// dababase size, defaulting to 5M
321+
size: 5 * 1024 * 1024
322+
}
323+
}
324+
```
325+
304326
### Close
305327

306328
Close the connection after use:
@@ -326,6 +348,7 @@ There are various schemes you can use:
326348
* `sworm:pg` exact query passed to postgres
327349
* `sworm:oracle` exact query passed to oracle
328350
* `sworm:sqlite` exact query passed to sqlite3
351+
* `sworm:websql` exact query passed to websql
329352

330353
## Models
331354

test/browser/websqlSpec.js

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
var describeDatabase = require('../describeDatabase');
2+
var sworm = require('../..')
3+
var expect = require('chai').expect
4+
5+
var database = {
6+
createTables: function(db, tables) {
7+
function createTable(name, sql) {
8+
tables.push(name);
9+
return db.query(sql);
10+
}
11+
12+
return createTable("people",
13+
'create table if not exists people (id integer primary key, name varchar(50) NOT NULL, address_id integer NULL, photo blob null)'
14+
).then(function() {
15+
return createTable("people_addresses",
16+
'create table if not exists people_addresses(address_id integer NOT NULL, person_id integer NOT NULL, rating integer NULL)'
17+
);
18+
}).then(function() {
19+
return createTable("addresses",
20+
'create table if not exists addresses(id integer primary key, address varchar(50) NOT NULL)'
21+
);
22+
}).then(function() {
23+
return createTable("people_weird_id",
24+
'create table if not exists people_weird_id(weird_id integer primary key, name varchar(50) NULL, address_weird_id integer NULL)'
25+
);
26+
}).then(function() {
27+
return createTable("people_explicit_id",
28+
'create table if not exists people_explicit_id(id integer NOT NULL, name varchar(50) NOT NULL)'
29+
);
30+
});
31+
},
32+
33+
"true": 1,
34+
"false": 0,
35+
36+
clean: function(records) {
37+
return records;
38+
},
39+
40+
driverModuleName: "websql",
41+
42+
transactions: false,
43+
44+
noModule: true
45+
};
46+
47+
var config = {
48+
driver: "websql",
49+
config: {
50+
name: 'test'
51+
}
52+
};
53+
54+
describeDatabase("websql", config, database, function () {
55+
describe('connection', function () {
56+
it('can connect with string for DB name', function () {
57+
var db = sworm.db('test')
58+
return db.query('select * from people')
59+
})
60+
61+
it('can connect with URL', function () {
62+
var db = sworm.db('websql:///test')
63+
return db.query('select * from people')
64+
})
65+
66+
it('can connect with openDatabase function', function () {
67+
var called = false
68+
69+
var db = sworm.db({
70+
driver: 'websql',
71+
config: {
72+
openDatabase: function() {
73+
called = true
74+
return window.openDatabase.apply(window, arguments)
75+
},
76+
name: 'test'
77+
}
78+
})
79+
80+
return db.query('select * from people').then(function () {
81+
expect(called).to.be.true
82+
})
83+
})
84+
})
85+
})

0 commit comments

Comments
 (0)