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
172173function 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+
196242function open ( ) {
197243 var connection ;
198244
0 commit comments