Merge pull request #23282 from evs-chris/master

[pg] array mode query results and pooled vs non client release/end
This commit is contained in:
Daniel Rosenwasser 2018-02-13 11:59:27 -08:00 committed by GitHub
commit 73c5362f5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 14 deletions

View File

@ -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);

53
types/pg/index.d.ts vendored
View File

@ -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<Client>;
connect(callback: (err: Error, client: Client, done: () => void) => void): void;
connect(): Promise<PoolClient>;
connect(callback: (err: Error, client: PoolClient, done: () => void) => void): void;
end(): Promise<void>;
end(callback: () => void): void;
query(queryStream: QueryConfig & stream.Readable): stream.Readable;
query(queryConfig: QueryArrayConfig): Promise<QueryArrayResult>;
query(queryConfig: QueryConfig): Promise<QueryResult>;
query(queryText: string, values?: any[]): Promise<QueryResult>;
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<void>;
connect(callback: (err: Error) => void): void;
end(): Promise<void>;
end(callback: (err: Error) => void): void;
release(err?: Error): void;
query(queryStream: QueryConfig & stream.Readable): stream.Readable;
query(queryConfig: QueryArrayConfig): Promise<QueryArrayResult>;
query(queryConfig: QueryConfig): Promise<QueryResult>;
query(queryText: string, values?: any[]): Promise<QueryResult>;
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<void>;
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;

View File

@ -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);
});