ci-node-query
Advanced tools
Comparing version 3.1.0 to 3.2.0
@@ -5,3 +5,3 @@ 'use strict'; | ||
getArgs = require('getargs'), | ||
Promise = require('bluebird'); | ||
promisify = require('../promisify'); | ||
@@ -19,6 +19,5 @@ module.exports = class dblite extends Adapter { | ||
let args = getArgs('sql:string, [params]:array, [callback]:function', arguments); | ||
let instance = Promise.promisifyAll(this.instance); | ||
if (! args.callback) { | ||
return instance.queryAsync(args.sql, args.params); | ||
return promisify(this.instance.query)(args.sql, args.params); | ||
} | ||
@@ -25,0 +24,0 @@ |
@@ -5,3 +5,3 @@ 'use strict'; | ||
getArgs = require('getargs'), | ||
Promise = require('bluebird'); | ||
promisify = require('../promisify'); | ||
@@ -18,7 +18,6 @@ module.exports = class mysql extends Adapter { | ||
execute(sql, params, callback) { | ||
let args = getArgs('sql:string, [params], [callback]:function', arguments); | ||
let instance = Promise.promisifyAll(this.instance); | ||
let args = getArgs('sql:string, [params]:array, [callback]:function', arguments); | ||
if (! args.callback) { | ||
return instance.queryAsync(args.sql, args.params); | ||
return promisify(this.instance.query)(args.sql, args.params); | ||
} | ||
@@ -25,0 +24,0 @@ |
@@ -5,3 +5,3 @@ 'use strict'; | ||
getArgs = require('getargs'), | ||
Promise = require('bluebird'); | ||
promisify = require('../promisify'); | ||
@@ -18,7 +18,6 @@ module.exports = class mysql2 extends Adapter { | ||
execute(/*sql, params, callback*/) { | ||
let args = getArgs('sql:string, [params], [callback]:function', arguments); | ||
let instance = Promise.promisifyAll(this.instance); | ||
let args = getArgs('sql:string, [params]:array, [callback]:function', arguments); | ||
if (! args.callback) { | ||
return instance.executeAsync(args.sql, args.params); | ||
return promisify(this.instance.execute)(args.sql, args.params); | ||
} | ||
@@ -25,0 +24,0 @@ |
'use strict'; | ||
let Adapter = require('../Adapter'), | ||
getArgs = require('getargs'), | ||
Promise = require('bluebird'); | ||
getArgs = require('getargs'); | ||
@@ -18,6 +17,16 @@ module.exports = class nodefirebird extends Adapter { | ||
let args = getArgs('sql:string, [params], [callback]:function', arguments); | ||
let instance = Promise.promisifyAll(this.instance); | ||
if (! args.callback) { | ||
return instance.queryAsync(args.sql, args.params); | ||
//return instance.queryAsync(args.sql, args.params); | ||
if (! args.callback) { | ||
return new Promise((resolve, reject) => { | ||
this.instance.query(args.sql, args.params, (err, result) => { | ||
if (err) { | ||
return reject(err); | ||
} | ||
return resolve(result); | ||
}); | ||
}); | ||
} | ||
} | ||
@@ -24,0 +33,0 @@ |
'use strict'; | ||
let Adapter = require('../Adapter'), | ||
getArgs = require('getargs'), | ||
Promise = require('bluebird'); | ||
getArgs = require('getargs'); | ||
@@ -18,3 +17,2 @@ module.exports = class pg extends Adapter { | ||
let args = getArgs('sql:string, [params]:array, [callback]:function', arguments); | ||
let instance = Promise.promisifyAll(this.instance); | ||
@@ -29,3 +27,11 @@ // Replace question marks with numbered placeholders, because this adapter is different... | ||
if (! args.callback) { | ||
return instance.queryAsync(args.sql, args.params); | ||
return new Promise((resolve, reject) => { | ||
this.instance.query(args.sql, args.params, (err, result) => { | ||
if (err) { | ||
return reject(err); | ||
} | ||
return resolve(result); | ||
}); | ||
}); | ||
} | ||
@@ -32,0 +38,0 @@ |
@@ -10,3 +10,3 @@ 'use strict'; | ||
*/ | ||
module.exports = (function() { | ||
module.exports = (() => { | ||
delete require.cache[require.resolve('../Driver')]; | ||
@@ -25,3 +25,3 @@ let driver = require('../Driver'); | ||
*/ | ||
driver.limit = function(origSql, limit, offset) { | ||
driver.limit = (origSql, limit, offset) => { | ||
let sql = `FIRST ${limit}`; | ||
@@ -43,3 +43,3 @@ | ||
*/ | ||
driver.insertBatch = function() { | ||
driver.insertBatch = () => { | ||
throw new Error('Not Implemented'); | ||
@@ -49,2 +49,2 @@ }; | ||
return driver; | ||
}()); | ||
})(); |
@@ -8,3 +8,3 @@ 'use strict'; | ||
*/ | ||
module.exports = (function() { | ||
module.exports = (() => { | ||
delete require.cache[require.resolve('../Driver')]; | ||
@@ -25,3 +25,3 @@ let driver = require('../Driver'), | ||
*/ | ||
driver.limit = function(sql, limit, offset) { | ||
driver.limit = (sql, limit, offset) => { | ||
if (! helpers.isNumber(offset)) { | ||
@@ -36,2 +36,2 @@ return sql += ` LIMIT ${limit}`; | ||
}()); | ||
})(); |
@@ -8,3 +8,3 @@ 'use strict'; | ||
*/ | ||
module.exports = (function() { | ||
module.exports = (() => { | ||
delete require.cache[require.resolve('../Driver')]; | ||
@@ -14,2 +14,2 @@ let driver = require('../Driver'); | ||
return driver; | ||
}()); | ||
})(); |
@@ -8,3 +8,3 @@ 'use strict'; | ||
*/ | ||
module.exports = (function() { | ||
module.exports = (() => { | ||
delete require.cache[require.resolve('../Driver')]; | ||
@@ -24,3 +24,3 @@ let driver = require('../Driver'); | ||
*/ | ||
driver.insertBatch = function(table, data) { | ||
driver.insertBatch = (table, data) => { | ||
@@ -68,2 +68,2 @@ // Get the data values to insert, so they can | ||
return driver; | ||
}()); | ||
})(); |
@@ -136,3 +136,3 @@ 'use strict'; | ||
*/ | ||
helpers[`is${t}`] = function(o) { | ||
helpers[`is${t}`] = function (o) { | ||
if (t.toLowerCase() === 'infinite') { | ||
@@ -139,0 +139,0 @@ t = 'infinity'; |
'use strict'; | ||
let getArgs = require('getargs'), | ||
helpers = require('./helpers'), | ||
State = require('./State'), | ||
QueryParser = require('./QueryParser'); | ||
const getArgs = require('getargs'); | ||
const helpers = require('./helpers'); | ||
const State = require('./State'); | ||
const QueryParser = require('./QueryParser'); | ||
/** | ||
* Main object that builds SQL queries. | ||
* | ||
* @param {Driver} Driver - The syntax driver for the database | ||
* @param {Adapter} Adapter - The database module adapter for running queries | ||
*/ | ||
class QueryBuilder { | ||
class QueryBuilderBase { | ||
/** | ||
@@ -272,5 +266,5 @@ * @private | ||
if (callback) { | ||
return this.adapter.execute(sql, vals, callback); | ||
return this.query(sql, vals, callback); | ||
} else { | ||
return this.adapter.execute(sql, vals); | ||
return this.query(sql, vals); | ||
} | ||
@@ -294,3 +288,21 @@ } | ||
} | ||
} | ||
/** | ||
* Main object that builds SQL queries. | ||
* | ||
* @param {Driver} Driver - The syntax driver for the database | ||
* @param {Adapter} Adapter - The database module adapter for running queries | ||
*/ | ||
class QueryBuilder extends QueryBuilderBase { | ||
/** | ||
* @private | ||
* @constructor | ||
* @param {Driver} Driver - The syntax driver for the database | ||
* @param {Adapter} Adapter - The database module adapter for running queries | ||
*/ | ||
constructor(Driver, Adapter) { | ||
super(Driver, Adapter); | ||
} | ||
// ---------------------------------------------------------------------------- | ||
@@ -301,2 +313,14 @@ // ! Miscellaneous Methods | ||
/** | ||
* Manually make an sql query | ||
* | ||
* @param {string} sql - The sql to execute | ||
* @param {array} [params] - The query parameters | ||
* @param {function} [callback] - Optional callback | ||
* @return {void|Promise} - Returns a promise if no callback is supplied | ||
*/ | ||
query(/*sql:string, [params]:array, [callback]:function*/) { | ||
return this.adapter.execute.apply(this.adapter, arguments); | ||
} | ||
/** | ||
* Reset the object state for a new query | ||
@@ -303,0 +327,0 @@ * |
'use strict'; | ||
let helpers = require('./helpers'); | ||
const XRegExp = require('xregexp'); | ||
const helpers = require('./helpers'); | ||
@@ -23,3 +24,3 @@ // -------------------------------------------------------------------------- | ||
let matchPatterns = { | ||
const matchPatterns = { | ||
function: /([a-z0-9_]+\((.*)\))/i, | ||
@@ -32,17 +33,17 @@ operator: /\!=?|\=|\+|&&?|~|\|\|?|\^|\/|<>|>=?|<=?|\-|%|OR|AND|NOT|XOR/ig, | ||
// Making sure that literals and functions aren't matched | ||
matchPatterns.identifier = new RegExp( | ||
'(' | ||
+ '(?!' | ||
+ matchPatterns['function'].source + '|' | ||
+ matchPatterns.literal.source | ||
+ ')' | ||
+ '([a-z_\-]+[0-9]*\\.?)' | ||
+ ')+', 'ig'); | ||
matchPatterns.identifier = XRegExp( | ||
`( | ||
(?! | ||
${matchPatterns['function'].source}| | ||
${matchPatterns.literal.source} | ||
) | ||
([a-z_\-]+[0-9]*\\.?) | ||
)+`, 'igx'); | ||
// Full pattern for determining ordering of the pieces | ||
matchPatterns.joinCombined = new RegExp( | ||
matchPatterns['function'].source + '+|' | ||
+ matchPatterns.literal.source + '+|' | ||
+ matchPatterns.identifier.source | ||
+ '|(' + matchPatterns.operator.source + ')+', 'ig'); | ||
matchPatterns.joinCombined = XRegExp( | ||
`${matchPatterns['function'].source}+| # functions | ||
${matchPatterns.literal.source}+| # literal values | ||
${matchPatterns.identifier.source} # identifiers | ||
|(${matchPatterns.operator.source})+`, 'igx'); | ||
@@ -49,0 +50,0 @@ this.matchPatterns = matchPatterns; |
{ | ||
"name": "ci-node-query", | ||
"version": "3.1.0", | ||
"version": "3.2.0", | ||
"description": "A query builder for node based on the one in CodeIgniter", | ||
@@ -20,3 +20,3 @@ "author": "Timothy J Warren <tim@timshomepage.net>", | ||
"type": "git", | ||
"url": "https://github.com/timw4mail/node-query.git" | ||
"url": "https://git.timshomepage.net/timw4mail/node-query.git" | ||
}, | ||
@@ -36,7 +36,6 @@ "keywords": [ | ||
"bugs": { | ||
"url": "https://github.com/timw4mail/node-query/issues" | ||
"url": "https://git.timshomepage.net/timw4mail/node-query/issues" | ||
}, | ||
"main": "lib/NodeQuery.js", | ||
"dependencies": { | ||
"bluebird": "^3.1.4", | ||
"dblite": "~0.7.6", | ||
@@ -48,3 +47,4 @@ "getargs": "~0.0.8", | ||
"pg": "~4.4.3", | ||
"require-reload": "~0.2.2" | ||
"require-reload": "~0.2.2", | ||
"xregexp": "^3.0.0" | ||
}, | ||
@@ -72,2 +72,2 @@ "devDependencies": { | ||
} | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
#CI-Node-query | ||
# CI-Node-query | ||
@@ -10,2 +10,5 @@ A node query builder for various SQL databases, based on [CodeIgniter](http://www.codeigniter.com/user_guide/database/query_builder.html)'s query builder. | ||
### Features | ||
* Callback and Promise API for making database calls. | ||
### Supported adapters | ||
@@ -26,43 +29,44 @@ | ||
### Basic use | ||
```javascript | ||
var nodeQuery = require('ci-node-query'); | ||
var nodeQuery = require('ci-node-query'); | ||
var connection = ... // Database module connection | ||
var connection = ... // Database module connection | ||
// Three arguments: database type, database connection, database connection library | ||
var query = nodeQuery.init('mysql', connection, 'mysql2'); | ||
// Three arguments: database type, database connection, database connection library | ||
var query = nodeQuery.init('mysql', connection, 'mysql2'); | ||
// The third argument is optional if the database connection library has the same name as the adapter, eg.. | ||
nodeQuery.init('mysql', connection, 'mysql'); | ||
// Can be instead | ||
nodeQuery.init('mysql', connection); | ||
// The third argument is optional if the database connection library has the same name as the adapter, eg.. | ||
nodeQuery.init('mysql', connection, 'mysql'); | ||
// Can be instead | ||
nodeQuery.init('mysql', connection); | ||
// You can also retrieve the instance later | ||
query = nodeQuery.getQuery(); | ||
// You can also retrieve the instance later | ||
query = nodeQuery.getQuery(); | ||
query.select('foo') | ||
.from('bar') | ||
.where('x', 3) | ||
.orWhere({y: 2}) | ||
.join('baz', 'baz.boo = bar.foo', 'left') | ||
.orderBy('x', 'DESC') | ||
.limit(2, 3) | ||
.get(function(/* Adapter dependent arguments */) { | ||
// Database module result handling | ||
}); | ||
query.select('foo') | ||
.from('bar') | ||
.where('x', 3) | ||
.orWhere({y: 2}) | ||
.join('baz', 'baz.boo = bar.foo', 'left') | ||
.orderBy('x', 'DESC') | ||
.limit(2, 3) | ||
.get(function(/* Adapter dependent arguments */) { | ||
// Database module result handling | ||
}); | ||
// As of version 3.1.0, you can also get promises | ||
var queryPromise = query.select('foo') | ||
.from('bar') | ||
.where('x', 3) | ||
.orWhere({y: 2}) | ||
.join('baz', 'baz.boo = bar.foo', 'left') | ||
.orderBy('x', 'DESC') | ||
.limit(2, 3) | ||
.get(); | ||
// As of version 3.1.0, you can also get promises | ||
var queryPromise = query.select('foo') | ||
.from('bar') | ||
.where('x', 3) | ||
.orWhere({y: 2}) | ||
.join('baz', 'baz.boo = bar.foo', 'left') | ||
.orderBy('x', 'DESC') | ||
.limit(2, 3) | ||
.get(); | ||
queryPromise.then(function(res) { | ||
// Handle query results | ||
}); | ||
``` | ||
queryPromise.then(function(res) { | ||
// Handle query results | ||
}); | ||
### Security notes | ||
@@ -76,5 +80,4 @@ As of version 2, `where` and `having` type methods parse the values passed to look for function calls. While values passed are still passed as query parameters, take care to avoid passing these kinds of methods unfiltered input. SQL function arguments are not currently parsed, so they need to be properly escaped for the current database. | ||
* The API is documented in [API.md](./API.md) | ||
* `tests/query-builder-base.js` contains a lot of usage examples | ||
* The `tests/adapters` folder contains examples of how to set up a connection for the appropriate database library | ||
* The documentation generated for the latest dev build is also [Available](https://github.timshomepage.net/node-query/docs/) | ||
57891
21
1665
81
+ Addedxregexp@^3.0.0
+ Addedxregexp@3.2.0(transitive)
- Removedbluebird@^3.1.4
- Removedbluebird@3.7.2(transitive)