All files / lib/adapters/Pg Pg.js

95% Statements 38/40
70% Branches 14/20
100% Functions 10/10
95% Lines 38/40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 1042x 2x 2x 2x 2x       2x 2x   2x 2x 2x 2x         2x     2x                   2x   2x 1x 1x 1x 1x   1x               1x 1x 1x     2x                   56x       56x 56x 115x     56x                       56x 56x 104x 104x     56x 56x 56x 56x                 2x  
const Adapter = require('../../Adapter');
const Result = require('../../Result');
const Helpers = require('../../Helpers');
const pg = require('pg');
const url = require('url');
 
class Pg extends Adapter {
	constructor (config) {
		let instance = null;
		let connectionString = Pg.formatConnectionString(config);
 
		Eif (connectionString !== '') {
			const conn = new pg.Client(connectionString);
			conn.connect(err => {
				Iif (err) {
					throw new Error(err);
				}
			});
 
			instance = Promise.resolve(conn);
		}
 
		super(instance);
	}
 
	/**
	 * Convert the connection object to a connection string
	 *
	 * @param {Object} config - the configuration object
	 * @return {String} - the connection string
	 */
	static formatConnectionString (config) {
		let connectionString = '';
 
		if (Helpers.isObject(config)) {
			const host = config.host || 'localhost';
			const user = config.user || 'postgres';
			const password = `:${config.password}` || '';
			const port = config.port || 5432;
 
			const conn = {
				protocol: 'postgres',
				slashes: true,
				host: `${host}:${port}`,
				auth: `${user}${password}`,
				pathname: config.database
			};
 
			connectionString = url.format(conn);
		} else Eif (Helpers.isString(config)) {
			connectionString = config;
		}
 
		return connectionString;
	}
 
	/**
	 * Transform the adapter's result into a standard format
	 *
	 * @param {*} result - original driver result object
	 * @return {Result} - standard result object
	 */
	transformResult (result) {
		Iif (result == null) {
			return new Result();
		}
 
		const cols = [];
		result.fields.forEach(field => {
			cols.push(field.name);
		});
 
		return new Result(result.rows, cols);
	}
 
	/**
	 * Run the sql query as a prepared statement
	 *
	 * @param {String} sql - The sql with placeholders
	 * @param {Array} params - The values to insert into the query
	 * @return {void|Promise} - Returns a promise if no callback is provided
	 */
	execute (sql, params) {
		// Replace question marks with numbered placeholders, because this adapter is different...
		let count = 0;
		sql = sql.replace(/\?/g, () => {
			count++;
			return `$${count}`;
		});
 
		return this.instance.then(conn => {
			return new Promise((resolve, reject) => {
				conn.query(sql, params, (err, result) =>
					(err)
						? reject(err)
						: resolve(this.transformResult(result))
				);
			});
		});
	}
}
 
module.exports = Pg;