"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var postgres_exports = {}; __export(postgres_exports, { PostgresDatabase: () => PostgresDatabase }); module.exports = __toCommonJS(postgres_exports); var Streams = __toESM(require("./streams")); var import_fs = require("./fs"); var Utils = __toESM(require("./utils")); class PostgresDatabase { constructor(config = PostgresDatabase.getConfig()) { try { this.pool = new (require("pg")).Pool(config); } catch { this.pool = null; } } destroy() { return this.pool.end(); } async query(statement, values) { if (!this.pool) { throw new Error(`Attempting to use postgres without 'pg' installed`); } let result; try { result = await this.pool.query(statement, values); } catch (e) { throw new Error(e.message); } return result?.rows || []; } static getConfig() { let config = {}; try { config = require(import_fs.FS.ROOT_PATH + "/config/config").usepostgres; if (!config) throw new Error("Missing config for pg database"); } catch { } return config; } async transaction(callback, depth = 0) { const conn = await this.pool.connect(); await conn.query(`BEGIN`); let result; try { result = await callback(conn); } catch (e) { await conn.query(`ROLLBACK`); if (e.code === "40001" && depth <= 10) { return this.transaction(callback, depth + 1); } else if (e.code === "23505" && !depth) { return this.transaction(callback, depth + 1); } else { throw e; } } await conn.query(`COMMIT`); return result; } stream(query) { const db = this; return new Streams.ObjectReadStream({ async read() { const result = await db.query(query); if (!result.length) return this.pushEnd(); this.buf.push(...result); } }); } async ensureMigrated(opts) { let value; try { const stored = await this.query( `SELECT value FROM db_info WHERE key = 'version' AND name = $1`, [opts.table] ); if (stored.length) { value = stored[0].value || "0"; } } catch { await this.query(`CREATE TABLE db_info (name TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL)`); } if (!value) { value = "0"; await this.query("INSERT INTO db_info (name, key, value) VALUES ($1, $2, $3)", [opts.table, "version", value]); } value = Number(value); const files = (0, import_fs.FS)(opts.migrationsFolder).readdirSync().filter((f) => f.endsWith(".sql")).map((f) => Number(f.slice(1).split(".")[0])); Utils.sortBy(files, (f) => f); const curVer = files[files.length - 1] || 0; if (curVer !== value) { if (!value) { try { await this.query(`SELECT * FROM ${opts.table} LIMIT 1`); } catch { await this.query((0, import_fs.FS)(opts.baseSchemaFile).readSync()); } } for (const n of files) { if (n <= value) continue; await this.query((0, import_fs.FS)(`${opts.migrationsFolder}/v${n}.sql`).readSync()); await this.query( `UPDATE db_info SET value = $1 WHERE key = 'version' AND name = $2`, [`${n}`, opts.table] ); } } } } //# sourceMappingURL=postgres.js.map