1- /*! *******************************************************
2- *
1+ /*!
32 * evolutility-server-node :: utils/query.js
43 *
54 * https://github.com/evoluteur/evolutility-server-node
65 * (c) 2019 Olivier Giulieri
7- ********************************************************* * /
6+ */
87
9- const pg = require ( 'pg' ) ,
8+ const pgp = require ( 'pg-promise' ) ( ) ,
109 csv = require ( 'csv-express' ) ,
1110 config = require ( '../../config.js' ) ,
1211 parseConnection = require ( 'pg-connection-string' ) . parse ,
@@ -17,71 +16,71 @@ const dbConfig = parseConnection(config.connectionString)
1716dbConfig . max = 10 ; // max number of clients in the pool
1817dbConfig . idleTimeoutMillis = 30000 ; // max client idle time before being closed
1918
20- const pool = new pg . Pool ( dbConfig ) ;
21-
22- pool . on ( 'error' , function ( err , client ) {
23- console . error ( 'Unexpected error on idle client' , err . message , err . stack )
24- process . exit ( - 1 )
25- } )
19+ const db = { }
20+ db . conn = pgp ( config . connectionString ) ;
2621
2722// - run a query and return the result in request
28- function runQuery ( res , sql , values , singleRecord , format , header , fnPrep = null ) {
23+ function runQuery ( res , sql , values , singleRecord , format , header , fnPrep ) {
2924 logger . logSQL ( sql ) ;
30-
31- // Get a Postgres client from the connection pool
32- pool . connect ( ( err , client , done ) => {
33- // SQL Query > Select Data
34- if ( ! client ) {
35- errors . badRequest ( res , 'No Database connection.' , 500 )
36- }
37- client . query ( sql , values )
38- . then ( data => {
39- done ( ) ;
40- var results = ( data && data . rows ) ? data . rows : [ ] ;
41- var nbRecords = results . length ;
42- if ( format === 'csv' ) {
43- if ( nbRecords ) {
44- if ( header ) {
45- var headers = { } ;
46- for ( key in results [ 0 ] ) {
47- headers [ key ] = header [ key ] || key ;
48- }
49- results . unshift ( headers ) ;
25+ // SQL Query > Select Data
26+ db . conn [ singleRecord ? 'one' : 'many' ] ( sql , values )
27+ . then ( data => {
28+ const results = data || [ ] ;
29+ const nbRecords = results ? results . length : 0 ;
30+ if ( format === 'csv' ) {
31+ if ( nbRecords ) {
32+ if ( header ) {
33+ var headers = { } ;
34+ for ( key in results [ 0 ] ) {
35+ headers [ key ] = header [ key ] || key ;
5036 }
51- logger . logCount ( results . length || 0 ) ;
52- return res . csv ( results ) ;
37+ results . unshift ( headers ) ;
5338 }
54- return null ;
39+ logger . logCount ( results . length || 0 ) ;
40+ return res . csv ( results ) ;
41+ }
42+ return res . csv ( null ) ;
43+ } else if ( singleRecord ) {
44+ logger . logCount ( 1 ) ;
45+ if ( fnPrep ) {
46+ return res . json ( fnPrep ( results ) ) ;
47+ }
48+ return res . json ( results ) ;
49+ } else {
50+ res . setHeader ( '_count' , nbRecords ) ;
51+ if ( nbRecords && results [ 0 ] . _full_count ) {
52+ res . setHeader ( '_full_count' , results [ 0 ] . _full_count ) ;
53+ // Remove artificual "_full_count" prop (used to return the total number of records) from every record.
54+ // results.forEach(r => {delete r._full_count})
55+ }
56+ logger . logCount ( results . length || 0 ) ;
57+ if ( fnPrep ) {
58+ return res . json ( fnPrep ( results ) ) ;
59+ }
60+ return res . json ( results ) ;
61+ }
62+ } )
63+ . catch ( err => {
64+ if ( err . code === 0 ) {
65+ if ( format === 'csv' ) {
66+ // - sending something to avoid empty page in browser
67+ return res . csv ( singleRecord ? { id : null } : [ { id : null } ] ) ;
5568 } else if ( singleRecord ) {
56- if ( fnPrep ) {
57- logger . logCount ( 1 , true ) ;
58- return res . json ( fnPrep ( results [ 0 ] ) ) ;
59- } else {
60- logger . logCount ( 1 ) ;
61- return res . json ( results . length ?results [ 0 ] :null ) ;
62- }
69+ return res . json ( null ) ;
6370 } else {
64- res . setHeader ( '_count' , nbRecords ) ;
65- if ( nbRecords && results [ 0 ] . _full_count ) {
66- res . setHeader ( '_full_count' , results [ 0 ] . _full_count ) ;
67- // Remove artificual "_full_count" prop (used to return the total number of records) from every record.
68- // results.forEach(r => {delete r._full_count})
69- }
70- logger . logCount ( results . length || 0 ) ;
71- return res . json ( results ) ;
71+ return res . json ( [ ] ) ;
7272 }
73- } )
74- . catch ( err => {
75- console . log ( err . stack )
76- errors . badRequest ( res , 'Database error.' , 500 )
77- } )
78- } )
73+ }
74+ console . log ( err )
75+ errors . badRequest ( res , 'Database error.' , 500 )
76+ } )
7977}
8078
8179// --------------------------------------------------------------------------------------
8280
8381module . exports = {
8482
83+ db : db ,
8584 runQuery : runQuery ,
8685
8786}
0 commit comments