@prairielearn/postgres 1.4.0 → 1.6.0
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/CHANGELOG.md +12 -0
- package/README.md +9 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/pool.d.ts +1 -0
- package/dist/pool.js +38 -8
- package/dist/pool.js.map +1 -1
- package/dist/pool.test.d.ts +1 -0
- package/dist/pool.test.js +137 -0
- package/dist/pool.test.js.map +1 -0
- package/dist/test-utils.d.ts +30 -0
- package/dist/test-utils.js +125 -0
- package/dist/test-utils.js.map +1 -0
- package/package.json +3 -1
- package/src/index.ts +2 -0
- package/src/pool.test.ts +167 -0
- package/src/pool.ts +41 -8
- package/src/test-utils.ts +158 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @prairielearn/postgres
|
|
2
2
|
|
|
3
|
+
## 1.6.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- dbfa7a689: Allow cursor results to be consumed as a stream
|
|
8
|
+
|
|
9
|
+
## 1.5.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 5d0f08ecc: Don't start nested transactions in `runInTransactionAsync`
|
|
14
|
+
|
|
3
15
|
## 1.4.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -191,6 +191,15 @@ for await (const users of cursor.iterate(100)) {
|
|
|
191
191
|
}
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
+
You can also use `cursor.stream(...)` to get an object stream, which can be useful for piping it somewhere else:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
import { queryCursor } from '@prairielearn/postgres';
|
|
198
|
+
|
|
199
|
+
const cursor = await queryCursor(sql.select_all_users, {});
|
|
200
|
+
cursor.stream(100).pipe(makeStreamSomehow());
|
|
201
|
+
```
|
|
202
|
+
|
|
194
203
|
### Callback-style functions
|
|
195
204
|
|
|
196
205
|
For most functions that return promises, there are corresponding versions that work with Node-style callbacks:
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -14,11 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.PostgresPool = exports.loadSqlEquiv = exports.loadSql = void 0;
|
|
17
|
+
exports.makePostgresTestUtils = exports.PostgresPool = exports.loadSqlEquiv = exports.loadSql = void 0;
|
|
18
18
|
var loader_1 = require("./loader");
|
|
19
19
|
Object.defineProperty(exports, "loadSql", { enumerable: true, get: function () { return loader_1.loadSql; } });
|
|
20
20
|
Object.defineProperty(exports, "loadSqlEquiv", { enumerable: true, get: function () { return loader_1.loadSqlEquiv; } });
|
|
21
21
|
var pool_1 = require("./pool");
|
|
22
22
|
Object.defineProperty(exports, "PostgresPool", { enumerable: true, get: function () { return pool_1.PostgresPool; } });
|
|
23
23
|
__exportStar(require("./default-pool"), exports);
|
|
24
|
+
var test_utils_1 = require("./test-utils");
|
|
25
|
+
Object.defineProperty(exports, "makePostgresTestUtils", { enumerable: true, get: function () { return test_utils_1.makePostgresTestUtils; } });
|
|
24
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,mCAAiD;AAAxC,iGAAA,OAAO,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC9B,+BAAsC;AAA7B,oGAAA,YAAY,OAAA;AAErB,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,mCAAiD;AAAxC,iGAAA,OAAO,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC9B,+BAAsC;AAA7B,oGAAA,YAAY,OAAA;AAErB,iDAA+B;AAE/B,2CAAkG;AAAzF,mHAAA,qBAAqB,OAAA"}
|
package/dist/pool.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { z } from 'zod';
|
|
|
5
5
|
export type QueryParams = Record<string, any> | any[];
|
|
6
6
|
export interface CursorIterator<T> {
|
|
7
7
|
iterate: (batchSize: number) => AsyncGenerator<T[]>;
|
|
8
|
+
stream: (batchSize: number) => NodeJS.ReadWriteStream;
|
|
8
9
|
}
|
|
9
10
|
export declare class PostgresError extends Error {
|
|
10
11
|
data: Record<string, any>;
|
package/dist/pool.js
CHANGED
|
@@ -12,6 +12,8 @@ const debug_1 = __importDefault(require("debug"));
|
|
|
12
12
|
const node_util_1 = require("node:util");
|
|
13
13
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
14
14
|
const zod_1 = require("zod");
|
|
15
|
+
const node_stream_1 = require("node:stream");
|
|
16
|
+
const multipipe_1 = __importDefault(require("multipipe"));
|
|
15
17
|
const debug = (0, debug_1.default)('prairielib:' + node_path_1.default.basename(__filename, '.js'));
|
|
16
18
|
const lastQueryMap = new WeakMap();
|
|
17
19
|
const searchSchemaMap = new WeakMap();
|
|
@@ -468,19 +470,32 @@ class PostgresPool {
|
|
|
468
470
|
* will be committed otherwise.
|
|
469
471
|
*/
|
|
470
472
|
async runInTransactionAsync(fn) {
|
|
471
|
-
|
|
473
|
+
// Check if we're already inside a transaction. If so, we won't start another one,
|
|
474
|
+
// as Postgres doesn't support nested transactions.
|
|
475
|
+
let client = this.alsClient.getStore();
|
|
476
|
+
const isNestedTransaction = client !== undefined;
|
|
477
|
+
const transactionClient = client ?? (await this.beginTransactionAsync());
|
|
472
478
|
let result;
|
|
473
479
|
try {
|
|
474
|
-
result = await this.alsClient.run(
|
|
480
|
+
result = await this.alsClient.run(transactionClient, () => fn(transactionClient));
|
|
475
481
|
}
|
|
476
482
|
catch (err) {
|
|
477
|
-
|
|
483
|
+
if (!isNestedTransaction) {
|
|
484
|
+
// If we're inside another transaction, we assume that the root transaction
|
|
485
|
+
// will catch this error and roll back the transaction.
|
|
486
|
+
await this.endTransactionAsync(transactionClient, err);
|
|
487
|
+
}
|
|
478
488
|
throw err;
|
|
479
489
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
490
|
+
if (!isNestedTransaction) {
|
|
491
|
+
// If we're inside another transaction; don't commit it prematurely. Allow
|
|
492
|
+
// the root transaction to commit it instead.
|
|
493
|
+
//
|
|
494
|
+
// Note that we don't invoke `endTransactionAsync` inside the `try` block
|
|
495
|
+
// because we don't want an error thrown by it to trigger *another* call
|
|
496
|
+
// to `endTransactionAsync` in the `catch` block.
|
|
497
|
+
await this.endTransactionAsync(transactionClient, null);
|
|
498
|
+
}
|
|
484
499
|
return result;
|
|
485
500
|
}
|
|
486
501
|
/**
|
|
@@ -760,7 +775,7 @@ class PostgresPool {
|
|
|
760
775
|
const client = await this.getClientAsync();
|
|
761
776
|
const cursor = await this.queryCursorWithClient(client, sql, params);
|
|
762
777
|
let iterateCalled = false;
|
|
763
|
-
|
|
778
|
+
const iterator = {
|
|
764
779
|
iterate: async function* (batchSize) {
|
|
765
780
|
// Safety check: if someone calls iterate multiple times, they're
|
|
766
781
|
// definitely doing something wrong.
|
|
@@ -789,7 +804,22 @@ class PostgresPool {
|
|
|
789
804
|
client.release();
|
|
790
805
|
}
|
|
791
806
|
},
|
|
807
|
+
stream: function (batchSize) {
|
|
808
|
+
const transform = new node_stream_1.Transform({
|
|
809
|
+
readableObjectMode: true,
|
|
810
|
+
writableObjectMode: true,
|
|
811
|
+
transform(chunk, _encoding, callback) {
|
|
812
|
+
for (const row of chunk) {
|
|
813
|
+
this.push(row);
|
|
814
|
+
}
|
|
815
|
+
callback();
|
|
816
|
+
},
|
|
817
|
+
});
|
|
818
|
+
// TODO: use native `node:stream#compose` once it's stable.
|
|
819
|
+
return (0, multipipe_1.default)(node_stream_1.Readable.from(iterator.iterate(batchSize)), transform);
|
|
820
|
+
},
|
|
792
821
|
};
|
|
822
|
+
return iterator;
|
|
793
823
|
}
|
|
794
824
|
/**
|
|
795
825
|
* Set the schema to use for the search path.
|
package/dist/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chai_1 = __importDefault(require("chai"));
|
|
7
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const default_pool_1 = require("./default-pool");
|
|
10
|
+
const test_utils_1 = require("./test-utils");
|
|
11
|
+
chai_1.default.use(chai_as_promised_1.default);
|
|
12
|
+
const { assert } = chai_1.default;
|
|
13
|
+
const postgresTestUtils = (0, test_utils_1.makePostgresTestUtils)({
|
|
14
|
+
database: 'prairielearn_postgres',
|
|
15
|
+
});
|
|
16
|
+
describe('@prairielearn/postgres', function () {
|
|
17
|
+
before(async () => {
|
|
18
|
+
await postgresTestUtils.createDatabase();
|
|
19
|
+
await (0, default_pool_1.queryAsync)('CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY, state TEXT);', {});
|
|
20
|
+
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (1,'uninitialized');", {});
|
|
21
|
+
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (2, 'stopped');", {});
|
|
22
|
+
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (3, 'launching');", {});
|
|
23
|
+
await (0, default_pool_1.queryAsync)("INSERT INTO workspaces (id, state) VALUES (4, 'running');", {});
|
|
24
|
+
});
|
|
25
|
+
after(async () => {
|
|
26
|
+
await postgresTestUtils.dropDatabase();
|
|
27
|
+
});
|
|
28
|
+
describe('queryCursor', () => {
|
|
29
|
+
it('returns zero rows', async () => {
|
|
30
|
+
const cursor = await (0, default_pool_1.queryCursor)('SELECT * FROM workspaces WHERE id = 5;', {});
|
|
31
|
+
let rowBatches = [];
|
|
32
|
+
for await (const rows of cursor.iterate(10)) {
|
|
33
|
+
rowBatches.push(rows);
|
|
34
|
+
}
|
|
35
|
+
assert.lengthOf(rowBatches, 0);
|
|
36
|
+
});
|
|
37
|
+
it('returns one row at a time', async () => {
|
|
38
|
+
const cursor = await (0, default_pool_1.queryCursor)('SELECT * FROM workspaces WHERE id <= 2;', {});
|
|
39
|
+
const rowBatches = [];
|
|
40
|
+
for await (const rows of cursor.iterate(1)) {
|
|
41
|
+
rowBatches.push(rows);
|
|
42
|
+
}
|
|
43
|
+
assert.lengthOf(rowBatches, 2);
|
|
44
|
+
assert.lengthOf(rowBatches[0], 1);
|
|
45
|
+
assert.lengthOf(rowBatches[1], 1);
|
|
46
|
+
});
|
|
47
|
+
it('returns all rows at once', async () => {
|
|
48
|
+
const cursor = (0, default_pool_1.queryCursor)('SELECT * FROM workspaces;', {});
|
|
49
|
+
const rowBatches = [];
|
|
50
|
+
for await (const rows of (await cursor).iterate(10)) {
|
|
51
|
+
rowBatches.push(rows);
|
|
52
|
+
}
|
|
53
|
+
assert.lengthOf(rowBatches, 1);
|
|
54
|
+
assert.lengthOf(rowBatches[0], 4);
|
|
55
|
+
});
|
|
56
|
+
it('handles errors', async () => {
|
|
57
|
+
const cursor = await (0, default_pool_1.queryCursor)('NOT VALID SQL', { foo: 'bar' });
|
|
58
|
+
async function readAllRows() {
|
|
59
|
+
const allRows = [];
|
|
60
|
+
for await (const rows of cursor.iterate(10)) {
|
|
61
|
+
allRows.push(...rows);
|
|
62
|
+
}
|
|
63
|
+
return allRows;
|
|
64
|
+
}
|
|
65
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
66
|
+
assert.instanceOf(maybeError, Error);
|
|
67
|
+
assert.match(maybeError.message, /syntax error/);
|
|
68
|
+
assert.isDefined(maybeError.data);
|
|
69
|
+
assert.equal(maybeError.data.sql, 'NOT VALID SQL');
|
|
70
|
+
assert.deepEqual(maybeError.data.sqlParams, { foo: 'bar' });
|
|
71
|
+
assert.isDefined(maybeError.data.sqlError);
|
|
72
|
+
assert.equal(maybeError.data.sqlError.severity, 'ERROR');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('queryValidatedCursor', () => {
|
|
76
|
+
it('validates with provided schema', async () => {
|
|
77
|
+
const WorkspaceSchema = zod_1.z.object({
|
|
78
|
+
id: zod_1.z.string(),
|
|
79
|
+
});
|
|
80
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, WorkspaceSchema);
|
|
81
|
+
const allRows = [];
|
|
82
|
+
for await (const rows of cursor.iterate(10)) {
|
|
83
|
+
allRows.push(...rows);
|
|
84
|
+
}
|
|
85
|
+
assert.lengthOf(allRows, 4);
|
|
86
|
+
const workspace = allRows[0];
|
|
87
|
+
assert.equal(workspace.id, '1');
|
|
88
|
+
assert.isUndefined(workspace.state);
|
|
89
|
+
});
|
|
90
|
+
it('throws error when validation fails', async () => {
|
|
91
|
+
const BadWorkspaceSchema = zod_1.z.object({
|
|
92
|
+
badProperty: zod_1.z.string(),
|
|
93
|
+
});
|
|
94
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, BadWorkspaceSchema);
|
|
95
|
+
async function readAllRows() {
|
|
96
|
+
const allRows = [];
|
|
97
|
+
for await (const rows of cursor.iterate(10)) {
|
|
98
|
+
allRows.push(...rows);
|
|
99
|
+
}
|
|
100
|
+
return allRows;
|
|
101
|
+
}
|
|
102
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
103
|
+
assert.instanceOf(maybeError, zod_1.ZodError);
|
|
104
|
+
assert.lengthOf(maybeError.errors, 4);
|
|
105
|
+
});
|
|
106
|
+
it('returns a stream', async () => {
|
|
107
|
+
const WorkspaceSchema = zod_1.z.object({
|
|
108
|
+
id: zod_1.z.string(),
|
|
109
|
+
});
|
|
110
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, WorkspaceSchema);
|
|
111
|
+
const stream = cursor.stream(1);
|
|
112
|
+
const allRows = [];
|
|
113
|
+
for await (const row of stream) {
|
|
114
|
+
allRows.push(row);
|
|
115
|
+
}
|
|
116
|
+
assert.lengthOf(allRows, 4);
|
|
117
|
+
});
|
|
118
|
+
it('emits an error when validation fails', async () => {
|
|
119
|
+
const BadWorkspaceSchema = zod_1.z.object({
|
|
120
|
+
badProperty: zod_1.z.string(),
|
|
121
|
+
});
|
|
122
|
+
const cursor = await (0, default_pool_1.queryValidatedCursor)('SELECT * FROM workspaces ORDER BY id ASC;', {}, BadWorkspaceSchema);
|
|
123
|
+
const stream = cursor.stream(1);
|
|
124
|
+
async function readAllRows() {
|
|
125
|
+
const allRows = [];
|
|
126
|
+
for await (const row of stream) {
|
|
127
|
+
allRows.push(row);
|
|
128
|
+
}
|
|
129
|
+
return allRows;
|
|
130
|
+
}
|
|
131
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
132
|
+
assert.instanceOf(maybeError, zod_1.ZodError);
|
|
133
|
+
assert.lengthOf(maybeError.errors, 1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=pool.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
export interface PostgresTestUtilsOptions {
|
|
3
|
+
database: string;
|
|
4
|
+
user?: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
poolConfig?: Pick<pg.PoolConfig, 'max' | 'idleTimeoutMillis'>;
|
|
7
|
+
defaultDatabase?: string;
|
|
8
|
+
prepareAfterReset?: (client: pg.Client) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
interface CreateDatabaseOptions {
|
|
11
|
+
dropExistingDatabase?: boolean;
|
|
12
|
+
database?: string;
|
|
13
|
+
templateDatabase?: string;
|
|
14
|
+
configurePool?: boolean;
|
|
15
|
+
prepare?: (client: pg.Client) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
interface DropDatabaseOptions {
|
|
18
|
+
database?: string;
|
|
19
|
+
force?: boolean;
|
|
20
|
+
closePool?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface PostgresTestUtils {
|
|
23
|
+
createDatabase: (options?: CreateDatabaseOptions) => Promise<void>;
|
|
24
|
+
resetDatabase: () => Promise<void>;
|
|
25
|
+
dropDatabase: (options?: DropDatabaseOptions) => Promise<void>;
|
|
26
|
+
getDatabaseNameForCurrentMochaWorker: () => string;
|
|
27
|
+
getPoolConfig: () => pg.PoolConfig;
|
|
28
|
+
}
|
|
29
|
+
export declare function makePostgresTestUtils(options: PostgresTestUtilsOptions): PostgresTestUtils;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.makePostgresTestUtils = void 0;
|
|
30
|
+
const pg_1 = __importDefault(require("pg"));
|
|
31
|
+
const defaultPool = __importStar(require("./default-pool"));
|
|
32
|
+
const POSTGRES_USER = 'postgres';
|
|
33
|
+
const POSTGRES_HOST = 'localhost';
|
|
34
|
+
const POSTGRES_DATABASE = 'postgres';
|
|
35
|
+
async function createDatabase(options, { dropExistingDatabase = true, configurePool = true, database, templateDatabase, prepare, } = {}) {
|
|
36
|
+
const client = new pg_1.default.Client({
|
|
37
|
+
...getPoolConfig(options),
|
|
38
|
+
database: options.defaultDatabase ?? POSTGRES_DATABASE,
|
|
39
|
+
});
|
|
40
|
+
await client.connect();
|
|
41
|
+
const escapedDatabase = client.escapeIdentifier(database ?? getDatabaseNameForCurrentMochaWorker(options.database));
|
|
42
|
+
if (dropExistingDatabase ?? true) {
|
|
43
|
+
await client.query(`DROP DATABASE IF EXISTS ${escapedDatabase}`);
|
|
44
|
+
}
|
|
45
|
+
if (templateDatabase) {
|
|
46
|
+
const escapedTemplateDatabase = client.escapeIdentifier(templateDatabase);
|
|
47
|
+
await client.query(`CREATE DATABASE ${escapedDatabase} TEMPLATE ${escapedTemplateDatabase}`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
await client.query(`CREATE DATABASE ${escapedDatabase}`);
|
|
51
|
+
}
|
|
52
|
+
await client.end();
|
|
53
|
+
await prepare?.(client);
|
|
54
|
+
if (configurePool) {
|
|
55
|
+
await defaultPool.initAsync({
|
|
56
|
+
user: options.user ?? POSTGRES_USER,
|
|
57
|
+
host: options.host ?? POSTGRES_HOST,
|
|
58
|
+
database: getDatabaseNameForCurrentMochaWorker(options.database),
|
|
59
|
+
// Offer sensible default, but these can be overridden by `options.poolConfig`.
|
|
60
|
+
max: 10,
|
|
61
|
+
idleTimeoutMillis: 30000,
|
|
62
|
+
...(options.poolConfig ?? {}),
|
|
63
|
+
}, (err) => {
|
|
64
|
+
throw err;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function resetDatabase(options) {
|
|
69
|
+
const client = new pg_1.default.Client(getPoolConfig(options));
|
|
70
|
+
await client.connect();
|
|
71
|
+
await client.query(`
|
|
72
|
+
DO
|
|
73
|
+
$func$
|
|
74
|
+
BEGIN
|
|
75
|
+
EXECUTE (
|
|
76
|
+
SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' RESTART IDENTITY CASCADE'
|
|
77
|
+
FROM pg_class
|
|
78
|
+
WHERE relkind = 'r'
|
|
79
|
+
AND relnamespace = 'public'::regnamespace
|
|
80
|
+
);
|
|
81
|
+
END
|
|
82
|
+
$func$;
|
|
83
|
+
`);
|
|
84
|
+
await options.prepareAfterReset?.(client);
|
|
85
|
+
await client.end();
|
|
86
|
+
}
|
|
87
|
+
async function dropDatabase(options, { closePool = true, force = false, database } = {}) {
|
|
88
|
+
if (closePool) {
|
|
89
|
+
await defaultPool.closeAsync();
|
|
90
|
+
}
|
|
91
|
+
const databaseName = database ?? getDatabaseNameForCurrentMochaWorker(options.database);
|
|
92
|
+
if ('PL_KEEP_TEST_DB' in process.env && !force) {
|
|
93
|
+
console.log(`PL_KEEP_TEST_DB environment variable set, not dropping database ${databaseName}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const client = new pg_1.default.Client({
|
|
97
|
+
...getPoolConfig(options),
|
|
98
|
+
database: options.defaultDatabase ?? POSTGRES_DATABASE,
|
|
99
|
+
});
|
|
100
|
+
await client.connect();
|
|
101
|
+
await client.query(`DROP DATABASE IF EXISTS ${client.escapeIdentifier(databaseName)}`);
|
|
102
|
+
await client.end();
|
|
103
|
+
}
|
|
104
|
+
function getDatabaseNameForCurrentMochaWorker(namespace) {
|
|
105
|
+
const workerId = process.env.MOCHA_WORKER_ID ?? '1';
|
|
106
|
+
return `${namespace}_${workerId}`;
|
|
107
|
+
}
|
|
108
|
+
function getPoolConfig(options) {
|
|
109
|
+
return {
|
|
110
|
+
user: options.user ?? POSTGRES_USER,
|
|
111
|
+
host: options.host ?? POSTGRES_HOST,
|
|
112
|
+
database: getDatabaseNameForCurrentMochaWorker(options.database),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function makePostgresTestUtils(options) {
|
|
116
|
+
return {
|
|
117
|
+
createDatabase: (createOptions) => createDatabase(options, createOptions),
|
|
118
|
+
resetDatabase: () => resetDatabase(options),
|
|
119
|
+
dropDatabase: (dropOptions) => dropDatabase(options, dropOptions),
|
|
120
|
+
getDatabaseNameForCurrentMochaWorker: () => getDatabaseNameForCurrentMochaWorker(options.database),
|
|
121
|
+
getPoolConfig: () => getPoolConfig(options),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
exports.makePostgresTestUtils = makePostgresTestUtils;
|
|
125
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/postgres",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"devDependencies": {
|
|
11
11
|
"@prairielearn/tsconfig": "*",
|
|
12
12
|
"@types/mocha": "^10.0.1",
|
|
13
|
+
"@types/multipipe": "^3.0.1",
|
|
13
14
|
"@types/node": "^18.14.2",
|
|
14
15
|
"mocha": "^10.2.0",
|
|
15
16
|
"ts-node": "^10.9.1",
|
|
@@ -19,6 +20,7 @@
|
|
|
19
20
|
"@types/debug": "^4.1.7",
|
|
20
21
|
"@types/lodash": "^4.14.191",
|
|
21
22
|
"@types/pg-cursor": "^2.7.0",
|
|
23
|
+
"multipipe": "^4.0.0",
|
|
22
24
|
"pg": "^8.10.0",
|
|
23
25
|
"pg-cursor": "^2.9.0",
|
|
24
26
|
"pg-pool": "^3.6.0",
|
package/src/index.ts
CHANGED
package/src/pool.test.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import chai from 'chai';
|
|
2
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
3
|
+
import { z, ZodError } from 'zod';
|
|
4
|
+
|
|
5
|
+
import { queryAsync, queryCursor, queryValidatedCursor } from './default-pool';
|
|
6
|
+
import { makePostgresTestUtils } from './test-utils';
|
|
7
|
+
|
|
8
|
+
chai.use(chaiAsPromised);
|
|
9
|
+
const { assert } = chai;
|
|
10
|
+
|
|
11
|
+
const postgresTestUtils = makePostgresTestUtils({
|
|
12
|
+
database: 'prairielearn_postgres',
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('@prairielearn/postgres', function () {
|
|
16
|
+
before(async () => {
|
|
17
|
+
await postgresTestUtils.createDatabase();
|
|
18
|
+
await queryAsync('CREATE TABLE workspaces (id BIGSERIAL PRIMARY KEY, state TEXT);', {});
|
|
19
|
+
await queryAsync("INSERT INTO workspaces (id, state) VALUES (1,'uninitialized');", {});
|
|
20
|
+
await queryAsync("INSERT INTO workspaces (id, state) VALUES (2, 'stopped');", {});
|
|
21
|
+
await queryAsync("INSERT INTO workspaces (id, state) VALUES (3, 'launching');", {});
|
|
22
|
+
await queryAsync("INSERT INTO workspaces (id, state) VALUES (4, 'running');", {});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
after(async () => {
|
|
26
|
+
await postgresTestUtils.dropDatabase();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('queryCursor', () => {
|
|
30
|
+
it('returns zero rows', async () => {
|
|
31
|
+
const cursor = await queryCursor('SELECT * FROM workspaces WHERE id = 5;', {});
|
|
32
|
+
let rowBatches = [];
|
|
33
|
+
for await (const rows of cursor.iterate(10)) {
|
|
34
|
+
rowBatches.push(rows);
|
|
35
|
+
}
|
|
36
|
+
assert.lengthOf(rowBatches, 0);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('returns one row at a time', async () => {
|
|
40
|
+
const cursor = await queryCursor('SELECT * FROM workspaces WHERE id <= 2;', {});
|
|
41
|
+
const rowBatches = [];
|
|
42
|
+
for await (const rows of cursor.iterate(1)) {
|
|
43
|
+
rowBatches.push(rows);
|
|
44
|
+
}
|
|
45
|
+
assert.lengthOf(rowBatches, 2);
|
|
46
|
+
assert.lengthOf(rowBatches[0], 1);
|
|
47
|
+
assert.lengthOf(rowBatches[1], 1);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('returns all rows at once', async () => {
|
|
51
|
+
const cursor = queryCursor('SELECT * FROM workspaces;', {});
|
|
52
|
+
const rowBatches = [];
|
|
53
|
+
for await (const rows of (await cursor).iterate(10)) {
|
|
54
|
+
rowBatches.push(rows);
|
|
55
|
+
}
|
|
56
|
+
assert.lengthOf(rowBatches, 1);
|
|
57
|
+
assert.lengthOf(rowBatches[0], 4);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('handles errors', async () => {
|
|
61
|
+
const cursor = await queryCursor('NOT VALID SQL', { foo: 'bar' });
|
|
62
|
+
|
|
63
|
+
async function readAllRows() {
|
|
64
|
+
const allRows = [];
|
|
65
|
+
for await (const rows of cursor.iterate(10)) {
|
|
66
|
+
allRows.push(...rows);
|
|
67
|
+
}
|
|
68
|
+
return allRows;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
72
|
+
assert.instanceOf(maybeError, Error);
|
|
73
|
+
assert.match(maybeError.message, /syntax error/);
|
|
74
|
+
assert.isDefined(maybeError.data);
|
|
75
|
+
assert.equal(maybeError.data.sql, 'NOT VALID SQL');
|
|
76
|
+
assert.deepEqual(maybeError.data.sqlParams, { foo: 'bar' });
|
|
77
|
+
assert.isDefined(maybeError.data.sqlError);
|
|
78
|
+
assert.equal(maybeError.data.sqlError.severity, 'ERROR');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('queryValidatedCursor', () => {
|
|
83
|
+
it('validates with provided schema', async () => {
|
|
84
|
+
const WorkspaceSchema = z.object({
|
|
85
|
+
id: z.string(),
|
|
86
|
+
});
|
|
87
|
+
const cursor = await queryValidatedCursor(
|
|
88
|
+
'SELECT * FROM workspaces ORDER BY id ASC;',
|
|
89
|
+
{},
|
|
90
|
+
WorkspaceSchema
|
|
91
|
+
);
|
|
92
|
+
const allRows = [];
|
|
93
|
+
for await (const rows of cursor.iterate(10)) {
|
|
94
|
+
allRows.push(...rows);
|
|
95
|
+
}
|
|
96
|
+
assert.lengthOf(allRows, 4);
|
|
97
|
+
const workspace = allRows[0] as any;
|
|
98
|
+
assert.equal(workspace.id, '1');
|
|
99
|
+
assert.isUndefined(workspace.state);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('throws error when validation fails', async () => {
|
|
103
|
+
const BadWorkspaceSchema = z.object({
|
|
104
|
+
badProperty: z.string(),
|
|
105
|
+
});
|
|
106
|
+
const cursor = await queryValidatedCursor(
|
|
107
|
+
'SELECT * FROM workspaces ORDER BY id ASC;',
|
|
108
|
+
{},
|
|
109
|
+
BadWorkspaceSchema
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
async function readAllRows() {
|
|
113
|
+
const allRows = [];
|
|
114
|
+
for await (const rows of cursor.iterate(10)) {
|
|
115
|
+
allRows.push(...rows);
|
|
116
|
+
}
|
|
117
|
+
return allRows;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
121
|
+
assert.instanceOf(maybeError, ZodError);
|
|
122
|
+
assert.lengthOf(maybeError.errors, 4);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('returns a stream', async () => {
|
|
126
|
+
const WorkspaceSchema = z.object({
|
|
127
|
+
id: z.string(),
|
|
128
|
+
});
|
|
129
|
+
const cursor = await queryValidatedCursor(
|
|
130
|
+
'SELECT * FROM workspaces ORDER BY id ASC;',
|
|
131
|
+
{},
|
|
132
|
+
WorkspaceSchema
|
|
133
|
+
);
|
|
134
|
+
const stream = cursor.stream(1);
|
|
135
|
+
const allRows = [];
|
|
136
|
+
for await (const row of stream) {
|
|
137
|
+
allRows.push(row);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
assert.lengthOf(allRows, 4);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('emits an error when validation fails', async () => {
|
|
144
|
+
const BadWorkspaceSchema = z.object({
|
|
145
|
+
badProperty: z.string(),
|
|
146
|
+
});
|
|
147
|
+
const cursor = await queryValidatedCursor(
|
|
148
|
+
'SELECT * FROM workspaces ORDER BY id ASC;',
|
|
149
|
+
{},
|
|
150
|
+
BadWorkspaceSchema
|
|
151
|
+
);
|
|
152
|
+
const stream = cursor.stream(1);
|
|
153
|
+
|
|
154
|
+
async function readAllRows() {
|
|
155
|
+
const allRows = [];
|
|
156
|
+
for await (const row of stream) {
|
|
157
|
+
allRows.push(row);
|
|
158
|
+
}
|
|
159
|
+
return allRows;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const maybeError = await readAllRows().catch((err) => err);
|
|
163
|
+
assert.instanceOf(maybeError, ZodError);
|
|
164
|
+
assert.lengthOf(maybeError.errors, 1);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
package/src/pool.ts
CHANGED
|
@@ -6,11 +6,14 @@ import debugFactory from 'debug';
|
|
|
6
6
|
import { callbackify } from 'node:util';
|
|
7
7
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
8
8
|
import { z } from 'zod';
|
|
9
|
+
import { Readable, Transform } from 'node:stream';
|
|
10
|
+
import multipipe from 'multipipe';
|
|
9
11
|
|
|
10
12
|
export type QueryParams = Record<string, any> | any[];
|
|
11
13
|
|
|
12
14
|
export interface CursorIterator<T> {
|
|
13
15
|
iterate: (batchSize: number) => AsyncGenerator<T[]>;
|
|
16
|
+
stream: (batchSize: number) => NodeJS.ReadWriteStream;
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
const debug = debugFactory('prairielib:' + path.basename(__filename, '.js'));
|
|
@@ -470,19 +473,33 @@ export class PostgresPool {
|
|
|
470
473
|
* will be committed otherwise.
|
|
471
474
|
*/
|
|
472
475
|
async runInTransactionAsync<T>(fn: (client: pg.PoolClient) => Promise<T>): Promise<T> {
|
|
473
|
-
|
|
476
|
+
// Check if we're already inside a transaction. If so, we won't start another one,
|
|
477
|
+
// as Postgres doesn't support nested transactions.
|
|
478
|
+
let client = this.alsClient.getStore();
|
|
479
|
+
const isNestedTransaction = client !== undefined;
|
|
480
|
+
const transactionClient = client ?? (await this.beginTransactionAsync());
|
|
481
|
+
|
|
474
482
|
let result: T;
|
|
475
483
|
try {
|
|
476
|
-
result = await this.alsClient.run(
|
|
484
|
+
result = await this.alsClient.run(transactionClient, () => fn(transactionClient));
|
|
477
485
|
} catch (err: any) {
|
|
478
|
-
|
|
486
|
+
if (!isNestedTransaction) {
|
|
487
|
+
// If we're inside another transaction, we assume that the root transaction
|
|
488
|
+
// will catch this error and roll back the transaction.
|
|
489
|
+
await this.endTransactionAsync(transactionClient, err);
|
|
490
|
+
}
|
|
479
491
|
throw err;
|
|
480
492
|
}
|
|
481
493
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
494
|
+
if (!isNestedTransaction) {
|
|
495
|
+
// If we're inside another transaction; don't commit it prematurely. Allow
|
|
496
|
+
// the root transaction to commit it instead.
|
|
497
|
+
//
|
|
498
|
+
// Note that we don't invoke `endTransactionAsync` inside the `try` block
|
|
499
|
+
// because we don't want an error thrown by it to trigger *another* call
|
|
500
|
+
// to `endTransactionAsync` in the `catch` block.
|
|
501
|
+
await this.endTransactionAsync(transactionClient, null);
|
|
502
|
+
}
|
|
486
503
|
|
|
487
504
|
return result;
|
|
488
505
|
}
|
|
@@ -896,7 +913,7 @@ export class PostgresPool {
|
|
|
896
913
|
const cursor = await this.queryCursorWithClient(client, sql, params);
|
|
897
914
|
|
|
898
915
|
let iterateCalled = false;
|
|
899
|
-
|
|
916
|
+
const iterator: CursorIterator<z.infer<Model>> = {
|
|
900
917
|
iterate: async function* (batchSize: number) {
|
|
901
918
|
// Safety check: if someone calls iterate multiple times, they're
|
|
902
919
|
// definitely doing something wrong.
|
|
@@ -924,7 +941,23 @@ export class PostgresPool {
|
|
|
924
941
|
client.release();
|
|
925
942
|
}
|
|
926
943
|
},
|
|
944
|
+
stream: function (batchSize: number) {
|
|
945
|
+
const transform = new Transform({
|
|
946
|
+
readableObjectMode: true,
|
|
947
|
+
writableObjectMode: true,
|
|
948
|
+
transform(chunk, _encoding, callback) {
|
|
949
|
+
for (const row of chunk) {
|
|
950
|
+
this.push(row);
|
|
951
|
+
}
|
|
952
|
+
callback();
|
|
953
|
+
},
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
// TODO: use native `node:stream#compose` once it's stable.
|
|
957
|
+
return multipipe(Readable.from(iterator.iterate(batchSize)), transform);
|
|
958
|
+
},
|
|
927
959
|
};
|
|
960
|
+
return iterator;
|
|
928
961
|
}
|
|
929
962
|
|
|
930
963
|
/**
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
|
|
3
|
+
import * as defaultPool from './default-pool';
|
|
4
|
+
|
|
5
|
+
const POSTGRES_USER = 'postgres';
|
|
6
|
+
const POSTGRES_HOST = 'localhost';
|
|
7
|
+
const POSTGRES_DATABASE = 'postgres';
|
|
8
|
+
|
|
9
|
+
export interface PostgresTestUtilsOptions {
|
|
10
|
+
database: string;
|
|
11
|
+
user?: string;
|
|
12
|
+
host?: string;
|
|
13
|
+
poolConfig?: Pick<pg.PoolConfig, 'max' | 'idleTimeoutMillis'>;
|
|
14
|
+
defaultDatabase?: string;
|
|
15
|
+
prepareAfterReset?: (client: pg.Client) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface CreateDatabaseOptions {
|
|
19
|
+
dropExistingDatabase?: boolean;
|
|
20
|
+
database?: string;
|
|
21
|
+
templateDatabase?: string;
|
|
22
|
+
configurePool?: boolean;
|
|
23
|
+
prepare?: (client: pg.Client) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface DropDatabaseOptions {
|
|
27
|
+
database?: string;
|
|
28
|
+
force?: boolean;
|
|
29
|
+
closePool?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function createDatabase(
|
|
33
|
+
options: PostgresTestUtilsOptions,
|
|
34
|
+
{
|
|
35
|
+
dropExistingDatabase = true,
|
|
36
|
+
configurePool = true,
|
|
37
|
+
database,
|
|
38
|
+
templateDatabase,
|
|
39
|
+
prepare,
|
|
40
|
+
}: CreateDatabaseOptions = {}
|
|
41
|
+
): Promise<void> {
|
|
42
|
+
const client = new pg.Client({
|
|
43
|
+
...getPoolConfig(options),
|
|
44
|
+
database: options.defaultDatabase ?? POSTGRES_DATABASE,
|
|
45
|
+
});
|
|
46
|
+
await client.connect();
|
|
47
|
+
|
|
48
|
+
const escapedDatabase = client.escapeIdentifier(
|
|
49
|
+
database ?? getDatabaseNameForCurrentMochaWorker(options.database)
|
|
50
|
+
);
|
|
51
|
+
if (dropExistingDatabase ?? true) {
|
|
52
|
+
await client.query(`DROP DATABASE IF EXISTS ${escapedDatabase}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (templateDatabase) {
|
|
56
|
+
const escapedTemplateDatabase = client.escapeIdentifier(templateDatabase);
|
|
57
|
+
await client.query(`CREATE DATABASE ${escapedDatabase} TEMPLATE ${escapedTemplateDatabase}`);
|
|
58
|
+
} else {
|
|
59
|
+
await client.query(`CREATE DATABASE ${escapedDatabase}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
await client.end();
|
|
63
|
+
|
|
64
|
+
await prepare?.(client);
|
|
65
|
+
|
|
66
|
+
if (configurePool) {
|
|
67
|
+
await defaultPool.initAsync(
|
|
68
|
+
{
|
|
69
|
+
user: options.user ?? POSTGRES_USER,
|
|
70
|
+
host: options.host ?? POSTGRES_HOST,
|
|
71
|
+
database: getDatabaseNameForCurrentMochaWorker(options.database),
|
|
72
|
+
// Offer sensible default, but these can be overridden by `options.poolConfig`.
|
|
73
|
+
max: 10,
|
|
74
|
+
idleTimeoutMillis: 30000,
|
|
75
|
+
...(options.poolConfig ?? {}),
|
|
76
|
+
},
|
|
77
|
+
(err) => {
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function resetDatabase(options: PostgresTestUtilsOptions): Promise<void> {
|
|
85
|
+
const client = new pg.Client(getPoolConfig(options));
|
|
86
|
+
await client.connect();
|
|
87
|
+
await client.query(`
|
|
88
|
+
DO
|
|
89
|
+
$func$
|
|
90
|
+
BEGIN
|
|
91
|
+
EXECUTE (
|
|
92
|
+
SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' RESTART IDENTITY CASCADE'
|
|
93
|
+
FROM pg_class
|
|
94
|
+
WHERE relkind = 'r'
|
|
95
|
+
AND relnamespace = 'public'::regnamespace
|
|
96
|
+
);
|
|
97
|
+
END
|
|
98
|
+
$func$;
|
|
99
|
+
`);
|
|
100
|
+
await options.prepareAfterReset?.(client);
|
|
101
|
+
await client.end();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function dropDatabase(
|
|
105
|
+
options: PostgresTestUtilsOptions,
|
|
106
|
+
{ closePool = true, force = false, database }: DropDatabaseOptions = {}
|
|
107
|
+
): Promise<void> {
|
|
108
|
+
if (closePool) {
|
|
109
|
+
await defaultPool.closeAsync();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const databaseName = database ?? getDatabaseNameForCurrentMochaWorker(options.database);
|
|
113
|
+
if ('PL_KEEP_TEST_DB' in process.env && !force) {
|
|
114
|
+
console.log(`PL_KEEP_TEST_DB environment variable set, not dropping database ${databaseName}`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const client = new pg.Client({
|
|
119
|
+
...getPoolConfig(options),
|
|
120
|
+
database: options.defaultDatabase ?? POSTGRES_DATABASE,
|
|
121
|
+
});
|
|
122
|
+
await client.connect();
|
|
123
|
+
await client.query(`DROP DATABASE IF EXISTS ${client.escapeIdentifier(databaseName)}`);
|
|
124
|
+
await client.end();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function getDatabaseNameForCurrentMochaWorker(namespace: string): string {
|
|
128
|
+
const workerId = process.env.MOCHA_WORKER_ID ?? '1';
|
|
129
|
+
return `${namespace}_${workerId}`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function getPoolConfig(options: PostgresTestUtilsOptions): pg.PoolConfig {
|
|
133
|
+
return {
|
|
134
|
+
user: options.user ?? POSTGRES_USER,
|
|
135
|
+
host: options.host ?? POSTGRES_HOST,
|
|
136
|
+
database: getDatabaseNameForCurrentMochaWorker(options.database),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface PostgresTestUtils {
|
|
141
|
+
createDatabase: (options?: CreateDatabaseOptions) => Promise<void>;
|
|
142
|
+
resetDatabase: () => Promise<void>;
|
|
143
|
+
dropDatabase: (options?: DropDatabaseOptions) => Promise<void>;
|
|
144
|
+
getDatabaseNameForCurrentMochaWorker: () => string;
|
|
145
|
+
getPoolConfig: () => pg.PoolConfig;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function makePostgresTestUtils(options: PostgresTestUtilsOptions): PostgresTestUtils {
|
|
149
|
+
return {
|
|
150
|
+
createDatabase: (createOptions?: CreateDatabaseOptions) =>
|
|
151
|
+
createDatabase(options, createOptions),
|
|
152
|
+
resetDatabase: () => resetDatabase(options),
|
|
153
|
+
dropDatabase: (dropOptions?: DropDatabaseOptions) => dropDatabase(options, dropOptions),
|
|
154
|
+
getDatabaseNameForCurrentMochaWorker: () =>
|
|
155
|
+
getDatabaseNameForCurrentMochaWorker(options.database),
|
|
156
|
+
getPoolConfig: () => getPoolConfig(options),
|
|
157
|
+
};
|
|
158
|
+
}
|