@@ -6,17 +6,16 @@ const async = require('async'),
66 GeoPoint = require ( 'geopoint' ) ,
77 HttpStatus = require ( 'http-status-codes' ) ,
88 postgres = require ( './postgres' ) ,
9- escapeSql = postgres . escapeSql ,
109 ServiceError = common . utils . ServiceError ,
1110 turf = require ( 'turf' ) ;
1211
1312let featureDatabasePool ;
1413
15- function executeQuery ( query , callback ) {
14+ function executeQuery ( query , params , callback ) {
1615 featureDatabasePool . connect ( ( err , client , done ) => {
1716 if ( err ) return callback ( err ) ;
1817
19- client . query ( query , ( err , results ) => {
18+ client . query ( query , params , ( err , results ) => {
2019 done ( ) ;
2120
2221 if ( err )
@@ -29,8 +28,15 @@ function executeQuery(query, callback) {
2928
3029function getById ( query , callback ) {
3130 const ids = query . id . constructor === Array ? query . id : [ query . id ] ;
32- const getQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE id IN (${ ids . map ( escapeSql ) . join ( ',' ) } )` ;
33- executeQuery ( getQuery , ( err , rows ) => {
31+
32+ const getParams = [ ] ;
33+
34+ const getQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE id IN (${ ids . map ( id => {
35+ getParams . push ( id ) ;
36+ return `$${ getParams . length } ` ;
37+ } ) . join ( ',' ) } )`;
38+
39+ executeQuery ( getQuery , getParams , ( err , rows ) => {
3440 if ( err ) return callback ( err ) ;
3541 if ( ! rows || rows . length === 0 ) return callback ( null , null ) ;
3642
@@ -119,58 +125,72 @@ function buildQueryColumns(query) {
119125 return queryColumns ;
120126}
121127
122- function addQueryPredicates ( sql , query ) {
128+ function addQueryPredicates ( sql , query , params ) {
123129 if ( query . layer ) {
124- sql += ` AND layer = ${ escapeSql ( query . layer ) } ` ;
130+ params . push ( query . layer ) ;
131+ sql += ` AND layer = $${ params . length } ` ;
125132 }
126133
127134 if ( query . filter_name ) {
128- sql += ` AND strpos(lower(name), lower(${ escapeSql ( query . filter_name ) } )) > 0` ;
135+ params . push ( query . filter_name ) ;
136+ sql += ` AND strpos(lower(name), lower($${ params . length } )) > 0` ;
129137 }
130138
131139 if ( query . filter_namespace ) {
132- sql += ` AND lower(split_part(id, '-', 1)) = lower(${ escapeSql ( query . filter_namespace ) } )` ;
140+ params . push ( query . filter_namespace ) ;
141+ sql += ` AND lower(split_part(id, '-', 1)) = lower($${ params . length } )` ;
133142 }
134143
135144 if ( query . filter_layer ) {
136- sql += ` AND lower(layer) IN (${ query . filter_layer . split ( ',' ) . map ( layer => `lower(${ escapeSql ( layer ) } )` ) . join ( ',' ) } )` ;
145+ sql += ` AND lower(layer) IN (${ query . filter_layer . split ( ',' ) . map ( layer => {
146+ params . push ( layer ) ;
147+ return `lower($${ params . length } )`
148+ } ) . join ( ',' ) } )`;
137149 }
138150
139151 return sql ;
140152}
141153
142154function getByBoundingBox ( query , callback ) {
143155 let boundingBoxQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE ST_Intersects(hull, ST_MakeEnvelope(
144- ${ query . west } , ${ query . south } ,
145- ${ query . east } , ${ query . north } , 4326
156+ $1 , $2 ,
157+ $3 , $4 , 4326
146158 ))` ;
147159
148- boundingBoxQuery = addQueryPredicates ( boundingBoxQuery , query ) ;
160+ const boundingBoxParams = [ query . west , query . south , query . east , query . north ] ;
149161
150- return executeQuery ( boundingBoxQuery , callback ) ;
162+ boundingBoxQuery = addQueryPredicates ( boundingBoxQuery , query , boundingBoxParams ) ;
163+
164+ return executeQuery ( boundingBoxQuery , boundingBoxParams , callback ) ;
151165}
152166
153167function getByPoint ( query , callback ) {
154- let pointQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE ST_Contains(hull, ST_GeomFromText(
155- 'POINT( ${ query . longitude } ${ query . latitude } )' , 4326)
168+ let pointQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE ST_Contains(hull,
169+ ST_SetSRID(ST_MakePoint($1, $2) , 4326)
156170 )` ;
157171
158- pointQuery = addQueryPredicates ( pointQuery , query ) ;
172+ const pointParams = [ query . longitude , query . latitude ] ;
173+
174+ pointQuery = addQueryPredicates ( pointQuery , query , pointParams ) ;
159175
160- return executeQuery ( pointQuery , callback ) ;
176+ return executeQuery ( pointQuery , pointParams , callback ) ;
161177}
162178
163179function getByName ( query , callback ) {
164180 const names = query . name . constructor === Array ? query . name : [ query . name ] ;
165181
166- let namesDisjunction = `(${ names . map ( function ( name ) {
167- return `lower(name) = lower(${ escapeSql ( name ) } )` ;
182+ const nameParams = [ ] ;
183+
184+ const namesDisjunction = `(${ names . map ( name => {
185+ nameParams . push ( name ) ;
186+ return `lower(name) = lower($${ nameParams . length } )` ;
168187 } ) . join ( " OR " ) } )`;
188+
169189 let nameQuery = `SELECT ${ buildQueryColumns ( query ) } FROM features WHERE ${ namesDisjunction } ` ;
170190
171- nameQuery = addQueryPredicates ( nameQuery , query ) ;
191+ nameQuery = addQueryPredicates ( nameQuery , query , nameParams ) ;
172192
173- executeQuery ( nameQuery , callback ) ;
193+ executeQuery ( nameQuery , nameParams , callback ) ;
174194}
175195
176196function init ( callback ) {
@@ -228,29 +248,39 @@ function upsert(feature, callback) {
228248 feature . elevation = feature . elevation || 'null' ;
229249 feature . hierarchy = feature . hierarchy || '{}' ;
230250
231- let upsertQuery = `INSERT INTO features (
251+ const upsertQuery = `
252+ INSERT INTO features (
232253 id, name, layer, properties, hull, created_at, updated_at
233254 ) VALUES (
234- ${ escapeSql ( feature . id ) } ,
235- ${ escapeSql ( feature . name ) } ,
236- ${ escapeSql ( feature . layer ) } ,
237- ${ escapeSql ( JSON . stringify ( feature . properties ) ) } ,
255+ $1 ,
256+ $2 ,
257+ $3 ,
258+ $4 ,
238259
239- ST_SetSRID(ST_GeomFromGeoJSON(${ escapeSql ( JSON . stringify ( feature . hull ) ) } ), 4326),
260+ ST_SetSRID(ST_GeomFromGeoJSON($5 ), 4326),
240261
241262 current_timestamp,
242263 current_timestamp
243264 ) ON CONFLICT (id) DO UPDATE SET
244- name = ${ escapeSql ( feature . name ) } ,
245- layer = ${ escapeSql ( feature . layer ) } ,
246- properties = ${ escapeSql ( JSON . stringify ( feature . properties ) ) } ,
265+ name = $6 ,
266+ layer = $7 ,
267+ properties = $8 ,
247268
248- hull = ST_SetSRID(ST_GeomFromGeoJSON(${ escapeSql ( JSON . stringify ( feature . hull ) ) } ), 4326),
269+ hull = ST_SetSRID(ST_GeomFromGeoJSON($9 ), 4326),
249270
250271 updated_at = current_timestamp
251272 ;` ;
252273
253- executeQuery ( upsertQuery , callback ) ;
274+ const hullJson = JSON . stringify ( feature . hull ) ;
275+ const propertiesJson = JSON . stringify ( feature . properties ) ;
276+
277+ const upsertParams = [
278+ feature . id , feature . name , feature . layer , propertiesJson ,
279+ hullJson , feature . name , feature . layer , propertiesJson ,
280+ hullJson ,
281+ ] ;
282+
283+ executeQuery ( upsertQuery , upsertParams , callback ) ;
254284}
255285
256286module . exports = {
0 commit comments