diff --git a/types/pg-query-stream/pg-query-stream-tests.ts b/types/pg-query-stream/pg-query-stream-tests.ts index dbf0b88d0b..49a2f41b0b 100644 --- a/types/pg-query-stream/pg-query-stream-tests.ts +++ b/types/pg-query-stream/pg-query-stream-tests.ts @@ -12,7 +12,7 @@ const pool = new pg.Pool(); pool.connect((err, client, done) => { const stream = client.query(query); stream.on('end', () => { - client.end(); + client.release(); }); stream.on('data', (data: any) => { console.log(data); diff --git a/types/pg/index.d.ts b/types/pg/index.d.ts index f91402efe1..b3fc5904c9 100644 --- a/types/pg/index.d.ts +++ b/types/pg/index.d.ts @@ -47,7 +47,10 @@ export interface QueryConfig { name?: string; text: string; values?: any[]; - rowMode?: string; +} + +export interface QueryArrayConfig extends QueryConfig { + rowMode: 'array'; } export interface QueryResult { @@ -57,6 +60,24 @@ export interface QueryResult { rows: any[]; } +export interface FieldDef { + name: string; + tableID: number; + columnID: number; + dataTypeID: number; + dataTypeSize: number; + dataTypeModifier: number; + format: string; +} + +export interface QueryArrayResult { + command: string; + rowCount: number; + oid: number; + rows: any[][]; + fields: FieldDef[]; +} + export interface Notification { processId: number; channel: string; @@ -77,36 +98,35 @@ export class Pool extends events.EventEmitter { readonly idleCount: number; readonly waitingCount: number; - connect(): Promise; - connect(callback: (err: Error, client: Client, done: () => void) => void): void; + connect(): Promise; + connect(callback: (err: Error, client: PoolClient, done: () => void) => void): void; end(): Promise; end(callback: () => void): void; query(queryStream: QueryConfig & stream.Readable): stream.Readable; + query(queryConfig: QueryArrayConfig): Promise; query(queryConfig: QueryConfig): Promise; query(queryText: string, values?: any[]): Promise; + query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): Query; 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; + on(event: "error", listener: (err: Error, client: PoolClient) => void): this; + on(event: "connect" | "acquire", listener: (client: PoolClient) => void): this; } -export class Client extends events.EventEmitter { +export class ClientBase extends events.EventEmitter { constructor(config: string | ClientConfig); connect(): Promise; connect(callback: (err: Error) => void): void; - end(): Promise; - end(callback: (err: Error) => void): void; - - release(err?: Error): void; - query(queryStream: QueryConfig & stream.Readable): stream.Readable; + query(queryConfig: QueryArrayConfig): Promise; query(queryConfig: QueryConfig): Promise; query(queryText: string, values?: any[]): Promise; + query(queryConfig: QueryArrayConfig, callback: (err: Error, result: QueryArrayResult) => void): Query; query(queryTextOrConfig: string | QueryConfig, callback: (err: Error, result: QueryResult) => void): Query; query(queryText: string, values: any[], callback: (err: Error, result: QueryResult) => void): Query; @@ -126,6 +146,17 @@ export class Client extends events.EventEmitter { on(event: "end", listener: () => void): this; } +export class Client extends ClientBase { + constructor(config: string | ClientConfig); + + end(): Promise; + end(callback: (err: Error) => void): void; +} + +export interface PoolClient extends ClientBase { + release(err?: Error): void; +} + export class Query extends events.EventEmitter { on(event: "row", listener: (row: any, result?: ResultBuilder) => void): this; on(event: "error", listener: (err: Error) => void): this; diff --git a/types/pg/pg-tests.ts b/types/pg/pg-tests.ts index 1f1e312544..b9b3f80d4e 100644 --- a/types/pg/pg-tests.ts +++ b/types/pg/pg-tests.ts @@ -48,8 +48,7 @@ client.query('SELECT $1::text as name', ['brianc'], (err, res) => { const query = { name: 'get-name', text: 'SELECT $1::text', - values: ['brianc'], - rowMode: 'array' + values: ['brianc'] }; client.query(query, (err, res) => { if (err) { @@ -66,6 +65,33 @@ client.query(query) console.error(e.stack); }); +const queryArrMode: pg.QueryArrayConfig = { + name: 'get-name-array', + text: 'SELECT $1::text', + values: ['brianc'], + rowMode: 'array' +}; +client.query(queryArrMode, (err, res) => { + if (err) { + console.error(err.stack); + } else { + console.log(res.rows); + console.log(res.fields.map(f => f.name)); + } +}); +client.query(queryArrMode) + .then(res => { + console.log(res.rows); + console.log(res.fields.map(f => f.name)); + }) + .catch(e => { + console.error(e.stack); + }); +client.query({ + text: 'select 1', + rowMode: 'array', +}).then(res => console.log(res.fields[0])); + client.end((err) => { console.log('client has disconnected'); if (err) { @@ -107,6 +133,12 @@ pool.connect((err, client, done) => { }); }); +pool.connect().then(client => { + client.query({ text: 'SELECT $1::int AS number', values: ['1'], rowMode: 'array' }).then(result => { + console.log(result.rowCount, result.rows[0][0], result.fields[0].name); + }).then(() => client.release(), e => client.release(e)); +}); + pool.on('error', (err, client) => { console.error('idle client error', err.message, err.stack); });