UNPKG

es-entity

Version:

ORM framework for Node js based on Ecmascript 6 and Typescript.

110 lines (88 loc) 2.77 kB
// @ts-ignore import pg from 'pg'; import { Readable } from 'stream'; import * as bean from '../bean/index.js'; import * as sql from '../sql/index.js'; import Handler from './Handler.js'; const pgDriver = await import('pg'); const pgQueryStream = await import('pg-query-stream'); export default class PostgreSql extends Handler { connectionPool: pg.Pool; constructor(config: bean.IConnectionConfig) { super(config); this.connectionPool = new pgDriver.Pool({ user: this.config.username, password: this.config.password, database: this.config.database, host: this.config.host, port: this.config.port, max: this.config.connectionLimit }); } async init() {} async getConnection(): Promise<pg.PoolClient> { let conn = await this.connectionPool.connect(); return conn; } async initTransaction(conn: pg.Client): Promise<void> { await conn.query('BEGIN'); } async commit(conn: pg.PoolClient): Promise<void> { await conn.query('COMMIT'); } async rollback(conn: pg.PoolClient): Promise<void> { await conn.query('ROLLBACK'); } async close(conn: pg.PoolClient): Promise<void> { conn.release(); } async end(): Promise<void> { /* TODO document why this async method 'end' is empty */ } async run(queryStmt: string | sql.Statement | sql.Statement[], connection?: pg.Client) { let { query, dataArgs } = this.prepareQuery(queryStmt); query = this.convertPlaceHolder(query); let temp: pg.QueryResult<any>; if (connection) { temp = await connection.query(query, dataArgs); } else { let con = await this.connectionPool.connect(); try { temp = await con.query(query, dataArgs); } finally { con.release(); } } let result = new bean.ResultSet(); result.rowCount = temp.rowCount ?? 0; result.rows = temp.rows; return result; } async stream(queryStmt: string | sql.Statement | sql.Statement[], connection?: pg.Client) { let { query, dataArgs } = this.prepareQuery(queryStmt); query = this.convertPlaceHolder(query); const queryStream = new pgQueryStream.default(query, dataArgs); let stream: Readable; if (connection) { stream = connection.query(queryStream); } else { let con = await this.connectionPool.connect(); stream = con.query(queryStream); stream.on('end', () => { con.release(); }); } return stream; } convertPlaceHolder(query: string) { let i = 1; while (query.includes('?')) { query = query.replace('?', `$${i}`); i++; } return query; } limit(size: string, index?: string): string { return ' limit ' + size + (index ? ' OFFSET ' + index : ''); } }