UNPKG

pgdelegate

Version:

A library provides easy use of PostgresSQL library

441 lines (440 loc) 21.2 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PGTypes = exports.PGDelegate = void 0; var postgres = require("pg"); var fs = require("fs"); var path = require("path"); var PGFormat = require("pg-format-fix"); var URI = require("./lib/uri.js"); ; ; ; var BASE_DIR = process.cwd(); var __PGDelegate = new WeakMap(); var ____DEFAULT_SERIALIZER = function (value) { return value; }; var ____serializer = ____DEFAULT_SERIALIZER; var PGDelegate = /** @class */ (function () { function PGDelegate() { } PGDelegate.setTypeParser = function (oid, parser) { postgres.types.setTypeParser(oid, parser); return this; }; PGDelegate.getTypeParser = function (oid) { var result = postgres.types.getTypeParser(oid); return result; }; PGDelegate.setTypeSerializer = function (serializer) { if (typeof serializer !== "function") return; ____serializer = serializer; }; PGDelegate.getTypeSerializer = function () { return ____serializer; }; PGDelegate.init = function (conn_info) { return __awaiter(this, void 0, void 0, function () { var _1, _2, _3, _4, _5, conn_options, uri_info, uri_path, sep, db_name, port, search_params, ssl_mode, ssl_info, ca_path, cert_path, key_path, instance, pool; return __generator(this, function (_a) { switch (_a.label) { case 0: _1 = conn_info.user, _2 = conn_info.password, _3 = conn_info.host, _4 = conn_info.database, _5 = conn_info.port, conn_options = __rest(conn_info, ["user", "password", "host", "database", "port"]); uri_info = new URI(conn_info.uri); uri_path = uri_info.pathname; sep = uri_path.indexOf('/', 1); db_name = uri_path.substring(1, sep <= 0 ? uri_path.length : sep); port = parseInt(uri_info.port || '5432'); search_params = new URLSearchParams(uri_info.search || ''); ssl_mode = search_params.get('sslmode'); if (!ssl_mode || ssl_mode === 'disable') { delete conn_options.ssl; } else { ssl_info = conn_options.ssl; if (ssl_info === undefined || typeof ssl_info === "boolean") { ssl_info = {}; } else { if (typeof ssl_info.ca_file === "string") { ca_path = path.resolve(BASE_DIR, ssl_info.ca_file); ssl_info.ca = fs.readFileSync(ca_path).toString('utf8'); ssl_info.ca_file = undefined; } if (typeof ssl_info.cert_file === "string") { cert_path = path.resolve(BASE_DIR, ssl_info.cert_file); ssl_info.cert = fs.readFileSync(cert_path).toString('utf8'); ssl_info.cert_file = undefined; } if (typeof ssl_info.key_file === "string") { key_path = path.resolve(BASE_DIR, ssl_info.key_file); ssl_info.key = fs.readFileSync(key_path).toString('utf8'); ssl_info.key_file = undefined; } } switch (ssl_mode) { case 'allow': case 'prefer': case 'require': conn_options.ssl = Object.assign({ rejectUnauthorized: false }, ssl_info); break; case 'verify-ca': case 'verify-full': conn_options.ssl = Object.assign({ rejectUnauthorized: true }, ssl_info); break; default: throw new RangeError("Invalid SSL mode: ".concat(ssl_mode)); } } instance = new PGDelegate(); pool = new postgres.Pool(__assign({ user: decodeURIComponent(uri_info.username || ''), password: decodeURIComponent(uri_info.password || ''), host: uri_info.hostname, port: port, database: decodeURIComponent(db_name) }, conn_options)); __PGDelegate.set(instance, { pool: pool }); return [4 /*yield*/, pool.connect()]; case 1: // Test connection (_a.sent()).release(); return [2 /*return*/, instance]; } }); }); }; PGDelegate.format = function (text, values) { if (values === void 0) { values = {}; } if (Array.isArray(values)) { return PGFormat.apply(void 0, __spreadArray([text], values, false)); } else if (Object(values) === values) { var result = ParseVarMap(text, values); return PGFormat.apply(void 0, __spreadArray([result.sql], result.values, false)); } else { throw Object.assign(new TypeError("Given values must be an object or an array!"), { text: text, values: values }); } }; Object.defineProperty(PGDelegate.prototype, "is_connected", { get: function () { return __PGDelegate.get(this).pool !== null; }, enumerable: false, configurable: true }); PGDelegate.prototype.release = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, __PGDelegate.get(this).pool.end()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; PGDelegate.prototype.query = function (text, values) { return __awaiter(this, void 0, void 0, function () { var pool, inst_client; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: pool = __PGDelegate.get(this).pool; if (!pool) throw new Error("Postgres connection has been dropped!"); return [4 /*yield*/, pool.connect()]; case 1: inst_client = _a.sent(); return [4 /*yield*/, Promise.resolve() .then(function () { return __awaiter(_this, void 0, void 0, function () { var incomint_values; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(values !== undefined)) return [3 /*break*/, 2]; incomint_values = values.map(____serializer); return [4 /*yield*/, inst_client.query(text, incomint_values)]; case 1: // @ts-ignore return [2 /*return*/, _a.sent()]; case 2: return [4 /*yield*/, inst_client.query(text)]; case 3: return [2 /*return*/, _a.sent()]; } }); }); }) .catch(function (e) { e.sql = text; e.values = values; return Promise.reject(e); }) .finally(function () { return inst_client.release(); })]; case 2: return [2 /*return*/, _a.sent()]; } }); }); }; PGDelegate.prototype.exec = function (text, values) { return __awaiter(this, void 0, void 0, function () { var pool, inst_client; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: pool = __PGDelegate.get(this).pool; if (!pool) throw new Error("Postgres connection has been dropped!"); return [4 /*yield*/, pool.connect()]; case 1: inst_client = _a.sent(); return [4 /*yield*/, Promise.resolve() .then(function () { return __awaiter(_this, void 0, void 0, function () { var result, incomint_values, final_sql; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(values !== undefined)) return [3 /*break*/, 2]; result = ParseVarMap(text, values || {}); incomint_values = result.values.map(____serializer); final_sql = PGFormat.apply(void 0, __spreadArray([result.sql], incomint_values, false)); return [4 /*yield*/, inst_client.query(final_sql)]; case 1: return [2 /*return*/, _a.sent()]; case 2: return [4 /*yield*/, inst_client.query(text)]; case 3: return [2 /*return*/, _a.sent()]; } }); }); }) .catch(function (e) { e.sql = text; e.values = values; return Promise.reject(e); }) .finally(function () { return inst_client.release(); })]; case 2: return [2 /*return*/, _a.sent()]; } }); }); }; return PGDelegate; }()); exports.PGDelegate = PGDelegate; ; var PGTypes; (function (PGTypes) { PGTypes[PGTypes["BOOL"] = 16] = "BOOL"; PGTypes[PGTypes["BYTEA"] = 17] = "BYTEA"; PGTypes[PGTypes["CHAR"] = 18] = "CHAR"; PGTypes[PGTypes["INT8"] = 20] = "INT8"; PGTypes[PGTypes["INT2"] = 21] = "INT2"; PGTypes[PGTypes["INT4"] = 23] = "INT4"; PGTypes[PGTypes["REGPROC"] = 24] = "REGPROC"; PGTypes[PGTypes["TEXT"] = 25] = "TEXT"; PGTypes[PGTypes["OID"] = 26] = "OID"; PGTypes[PGTypes["TID"] = 27] = "TID"; PGTypes[PGTypes["XID"] = 28] = "XID"; PGTypes[PGTypes["CID"] = 29] = "CID"; PGTypes[PGTypes["JSON"] = 114] = "JSON"; PGTypes[PGTypes["XML"] = 142] = "XML"; PGTypes[PGTypes["PG_NODE_TREE"] = 194] = "PG_NODE_TREE"; PGTypes[PGTypes["SMGR"] = 210] = "SMGR"; PGTypes[PGTypes["PATH"] = 602] = "PATH"; PGTypes[PGTypes["POLYGON"] = 604] = "POLYGON"; PGTypes[PGTypes["CIDR"] = 650] = "CIDR"; PGTypes[PGTypes["FLOAT4"] = 700] = "FLOAT4"; PGTypes[PGTypes["FLOAT8"] = 701] = "FLOAT8"; PGTypes[PGTypes["ABSTIME"] = 702] = "ABSTIME"; PGTypes[PGTypes["RELTIME"] = 703] = "RELTIME"; PGTypes[PGTypes["TINTERVAL"] = 704] = "TINTERVAL"; PGTypes[PGTypes["CIRCLE"] = 718] = "CIRCLE"; PGTypes[PGTypes["MACADDR8"] = 774] = "MACADDR8"; PGTypes[PGTypes["MONEY"] = 790] = "MONEY"; PGTypes[PGTypes["MACADDR"] = 829] = "MACADDR"; PGTypes[PGTypes["INET"] = 869] = "INET"; PGTypes[PGTypes["ACLITEM"] = 1033] = "ACLITEM"; PGTypes[PGTypes["BPCHAR"] = 1042] = "BPCHAR"; PGTypes[PGTypes["VARCHAR"] = 1043] = "VARCHAR"; PGTypes[PGTypes["DATE"] = 1082] = "DATE"; PGTypes[PGTypes["TIME"] = 1083] = "TIME"; PGTypes[PGTypes["TIMESTAMP"] = 1114] = "TIMESTAMP"; PGTypes[PGTypes["TIMESTAMPTZ"] = 1184] = "TIMESTAMPTZ"; PGTypes[PGTypes["INTERVAL"] = 1186] = "INTERVAL"; PGTypes[PGTypes["TIMETZ"] = 1266] = "TIMETZ"; PGTypes[PGTypes["BIT"] = 1560] = "BIT"; PGTypes[PGTypes["VARBIT"] = 1562] = "VARBIT"; PGTypes[PGTypes["NUMERIC"] = 1700] = "NUMERIC"; PGTypes[PGTypes["REFCURSOR"] = 1790] = "REFCURSOR"; PGTypes[PGTypes["REGPROCEDURE"] = 2202] = "REGPROCEDURE"; PGTypes[PGTypes["REGOPER"] = 2203] = "REGOPER"; PGTypes[PGTypes["REGOPERATOR"] = 2204] = "REGOPERATOR"; PGTypes[PGTypes["REGCLASS"] = 2205] = "REGCLASS"; PGTypes[PGTypes["REGTYPE"] = 2206] = "REGTYPE"; PGTypes[PGTypes["UUID"] = 2950] = "UUID"; PGTypes[PGTypes["TXID_SNAPSHOT"] = 2970] = "TXID_SNAPSHOT"; PGTypes[PGTypes["PG_LSN"] = 3220] = "PG_LSN"; PGTypes[PGTypes["PG_NDISTINCT"] = 3361] = "PG_NDISTINCT"; PGTypes[PGTypes["PG_DEPENDENCIES"] = 3402] = "PG_DEPENDENCIES"; PGTypes[PGTypes["TSVECTOR"] = 3614] = "TSVECTOR"; PGTypes[PGTypes["TSQUERY"] = 3615] = "TSQUERY"; PGTypes[PGTypes["GTSVECTOR"] = 3642] = "GTSVECTOR"; PGTypes[PGTypes["REGCONFIG"] = 3734] = "REGCONFIG"; PGTypes[PGTypes["REGDICTIONARY"] = 3769] = "REGDICTIONARY"; PGTypes[PGTypes["JSONB"] = 3802] = "JSONB"; PGTypes[PGTypes["REGNAMESPACE"] = 4089] = "REGNAMESPACE"; PGTypes[PGTypes["REGROLE"] = 4096] = "REGROLE"; })(PGTypes || (exports.PGTypes = PGTypes = {})); exports.default = PGDelegate; function ParseVarMap(sql, data) { var i = 0, parsed = '', values = []; while (i < sql.length) { switch (sql[i]) { case "\\": { var _a = EatEscape(sql, i), idx = _a.idx, parts = _a.parts; i = idx; parsed += parts; break; } case "{": { var _b = EatValue(sql, i), idx = _b.idx, key = _b.key; var value = data[key]; if (value === undefined) { throw Object.assign(new RangeError("Unable to locate value key \"".concat(key, "\" in data map!")), { sql: sql, data: data }); } values.push(value); i = idx; parsed += ((value instanceof BigInt) || (typeof value === "bigint")) ? '%s' : '%L'; break; } case "[": { var _c = EatColumn(sql, i), idx = _c.idx, key = _c.key; if (data[key] === undefined) { throw Object.assign(new RangeError("Unable to locate column key \"".concat(key, "\" in data map!")), { sql: sql, data: data }); } values.push(data[key]); i = idx; parsed += '%I'; break; } default: { parsed += sql[i++]; break; } } } return { sql: parsed, values: values }; } function EatEscape(sql, idx) { var str = sql.substring(idx, idx + 2); switch (str) { case "\\\\": str = "\\"; break; case "\\{": str = "{"; break; case "\\[": str = "["; break; default: break; } return { parts: str, idx: idx + 2 }; } function EatValue(sql, idx) { var to = idx; while (to < sql.length) { if (sql[to] === "}") break; to++; } if (to === idx + 1) throw Object.assign(new SyntaxError("Missing key name near offset ".concat(idx, "!")), { sql: sql }); if (to === sql.length) throw Object.assign(new SyntaxError("Missing closing operator '}' near offset ".concat(idx, "!")), { sql: sql }); return { idx: to + 1, key: sql.substring(idx + 1, to) }; } function EatColumn(sql, idx) { var to = idx; while (to < sql.length) { if (sql[to] === "]") break; to++; } if (to === idx + 1) throw Object.assign(new SyntaxError("Missing key name near offset ".concat(idx, "!")), { sql: sql }); if (to === sql.length) throw Object.assign(new SyntaxError("Missing closing operator ']' near offset ".concat(idx, "!"))); return { idx: to + 1, key: sql.substring(idx + 1, to) }; }