Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [2.2.0] - 2018-04-02
### Added
- Query class for interfacing with custom queries (like statements, but only for
onetime use).
- Statement class with same API as query class.

### Deprecated
- SqlQuery class, renamed to BuildQuery

## [2.1.0] - 2018-03-16
### Added
- Collate option in schema for columns
Expand Down
6 changes: 5 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {SqlQuery, buildQuery} from './sqlquery';
import {SqlReadStream} from './sqlreadstream';
import {DataType, Table} from './table';
import {MapTable} from './maptable';
import {query} from './query';
import {statement} from './statement';

module.exports = {
DataType,
Expand All @@ -11,5 +13,7 @@ module.exports = {
SqlQuery,
Table,
MapTable,
buildQuery
buildQuery,
query,
statement
};
40 changes: 40 additions & 0 deletions lib/query.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import _ from 'lodash';

import {SqlReadStream} from './sqlreadstream';

class Query {
constructor(db, sql, params) {
this.db = db;
this.sql = sql;
this.params = params;
}

all(params) {
return this.db.all(this.sql, params || this.params);
}

get(params) {
return this.db.get(this.sql, params || this.params);
}

each(params, callback) {
if (_.isFunction(params)) {
callback = params;
params = undefined;
}

return this.db.each(this.sql, params || this.params, callback);
}

prepare(params) {
return this.db.prepare(this.sql, params || this.params);
}

stream(params) {
return new SqlReadStream(this.db.prepare(this.sql, params || this.params));
}
}

export function query(db, sql, params) {
return new Query(db, sql, params);
}
24 changes: 15 additions & 9 deletions lib/sqlquery.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import _ from 'lodash';
import assert from 'assert';

import {SqlReadStream} from './sqlreadstream';
import {query} from './query';

class SqlStatementParameters {
constructor() {
Expand Down Expand Up @@ -38,7 +39,7 @@ class SqlStatementParameters {
}


export class SqlQuery {
class BuildQuery {
constructor(db) {
this.db = db;
this.selectColumnList = null;
Expand Down Expand Up @@ -333,23 +334,23 @@ export class SqlQuery {
}

all() {
const query = this._buildSelectQuery();
return this.db.all(query.sql, query.params);
const rawQuery = this._buildSelectQuery();
return query(this.db, rawQuery.sql, rawQuery.params).all();
}

get() {
const query = this._buildSelectQuery();
return this.db.get(query.sql, query.params);
const rawQuery = this._buildSelectQuery();
return query(this.db, rawQuery.sql, rawQuery.params).get();
}

each(callback) {
const query = this._buildSelectQuery();
return this.db.each(query.sql, query.params, callback);
const rawQuery = this._buildSelectQuery();
return query(this.db, rawQuery.sql, rawQuery.params).each(callback);
}

prepareSelect() {
const query = this._buildSelectQuery();
return this.db.prepare(query.sql, query.params);
const rawQuery = this._buildSelectQuery();
return query(this.db, rawQuery.sql, rawQuery.params).prepare();
}

stream() {
Expand Down Expand Up @@ -430,6 +431,11 @@ export class SqlQuery {
}
}

/**
* @deprecated Use #buildQuery function instead
*/
export const SqlQuery = BuildQuery;

export function buildQuery(db) {
return new SqlQuery(db);
}
21 changes: 1 addition & 20 deletions lib/sqlreadstream.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,7 @@ import Promise from 'bluebird';
import _ from 'lodash';
import assert from 'assert';

// Like promisifyAll, but with specific list of functions (sqlite3 functions
// are not iterable for the native classes).
function promisifyFunctions(klass, promiseFunctions) {
for (let i = 0; i < promiseFunctions.length; i++) {
let fnc = promiseFunctions[i];
let asyncFnc = `${fnc}Async`;

if (klass.prototype[fnc] && !klass.prototype[asyncFnc]) {
klass.prototype[asyncFnc] = function (...params) {
return Promise.fromCallback(klass.prototype[fnc].bind(this, ...params));
};
}
}
}

export function promisifyStatement() {
promisifyFunctions(sqlite3.Statement, [
'all', 'bind', 'get', 'getMultiple'
]);
}
import {promisifyStatement} from './statement';

promisifyStatement();

Expand Down
60 changes: 60 additions & 0 deletions lib/statement.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import sqlite3 from 'sqlite3';
import Promise from 'bluebird';
import _ from 'lodash';

import {SqlReadStream} from './sqlreadstream';

// Like promisifyAll, but with specific list of functions (sqlite3 functions
// are not iterable for the native classes).
function promisifyFunctions(klass, promiseFunctions) {
for (let i = 0; i < promiseFunctions.length; i++) {
let fnc = promiseFunctions[i];
let asyncFnc = `${fnc}Async`;

if (klass.prototype[fnc] && !klass.prototype[asyncFnc]) {
klass.prototype[asyncFnc] = function (...params) {
return Promise.fromCallback(klass.prototype[fnc].bind(this, ...params));
};
}
}
}

export function promisifyStatement() {
promisifyFunctions(sqlite3.Statement, [
'all', 'bind', 'get', 'getMultiple'
]);
}

promisifyStatement();

export class Statement {
constructor(db, statement) {
this.statement = statement;
}

all(...params) {
return this.statement.allAsync(...params);
}

/**
* It is important that we don't send any param values, even undefined, if not
* used, as this would restart the statement.
*/
get(...params) {
return this.statement.getAsync(...params);
}

each(...params) {
return this.statement.eachAsync(...params);
}

stream() {
return new SqlReadStream(this.statement);
}
}

export function statement(db, sql, params) {
return db.prepare(sql, params).then(statement => {
return new Statement(db, statement);
});
}
40 changes: 20 additions & 20 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "sqlutil",
"version": "2.1.0",
"version": "2.2.0",
"description": "Wrapper around sqlite for structured queries",
"homepage": "https://github.com/erikman/sqlutil",
"main": "dist/index.js",
Expand All @@ -11,7 +11,7 @@
"build": "babel --compact true --minified --source-maps false -d dist/ lib",
"build:debug": "babel -d dist/ lib",
"lint": "eslint lib test",
"test": "mocha --compilers js:babel-core/register test",
"test": "mocha --require babel-polyfill --compilers js:babel-core/register test",
"prepare": "npm run build"
},
"keywords": [
Expand All @@ -27,11 +27,13 @@
"license": "MIT",
"repository": "erikman/sqlutil",
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-eslint": "^7.1.1",
"babel-preset-env": "^1.6.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.26.0",
"chai": "^3.5.0",
"chai-as-promised": "^6.0.0",
"eslint": "^3.15.0",
Expand Down
Loading