All files / src/engines postgres-engine.ts

100% Statements 21/21
100% Branches 4/4
100% Functions 14/14
100% Lines 16/16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56      1x   1x       7x       8x       15x       2x       21x   31x     24x 1x 1x     23x       21x                 23x   23x 36x        
import { DatabaseEngine } from "../database-engine";
import * as pg from "pg";
import { DatabaseType, KeyedDatabaseResult } from "../base-model";
import SQLGrammarCompiler from "../query/compiler";
 
export default class PostgresEngine implements DatabaseEngine {
    private pool: pg.Pool;
 
    constructor(pool: pg.Pool) {
        this.pool = pool;
    }
 
    query(sql: string, params: DatabaseType[]): Promise<void> {
        return this.pool.query(this.transformQuery(sql, params)).then(() => {});
    }
 
    get(sql: string, params: DatabaseType[]): Promise<KeyedDatabaseResult[]> {
        return this.pool.query(this.transformQuery(sql, params)).then(x => x.rows);
    }
 
    insertAndGetId(table: string, sql: string, params: DatabaseType[]): Promise<number> {
        return this.get(sql + " RETURNING id", params).then(x => <number>x[0]["id"]);
    }
 
    getGrammarCompiler(): SQLGrammarCompiler {
        return new class extends SQLGrammarCompiler {
            protected escapeColumn(column: string): string {
                if (column === "*") return column;
 
                // We need to escape both parts of the as independently.
                if (column.toLowerCase().indexOf(" as ") !== -1) {
                    const [original, , alias] = column.split(" ");
                    return this.escapeColumn(original) + " AS " + this.escapeColumn(alias);
                }
 
                return column.split(".").map(x => '"' + x + '"').join(".");
            }
 
            protected escapeTable(table: string): string {
                return table.split(".").map(x => '"' + x + '"').join(".");
            }
        };
    }
 
    /**
     * Converts ? placeholders into numbered $# placeholders that postgres understands.
     */
    private transformQuery(sql: string, params: DatabaseType[]): { text: string, values: any[] } {
        let i = 1;
 
        return {
            text: sql.replace(/\?/g, () => "$" + (i++)),
            values: params
        };
    }
}