Skip to content
This repository was archived by the owner on Sep 9, 2024. It is now read-only.

Commit 162a7d6

Browse files
authored
Merge pull request #36 from 2Toad/1.5.0
1.5.0
2 parents 7026444 + 4fe8fa8 commit 162a7d6

File tree

9 files changed

+1723
-408
lines changed

9 files changed

+1723
-408
lines changed

.eslintrc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@
8787
"lines-around-directive": "error",
8888
"max-depth": "error",
8989
"max-len": "off",
90-
"max-lines": "error",
9190
"max-nested-callbacks": "error",
9291
"max-params": "error",
9392
"max-statements": "error",
@@ -204,7 +203,6 @@
204203
"padded-blocks": "off",
205204
"prefer-arrow-callback": "off",
206205
"prefer-const": "error",
207-
"prefer-destructuring": "error",
208206
"prefer-numeric-literals": "error",
209207
"prefer-promise-reject-errors": "error",
210208
"prefer-reflect": "off",

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
language: node_js
22
node_js:
3+
- "8"
34
- "7"
45
- "6"
6+
cache: yarn
57
script: yarn lint

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ return teradata.write(sql)
9595
```
9696

9797
#### Read Prepared Statement
98+
99+
##### Anonymous Parameters
98100
```js
99101
var id = 7;
100102
var sql = 'SELECT * FROM MyDatabase.MyTable WHERE Id = ?';
@@ -107,7 +109,22 @@ return teradata.readPreparedStatement(sql, [
107109
});
108110
```
109111

112+
##### Named Parameters
113+
```js
114+
var id = 7;
115+
var sql = 'SELECT * FROM MyDatabase.MyTable WHERE Id = :id';
116+
117+
return teradata.readPreparedStatement(sql, [
118+
teradata.createPreparedStatementParam('id', 'Int', Number(id))
119+
])
120+
.then(function(response) {
121+
console.log(response);
122+
});
123+
```
124+
110125
#### Write Prepared Statement
126+
127+
##### Anonymous Parameters
111128
```js
112129
var id = 7;
113130
var username = 'Foo';
@@ -121,3 +138,23 @@ return teradata.writePreparedStatement(sql, [
121138
console.log(count);
122139
});
123140
```
141+
142+
##### Named Parameters
143+
144+
```js
145+
var id = 7;
146+
var username = 'Foo';
147+
var sql = 'UPDATE MyDatabase.MyTable SET Username = :username WHERE Id = :id';
148+
149+
return teradata.writePreparedStatement(sql, [
150+
teradata.createPreparedStatementParam('id', 'Int', Number(id)),
151+
teradata.createPreparedStatementParam('username', 'String', username)
152+
])
153+
.then(function(count) {
154+
console.log(count);
155+
});
156+
```
157+
158+
---
159+
160+
See the [docs](https://github.com/2Toad/node-teradata/tree/master/docs) for more information

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2017 2Toad, LLC
44
* https://github.com/2Toad/node-teradata
55
*
6-
* Version: 1.4.0
6+
* Version: 1.5.0
77
* License: MIT
88
*/
99

lib/logger.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2017 2Toad, LLC
44
* https://github.com/2Toad/node-teradata
55
*
6-
* Version: 1.4.0
6+
* Version: 1.5.0
77
* License: MIT
88
*/
99

lib/teradata.js

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2017 2Toad, LLC
44
* https://github.com/2Toad/node-teradata
55
*
6-
* Version: 1.4.0
6+
* Version: 1.5.0
77
* License: MIT
88
*/
99

@@ -17,6 +17,7 @@ function Teradata(config) {
1717
if (!config) throw new Error('Configuration required');
1818

1919
this.connections = [];
20+
this.namedParamsRegex = /:([^\W]+)/g;
2021
this.config = _.defaultsDeep(config, {
2122
driver: './jars/',
2223
minPoolSize: 1,
@@ -170,13 +171,15 @@ function createStatement(connection) {
170171
}
171172

172173
function createPreparedStatement(sql, params) {
174+
var parsed = parseNamedParameters.call(this, sql, params);
175+
173176
return open.call(this)
174177
.then(function(connection) {
175-
return connection.prepareStatementAsync(sql)
178+
return connection.prepareStatementAsync(parsed.sql)
176179
.then(function(preparedStatement) {
177180
Promise.promisifyAll(preparedStatement);
178181

179-
return Promise.all(params.map(function(param) {
182+
return Promise.all(parsed.params.map(function(param) {
180183
var setTypeAsync = 'set' + param.type + 'Async';
181184
if (!preparedStatement[setTypeAsync]) throw new Error('Invalid parameter type: ' + param.type);
182185

@@ -193,6 +196,49 @@ function createPreparedStatement(sql, params) {
193196
});
194197
}
195198

199+
function parseNamedParameters(sql, params) {
200+
var match;
201+
var matches = [];
202+
var parsed = {
203+
sql: sql,
204+
params: params
205+
};
206+
207+
while ((match = this.namedParamsRegex.exec(sql)) !== null) {
208+
matches.push(match[1]);
209+
}
210+
211+
if (!hasNamedParameters(params) && !matches.length) return parsed;
212+
213+
parsed.params = [];
214+
215+
_.each(matches, function(match, index) {
216+
var filtered = _.filter(params, {'index': match});
217+
if (filtered.length > 1) throw new Error('Duplicate named parameter: ' + match);
218+
219+
var param = filtered[0];
220+
if (!param) throw new Error('Missing named parameter: ' + match);
221+
222+
param.index = index + 1;
223+
parsed.params.push(param);
224+
225+
parsed.sql = parsed.sql.replace(':' + match, '?');
226+
});
227+
228+
return parsed;
229+
}
230+
231+
function hasNamedParameters(params) {
232+
var namedParams = _.filter(params, function(param) {
233+
return typeof param.index === 'string';
234+
});
235+
236+
if (!namedParams.length) return false;
237+
if (namedParams.length !== params.length) throw new Error('Mixed anonymous and named parameters');
238+
239+
return true;
240+
}
241+
196242
function open() {
197243
var connection;
198244

0 commit comments

Comments
 (0)