From 07a5388936cdd623e6f028e3516c65b05c7a2f41 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Fri, 26 Aug 2016 15:12:22 +0800 Subject: [PATCH] Port pg 6.1.0 types update to types-2.0 branch --- pg-pool/index.d.ts | 7 +++++++ pg-pool/pg-pool-tests.ts | 41 +++++++++++++++++++++++++++++++++++++ pg-pool/tsconfig.json | 19 +++++++++++++++++ pg/index.d.ts | 44 ++++++++++++++++++++++++++++++++++++++-- pg/pg-tests.ts | 30 +++++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 pg-pool/index.d.ts create mode 100644 pg-pool/pg-pool-tests.ts create mode 100644 pg-pool/tsconfig.json diff --git a/pg-pool/index.d.ts b/pg-pool/index.d.ts new file mode 100644 index 0000000000..7887ddc82f --- /dev/null +++ b/pg-pool/index.d.ts @@ -0,0 +1,7 @@ +// Type definitions for pg-pool +// Project: https://github.com/brianc/node-pg-pool +// Definitions by: Leo Liang +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// +export {Pool, PoolConfig} from "pg"; diff --git a/pg-pool/pg-pool-tests.ts b/pg-pool/pg-pool-tests.ts new file mode 100644 index 0000000000..13c2a7c4ec --- /dev/null +++ b/pg-pool/pg-pool-tests.ts @@ -0,0 +1,41 @@ +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(); diff --git a/pg-pool/tsconfig.json b/pg-pool/tsconfig.json new file mode 100644 index 0000000000..b0d5838b3f --- /dev/null +++ b/pg-pool/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "noImplicitAny": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "pg-pool-tests.ts" + ] +} diff --git a/pg/index.d.ts b/pg/index.d.ts index b9c96777de..f38313888b 100644 --- a/pg/index.d.ts +++ b/pg/index.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 @@ export interface ClientConfig extends ConnectionConfig { 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 @@ export interface ResultBuilder extends QueryResult { addRow(row: any): void; } +export declare 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 declare class Client extends events.EventEmitter { constructor(connection: string); constructor(config: ClientConfig); - connect(callback?: (err: Error) => void): void; + 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; diff --git a/pg/pg-tests.ts b/pg/pg-tests.ts index aa55b537e9..8936f01ee0 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