diff --git a/pg-pool/pg-pool-tests.ts b/pg-pool/pg-pool-tests.ts new file mode 100644 index 0000000000..96de93d667 --- /dev/null +++ b/pg-pool/pg-pool-tests.ts @@ -0,0 +1,42 @@ +/// +import {Pool} from "pg-pool"; + +let pool = new Pool() + +//you can pass properties to the pool +//these properties are passed unchanged to both the node-postgres Client constructor +//and the node-pool (https://github.com/coopernurse/node-pool) constructor +//allowing you to fully configure the behavior of both +let pool2 = new Pool({ + database: 'postgres', + user: 'brianc', + password: 'secret!', + port: 5432, + ssl: true, + max: 20, //set pool max size to 20 + min: 4, //set min pool size to 4 + idleTimeoutMillis: 1000 //close idle clients after 1 second +}) + +pool.connect().then(client => { + client.query('select $1::text as name', ['pg-pool']).then(res => { + client.release() + console.log('hello from', res.rows[0].name) + }) + .catch(e => { + client.release() + console.error('query error', e.message, e.stack) + }) +}) + +async function helperTest() { + const time = await pool.query('SELECT NOW()'); + const name = await pool.query('select $1::text as name', ['brianc']); + console.log(name.rows[0].name, 'says hello at', time.rows[0].name); +} + +pool.query('SELECT $1::text as name', ['brianc'], function (err, res) { + console.log(res.rows[0].name) // brianc +}) + +pool.end(); \ No newline at end of file diff --git a/pg-pool/pg-pool.d.ts b/pg-pool/pg-pool.d.ts new file mode 100644 index 0000000000..d25f5a9bb6 --- /dev/null +++ b/pg-pool/pg-pool.d.ts @@ -0,0 +1,10 @@ +// Type definitions for pg-pool +// Project: https://github.com/brianc/node-pg-pool +// Definitions by: Leo Liang +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +declare module "pg-pool" { + export {Pool, PoolConfig} from "pg"; +} diff --git a/pg/pg-tests.ts b/pg/pg-tests.ts index 559c6183fc..6c919bd132 100644 --- a/pg/pg-tests.ts +++ b/pg/pg-tests.ts @@ -42,3 +42,33 @@ client.connect((err) => { }); return null; }); + +// client pooling + +var config = { + user: 'foo', //env var: PGUSER + database: 'my_db', //env var: PGDATABASE + password: 'secret', //env var: PGPASSWORD + port: 5432, //env var: PGPORT + max: 10, // max number of clients in the pool + idleTimeoutMillis: 30000, // how long a client is allowed to remain idle before being closed +}; +var pool = new pg.Pool(config); + +pool.connect(function(err, client, done) { + if(err) { + return console.error('error fetching client from pool', err); + } + client.query('SELECT $1::int AS number', ['1'], function(err, result) { + done(); + + if(err) { + return console.error('error running query', err); + } + console.log(result.rows[0].number); + }); +}); + +pool.on('error', function (err, client) { + console.error('idle client error', err.message, err.stack) +}) \ No newline at end of file diff --git a/pg/pg.d.ts b/pg/pg.d.ts index 592d782610..bd15066beb 100644 --- a/pg/pg.d.ts +++ b/pg/pg.d.ts @@ -1,4 +1,4 @@ -// Type definitions for pg +// Type definitions for pg 6.1.0 // Project: https://github.com/brianc/node-postgres // Definitions by: Phips Peter // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -33,6 +33,16 @@ declare module "pg" { ssl?: boolean; } + export interface PoolConfig extends ClientConfig { + // properties from module 'node-pool' + max?: number; + min?: number; + refreshIdle?: boolean; + idleTimeoutMillis?: number; + reapIntervalMillis?: number; + returnToHead?: boolean; + } + export interface QueryConfig { name?: string; text: string; @@ -50,12 +60,42 @@ declare module "pg" { addRow(row: any): void; } + export class Pool extends events.EventEmitter { + + constructor(); + + // `new Pool('pg://user@localhost/mydb')` is not allowed. + // But it passes type check because of issue: + // https://github.com/Microsoft/TypeScript/issues/7485 + constructor(config: PoolConfig); + + connect(): Promise; + connect(callback: (err: Error, client: Client, done: () => void) => void): void; + + end(): Promise; + + query(queryText: string): Promise; + query(queryText: string, values: any[]): Promise; + + query(queryText: string, callback: (err: Error, result: QueryResult) => void): void; + query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): void; + + public on(event: "error", listener: (err: Error, client: Client) => void): this; + public on(event: "connect", listener: (client: Client) => void): this; + public on(event: "acquire", listener: (client: Client) => void): this; + public on(event: string, listener: Function): this; + } + export class Client extends events.EventEmitter { constructor(connection: string); constructor(config: ClientConfig); connect(callback?: (err:Error) => void): void; end(): void; + release(): void; + + query(queryText: string): Promise; + query(queryText: string, values: any[]): Promise; query(queryText: string, callback?: (err: Error, result: QueryResult) => void): Query; query(config: QueryConfig, callback?: (err: Error, result: QueryResult) => void): Query; @@ -86,7 +126,7 @@ declare module "pg" { public on(event: string, listener: Function): this; } - namespace types { + export namespace types { function setTypeParser(typeId: number, parser: (value: string) => T): void; } }