From 582bba204d4918c447cd6cc68aca775c5123b481 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Wed, 2 Aug 2017 11:52:55 +0800 Subject: [PATCH 01/11] Update typing for pg --- types/pg/index.d.ts | 31 +++++++++++---------- types/pg/pg-tests.ts | 63 +++++++++++++++++++++++++----------------- types/pg/tsconfig.json | 4 +-- types/pg/tslint.json | 5 ++++ 4 files changed, 61 insertions(+), 42 deletions(-) create mode 100644 types/pg/tslint.json diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index da6f4db575..fc20d5fd85 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -9,9 +9,11 @@ import events = require("events"); import stream = require("stream"); import pgTypes = require("pg-types"); -export declare function connect(connection: string, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; -export declare function connect(config: ClientConfig, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; -export declare function end(): void; +// tslint:disable-next-line unified-signatures +export function connect(connection: string, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; +// tslint:disable-next-line unified-signatures +export function connect(config: ClientConfig, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; +export function end(): void; export interface ConnectionConfig { user?: string; @@ -64,7 +66,7 @@ export interface ResultBuilder extends QueryResult { addRow(row: any): void; } -export declare class Pool extends events.EventEmitter { +export class Pool extends events.EventEmitter { // `new Pool('pg://user@localhost/mydb')` is not allowed. // But it passes type check because of issue: // https://github.com/Microsoft/TypeScript/issues/7485 @@ -76,9 +78,8 @@ export declare class Pool extends events.EventEmitter { end(callback?: () => void): Promise; query(queryStream: QueryConfig & stream.Readable): stream.Readable; - query(queryTextOrConfig: string | QueryConfig): Promise; - query(queryText: string, values: any[]): Promise; - + query(queryConfig: QueryConfig): Promise; + query(queryText: string, values?: any[]): Promise; query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): Query; query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): Query; @@ -86,18 +87,17 @@ export declare class Pool extends events.EventEmitter { on(event: "connect" | "acquire", listener: (client: Client) => void): this; } -export declare class Client extends events.EventEmitter { - constructor(connection: string); - constructor(config: ClientConfig); +export class Client extends events.EventEmitter { + constructor(connection: string); // tslint:disable-line unified-signatures + constructor(config: ClientConfig); // tslint:disable-line unified-signatures connect(callback?: (err: Error) => void): void; end(callback?: (err: Error) => void): void; release(err?: Error): void; query(queryStream: QueryConfig & stream.Readable): stream.Readable; - query(queryTextOrConfig: string | QueryConfig): Promise; - query(queryText: string, values: any[]): Promise; - + query(queryConfig: QueryConfig): Promise; + query(queryText: string, values?: any[]): Promise; query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): Query; query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): Query; @@ -110,16 +110,17 @@ export declare class Client extends events.EventEmitter { on(event: "drain", listener: () => void): this; on(event: "error", listener: (err: Error) => void): this; on(event: "notification" | "notice", listener: (message: any) => void): this; + // tslint:disable-next-line unified-signatures on(event: "end", listener: () => void): this; } -export declare class Query extends events.EventEmitter { +export class Query extends events.EventEmitter { on(event: "row", listener: (row: any, result?: ResultBuilder) => void): this; on(event: "error", listener: (err: Error) => void): this; on(event: "end", listener: (result: ResultBuilder) => void): this; } -export declare class Events extends events.EventEmitter { +export class Events extends events.EventEmitter { on(event: "error", listener: (err: Error, client: Client) => void): this; } diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index 4b4cfba7ec..6bdf408bee 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -1,8 +1,9 @@ import * as pg from "pg"; -var conString = "postgres://username:password@localhost/database"; +const conString = "postgres://username:password@localhost/database"; // https://github.com/brianc/node-pg-types +// tslint:disable-next-line no-unnecessary-callback-wrapper pg.types.setTypeParser(20, val => Number(val)); // Client pooling @@ -15,8 +16,7 @@ pg.connect(conString, (err, client, done) => { if (err) { done(err); return console.error("Error running query", err); - } - else { + } else { done(); } console.log(result.rows[0]["number"]); @@ -26,7 +26,7 @@ pg.connect(conString, (err, client, done) => { }); // Simple -var client = new pg.Client(conString); +const client = new pg.Client(conString); client.connect(err => { if (err) { return console.error("Could not connect to postgres", err); @@ -46,36 +46,49 @@ client.on('end', () => console.log("Client was disconnected.")); // 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 - Promise, +const config = { + user: 'foo', + database: 'my_db', + password: 'secret', + port: 5432, + max: 10, + idleTimeoutMillis: 30000, + Promise, }; -var pool = new pg.Pool(config); +const pool = new pg.Pool(config); pool.connect((err, client, done) => { - if(err) { - return console.error('error fetching client from pool', err); - } - client.query('SELECT $1::int AS number', ['1'], (err, result) => { - done(); - - if(err) { - return console.error('error running query', err); + if (err) { + return console.error('error fetching client from pool', err); } - console.log(result.rows[0].number); - }); + client.query('SELECT $1::int AS number', ['1'], (err, result) => { + done(); + + if (err) { + return console.error('error running query', err); + } + console.log(result.rows[0].number); + }); }); pool.on('error', (err, client) => { - console.error('idle client error', err.message, err.stack) -}) + console.error('idle client error', err.message, err.stack); +}); pool.end(); pool.end(() => { console.log("pool is closed"); }); + +// Promise + +function query(sql: string, binds?: any[]): void { + // binds: any[] | undefined + pool.query(sql, binds) + .then((result: pg.QueryResult) => { + console.log(result.rows[0].number); + }) + .catch((err: any) => { + console.error('error running query', err); + }); +} diff --git a/types/pg/tsconfig.json b/types/pg/tsconfig.json index 3535f4d43f..6905c7197c 100644 --- a/types/pg/tsconfig.json +++ b/types/pg/tsconfig.json @@ -6,7 +6,7 @@ ], "noImplicitAny": true, "noImplicitThis": true, - "strictNullChecks": false, + "strictNullChecks": true, "baseUrl": "../", "typeRoots": [ "../" @@ -19,4 +19,4 @@ "index.d.ts", "pg-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/pg/tslint.json b/types/pg/tslint.json new file mode 100644 index 0000000000..495d29983d --- /dev/null +++ b/types/pg/tslint.json @@ -0,0 +1,5 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + } +} From 59035dd08eb992d11440874d99785707e36677af Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Thu, 3 Aug 2017 11:32:19 +0800 Subject: [PATCH 02/11] Fix review comment --- types/pg/index.d.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index fc20d5fd85..b2c3634f5c 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -9,10 +9,9 @@ import events = require("events"); import stream = require("stream"); import pgTypes = require("pg-types"); -// tslint:disable-next-line unified-signatures -export function connect(connection: string, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; -// tslint:disable-next-line unified-signatures -export function connect(config: ClientConfig, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; +export function connect( + connectionOrConfig: string | ClientConfig, + callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; export function end(): void; export interface ConnectionConfig { @@ -88,8 +87,7 @@ export class Pool extends events.EventEmitter { } export class Client extends events.EventEmitter { - constructor(connection: string); // tslint:disable-line unified-signatures - constructor(config: ClientConfig); // tslint:disable-line unified-signatures + constructor(connectionOrConfig: string | ClientConfig); connect(callback?: (err: Error) => void): void; end(callback?: (err: Error) => void): void; From 3653eef83fb63e92c9751ea67670f0c43b9ef150 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Fri, 11 Aug 2017 14:37:31 +0800 Subject: [PATCH 03/11] Update to pg 7.1 API --- types/pg/index.d.ts | 21 +++--- types/pg/pg-tests.ts | 144 +++++++++++++++++++++++++---------------- types/pg/tsconfig.json | 1 + 3 files changed, 100 insertions(+), 66 deletions(-) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index b2c3634f5c..92aeb91c86 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for pg 6.1 +// Type definitions for pg 7.1 // Project: https://github.com/brianc/node-postgres // Definitions by: Phips Peter // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -9,11 +9,6 @@ import events = require("events"); import stream = require("stream"); import pgTypes = require("pg-types"); -export function connect( - connectionOrConfig: string | ClientConfig, - callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; -export function end(): void; - export interface ConnectionConfig { user?: string; database?: string; @@ -41,6 +36,7 @@ export interface PoolConfig extends ClientConfig { max?: number; min?: number; refreshIdle?: boolean; + connectionTimeoutMillis?: number; idleTimeoutMillis?: number; reapIntervalMillis?: number; returnToHead?: boolean; @@ -74,7 +70,8 @@ export class Pool extends events.EventEmitter { connect(): Promise; connect(callback: (err: Error, client: Client, done: () => void) => void): void; - end(callback?: () => void): Promise; + end(): Promise; + end(callback: () => void): void; query(queryStream: QueryConfig & stream.Readable): stream.Readable; query(queryConfig: QueryConfig): Promise; @@ -87,10 +84,14 @@ export class Pool extends events.EventEmitter { } export class Client extends events.EventEmitter { - constructor(connectionOrConfig: string | ClientConfig); + constructor(config: ClientConfig); + + connect(): Promise; + connect(callback: (err: Error) => void): void; + + end(): Promise; + end(callback: (err: Error) => void): void; - connect(callback?: (err: Error) => void): void; - end(callback?: (err: Error) => void): void; release(err?: Error): void; query(queryStream: QueryConfig & stream.Readable): stream.Readable; diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index 6bdf408bee..d3359d930a 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -1,32 +1,15 @@ import * as pg from "pg"; -const conString = "postgres://username:password@localhost/database"; - // https://github.com/brianc/node-pg-types // tslint:disable-next-line no-unnecessary-callback-wrapper pg.types.setTypeParser(20, val => Number(val)); -// Client pooling -pg.defaults.ssl = true; -pg.connect(conString, (err, client, done) => { - if (err) { - return console.error("Error fetching client from pool", err); - } - client.query("SELECT $1::int AS number", ["1"], (err, result) => { - if (err) { - done(err); - return console.error("Error running query", err); - } else { - done(); - } - console.log(result.rows[0]["number"]); - return null; - }); - return null; +const client = new pg.Client({ + host: 'my.database-server.com', + port: 5334, + user: 'database-user', + password: 'secretpassword!!', }); - -// Simple -const client = new pg.Client(conString); client.connect(err => { if (err) { return console.error("Could not connect to postgres", err); @@ -44,51 +27,100 @@ client.connect(err => { }); client.on('end', () => console.log("Client was disconnected.")); -// client pooling +client.connect() + .then(() => console.log('connected')) + .catch(e => console.error('connection error', e.stack)); -const config = { - user: 'foo', - database: 'my_db', - password: 'secret', - port: 5432, - max: 10, - idleTimeoutMillis: 30000, - Promise, +client.query('SELECT NOW()', (err, res) => { + if (err) throw err; + console.log(res); + client.end(); +}); + +client.query('SELECT $1::text as name', ['brianc'], (err, res) => { + if (err) throw err; + console.log(res); + client.end(); +}); + +const query = { + name: 'get-name', + text: 'SELECT $1::text', + values: ['brianc'], + rowMode: 'array' }; -const pool = new pg.Pool(config); +client.query(query, (err, res) => { + if (err) { + console.error(err.stack); + } else { + console.log(res.rows); + } +}); +client.query(query) + .then(res => { + console.log(res.rows); + }) + .catch(e => { + console.error(e.stack); + }); +client.end((err) => { + console.log('client has disconnected'); + if (err) { + console.log('error during disconnection', err.stack); + } +}); + +client.end() + .then(() => console.log('client has disconnected')) + .catch(err => console.error('error during disconnection', err.stack)); + +const pool = new pg.Pool({ + host: 'localhost', + port: 5432, + user: 'database-user', + database: 'my_db', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, +}); pool.connect((err, client, done) => { - if (err) { - return console.error('error fetching client from pool', err); - } - client.query('SELECT $1::int AS number', ['1'], (err, result) => { - done(); + if (err) { + return console.error('error fetching client from pool', err); + } + client.query('SELECT $1::int AS number', ['1'], (err, result) => { + done(); - if (err) { - return console.error('error running query', err); - } - console.log(result.rows[0].number); - }); + if (err) { + return console.error('error running query', err); + } + console.log(result.rows[0].number); + }); }); pool.on('error', (err, client) => { - console.error('idle client error', err.message, err.stack); + console.error('idle client error', err.message, err.stack); }); -pool.end(); +pool.query('SELECT $1::text as name', ['brianc'], (err, result) => { + if (err) { + return console.error('Error executing query', err.stack); + } + console.log(result.rows[0].name); +}); + +pool.query('SELECT $1::text as name', ['brianc']) + .then((res) => console.log(res.rows[0].name)) + .catch(err => console.error('Error executing query', err.stack)); + pool.end(() => { - console.log("pool is closed"); + console.log('pool has ended'); }); -// Promise +pool.end().then(() => console.log('pool has ended')); -function query(sql: string, binds?: any[]): void { - // binds: any[] | undefined - pool.query(sql, binds) - .then((result: pg.QueryResult) => { - console.log(result.rows[0].number); - }) - .catch((err: any) => { - console.error('error running query', err); - }); -} +(async () => { + const client = await pool.connect(); + await client.query('SELECT NOW()'); + client.release(); +})(); diff --git a/types/pg/tsconfig.json b/types/pg/tsconfig.json index 6905c7197c..caa997a916 100644 --- a/types/pg/tsconfig.json +++ b/types/pg/tsconfig.json @@ -4,6 +4,7 @@ "lib": [ "es6" ], + "target": "es6", "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, From c03e601a5079f67aae15d2780e8c01d2136da18e Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Fri, 11 Aug 2017 16:23:04 +0800 Subject: [PATCH 04/11] Update pg-query-stream test to use pg@7.1 API. --- types/pg-query-stream/pg-query-stream-tests.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/types/pg-query-stream/pg-query-stream-tests.ts b/types/pg-query-stream/pg-query-stream-tests.ts index 6c4c034102..1df78ea648 100644 --- a/types/pg-query-stream/pg-query-stream-tests.ts +++ b/types/pg-query-stream/pg-query-stream-tests.ts @@ -8,7 +8,8 @@ const options: QueryStream.Options = { const query = new QueryStream('SELECT * FROM generate_series(0, $1) num', [1000000], options); -pg.connect('', (err, client, done) => { +const pool = new pg.Pool(); +pool.connect((err, client, done) => { const stream = client.query(query); stream.on('end', () => { client.end(); @@ -17,3 +18,4 @@ pg.connect('', (err, client, done) => { console.log(data); }); }); +pool.end(); From 854a2af8e5ff411490b48cc14f960ead8f4c1874 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Tue, 22 Aug 2017 18:26:00 +0800 Subject: [PATCH 05/11] Add properties totalCount, idleCount, waitingCount --- types/pg/index.d.ts | 4 ++++ types/pg/pg-tests.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index 92aeb91c86..ebba2d0f7d 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -67,6 +67,10 @@ export class Pool extends events.EventEmitter { // https://github.com/Microsoft/TypeScript/issues/7485 constructor(config?: PoolConfig); + readonly totalCount: number; + readonly idleCount: number; + readonly waitingCount: number; + connect(): Promise; connect(callback: (err: Error, client: Client, done: () => void) => void): void; diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index d3359d930a..81eadd0b13 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -84,6 +84,7 @@ const pool = new pg.Pool({ idleTimeoutMillis: 30000, connectionTimeoutMillis: 2000, }); +console.log(pool.totalCount); pool.connect((err, client, done) => { if (err) { return console.error('error fetching client from pool', err); From a26b2c6e97871596a94e4c2d5529bb229861080a Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Fri, 25 Aug 2017 17:33:35 +0800 Subject: [PATCH 06/11] Remove properties which are no more available in pg 7.1 --- types/pg/index.d.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index ebba2d0f7d..04a84f1dfd 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -35,11 +35,9 @@ export interface PoolConfig extends ClientConfig { // properties from module 'node-pool' max?: number; min?: number; - refreshIdle?: boolean; connectionTimeoutMillis?: number; idleTimeoutMillis?: number; - reapIntervalMillis?: number; - returnToHead?: boolean; + application_name?: string; Promise?: PromiseConstructorLike; } From 84a47dcbebb349bd3f72810b7ec2f63b85629c4a Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Fri, 25 Aug 2017 17:59:24 +0800 Subject: [PATCH 07/11] New test rule expects a github URL. --- types/pg/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index 04a84f1dfd..1383dc2a22 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for pg 7.1 // Project: https://github.com/brianc/node-postgres -// Definitions by: Phips Peter +// Definitions by: Phips Peter // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /// From 3bc2634b096e54d3c6c5a5af7ef58051bc1847dd Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Mon, 28 Aug 2017 10:56:04 +0800 Subject: [PATCH 08/11] Fix lint rule no-void-expression --- types/pg/pg-tests.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index 81eadd0b13..bc1bfd30e0 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -12,11 +12,13 @@ const client = new pg.Client({ }); client.connect(err => { if (err) { - return console.error("Could not connect to postgres", err); + console.error("Could not connect to postgres", err); + return; } client.query("SELECT NOW() AS 'theTime'", (err, result) => { if (err) { - return console.error("Error running query", err); + console.error("Error running query", err); + return; } console.log(result.rowCount); console.log(result.rows[0]["theTime"]); @@ -87,13 +89,15 @@ const pool = new pg.Pool({ console.log(pool.totalCount); pool.connect((err, client, done) => { if (err) { - return console.error('error fetching client from pool', err); + console.error('error fetching client from pool', err); + return; } client.query('SELECT $1::int AS number', ['1'], (err, result) => { done(); if (err) { - return console.error('error running query', err); + console.error('error running query', err); + return; } console.log(result.rows[0].number); }); @@ -105,7 +109,8 @@ pool.on('error', (err, client) => { pool.query('SELECT $1::text as name', ['brianc'], (err, result) => { if (err) { - return console.error('Error executing query', err.stack); + console.error('Error executing query', err.stack); + return; } console.log(result.rows[0].name); }); From adcf24f32d70efed4ab820adadd454575d09de20 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Wed, 30 Aug 2017 10:55:55 +0800 Subject: [PATCH 09/11] Add connectionString property to the config object --- types/pg/index.d.ts | 1 + types/pg/pg-tests.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index 1383dc2a22..ec5b929aa4 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -15,6 +15,7 @@ export interface ConnectionConfig { password?: string; port?: number; host?: string; + connectionString?: string; } export interface Defaults extends ConnectionConfig { diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index bc1bfd30e0..1f1e312544 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -77,6 +77,10 @@ client.end() .then(() => console.log('client has disconnected')) .catch(err => console.error('error during disconnection', err.stack)); +const poolOne = new pg.Pool({ + connectionString: 'postgresql://dbuser:secretpassword@database.server.com:3211/mydb' +}); + const pool = new pg.Pool({ host: 'localhost', port: 5432, From 6e75e3644b622e3a7e96d4273d8951c74893e396 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Thu, 31 Aug 2017 17:57:20 +0800 Subject: [PATCH 10/11] Copy v6 types to its folder --- types/pg/v6/index.d.ts | 128 ++++++++++++++++++++++++++++++++++++++ types/pg/v6/pg-tests.ts | 81 ++++++++++++++++++++++++ types/pg/v6/tsconfig.json | 25 ++++++++ 3 files changed, 234 insertions(+) create mode 100644 types/pg/v6/index.d.ts create mode 100644 types/pg/v6/pg-tests.ts create mode 100644 types/pg/v6/tsconfig.json diff --git a/types/pg/v6/index.d.ts b/types/pg/v6/index.d.ts new file mode 100644 index 0000000000..5624989ac7 --- /dev/null +++ b/types/pg/v6/index.d.ts @@ -0,0 +1,128 @@ +// Type definitions for pg 6.1 +// Project: https://github.com/brianc/node-postgres +// Definitions by: Phips Peter +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +import events = require("events"); +import stream = require("stream"); +import pgTypes = require("pg-types"); + +export declare function connect(connection: string, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; +export declare function connect(config: ClientConfig, callback: (err: Error, client: Client, done: (err?: any) => void) => void): void; +export declare function end(): void; + +export interface ConnectionConfig { + user?: string; + database?: string; + password?: string; + port?: number; + host?: string; +} + +export interface Defaults extends ConnectionConfig { + poolSize?: number; + poolIdleTimeout?: number; + reapIntervalMillis?: number; + binary?: boolean; + parseInt8?: boolean; +} + +import { TlsOptions } from "tls"; + +export interface ClientConfig extends ConnectionConfig { + ssl?: boolean | TlsOptions; +} + +export interface PoolConfig extends ClientConfig { + // properties from module 'node-pool' + max?: number; + min?: number; + refreshIdle?: boolean; + idleTimeoutMillis?: number; + reapIntervalMillis?: number; + returnToHead?: boolean; + application_name?: string; + Promise?: PromiseConstructorLike; +} + +export interface QueryConfig { + name?: string; + text: string; + values?: any[]; +} + +export interface QueryResult { + command: string; + rowCount: number; + oid: number; + rows: any[]; +} + +export interface ResultBuilder extends QueryResult { + addRow(row: any): void; +} + +export declare class Pool extends events.EventEmitter { + // `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(callback?: () => void): Promise; + + query(queryStream: QueryConfig & stream.Readable): stream.Readable; + query(queryTextOrConfig: string | QueryConfig): Promise; + query(queryText: string, values: any[]): Promise; + + query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): Query; + query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): Query; + + on(event: "error", listener: (err: Error, client: Client) => void): this; + on(event: "connect" | "acquire", listener: (client: Client) => void): this; +} + +export declare class Client extends events.EventEmitter { + constructor(connection: string); + constructor(config: ClientConfig); + + connect(callback?: (err: Error) => void): void; + end(callback?: (err: Error) => void): void; + release(err?: Error): void; + + query(queryStream: QueryConfig & stream.Readable): stream.Readable; + query(queryTextOrConfig: string | QueryConfig): Promise; + query(queryText: string, values: any[]): Promise; + + query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): Query; + query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): Query; + + copyFrom(queryText: string): stream.Writable; + copyTo(queryText: string): stream.Readable; + + pauseDrain(): void; + resumeDrain(): void; + + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "notification" | "notice", listener: (message: any) => void): this; + on(event: "end", listener: () => void): this; +} + +export declare class Query extends events.EventEmitter { + on(event: "row", listener: (row: any, result?: ResultBuilder) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "end", listener: (result: ResultBuilder) => void): this; +} + +export declare class Events extends events.EventEmitter { + on(event: "error", listener: (err: Error, client: Client) => void): this; +} + +export const types: typeof pgTypes; + +export const defaults: Defaults & ClientConfig; diff --git a/types/pg/v6/pg-tests.ts b/types/pg/v6/pg-tests.ts new file mode 100644 index 0000000000..4b4cfba7ec --- /dev/null +++ b/types/pg/v6/pg-tests.ts @@ -0,0 +1,81 @@ +import * as pg from "pg"; + +var conString = "postgres://username:password@localhost/database"; + +// https://github.com/brianc/node-pg-types +pg.types.setTypeParser(20, val => Number(val)); + +// Client pooling +pg.defaults.ssl = true; +pg.connect(conString, (err, client, done) => { + if (err) { + return console.error("Error fetching client from pool", err); + } + client.query("SELECT $1::int AS number", ["1"], (err, result) => { + if (err) { + done(err); + return console.error("Error running query", err); + } + else { + done(); + } + console.log(result.rows[0]["number"]); + return null; + }); + return null; +}); + +// Simple +var client = new pg.Client(conString); +client.connect(err => { + if (err) { + return console.error("Could not connect to postgres", err); + } + client.query("SELECT NOW() AS 'theTime'", (err, result) => { + if (err) { + return console.error("Error running query", err); + } + console.log(result.rowCount); + console.log(result.rows[0]["theTime"]); + client.end(); + return null; + }); + return null; +}); +client.on('end', () => console.log("Client was disconnected.")); + +// 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 + Promise, +}; +var pool = new pg.Pool(config); + +pool.connect((err, client, done) => { + if(err) { + return console.error('error fetching client from pool', err); + } + client.query('SELECT $1::int AS number', ['1'], (err, result) => { + done(); + + if(err) { + return console.error('error running query', err); + } + console.log(result.rows[0].number); + }); +}); + +pool.on('error', (err, client) => { + console.error('idle client error', err.message, err.stack) +}) + +pool.end(); +pool.end(() => { + console.log("pool is closed"); +}); diff --git a/types/pg/v6/tsconfig.json b/types/pg/v6/tsconfig.json new file mode 100644 index 0000000000..2c44f5862b --- /dev/null +++ b/types/pg/v6/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "baseUrl": "../../", + "typeRoots": [ + "../../" + ], + "paths": { + "pg": [ "pg/v6" ] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "pg-tests.ts" + ] +} From 402433d3b4dd078422da3b6c2777f52a8efb58e9 Mon Sep 17 00:00:00 2001 From: Leo Liang Date: Wed, 6 Sep 2017 14:10:22 +0800 Subject: [PATCH 11/11] Fix error after merge master --- types/pg/index.d.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index c053427078..c6d82869c3 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -57,9 +57,9 @@ export interface QueryResult { } export interface Notification { - processId: number, - channel: string, - payload?: string + processId: number; + channel: string; + payload?: string; } export interface ResultBuilder extends QueryResult { @@ -118,6 +118,7 @@ export class Client extends events.EventEmitter { on(event: "drain", listener: () => void): this; on(event: "error", listener: (err: Error) => void): this; on(event: "notification" | "notice", listener: (message: Notification) => void): this; + // tslint:disable-next-line unified-signatures on(event: "end", listener: () => void): this; }