import * as pgLib from "pg"; export namespace pg { export type Client = pgLib.Client; /** * Connect to a PostgreSQL database. You should call `closePg` when you are done. * * @param connection A PostgreSQL connection string, such as: * "postgres://myuser:mypassword@localhost:5432/dbname" */ export function connectPg(connection: string): Promise { // TODO Remove cast when this PR is merged: const client = new pgLib.Client(connection); return new Promise((resolve, reject) => { client.connect(err => { if ((err)) { reject(err); return; } resolve(client); }); }); } export function closePg(conn: Client): Promise { return new Promise((resolve, reject) => { conn.end(err => { if ((err)) { reject(err); return; } resolve(); }); }); } /** * * @param connection See `connectPg` * @param action */ export async function withPg(connection: string, action: (conn: Client) => Promise): Promise { const conn = await connectPg(connection); let result: A; try { result = await action(conn); } finally { closePg(conn); } return result; } export function query_(conn: Client, queryText: string): Promise { return new Promise((resolve, reject) => { conn.query(queryText, (err: Error): void => { if ((err)) { reject(err); return; } resolve(); }); }); } export function query(conn: Client, queryText: string, values: any[]): Promise { return new Promise((resolve, reject) => { const q = { text: queryText, values: values, rowMode: "array" }; conn.query(q, (err: Error, result: pgLib.QueryResult): void => { if ((err)) { reject(err); return; } resolve(result); }); }); } }