@take-out/postgres 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/dist/cjs/build.native.js +0 -29
- package/dist/cjs/build.native.js.map +0 -1
- package/dist/cjs/cli.native.js +0 -164
- package/dist/cjs/cli.native.js.map +0 -1
- package/dist/cjs/createServerHelpers.native.js +0 -43
- package/dist/cjs/createServerHelpers.native.js.map +0 -1
- package/dist/cjs/helpers/chunkedQuery.cjs +0 -60
- package/dist/cjs/helpers/chunkedQuery.js +0 -51
- package/dist/cjs/helpers/chunkedQuery.js.map +0 -6
- package/dist/cjs/helpers/chunkedQuery.native.js +0 -73
- package/dist/cjs/helpers/chunkedQuery.native.js.map +0 -1
- package/dist/cjs/helpers/getDBClient.cjs +0 -172
- package/dist/cjs/helpers/getDBClient.js +0 -179
- package/dist/cjs/helpers/getDBClient.js.map +0 -6
- package/dist/cjs/helpers/getDBClient.native.js +0 -189
- package/dist/cjs/helpers/getDBClient.native.js.map +0 -1
- package/dist/cjs/index.native.js +0 -64
- package/dist/cjs/index.native.js.map +0 -1
- package/dist/cjs/migrate.native.js +0 -185
- package/dist/cjs/migrate.native.js.map +0 -1
- package/dist/cjs/scripts/build-migrations.native.js +0 -86
- package/dist/cjs/scripts/build-migrations.native.js.map +0 -1
- package/dist/cjs/scripts/drizzle-migrations-sync.native.js +0 -209
- package/dist/cjs/scripts/drizzle-migrations-sync.native.js.map +0 -1
- package/dist/cjs/scripts/migration-add.native.js +0 -72
- package/dist/cjs/scripts/migration-add.native.js.map +0 -1
- package/dist/cjs/scripts/pg_dump.native.js +0 -55
- package/dist/cjs/scripts/pg_dump.native.js.map +0 -1
- package/dist/cjs/scripts/psql.native.js +0 -56
- package/dist/cjs/scripts/psql.native.js.map +0 -1
- package/dist/cjs/sql.native.js +0 -49
- package/dist/cjs/sql.native.js.map +0 -1
- package/dist/esm/build.native.js +0 -3
- package/dist/esm/build.native.js.map +0 -1
- package/dist/esm/cli.native.js +0 -162
- package/dist/esm/cli.native.js.map +0 -1
- package/dist/esm/createServerHelpers.native.js +0 -17
- package/dist/esm/createServerHelpers.native.js.map +0 -1
- package/dist/esm/helpers/chunkedQuery.js +0 -35
- package/dist/esm/helpers/chunkedQuery.js.map +0 -6
- package/dist/esm/helpers/chunkedQuery.mjs +0 -36
- package/dist/esm/helpers/chunkedQuery.mjs.map +0 -1
- package/dist/esm/helpers/chunkedQuery.native.js +0 -46
- package/dist/esm/helpers/chunkedQuery.native.js.map +0 -1
- package/dist/esm/helpers/getDBClient.js +0 -155
- package/dist/esm/helpers/getDBClient.js.map +0 -6
- package/dist/esm/helpers/getDBClient.mjs +0 -136
- package/dist/esm/helpers/getDBClient.mjs.map +0 -1
- package/dist/esm/helpers/getDBClient.native.js +0 -150
- package/dist/esm/helpers/getDBClient.native.js.map +0 -1
- package/dist/esm/index.native.js +0 -20
- package/dist/esm/index.native.js.map +0 -1
- package/dist/esm/migrate.native.js +0 -159
- package/dist/esm/migrate.native.js.map +0 -1
- package/dist/esm/scripts/build-migrations.native.js +0 -49
- package/dist/esm/scripts/build-migrations.native.js.map +0 -1
- package/dist/esm/scripts/drizzle-migrations-sync.native.js +0 -183
- package/dist/esm/scripts/drizzle-migrations-sync.native.js.map +0 -1
- package/dist/esm/scripts/migration-add.native.js +0 -46
- package/dist/esm/scripts/migration-add.native.js.map +0 -1
- package/dist/esm/scripts/pg_dump.native.js +0 -29
- package/dist/esm/scripts/pg_dump.native.js.map +0 -1
- package/dist/esm/scripts/psql.native.js +0 -30
- package/dist/esm/scripts/psql.native.js.map +0 -1
- package/dist/esm/sql.native.js +0 -21
- package/dist/esm/sql.native.js.map +0 -1
- package/types/helpers/chunkedQuery.d.ts +0 -17
- package/types/helpers/chunkedQuery.d.ts.map +0 -1
- package/types/helpers/getDBClient.d.ts +0 -11
- package/types/helpers/getDBClient.d.ts.map +0 -1
package/dist/esm/cli.native.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { defineCommand, runMain } from "citty";
|
|
4
|
-
import { buildMigrations as buildMigrationsRun } from "./scripts/build-migrations.native.js";
|
|
5
|
-
import { syncDrizzleMigrations } from "./scripts/drizzle-migrations-sync.native.js";
|
|
6
|
-
import { addMigration } from "./scripts/migration-add.native.js";
|
|
7
|
-
import { runPgDump } from "./scripts/pg_dump.native.js";
|
|
8
|
-
import { runPsql } from "./scripts/psql.native.js";
|
|
9
|
-
var syncDrizzle = defineCommand({
|
|
10
|
-
meta: {
|
|
11
|
-
name: "sync-drizzle",
|
|
12
|
-
description: "Sync Drizzle SQL migrations to TypeScript wrappers"
|
|
13
|
-
},
|
|
14
|
-
args: {
|
|
15
|
-
dir: {
|
|
16
|
-
type: "string",
|
|
17
|
-
description: "Migrations directory",
|
|
18
|
-
required: !1,
|
|
19
|
-
default: "./src/database/migrations"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
async run(param) {
|
|
23
|
-
var {
|
|
24
|
-
args
|
|
25
|
-
} = param,
|
|
26
|
-
migrationsDir = join(process.cwd(), args.dir);
|
|
27
|
-
console.info(`Syncing migrations in ${migrationsDir}`), await syncDrizzleMigrations({
|
|
28
|
-
migrationsDir
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}),
|
|
32
|
-
buildMigrations = defineCommand({
|
|
33
|
-
meta: {
|
|
34
|
-
name: "build-migrations",
|
|
35
|
-
description: "Build migration bundle for deployment"
|
|
36
|
-
},
|
|
37
|
-
args: {
|
|
38
|
-
dir: {
|
|
39
|
-
type: "string",
|
|
40
|
-
description: "Migrations directory",
|
|
41
|
-
required: !1,
|
|
42
|
-
default: "./src/database/migrations"
|
|
43
|
-
},
|
|
44
|
-
out: {
|
|
45
|
-
type: "string",
|
|
46
|
-
description: "Output file name",
|
|
47
|
-
required: !1,
|
|
48
|
-
default: "migrate-dist.js"
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
async run(param) {
|
|
52
|
-
var {
|
|
53
|
-
args
|
|
54
|
-
} = param,
|
|
55
|
-
migrationsDir = join(process.cwd(), args.dir);
|
|
56
|
-
await buildMigrationsRun({
|
|
57
|
-
migrationsDir,
|
|
58
|
-
outFile: args.out
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}),
|
|
62
|
-
migrationAdd = defineCommand({
|
|
63
|
-
meta: {
|
|
64
|
-
name: "migrate:add",
|
|
65
|
-
description: "Create a new custom TypeScript migration"
|
|
66
|
-
},
|
|
67
|
-
args: {
|
|
68
|
-
name: {
|
|
69
|
-
type: "positional",
|
|
70
|
-
description: "Migration name",
|
|
71
|
-
required: !1
|
|
72
|
-
},
|
|
73
|
-
dir: {
|
|
74
|
-
type: "string",
|
|
75
|
-
description: "Migrations directory",
|
|
76
|
-
required: !1,
|
|
77
|
-
default: "./src/database/migrations"
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
async run(param) {
|
|
81
|
-
var {
|
|
82
|
-
args
|
|
83
|
-
} = param,
|
|
84
|
-
migrationsDir = join(process.cwd(), args.dir);
|
|
85
|
-
addMigration({
|
|
86
|
-
migrationsDir,
|
|
87
|
-
name: args.name
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}),
|
|
91
|
-
psql = defineCommand({
|
|
92
|
-
meta: {
|
|
93
|
-
name: "psql",
|
|
94
|
-
description: "Connect to PostgreSQL database with psql"
|
|
95
|
-
},
|
|
96
|
-
args: {
|
|
97
|
-
connectionString: {
|
|
98
|
-
type: "string",
|
|
99
|
-
description: "PostgreSQL connection string",
|
|
100
|
-
required: !1
|
|
101
|
-
},
|
|
102
|
-
query: {
|
|
103
|
-
type: "string",
|
|
104
|
-
description: "Query to execute",
|
|
105
|
-
required: !1
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
async run(param) {
|
|
109
|
-
var {
|
|
110
|
-
args
|
|
111
|
-
} = param,
|
|
112
|
-
connectionString = args.connectionString || process.env.ZERO_UPSTREAM_DB;
|
|
113
|
-
connectionString || (console.error("No connection string provided. Set ZERO_UPSTREAM_DB or pass --connectionString"), process.exit(1));
|
|
114
|
-
var exitCode = runPsql({
|
|
115
|
-
connectionString,
|
|
116
|
-
query: args.query
|
|
117
|
-
});
|
|
118
|
-
process.exit(exitCode || 0);
|
|
119
|
-
}
|
|
120
|
-
}),
|
|
121
|
-
pgDump = defineCommand({
|
|
122
|
-
meta: {
|
|
123
|
-
name: "pg_dump",
|
|
124
|
-
description: "Dump PostgreSQL database using pg_dump"
|
|
125
|
-
},
|
|
126
|
-
args: {
|
|
127
|
-
connectionString: {
|
|
128
|
-
type: "string",
|
|
129
|
-
description: "PostgreSQL connection string",
|
|
130
|
-
required: !1
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
async run(param) {
|
|
134
|
-
var {
|
|
135
|
-
args
|
|
136
|
-
} = param,
|
|
137
|
-
connectionString = args.connectionString || process.env.ZERO_UPSTREAM_DB;
|
|
138
|
-
connectionString || (console.error("No connection string provided. Set ZERO_UPSTREAM_DB or pass --connectionString"), process.exit(1));
|
|
139
|
-
var cliArgs = process.argv.slice(3),
|
|
140
|
-
exitCode = runPgDump({
|
|
141
|
-
connectionString,
|
|
142
|
-
args: cliArgs
|
|
143
|
-
});
|
|
144
|
-
process.exit(exitCode || 0);
|
|
145
|
-
}
|
|
146
|
-
}),
|
|
147
|
-
main = defineCommand({
|
|
148
|
-
meta: {
|
|
149
|
-
name: "postgres",
|
|
150
|
-
description: "PostgreSQL database utilities and migration tools",
|
|
151
|
-
version: "0.0.1"
|
|
152
|
-
},
|
|
153
|
-
subCommands: {
|
|
154
|
-
"sync-drizzle": syncDrizzle,
|
|
155
|
-
"build-migrations": buildMigrations,
|
|
156
|
-
"migrate:add": migrationAdd,
|
|
157
|
-
psql,
|
|
158
|
-
pg_dump: pgDump
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
runMain(main);
|
|
162
|
-
//# sourceMappingURL=cli.native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["join","defineCommand","runMain","buildMigrations","buildMigrationsRun","syncDrizzleMigrations","addMigration","runPgDump","runPsql","syncDrizzle","meta","name","description","args","dir","type","required","default","run","param","migrationsDir","process","cwd","console","info","out","outFile","migrationAdd","psql","connectionString","query","env","ZERO_UPSTREAM_DB","error","exit","exitCode","pgDump","cliArgs","argv","slice","main","version","subCommands"],"sources":["../../src/cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { getDBClient } from "./helpers/getDBClient.native.js";
|
|
2
|
-
import { createSql, setDefaultPool } from "./sql.native.js";
|
|
3
|
-
function createServerHelpers(pool) {
|
|
4
|
-
var sql = createSql(pool);
|
|
5
|
-
return setDefaultPool(pool), {
|
|
6
|
-
sql,
|
|
7
|
-
getDBClient: function () {
|
|
8
|
-
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
9
|
-
return getDBClient({
|
|
10
|
-
pool,
|
|
11
|
-
...options
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
export { createServerHelpers };
|
|
17
|
-
//# sourceMappingURL=createServerHelpers.native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["getDBClient","createSql","setDefaultPool","createServerHelpers","pool","sql","options","arguments","length"],"sources":["../../src/createServerHelpers.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,WAAA,QAA4C;AACrD,SAASC,SAAA,EAAWC,cAAA,QAAsB;AAWnC,SAASC,oBAAoBC,IAAA,EAA2B;EAC7D,IAAAC,GAAM,GAAAJ,SAAM,CAAAG,IAAU;EACtB,OAAAF,cAAA,CAAeE,IAAI,GAEZ;IACLC,GAAA;IACAL,WAAA,EAAa,SAAAA,CAAA,EAAW;MAC1B,IAAAM,OAAA,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,iBAAAA,SAAA;MACF,OAAAP,WAAA","ignoreList":[]}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
async function processInChunks(client, query, processor, options = {}) {
|
|
2
|
-
const { chunkSize = 1e3, onProgress } = options;
|
|
3
|
-
let offset = 0, hasMore = !0, totalProcessed = 0;
|
|
4
|
-
const countQuery = query.replace(/SELECT .+ FROM/, "SELECT COUNT(*) FROM").replace(/ORDER BY .+/, ""), countResult = await client.query(countQuery), totalCount = Number.parseInt(countResult.rows[0].count, 10);
|
|
5
|
-
for (; hasMore; ) {
|
|
6
|
-
const paginatedQuery = `${query} LIMIT ${chunkSize} OFFSET ${offset}`, result = await client.query(paginatedQuery);
|
|
7
|
-
if (result.rows.length === 0) {
|
|
8
|
-
hasMore = !1;
|
|
9
|
-
break;
|
|
10
|
-
}
|
|
11
|
-
await processor(result.rows), totalProcessed += result.rows.length, offset += chunkSize, onProgress && onProgress(totalProcessed, totalCount), result.rows.length < chunkSize && (hasMore = !1);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
async function updateInChunks(client, tableName, selectQuery, transformer, options = {}) {
|
|
15
|
-
let totalUpdated = 0;
|
|
16
|
-
return await processInChunks(
|
|
17
|
-
client,
|
|
18
|
-
selectQuery,
|
|
19
|
-
async (rows) => {
|
|
20
|
-
for (const row of rows) {
|
|
21
|
-
const updates = await transformer(row);
|
|
22
|
-
if (updates && Object.keys(updates).length > 0) {
|
|
23
|
-
const setClause = Object.keys(updates).map((key, index) => `${key} = $${index + 2}`).join(", "), values = [row.id, ...Object.values(updates)];
|
|
24
|
-
await client.query(`UPDATE ${tableName} SET ${setClause} WHERE id = $1`, values), totalUpdated++;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
options
|
|
29
|
-
), totalUpdated;
|
|
30
|
-
}
|
|
31
|
-
export {
|
|
32
|
-
processInChunks,
|
|
33
|
-
updateInChunks
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=chunkedQuery.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/helpers/chunkedQuery.ts"],
|
|
4
|
-
"mappings": "AAUA,eAAsB,gBACpB,QACA,OACA,WACA,UAA+B,CAAC,GACjB;AACf,QAAM,EAAE,YAAY,KAAM,WAAW,IAAI;AACzC,MAAI,SAAS,GACT,UAAU,IACV,iBAAiB;AAGrB,QAAM,aAAa,MAChB,QAAQ,kBAAkB,sBAAsB,EAChD,QAAQ,eAAe,EAAE,GACtB,cAAc,MAAM,OAAO,MAAM,UAAU,GAC3C,aAAa,OAAO,SAAS,YAAY,KAAK,CAAC,EAAE,OAAO,EAAE;AAEhE,SAAO,WAAS;AACd,UAAM,iBAAiB,GAAG,KAAK,UAAU,SAAS,WAAW,MAAM,IAC7D,SAAS,MAAM,OAAO,MAAS,cAAc;AAEnD,QAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,IAAI,GAE3B,kBAAkB,OAAO,KAAK,QAC9B,UAAU,WAEN,cACF,WAAW,gBAAgB,UAAU,GAInC,OAAO,KAAK,SAAS,cACvB,UAAU;AAAA,EAEd;AACF;AAKA,eAAsB,eACpB,QACA,WACA,aACA,aACA,UAA+B,CAAC,GACf;AACjB,MAAI,eAAe;AAEnB,eAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO,SAAS;AACd,iBAAW,OAAO,MAAM;AACtB,cAAM,UAAU,MAAM,YAAY,GAAG;AAErC,YAAI,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AAE9C,gBAAM,YAAY,OAAO,KAAK,OAAO,EAClC,IAAI,CAAC,KAAK,UAAU,GAAG,GAAG,OAAO,QAAQ,CAAC,EAAE,EAC5C,KAAK,IAAI,GAEN,SAAS,CAAC,IAAI,IAAI,GAAG,OAAO,OAAO,OAAO,CAAC;AAEjD,gBAAM,OAAO,MAAM,UAAU,SAAS,QAAQ,SAAS,kBAAkB,MAAM,GAE/E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,EACF,GAEO;AACT;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
async function processInChunks(client, query, processor, options = {}) {
|
|
2
|
-
const {
|
|
3
|
-
chunkSize = 1e3,
|
|
4
|
-
onProgress
|
|
5
|
-
} = options;
|
|
6
|
-
let offset = 0,
|
|
7
|
-
hasMore = !0,
|
|
8
|
-
totalProcessed = 0;
|
|
9
|
-
const countQuery = query.replace(/SELECT .+ FROM/, "SELECT COUNT(*) FROM").replace(/ORDER BY .+/, ""),
|
|
10
|
-
countResult = await client.query(countQuery),
|
|
11
|
-
totalCount = Number.parseInt(countResult.rows[0].count, 10);
|
|
12
|
-
for (; hasMore;) {
|
|
13
|
-
const paginatedQuery = `${query} LIMIT ${chunkSize} OFFSET ${offset}`,
|
|
14
|
-
result = await client.query(paginatedQuery);
|
|
15
|
-
if (result.rows.length === 0) {
|
|
16
|
-
hasMore = !1;
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
await processor(result.rows), totalProcessed += result.rows.length, offset += chunkSize, onProgress && onProgress(totalProcessed, totalCount), result.rows.length < chunkSize && (hasMore = !1);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async function updateInChunks(client, tableName, selectQuery, transformer, options = {}) {
|
|
23
|
-
let totalUpdated = 0;
|
|
24
|
-
return await processInChunks(client, selectQuery, async rows => {
|
|
25
|
-
for (const row of rows) {
|
|
26
|
-
const updates = await transformer(row);
|
|
27
|
-
if (updates && Object.keys(updates).length > 0) {
|
|
28
|
-
const setClause = Object.keys(updates).map((key, index) => `${key} = $${index + 2}`).join(", "),
|
|
29
|
-
values = [row.id, ...Object.values(updates)];
|
|
30
|
-
await client.query(`UPDATE ${tableName} SET ${setClause} WHERE id = $1`, values), totalUpdated++;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}, options), totalUpdated;
|
|
34
|
-
}
|
|
35
|
-
export { processInChunks, updateInChunks };
|
|
36
|
-
//# sourceMappingURL=chunkedQuery.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["processInChunks","client","query","processor","options","chunkSize","onProgress","offset","hasMore","totalProcessed","countQuery","replace","countResult","totalCount","Number","parseInt","rows","count","paginatedQuery","result","length","updateInChunks","tableName","selectQuery","transformer","totalUpdated","row","updates","Object","keys","setClause","map","key","index","join","values","id"],"sources":["../../../src/helpers/chunkedQuery.ts"],"sourcesContent":[null],"mappings":"AAUA,eAAsBA,gBACpBC,MAAA,EACAC,KAAA,EACAC,SAAA,EACAC,OAAA,GAA+B,CAAC,GACjB;EACf,MAAM;IAAEC,SAAA,GAAY;IAAMC;EAAW,IAAIF,OAAA;EACzC,IAAIG,MAAA,GAAS;IACTC,OAAA,GAAU;IACVC,cAAA,GAAiB;EAGrB,MAAMC,UAAA,GAAaR,KAAA,CAChBS,OAAA,CAAQ,kBAAkB,sBAAsB,EAChDA,OAAA,CAAQ,eAAe,EAAE;IACtBC,WAAA,GAAc,MAAMX,MAAA,CAAOC,KAAA,CAAMQ,UAAU;IAC3CG,UAAA,GAAaC,MAAA,CAAOC,QAAA,CAASH,WAAA,CAAYI,IAAA,CAAK,CAAC,EAAEC,KAAA,EAAO,EAAE;EAEhE,OAAOT,OAAA,GAAS;IACd,MAAMU,cAAA,GAAiB,GAAGhB,KAAK,UAAUG,SAAS,WAAWE,MAAM;MAC7DY,MAAA,GAAS,MAAMlB,MAAA,CAAOC,KAAA,CAASgB,cAAc;IAEnD,IAAIC,MAAA,CAAOH,IAAA,CAAKI,MAAA,KAAW,GAAG;MAC5BZ,OAAA,GAAU;MACV;IACF;IAEA,MAAML,SAAA,CAAUgB,MAAA,CAAOH,IAAI,GAE3BP,cAAA,IAAkBU,MAAA,CAAOH,IAAA,CAAKI,MAAA,EAC9Bb,MAAA,IAAUF,SAAA,EAENC,UAAA,IACFA,UAAA,CAAWG,cAAA,EAAgBI,UAAU,GAInCM,MAAA,CAAOH,IAAA,CAAKI,MAAA,GAASf,SAAA,KACvBG,OAAA,GAAU;EAEd;AACF;AAKA,eAAsBa,eACpBpB,MAAA,EACAqB,SAAA,EACAC,WAAA,EACAC,WAAA,EACApB,OAAA,GAA+B,CAAC,GACf;EACjB,IAAIqB,YAAA,GAAe;EAEnB,aAAMzB,eAAA,CACJC,MAAA,EACAsB,WAAA,EACA,MAAOP,IAAA,IAAS;IACd,WAAWU,GAAA,IAAOV,IAAA,EAAM;MACtB,MAAMW,OAAA,GAAU,MAAMH,WAAA,CAAYE,GAAG;MAErC,IAAIC,OAAA,IAAWC,MAAA,CAAOC,IAAA,CAAKF,OAAO,EAAEP,MAAA,GAAS,GAAG;QAE9C,MAAMU,SAAA,GAAYF,MAAA,CAAOC,IAAA,CAAKF,OAAO,EAClCI,GAAA,CAAI,CAACC,GAAA,EAAKC,KAAA,KAAU,GAAGD,GAAG,OAAOC,KAAA,GAAQ,CAAC,EAAE,EAC5CC,IAAA,CAAK,IAAI;UAENC,MAAA,GAAS,CAACT,GAAA,CAAIU,EAAA,EAAI,GAAGR,MAAA,CAAOO,MAAA,CAAOR,OAAO,CAAC;QAEjD,MAAM1B,MAAA,CAAOC,KAAA,CAAM,UAAUoB,SAAS,QAAQQ,SAAS,kBAAkBK,MAAM,GAE/EV,YAAA;MACF;IACF;EACF,GACArB,OACF,GAEOqB,YAAA;AACT","ignoreList":[]}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
async function processInChunks(client, query, processor) {
|
|
2
|
-
for (var options = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {}, {
|
|
3
|
-
chunkSize = 1e3,
|
|
4
|
-
onProgress
|
|
5
|
-
} = options, offset = 0, hasMore = !0, totalProcessed = 0, countQuery = query.replace(/SELECT .+ FROM/, "SELECT COUNT(*) FROM").replace(/ORDER BY .+/, ""), countResult = await client.query(countQuery), totalCount = Number.parseInt(countResult.rows[0].count, 10); hasMore;) {
|
|
6
|
-
var paginatedQuery = `${query} LIMIT ${chunkSize} OFFSET ${offset}`,
|
|
7
|
-
result = await client.query(paginatedQuery);
|
|
8
|
-
if (result.rows.length === 0) {
|
|
9
|
-
hasMore = !1;
|
|
10
|
-
break;
|
|
11
|
-
}
|
|
12
|
-
await processor(result.rows), totalProcessed += result.rows.length, offset += chunkSize, onProgress && onProgress(totalProcessed, totalCount), result.rows.length < chunkSize && (hasMore = !1);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
async function updateInChunks(client, tableName, selectQuery, transformer) {
|
|
16
|
-
var options = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : {},
|
|
17
|
-
totalUpdated = 0;
|
|
18
|
-
return await processInChunks(client, selectQuery, async function (rows) {
|
|
19
|
-
var _iteratorNormalCompletion = !0,
|
|
20
|
-
_didIteratorError = !1,
|
|
21
|
-
_iteratorError = void 0;
|
|
22
|
-
try {
|
|
23
|
-
for (var _iterator = rows[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
24
|
-
var row = _step.value,
|
|
25
|
-
updates = await transformer(row);
|
|
26
|
-
if (updates && Object.keys(updates).length > 0) {
|
|
27
|
-
var setClause = Object.keys(updates).map(function (key, index) {
|
|
28
|
-
return `${key} = $${index + 2}`;
|
|
29
|
-
}).join(", "),
|
|
30
|
-
values = [row.id, ...Object.values(updates)];
|
|
31
|
-
await client.query(`UPDATE ${tableName} SET ${setClause} WHERE id = $1`, values), totalUpdated++;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
} catch (err) {
|
|
35
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
36
|
-
} finally {
|
|
37
|
-
try {
|
|
38
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
39
|
-
} finally {
|
|
40
|
-
if (_didIteratorError) throw _iteratorError;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}, options), totalUpdated;
|
|
44
|
-
}
|
|
45
|
-
export { processInChunks, updateInChunks };
|
|
46
|
-
//# sourceMappingURL=chunkedQuery.native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["processInChunks","client","query","processor","options","arguments","length","chunkSize","onProgress","offset","hasMore","totalProcessed","countQuery","replace","countResult","totalCount","Number","parseInt","rows","count","paginatedQuery","result","updateInChunks","tableName","selectQuery","transformer","totalUpdated","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","row","value","updates","Object","keys","setClause","map","key","index","join","values","id","err"],"sources":["../../../src/helpers/chunkedQuery.ts"],"sourcesContent":[null],"mappings":"AAUA,eAAsBA,gBACpBC,MAAA,EACAC,KAAA,EACAC,SAAA,EACA;EAEA,SAAQC,OAAA,GAAAC,SAAkB,CAAAC,MAAA,GAAW,KAAID,SAAA,iBAAAA,SAAA;MAAAE,SAAA;MAAAC;IAAA,IAAAJ,OAAA,EAAAK,MAAA,MAAAC,OAAA,OAAAC,cAAA,MAAAC,UAAA,GAAAV,KAAA,CAAAW,OAAA,2CAAAA,OAAA,qBAAAC,WAAA,SAAAb,MAAA,CAAAC,KAAA,CAAAU,UAAA,GAAAG,UAAA,GAAAC,MAAA,CAAAC,QAAA,CAAAH,WAAA,CAAAI,IAAA,IAAAC,KAAA,OAAAT,OAAA;IACzC,IAAIU,cACA,MAAUlB,KACV,UAAAK,SAAiB,WAAAE,MAAA;MAAAY,MAAA,SAAApB,MAAA,CAAAC,KAAA,CAAAkB,cAAA;IAGrB,IAAMC,MAAA,CAAAH,IAAA,CAAAZ,MAAa,KAChB;MAKHI,OAAO;MACL;IAGA;IACE,MAAAP,SAAU,CAAAkB,MAAA,CAAAH,IAAA,GAAAP,cAAA,IAAAU,MAAA,CAAAH,IAAA,CAAAZ,MAAA,EAAAG,MAAA,IAAAF,SAAA,EAAAC,UAAA,IAAAA,UAAA,CAAAG,cAAA,EAAAI,UAAA,GAAAM,MAAA,CAAAH,IAAA,CAAAZ,MAAA,GAAAC,SAAA,KAAAG,OAAA;EACV;AAAA;AAGF,eAAMY,cAAiBA,CAAArB,MAEvB,EAAAsB,SAAA,EAAAC,WAAyB,EAAAC,WACzB;EAUF,IAAArB,OAAA,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,iBAAAA,SAAA;IAAAqB,YAAA;EACF,aAAA1B,eAAA,CAAAC,MAAA,EAAAuB,WAAA,kBAAAN,IAAA;IAKA,IAAAS,yBACE,KACA;MAAAC,iBACA,KACA;MAAAC,cACA,QAAgC;IAEhC,IAAI;MAEJ,SAAMC,SAAA,GAAAZ,IAAA,CAAAa,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAN,yBAAA,IAAAM,KAAA,GAAAH,SAAA,CAAAI,IAAA,IAAAC,IAAA,GAAAR,yBAAA;QACJ,IAAAS,GAAA,GAAAH,KAAA,CAAAI,KAAA;UAAAC,OAAA,SAAAb,WAAA,CAAAW,GAAA;QACA,IAAAE,OAAA,IAAAC,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAhC,MAAA;UACA,IAAOmC,SAAS,GAAAF,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAI,GAAA,WAAAC,GAAA,EAAAC,KAAA;cACd,OAAW,GAAAD,GAAO,OAAMC,KAAA;YACtB,GAAAC,IAAM;YAAUC,MAAM,IAElBV,GAAA,CAAAW,EAAA,EAEF,GAAAR,MAAM,CAAAO,MAAY,CAAAR,OAAO,EAMzB;UAGF,MAAArC,MAAA,CAAAC,KAAA,WAAAqB,SAAA,QAAAkB,SAAA,kBAAAK,MAAA,GAAApB,YAAA;QACF;MACF;IACA,SAAAsB,GAAA;MAGKpB,iBAAA,OAAAC,cAAA,GAAAmB,GAAA;IACT","ignoreList":[]}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import pg from "pg";
|
|
2
|
-
const cache = /* @__PURE__ */ new Map(), createPoolKey = (connectionString) => connectionString, getOrCreatePoolCache = (connectionString, config) => {
|
|
3
|
-
const key = createPoolKey(connectionString);
|
|
4
|
-
return cache.has(key) || cache.set(key, {
|
|
5
|
-
pool: new pg.Pool(config),
|
|
6
|
-
maxConnections: null,
|
|
7
|
-
reservedConnections: null,
|
|
8
|
-
openedConnections: null,
|
|
9
|
-
openedConnectionsLastUpdate: null
|
|
10
|
-
}), cache.get(key);
|
|
11
|
-
};
|
|
12
|
-
async function getDBClient(options = {}) {
|
|
13
|
-
const { pool, connectionString, retries = 8 } = options;
|
|
14
|
-
if (!pool && !connectionString)
|
|
15
|
-
throw new Error("Either pool or connectionString must be provided");
|
|
16
|
-
let client = null;
|
|
17
|
-
try {
|
|
18
|
-
return client = await tryToGetNewClientFromPool(pool, connectionString, retries), client;
|
|
19
|
-
} catch (error) {
|
|
20
|
-
throw console.error("Failed to get DB client:", error), error;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
|
|
24
|
-
const { default: retry } = await import("async-retry");
|
|
25
|
-
return await retry(
|
|
26
|
-
async () => {
|
|
27
|
-
if (providedPool) {
|
|
28
|
-
console.info("Connecting to provided pool...");
|
|
29
|
-
const client2 = await providedPool.connect();
|
|
30
|
-
return console.info("Connected to pool"), client2;
|
|
31
|
-
}
|
|
32
|
-
if (!connectionString)
|
|
33
|
-
throw new Error("No connection string provided");
|
|
34
|
-
const poolCache = getOrCreatePoolCache(connectionString, {
|
|
35
|
-
connectionString,
|
|
36
|
-
connectionTimeoutMillis: 5e3,
|
|
37
|
-
// idle_session_timeout set to 35s on server, client timeout at 30s
|
|
38
|
-
// fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
|
|
39
|
-
idleTimeoutMillis: 3e4,
|
|
40
|
-
allowExitOnIdle: !0
|
|
41
|
-
});
|
|
42
|
-
console.info(`Connecting to pool ${connectionString}...`);
|
|
43
|
-
const client = await poolCache.pool.connect();
|
|
44
|
-
return console.info("Connected to pool"), client;
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
retries,
|
|
48
|
-
minTimeout: 300,
|
|
49
|
-
factor: 2,
|
|
50
|
-
maxTimeout: 8e3
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
async function queryDb(queryText, params, options = {}) {
|
|
55
|
-
let client = null;
|
|
56
|
-
try {
|
|
57
|
-
return client = await tryToGetNewClientFromPool(
|
|
58
|
-
options.pool,
|
|
59
|
-
options.connectionString,
|
|
60
|
-
options.retries || 8
|
|
61
|
-
), await client.query(queryText, params);
|
|
62
|
-
} catch (error) {
|
|
63
|
-
throw console.error("Database query failed:", {
|
|
64
|
-
query: queryText,
|
|
65
|
-
error: error instanceof Error ? error.message : String(error)
|
|
66
|
-
}), error;
|
|
67
|
-
} finally {
|
|
68
|
-
if (client && options.connectionString)
|
|
69
|
-
if (await checkForTooManyConnections(
|
|
70
|
-
client,
|
|
71
|
-
options.connectionString
|
|
72
|
-
)) {
|
|
73
|
-
const poolCache = cache.get(createPoolKey(options.connectionString));
|
|
74
|
-
client.release(), await poolCache?.pool.end(), poolCache && cache.delete(createPoolKey(options.connectionString));
|
|
75
|
-
} else
|
|
76
|
-
client.release();
|
|
77
|
-
else client && client.release();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
async function checkForTooManyConnections(client, connectionString) {
|
|
81
|
-
const poolCache = cache.get(createPoolKey(connectionString));
|
|
82
|
-
if (!poolCache) return !1;
|
|
83
|
-
const currentTime = Date.now(), openedConnectionsMaxAge = 1e4, maxConnectionsTolerance = 0.9;
|
|
84
|
-
if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
|
|
85
|
-
const [maxConnections, reservedConnections] = await getConnectionLimits(client);
|
|
86
|
-
console.info(
|
|
87
|
-
`Max connections: ${maxConnections}, Reserved connections: ${reservedConnections}`
|
|
88
|
-
), poolCache.maxConnections = maxConnections, poolCache.reservedConnections = reservedConnections;
|
|
89
|
-
}
|
|
90
|
-
if (poolCache.openedConnections === null || poolCache.openedConnectionsLastUpdate === null || currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
|
|
91
|
-
const openedConnections = await getOpenedConnections(client, connectionString);
|
|
92
|
-
poolCache.openedConnections = openedConnections, poolCache.openedConnectionsLastUpdate = currentTime;
|
|
93
|
-
}
|
|
94
|
-
return poolCache.openedConnections > (poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance ? (console.warn(
|
|
95
|
-
`Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`
|
|
96
|
-
), !0) : !1;
|
|
97
|
-
}
|
|
98
|
-
async function getConnectionLimits(client) {
|
|
99
|
-
console.info("Getting connection limits...");
|
|
100
|
-
const maxConnectionsResult = await client.query("SHOW max_connections"), reservedConnectionResult = await client.query(
|
|
101
|
-
"SHOW superuser_reserved_connections"
|
|
102
|
-
);
|
|
103
|
-
return [
|
|
104
|
-
Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10),
|
|
105
|
-
Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10)
|
|
106
|
-
];
|
|
107
|
-
}
|
|
108
|
-
async function getOpenedConnections(client, connectionString) {
|
|
109
|
-
const dbName = new URL(connectionString).pathname.slice(1);
|
|
110
|
-
console.info("Getting opened connections...");
|
|
111
|
-
const openConnectionsResult = await client.query(
|
|
112
|
-
"SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1",
|
|
113
|
-
[dbName]
|
|
114
|
-
), result = Number.parseInt(
|
|
115
|
-
openConnectionsResult.rows[0]?.opened_connections || 0,
|
|
116
|
-
10
|
|
117
|
-
);
|
|
118
|
-
return console.info(`Opened connections: ${result}`), result;
|
|
119
|
-
}
|
|
120
|
-
async function getNewClient(options = {}) {
|
|
121
|
-
const { connectionString } = options;
|
|
122
|
-
if (!connectionString)
|
|
123
|
-
throw new Error("connectionString is required for getNewClient");
|
|
124
|
-
try {
|
|
125
|
-
return await tryToGetNewClient(connectionString);
|
|
126
|
-
} catch (error) {
|
|
127
|
-
throw console.error("Failed to get new client:", error), error;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
async function tryToGetNewClient(connectionString) {
|
|
131
|
-
const configurations = {
|
|
132
|
-
connectionString,
|
|
133
|
-
connectionTimeoutMillis: 5e3,
|
|
134
|
-
idleTimeoutMillis: 3e4,
|
|
135
|
-
allowExitOnIdle: !0
|
|
136
|
-
}, { default: retry } = await import("async-retry");
|
|
137
|
-
return await retry(
|
|
138
|
-
async () => {
|
|
139
|
-
const newClient = new pg.Client(configurations);
|
|
140
|
-
return await newClient.connect(), newClient;
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
retries: 10,
|
|
144
|
-
minTimeout: 100,
|
|
145
|
-
factor: 2,
|
|
146
|
-
maxTimeout: 5e3
|
|
147
|
-
}
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
export {
|
|
151
|
-
getDBClient,
|
|
152
|
-
getNewClient,
|
|
153
|
-
queryDb
|
|
154
|
-
};
|
|
155
|
-
//# sourceMappingURL=getDBClient.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/helpers/getDBClient.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": ["client"]
|
|
6
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import pg from "pg";
|
|
2
|
-
const cache = /* @__PURE__ */new Map(),
|
|
3
|
-
createPoolKey = connectionString => connectionString,
|
|
4
|
-
getOrCreatePoolCache = (connectionString, config) => {
|
|
5
|
-
const key = createPoolKey(connectionString);
|
|
6
|
-
return cache.has(key) || cache.set(key, {
|
|
7
|
-
pool: new pg.Pool(config),
|
|
8
|
-
maxConnections: null,
|
|
9
|
-
reservedConnections: null,
|
|
10
|
-
openedConnections: null,
|
|
11
|
-
openedConnectionsLastUpdate: null
|
|
12
|
-
}), cache.get(key);
|
|
13
|
-
};
|
|
14
|
-
async function getDBClient(options = {}) {
|
|
15
|
-
const {
|
|
16
|
-
pool,
|
|
17
|
-
connectionString,
|
|
18
|
-
retries = 8
|
|
19
|
-
} = options;
|
|
20
|
-
if (!pool && !connectionString) throw new Error("Either pool or connectionString must be provided");
|
|
21
|
-
let client = null;
|
|
22
|
-
try {
|
|
23
|
-
return client = await tryToGetNewClientFromPool(pool, connectionString, retries), client;
|
|
24
|
-
} catch (error) {
|
|
25
|
-
throw console.error("Failed to get DB client:", error), error;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
|
|
29
|
-
const {
|
|
30
|
-
default: retry
|
|
31
|
-
} = await import("async-retry");
|
|
32
|
-
return await retry(async () => {
|
|
33
|
-
if (providedPool) {
|
|
34
|
-
console.info("Connecting to provided pool...");
|
|
35
|
-
const client2 = await providedPool.connect();
|
|
36
|
-
return console.info("Connected to pool"), client2;
|
|
37
|
-
}
|
|
38
|
-
if (!connectionString) throw new Error("No connection string provided");
|
|
39
|
-
const poolCache = getOrCreatePoolCache(connectionString, {
|
|
40
|
-
connectionString,
|
|
41
|
-
connectionTimeoutMillis: 5e3,
|
|
42
|
-
// idle_session_timeout set to 35s on server, client timeout at 30s
|
|
43
|
-
// fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
|
|
44
|
-
idleTimeoutMillis: 3e4,
|
|
45
|
-
allowExitOnIdle: !0
|
|
46
|
-
});
|
|
47
|
-
console.info(`Connecting to pool ${connectionString}...`);
|
|
48
|
-
const client = await poolCache.pool.connect();
|
|
49
|
-
return console.info("Connected to pool"), client;
|
|
50
|
-
}, {
|
|
51
|
-
retries,
|
|
52
|
-
minTimeout: 300,
|
|
53
|
-
factor: 2,
|
|
54
|
-
maxTimeout: 8e3
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
async function queryDb(queryText, params, options = {}) {
|
|
58
|
-
let client = null;
|
|
59
|
-
try {
|
|
60
|
-
return client = await tryToGetNewClientFromPool(options.pool, options.connectionString, options.retries || 8), await client.query(queryText, params);
|
|
61
|
-
} catch (error) {
|
|
62
|
-
throw console.error("Database query failed:", {
|
|
63
|
-
query: queryText,
|
|
64
|
-
error: error instanceof Error ? error.message : String(error)
|
|
65
|
-
}), error;
|
|
66
|
-
} finally {
|
|
67
|
-
if (client && options.connectionString) {
|
|
68
|
-
if (await checkForTooManyConnections(client, options.connectionString)) {
|
|
69
|
-
const poolCache = cache.get(createPoolKey(options.connectionString));
|
|
70
|
-
client.release(), await poolCache?.pool.end(), poolCache && cache.delete(createPoolKey(options.connectionString));
|
|
71
|
-
} else client.release();
|
|
72
|
-
} else client && client.release();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async function checkForTooManyConnections(client, connectionString) {
|
|
76
|
-
const poolCache = cache.get(createPoolKey(connectionString));
|
|
77
|
-
if (!poolCache) return !1;
|
|
78
|
-
const currentTime = Date.now(),
|
|
79
|
-
openedConnectionsMaxAge = 1e4,
|
|
80
|
-
maxConnectionsTolerance = 0.9;
|
|
81
|
-
if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
|
|
82
|
-
const [maxConnections, reservedConnections] = await getConnectionLimits(client);
|
|
83
|
-
console.info(`Max connections: ${maxConnections}, Reserved connections: ${reservedConnections}`), poolCache.maxConnections = maxConnections, poolCache.reservedConnections = reservedConnections;
|
|
84
|
-
}
|
|
85
|
-
if (poolCache.openedConnections === null || poolCache.openedConnectionsLastUpdate === null || currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
|
|
86
|
-
const openedConnections = await getOpenedConnections(client, connectionString);
|
|
87
|
-
poolCache.openedConnections = openedConnections, poolCache.openedConnectionsLastUpdate = currentTime;
|
|
88
|
-
}
|
|
89
|
-
return poolCache.openedConnections > (poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance ? (console.warn(`Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`), !0) : !1;
|
|
90
|
-
}
|
|
91
|
-
async function getConnectionLimits(client) {
|
|
92
|
-
console.info("Getting connection limits...");
|
|
93
|
-
const maxConnectionsResult = await client.query("SHOW max_connections"),
|
|
94
|
-
reservedConnectionResult = await client.query("SHOW superuser_reserved_connections");
|
|
95
|
-
return [Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10), Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10)];
|
|
96
|
-
}
|
|
97
|
-
async function getOpenedConnections(client, connectionString) {
|
|
98
|
-
const dbName = new URL(connectionString).pathname.slice(1);
|
|
99
|
-
console.info("Getting opened connections...");
|
|
100
|
-
const openConnectionsResult = await client.query("SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1", [dbName]),
|
|
101
|
-
result = Number.parseInt(openConnectionsResult.rows[0]?.opened_connections || 0, 10);
|
|
102
|
-
return console.info(`Opened connections: ${result}`), result;
|
|
103
|
-
}
|
|
104
|
-
async function getNewClient(options = {}) {
|
|
105
|
-
const {
|
|
106
|
-
connectionString
|
|
107
|
-
} = options;
|
|
108
|
-
if (!connectionString) throw new Error("connectionString is required for getNewClient");
|
|
109
|
-
try {
|
|
110
|
-
return await tryToGetNewClient(connectionString);
|
|
111
|
-
} catch (error) {
|
|
112
|
-
throw console.error("Failed to get new client:", error), error;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async function tryToGetNewClient(connectionString) {
|
|
116
|
-
const configurations = {
|
|
117
|
-
connectionString,
|
|
118
|
-
connectionTimeoutMillis: 5e3,
|
|
119
|
-
idleTimeoutMillis: 3e4,
|
|
120
|
-
allowExitOnIdle: !0
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
default: retry
|
|
124
|
-
} = await import("async-retry");
|
|
125
|
-
return await retry(async () => {
|
|
126
|
-
const newClient = new pg.Client(configurations);
|
|
127
|
-
return await newClient.connect(), newClient;
|
|
128
|
-
}, {
|
|
129
|
-
retries: 10,
|
|
130
|
-
minTimeout: 100,
|
|
131
|
-
factor: 2,
|
|
132
|
-
maxTimeout: 5e3
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
export { getDBClient, getNewClient, queryDb };
|
|
136
|
-
//# sourceMappingURL=getDBClient.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["pg","cache","Map","createPoolKey","connectionString","getOrCreatePoolCache","config","key","has","set","pool","Pool","maxConnections","reservedConnections","openedConnections","openedConnectionsLastUpdate","get","getDBClient","options","retries","Error","client","tryToGetNewClientFromPool","error","console","providedPool","default","retry","info","client2","connect","poolCache","connectionTimeoutMillis","idleTimeoutMillis","allowExitOnIdle","minTimeout","factor","maxTimeout","queryDb","queryText","params","query","message","String","checkForTooManyConnections","release","end","delete","currentTime","Date","now","openedConnectionsMaxAge","maxConnectionsTolerance","getConnectionLimits","getOpenedConnections","warn","maxConnectionsResult","reservedConnectionResult","Number","parseInt","rows","max_connections","superuser_reserved_connections","dbName","URL","pathname","slice","openConnectionsResult","result","opened_connections","getNewClient","tryToGetNewClient","configurations","newClient","Client"],"sources":["../../../src/helpers/getDBClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|