UNPKG

smc-hub

Version:

CoCalc: Backend webserver component

44 lines (38 loc) 1.33 kB
/* * This file is part of CoCalc: Copyright © 2020 Sagemath, Inc. * License: AGPLv3 s.t. "Commons Clause" – see LICENSE.md for details */ // This is used in postgres-base to set postgres parameters for a single query // https://www.postgresql.org/docs/10/sql-set.html import { Client } from "pg"; import debug from "debug"; const L = debug("hub:pg:query_params"); interface Opts { client: Client; query: string; params: string[]; pg_params: { [key: string]: string }; cb: (err?, result?) => void; } // Run the actual query after a setup query in a transaction; this is // used by __do_query in postgres-base export async function do_query_with_pg_params(opts: Opts): Promise<void> { const { client, query, params, pg_params, cb } = opts; try { await client.query("BEGIN"); for (const [k, v] of Object.entries(pg_params)) { // SET LOCAL: only for this transaction! // NOTE: interestingly, $1, $2 params do not work … but this isn't user-facing const q = `SET LOCAL ${k} TO ${v}`; L(`Setting query param: ${k}=${v}`); await client.query(q); } const res = await client.query(query, params); await client.query("COMMIT"); cb(undefined, res); } catch (err) { L(`ROLLBACK -- err=${err}`); await client.query("ROLLBACK"); cb(err); } }