pogi 2.10.2 → 3.0.0-beta2
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/.vscode/launch.json +47 -15
- package/CHANGELOG.md +11 -0
- package/docs/API/PgDb.md +25 -0
- package/docs/notification.md +19 -0
- package/jest.config.js +23 -0
- package/lib/bin/generateInterface.js +3 -3
- package/lib/bin/generateInterface.js.map +1 -1
- package/lib/connectionOptions.d.ts +10 -0
- package/lib/index.d.ts +1 -1
- package/lib/pgConverters.d.ts +9 -8
- package/lib/pgConverters.js +46 -32
- package/lib/pgConverters.js.map +1 -1
- package/lib/pgConverters.test.d.ts +1 -0
- package/lib/pgConverters.test.js +13 -0
- package/lib/pgConverters.test.js.map +1 -0
- package/lib/pgDb.d.ts +27 -27
- package/lib/pgDb.js +293 -100
- package/lib/pgDb.js.map +1 -1
- package/lib/pgDb.test.d.ts +1 -0
- package/lib/pgDb.test.js +1126 -0
- package/lib/pgDb.test.js.map +1 -0
- package/lib/pgDbInterface.d.ts +53 -0
- package/lib/pgDbInterface.js +11 -0
- package/lib/pgDbInterface.js.map +1 -0
- package/lib/pgDbOperators.d.ts +3 -3
- package/lib/pgDbOperators.js +4 -7
- package/lib/pgDbOperators.js.map +1 -1
- package/lib/pgDbOperators.test.d.ts +1 -0
- package/lib/pgDbOperators.test.js +313 -0
- package/lib/pgDbOperators.test.js.map +1 -0
- package/lib/pgSchema.d.ts +10 -9
- package/lib/pgSchema.js.map +1 -1
- package/lib/pgSchemaInterface.d.ts +12 -0
- package/lib/pgSchemaInterface.js +3 -0
- package/lib/pgSchemaInterface.js.map +1 -0
- package/lib/pgTable.d.ts +15 -40
- package/lib/pgTable.js +54 -54
- package/lib/pgTable.js.map +1 -1
- package/lib/pgTableInterface.d.ts +102 -0
- package/lib/pgTableInterface.js +4 -0
- package/lib/pgTableInterface.js.map +1 -0
- package/lib/pgUtils.d.ts +16 -6
- package/lib/pgUtils.js +162 -31
- package/lib/pgUtils.js.map +1 -1
- package/lib/queryAble.d.ts +20 -53
- package/lib/queryAble.js +149 -80
- package/lib/queryAble.js.map +1 -1
- package/lib/queryAbleInterface.d.ts +55 -0
- package/lib/queryAbleInterface.js +7 -0
- package/lib/queryAbleInterface.js.map +1 -0
- package/lib/queryWhere.d.ts +2 -2
- package/lib/queryWhere.js +19 -23
- package/lib/queryWhere.js.map +1 -1
- package/mkdocs.yml +1 -0
- package/package.json +21 -11
- package/src/bin/generateInterface.ts +2 -2
- package/src/connectionOptions.ts +48 -13
- package/src/index.d.ts +7 -0
- package/src/index.ts +1 -1
- package/src/pgConverters.test.ts +10 -0
- package/src/pgConverters.ts +34 -22
- package/src/pgDb.test.ts +1324 -0
- package/src/pgDb.ts +318 -122
- package/src/pgDbInterface.ts +57 -0
- package/src/pgDbOperators.test.ts +478 -0
- package/src/pgDbOperators.ts +45 -22
- package/src/pgSchema.ts +10 -9
- package/src/pgSchemaInterface.ts +12 -0
- package/src/pgTable.ts +66 -98
- package/src/pgTableInterface.ts +131 -0
- package/src/pgUtils.ts +166 -42
- package/src/queryAble.ts +167 -125
- package/src/queryAbleInterface.ts +104 -0
- package/src/queryWhere.ts +42 -43
- package/{spec/resources → src/test}/init.sql +23 -0
- package/src/test/pgServiceRestartTest.ts +1500 -0
- package/{spec/resources → src/test}/throw_exception.sql +0 -0
- package/{spec/resources → src/test}/tricky.sql +0 -0
- package/{src/tsconfig.json → tsconfig.json} +12 -11
- package/spec/run.js +0 -5
- package/spec/support/jasmine.json +0 -9
- package/src/test/pgDbOperatorSpec.ts +0 -492
- package/src/test/pgDbSpec.ts +0 -994
package/.vscode/launch.json
CHANGED
|
@@ -11,25 +11,57 @@
|
|
|
11
11
|
"cwd": "${workspaceFolder}",
|
|
12
12
|
"runtimeExecutable": "npm",
|
|
13
13
|
"runtimeArgs": [
|
|
14
|
-
"run-script",
|
|
14
|
+
"run-script",
|
|
15
|
+
"test_debug"
|
|
15
16
|
],
|
|
16
17
|
"port": 9229
|
|
17
18
|
},
|
|
18
19
|
{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
20
|
+
"name": "Run test",
|
|
21
|
+
"type": "node",
|
|
22
|
+
"request": "launch",
|
|
23
|
+
"cwd": "${workspaceFolder}",
|
|
24
|
+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
|
|
25
|
+
"args": [
|
|
26
|
+
"--runInBand",
|
|
27
|
+
"--config",
|
|
28
|
+
"jest.config.js",
|
|
29
|
+
"--runTestsByPath",
|
|
30
|
+
"${relativeFile}",
|
|
31
|
+
],
|
|
32
|
+
"console": "integratedTerminal",
|
|
33
|
+
"internalConsoleOptions": "neverOpen",
|
|
34
|
+
"disableOptimisticBPs": true,
|
|
35
|
+
"skipFiles": [
|
|
36
|
+
"fs.js",
|
|
37
|
+
"typescript.js",
|
|
38
|
+
"tslib.js",
|
|
39
|
+
"loader.js",
|
|
40
|
+
"loaders.js",
|
|
41
|
+
"helpers.js",
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"type": "node",
|
|
46
|
+
"name": "vscode-jest-tests",
|
|
47
|
+
"request": "launch",
|
|
48
|
+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
|
|
49
|
+
"args": [
|
|
50
|
+
"--runInBand"
|
|
51
|
+
],
|
|
52
|
+
"cwd": "${workspaceFolder}",
|
|
53
|
+
"envFile": "${workspaceFolder}/.env",
|
|
54
|
+
"console": "integratedTerminal",
|
|
55
|
+
"internalConsoleOptions": "neverOpen",
|
|
56
|
+
"disableOptimisticBPs": true,
|
|
57
|
+
"outFiles": [
|
|
58
|
+
"${workspaceFolder}/lib/*.js",
|
|
59
|
+
"!${workspaceFolder}/node_modules/**/*",
|
|
60
|
+
],
|
|
25
61
|
"skipFiles": [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"loaders.js",
|
|
31
|
-
"helpers.js",
|
|
32
|
-
]
|
|
33
|
-
}
|
|
62
|
+
"${workspaceFolder}/node_modules/**/*.js",
|
|
63
|
+
"<node_internals>/**/*.js"
|
|
64
|
+
],
|
|
65
|
+
}
|
|
34
66
|
]
|
|
35
67
|
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
# [2.11.0](https://github.com/holdfenytolvaj/pogi/compare/v2.10.0...v2.11.0) (2021-09-16)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
- documentation on postgres-notifications
|
|
6
|
+
([427119b](https://github.com/holdfenytolvaj/pogi/commit/427119baa3ffd8a19dc5ba5084e08ab7e2a4c395))
|
|
7
|
+
- automatic restart upon disconnected connection ([2bc777a](https://github.com/holdfenytolvaj/pogi/commit/2bc777ace4b88c2890b80e4090f3733137b89ef5))
|
|
8
|
+
- automatic recognition of changed enum ([5af7146](https://github.com/holdfenytolvaj/pogi/commit/5af7146d727f0344e3411a2f9df1f02afbf998b2),[bfaedd5](https://github.com/holdfenytolvaj/pogi/commit/bfaedd5a10810623d27be010e338abe324155494))
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
1
12
|
## [2.10.2](https://github.com/holdfenytolvaj/pogi/compare/v2.10.0...v2.10.2) (2021-01-29)
|
|
2
13
|
|
|
3
14
|
|
package/docs/API/PgDb.md
CHANGED
|
@@ -191,3 +191,28 @@ For example see the [transaction](/transaction) section.
|
|
|
191
191
|
If the PgDb instance has dedicated connection mode and has transaction it will rolls back, otherwise do nothing.
|
|
192
192
|
Returns with PgDb instance (with pool connections mode) where no transaction is taking place.
|
|
193
193
|
For example see the [transaction](/transaction) section.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
## listen
|
|
197
|
+
<span class="def"><span class="func">listen</span>(channel:<span class="type">string</span>, callback:<span class="type">(Notification)=>void)</span>;</>
|
|
198
|
+
|
|
199
|
+
Creates a new dedicated connection for listeners (if it doesn't exists), and sets a callback for the channel.
|
|
200
|
+
It is possible to set multiple callbacks for one channel.
|
|
201
|
+
If there will be a notification from the database, the callback will be executed.
|
|
202
|
+
For example see the [notification](/notification) section.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
## unlisten
|
|
206
|
+
<span class="def"><span class="func">unlisten</span>(channel:<span class="type">string</span>, callback?:<span class="type">(Notification)=>void)</span>;</>
|
|
207
|
+
|
|
208
|
+
Removes a listener. If callback parameter is set, only the given callback will be removed.
|
|
209
|
+
If callback parameter is not set, all callbacks will be removed from the channel.
|
|
210
|
+
If it was the last channel, the dedicated connection for listeners will be released.
|
|
211
|
+
For example see the [notification](/notification) section.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
## notify
|
|
215
|
+
<span class="def"><span class="func">notify</span>(channel:<span class="type">string</span>, payload?:<span class="type">string</span>;</>
|
|
216
|
+
|
|
217
|
+
Send a notification via postgresql.
|
|
218
|
+
For example see the [notification](/notification) section.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## Notification
|
|
2
|
+
as simple as:
|
|
3
|
+
```js
|
|
4
|
+
let result = '';
|
|
5
|
+
await db.listen('channel', (data) => { result += data.payload; });
|
|
6
|
+
await db.listen('channel', () => { result += ',nextCallback'; });
|
|
7
|
+
|
|
8
|
+
await db.run(`NOTIFY channel, 'data'`);
|
|
9
|
+
//same as: await db.notify('channel', 'data');
|
|
10
|
+
//result will be: 'data,nextCallback'
|
|
11
|
+
|
|
12
|
+
await db.unlisten('channel');
|
|
13
|
+
//dedicated listener connection now released.
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
See [Postgresql documentation](https://www.postgresql.org/docs/current/sql-notify.html)
|
|
17
|
+
|
|
18
|
+
## Some comments
|
|
19
|
+
Notification listeners uses a dedicated connection. If e.g. the postgresql server restarts, some notifications might not be received, but the connection and the listeners will be re-created.
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// For a detailed explanation regarding each configuration property, visit:
|
|
2
|
+
// https://jestjs.io/docs/en/configuration.html
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
roots: ["./src"],
|
|
6
|
+
testMatch: [
|
|
7
|
+
"**/*.test.ts"
|
|
8
|
+
],
|
|
9
|
+
testPathIgnorePatterns: ["/dist/", "/build/"],
|
|
10
|
+
|
|
11
|
+
// A preset that is used as a base for Jest's configuration
|
|
12
|
+
preset: "ts-jest",
|
|
13
|
+
testEnvironment: "node",
|
|
14
|
+
testRunner: "jest-jasmine2",
|
|
15
|
+
|
|
16
|
+
globals: {
|
|
17
|
+
"ts-jest": {
|
|
18
|
+
tsconfig: "tsconfig.json",
|
|
19
|
+
isolatedModules: true
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
setupFiles: ['dotenv/config']
|
|
23
|
+
};
|
|
@@ -5,7 +5,7 @@ const pgDb_1 = require("../pgDb");
|
|
|
5
5
|
const pgSchema_1 = require("../pgSchema");
|
|
6
6
|
const pgTable_1 = require("../pgTable");
|
|
7
7
|
(function () {
|
|
8
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
8
|
+
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
9
9
|
try {
|
|
10
10
|
let pgdb = yield pgDb_1.PgDb.connect({
|
|
11
11
|
logger: {
|
|
@@ -17,7 +17,7 @@ const pgTable_1 = require("../pgTable");
|
|
|
17
17
|
console.log('export interface PgDbType extends PgDb {');
|
|
18
18
|
for (let schemaName in pgdb.schemas) {
|
|
19
19
|
if (!(pgdb[schemaName] instanceof pgSchema_1.PgSchema)) {
|
|
20
|
-
throw Error('Already existing property: ' + schemaName + '!');
|
|
20
|
+
throw new Error('Already existing property: ' + schemaName + '!');
|
|
21
21
|
}
|
|
22
22
|
console.log(` '${schemaName}': PgSchema_${schemaName};`);
|
|
23
23
|
}
|
|
@@ -31,7 +31,7 @@ const pgTable_1 = require("../pgTable");
|
|
|
31
31
|
console.log(`export interface PgSchema_${schemaName} extends PgSchema {`);
|
|
32
32
|
for (let tableName in pgdb.schemas[schemaName].tables) {
|
|
33
33
|
if (!(pgdb[schemaName][tableName] instanceof pgTable_1.PgTable)) {
|
|
34
|
-
throw Error('Already existing property: ' + tableName + ' on schema:' + schemaName + '!');
|
|
34
|
+
throw new Error('Already existing property: ' + tableName + ' on schema:' + schemaName + '!');
|
|
35
35
|
}
|
|
36
36
|
console.log(` '${tableName}': PgTable<any>;`);
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInterface.js","sourceRoot":"","sources":["../../src/bin/generateInterface.ts"],"names":[],"mappings":";;;AAAA,kCAA6B;AAC7B,0CAAqC;AACrC,wCAAmC;AAEnC,CAAC;;QACG,IAAI;YACA,IAAI,IAAI,GAAG,MAAM,WAAI,CAAC,OAAO,CAAC;gBAC1B,MAAM,EAAE;oBACJ,GAAG,EAAE,GAAG,EAAE;oBACV,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK;iBAC1B;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAExD,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,mBAAQ,CAAC,EAAE;oBACzC,MAAM,KAAK,CAAC,6BAA6B,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"generateInterface.js","sourceRoot":"","sources":["../../src/bin/generateInterface.ts"],"names":[],"mappings":";;;AAAA,kCAA6B;AAC7B,0CAAqC;AACrC,wCAAmC;AAEnC,CAAC;;QACG,IAAI;YACA,IAAI,IAAI,GAAG,MAAM,WAAI,CAAC,OAAO,CAAC;gBAC1B,MAAM,EAAE;oBACJ,GAAG,EAAE,GAAG,EAAE;oBACV,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK;iBAC1B;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAExD,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,mBAAQ,CAAC,EAAE;oBACzC,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;iBACrE;gBACD,OAAO,CAAC,GAAG,CAAC,QAAQ,UAAU,eAAe,UAAU,GAAG,CAAC,CAAC;aAC/D;YAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,eAAe,UAAU,GAAG,CAAC,CAAC;aACnE;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEjB,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,qBAAqB,CAAC,CAAC;gBAC1E,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;oBACnD,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,YAAY,iBAAO,CAAC,EAAE;wBACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;qBACjG;oBACD,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,kBAAkB,CAAC,CAAC;iBACpD;gBACD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7B,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;oBACnD,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,kBAAkB,CAAC,CAAC;iBACxD;gBACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAErB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACpB;YAGD,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACpB;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CAAA,CAAC,EAAE,CAAC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { PgDbLogger } from './pgDbLogger';
|
|
2
|
+
export interface ForceEscapeColumnsOptions {
|
|
3
|
+
select?: boolean;
|
|
4
|
+
where?: boolean;
|
|
5
|
+
orderBy?: boolean;
|
|
6
|
+
groupBy?: boolean;
|
|
7
|
+
}
|
|
2
8
|
export interface ConnectionOptions {
|
|
3
9
|
host?: string;
|
|
4
10
|
user?: string;
|
|
@@ -6,6 +12,7 @@ export interface ConnectionOptions {
|
|
|
6
12
|
password?: string;
|
|
7
13
|
port?: number;
|
|
8
14
|
poolSize?: number;
|
|
15
|
+
forceEscapeColumns?: boolean | ForceEscapeColumnsOptions;
|
|
9
16
|
rows?: number;
|
|
10
17
|
min?: number;
|
|
11
18
|
max?: number;
|
|
@@ -22,4 +29,7 @@ export interface ConnectionOptions {
|
|
|
22
29
|
idleTimeoutMillis?: number;
|
|
23
30
|
logger?: PgDbLogger;
|
|
24
31
|
skipUndefined?: 'all' | 'select' | 'none';
|
|
32
|
+
strictDdl?: boolean;
|
|
33
|
+
strictDdlSelect?: boolean;
|
|
34
|
+
strictDdlWhere?: boolean;
|
|
25
35
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ export { ConnectionOptions } from './connectionOptions';
|
|
|
3
3
|
export { PgDbLogger } from './pgDbLogger';
|
|
4
4
|
export { PgTable } from './pgTable';
|
|
5
5
|
export { PgSchema } from './pgSchema';
|
|
6
|
-
export { QueryOptions } from './
|
|
6
|
+
export { QueryOptions } from './queryAbleInterface';
|
package/lib/pgConverters.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
export declare let
|
|
6
|
-
export declare let
|
|
7
|
-
export declare let
|
|
8
|
-
export declare let
|
|
1
|
+
export declare function parseArray(s: string): (string | null)[];
|
|
2
|
+
export declare function parseNumberWithValidation(s: string): number | null;
|
|
3
|
+
export declare function parseNumberOrNull(s: string): number | null;
|
|
4
|
+
export declare function parseBoolOrNull(s: string): boolean | null;
|
|
5
|
+
export declare let parseBooleanArray: (s: string) => (boolean | null)[];
|
|
6
|
+
export declare let parseNumberArray: (s: string) => (number | null)[];
|
|
7
|
+
export declare let parseNumberArrayWithValidation: (s: string[]) => (number | null)[];
|
|
8
|
+
export declare let parseDateArray: (s: string) => (Date | null)[];
|
|
9
|
+
export declare let parseJsonArray: (s: string) => (Object | null)[];
|
package/lib/pgConverters.js
CHANGED
|
@@ -1,54 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseJsonArray = exports.parseDateArray = exports.parseNumberArrayWithValidation = exports.parseNumberArray = exports.parseBooleanArray = exports.parseBoolOrNull = exports.parseNumberOrNull = exports.parseNumberWithValidation = exports.parseArray = void 0;
|
|
4
4
|
const moment = require("moment");
|
|
5
|
-
|
|
6
|
-
if (
|
|
5
|
+
function parseArray(s) {
|
|
6
|
+
if (!s || s[0] !== '{' || s[s.length - 1] !== '}')
|
|
7
|
+
throw new Error('Invalid array value:' + s);
|
|
8
|
+
if (s == "{}")
|
|
7
9
|
return [];
|
|
8
|
-
|
|
10
|
+
s = s.slice(1, s.length - 1);
|
|
9
11
|
let e = /(?:("(?:[^"\\]|\\.)*")|([^,"]*))(?:,|$)/g;
|
|
10
12
|
let valList = [];
|
|
11
13
|
let parsingResult;
|
|
12
14
|
do {
|
|
13
|
-
parsingResult = e.exec(
|
|
14
|
-
|
|
15
|
+
parsingResult = e.exec(s);
|
|
16
|
+
if (!parsingResult)
|
|
17
|
+
throw new Error('Invalid array value:' + s);
|
|
18
|
+
let valStr = (parsingResult[2] === 'NULL') ? null :
|
|
15
19
|
(parsingResult[1] == null ? parsingResult[2] : unescapeString(parsingResult[1]));
|
|
16
20
|
valList.push(valStr);
|
|
17
|
-
} while (e.lastIndex <
|
|
21
|
+
} while (e.lastIndex < s.length);
|
|
18
22
|
return valList;
|
|
19
|
-
}
|
|
20
|
-
exports.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
}
|
|
24
|
+
exports.parseArray = parseArray;
|
|
25
|
+
;
|
|
26
|
+
function parseNumberWithValidation(s) {
|
|
27
|
+
if (s === 'NULL') {
|
|
23
28
|
return null;
|
|
24
29
|
}
|
|
25
|
-
let v = +
|
|
30
|
+
let v = +s;
|
|
26
31
|
if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) {
|
|
27
|
-
throw Error("Number can't be represented in javascript precisely: " +
|
|
32
|
+
throw new Error("Number can't be represented in javascript precisely: " + s);
|
|
28
33
|
}
|
|
29
34
|
return v;
|
|
30
|
-
}
|
|
31
|
-
exports.
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
}
|
|
36
|
+
exports.parseNumberWithValidation = parseNumberWithValidation;
|
|
37
|
+
;
|
|
38
|
+
function parseNumberOrNull(s) {
|
|
39
|
+
if (s === 'NULL') {
|
|
34
40
|
return null;
|
|
35
41
|
}
|
|
36
|
-
return +
|
|
37
|
-
}
|
|
38
|
-
exports.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
exports.
|
|
47
|
-
let
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
return +s;
|
|
43
|
+
}
|
|
44
|
+
exports.parseNumberOrNull = parseNumberOrNull;
|
|
45
|
+
;
|
|
46
|
+
function parseBoolOrNull(s) {
|
|
47
|
+
if (s === 'NULL') {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return s == 't';
|
|
51
|
+
}
|
|
52
|
+
exports.parseBoolOrNull = parseBoolOrNull;
|
|
53
|
+
let parseBooleanArray = (s) => s == "{}" ? [] : s.substring(1, s.length - 1).split(',').map(parseBoolOrNull);
|
|
54
|
+
exports.parseBooleanArray = parseBooleanArray;
|
|
55
|
+
let parseNumberArray = (s) => s == "{}" ? [] : s.substring(1, s.length - 1).split(',').map(parseNumberOrNull);
|
|
56
|
+
exports.parseNumberArray = parseNumberArray;
|
|
57
|
+
let parseNumberArrayWithValidation = (s) => s.map(parseNumberWithValidation);
|
|
58
|
+
exports.parseNumberArrayWithValidation = parseNumberArrayWithValidation;
|
|
59
|
+
let parseDateArray = (s) => s == "{}" ? [] : s.substring(1, s.length - 1).split(',').map(d => d == 'NULL' ? null : moment(d.substring(1, d.length - 1)).toDate());
|
|
60
|
+
exports.parseDateArray = parseDateArray;
|
|
61
|
+
let parseJsonArray = (s) => {
|
|
62
|
+
let vals = parseArray(s);
|
|
63
|
+
return vals.map(s2 => typeof s2 === 'string' ? JSON.parse(s2) : s2);
|
|
50
64
|
};
|
|
51
|
-
exports.
|
|
65
|
+
exports.parseJsonArray = parseJsonArray;
|
|
52
66
|
function unescapeString(s) {
|
|
53
67
|
return s.slice(1, s.length - 1)
|
|
54
68
|
.replace(/\\"/g, '"')
|
package/lib/pgConverters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgConverters.js","sourceRoot":"","sources":["../src/pgConverters.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;
|
|
1
|
+
{"version":3,"file":"pgConverters.js","sourceRoot":"","sources":["../src/pgConverters.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAGjC,SAAgB,UAAU,CAAC,CAAS;IAChC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACzB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,0CAA0C,CAAC;IACnD,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,aAAa,CAAC;IAClB,GAAG;QACC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACxB,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE;IACjC,OAAO,OAAO,CAAC;AACnB,CAAC;AAfD,gCAeC;AAAA,CAAC;AAEF,SAAgB,yBAAyB,CAAC,CAAS;IAC/C,IAAI,CAAC,KAAK,MAAM,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACX,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE;QAC5D,MAAM,IAAI,KAAK,CAAC,uDAAuD,GAAG,CAAC,CAAC,CAAC;KAChF;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AATD,8DASC;AAAA,CAAC;AAEF,SAAgB,iBAAiB,CAAC,CAAS;IACvC,IAAI,CAAC,KAAK,MAAM,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,OAAO,CAAC,CAAC,CAAC;AACd,CAAC;AALD,8CAKC;AAAA,CAAC;AAEF,SAAgB,eAAe,CAAC,CAAS;IACrC,IAAI,CAAC,KAAK,MAAM,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,OAAO,CAAC,IAAI,GAAG,CAAC;AACpB,CAAC;AALD,0CAKC;AAEM,IAAI,iBAAiB,GAAG,CAAC,CAAS,EAAsB,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAArI,QAAA,iBAAiB,qBAAoH;AACzI,IAAI,gBAAgB,GAAG,CAAC,CAAS,EAAqB,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAArI,QAAA,gBAAgB,oBAAqH;AACzI,IAAI,8BAA8B,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAAnF,QAAA,8BAA8B,kCAAqD;AACvF,IAAI,cAAc,GAAG,CAAC,CAAS,EAAmB,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAAvL,QAAA,cAAc,kBAAyK;AAC3L,IAAI,cAAc,GAAG,CAAC,CAAS,EAAqB,EAAE;IACzD,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC,CAAC;AAHS,QAAA,cAAc,kBAGvB;AAEF,SAAS,cAAc,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const pgConverters_1 = require("./pgConverters");
|
|
5
|
+
describe("pgConverters.test", () => {
|
|
6
|
+
it("parseArray", () => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
|
|
7
|
+
expect((0, pgConverters_1.parseArray)('{}')).toEqual([]);
|
|
8
|
+
expect((0, pgConverters_1.parseArray)('{1,2}')).toEqual(['1', '2']);
|
|
9
|
+
expect((0, pgConverters_1.parseArray)('{NULL,""}')).toEqual([null, '']);
|
|
10
|
+
expect((0, pgConverters_1.parseArray)('{"\\\\","\\""}')).toEqual(['\\', '"']);
|
|
11
|
+
}));
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=pgConverters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgConverters.test.js","sourceRoot":"","sources":["../src/pgConverters.test.ts"],"names":[],"mappings":";;;AAAA,iDAA4C;AAE5C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,YAAY,EAAE,GAAS,EAAE;QACxB,MAAM,CAAC,IAAA,yBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,IAAA,yBAAU,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAA,yBAAU,EAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,IAAA,yBAAU,EAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/lib/pgDb.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { QueryAble
|
|
1
|
+
import { QueryAble } from "./queryAble";
|
|
2
|
+
import { IPgDb, ResultFieldType, PostProcessResultFunc, Notification, TranzactionIsolationLevel } from "./pgDbInterface";
|
|
2
3
|
import { PgTable } from "./pgTable";
|
|
3
4
|
import { PgSchema } from "./pgSchema";
|
|
5
|
+
import * as pg from 'pg';
|
|
4
6
|
import { PgDbLogger } from './pgDbLogger';
|
|
5
7
|
import { ConnectionOptions } from './connectionOptions';
|
|
6
8
|
export declare enum FieldType {
|
|
@@ -9,28 +11,15 @@ export declare enum FieldType {
|
|
|
9
11
|
TIME = 2,
|
|
10
12
|
TSVECTOR = 3
|
|
11
13
|
}
|
|
12
|
-
export declare
|
|
13
|
-
serializable = "SERIALIZABLE",
|
|
14
|
-
repeatableRead = "REPEATABLE READ",
|
|
15
|
-
readCommitted = "READ COMMITTED",
|
|
16
|
-
readUncommitted = "READ UNCOMMITTED"
|
|
17
|
-
}
|
|
18
|
-
export declare type PostProcessResultFunc = (res: any[], fields: ResultFieldType[], logger: PgDbLogger) => void;
|
|
19
|
-
export interface Notification {
|
|
20
|
-
processId: number;
|
|
21
|
-
channel: string;
|
|
22
|
-
payload?: string;
|
|
23
|
-
}
|
|
24
|
-
export declare class PgDb extends QueryAble {
|
|
14
|
+
export declare class PgDb extends QueryAble implements IPgDb {
|
|
25
15
|
protected static instances: {
|
|
26
16
|
[index: string]: Promise<PgDb>;
|
|
27
17
|
};
|
|
28
|
-
pool:
|
|
29
|
-
connection:
|
|
30
|
-
protected connectionForListen: any;
|
|
18
|
+
pool: pg.Pool;
|
|
19
|
+
connection: pg.PoolClient | null;
|
|
31
20
|
config: ConnectionOptions;
|
|
32
|
-
defaultSchemas:
|
|
33
|
-
db:
|
|
21
|
+
defaultSchemas: string[];
|
|
22
|
+
db: IPgDb;
|
|
34
23
|
schemas: {
|
|
35
24
|
[name: string]: PgSchema;
|
|
36
25
|
};
|
|
@@ -38,13 +27,14 @@ export declare class PgDb extends QueryAble {
|
|
|
38
27
|
[name: string]: PgTable<any>;
|
|
39
28
|
};
|
|
40
29
|
fn: {
|
|
41
|
-
[name: string]: (...
|
|
30
|
+
[name: string]: (...args: any[]) => any;
|
|
42
31
|
};
|
|
43
32
|
[name: string]: any | PgSchema;
|
|
44
|
-
pgdbTypeParsers:
|
|
45
|
-
|
|
33
|
+
pgdbTypeParsers: Record<string, (s: any) => any>;
|
|
34
|
+
knownOids: Record<number, boolean>;
|
|
35
|
+
postProcessResult: PostProcessResultFunc | undefined | null;
|
|
46
36
|
private constructor();
|
|
47
|
-
setPostProcessResult(f: (res: any[], fields: ResultFieldType[], logger: PgDbLogger) => void): void;
|
|
37
|
+
setPostProcessResult(f: null | ((res: any[], fields: ResultFieldType[], logger: PgDbLogger) => void)): void;
|
|
48
38
|
static getInstance(config: ConnectionOptions): Promise<PgDb>;
|
|
49
39
|
close(): Promise<void>;
|
|
50
40
|
static connect(config: ConnectionOptions): Promise<PgDb>;
|
|
@@ -53,8 +43,9 @@ export declare class PgDb extends QueryAble {
|
|
|
53
43
|
private initSchemasAndTables;
|
|
54
44
|
private setDefaultTablesAndFunctions;
|
|
55
45
|
private initFieldTypes;
|
|
56
|
-
setTypeParser(typeName: string, parser: (
|
|
57
|
-
setPgDbTypeParser(typeName: string, parser: (
|
|
46
|
+
setTypeParser(typeName: string, parser: (s: string) => any, schemaName?: string): Promise<void>;
|
|
47
|
+
setPgDbTypeParser(typeName: string, parser: (s: string) => any, schemaName?: string): Promise<void>;
|
|
48
|
+
resetMissingParsers(connection: pg.PoolClient, oidList: number[]): Promise<void>;
|
|
58
49
|
dedicatedConnectionBegin(): Promise<PgDb>;
|
|
59
50
|
dedicatedConnectionEnd(): Promise<PgDb>;
|
|
60
51
|
savePoint(name: string): Promise<PgDb>;
|
|
@@ -69,10 +60,19 @@ export declare class PgDb extends QueryAble {
|
|
|
69
60
|
savePoint?: string;
|
|
70
61
|
}): Promise<PgDb>;
|
|
71
62
|
isTransactionActive(): boolean;
|
|
72
|
-
execute(fileName: string, statementTransformerFunction?: (
|
|
63
|
+
execute(fileName: string, statementTransformerFunction?: (s: string) => string): Promise<void>;
|
|
73
64
|
private listeners;
|
|
65
|
+
private connectionForListen;
|
|
66
|
+
private _needToRestartConnectionForListen;
|
|
67
|
+
private restartConnectionForListen;
|
|
74
68
|
listen(channel: string, callback: (notification: Notification) => void): Promise<void>;
|
|
75
|
-
unlisten(channel: string, callback?: (
|
|
69
|
+
unlisten(channel: string, callback?: (notification: Notification) => void): Promise<void>;
|
|
76
70
|
notify(channel: string, payload?: string): Promise<any[]>;
|
|
71
|
+
runRestartConnectionForListen(): Promise<Error | null>;
|
|
72
|
+
needToFixConnectionForListen(): boolean;
|
|
73
|
+
private tryToFixConnectionForListenActively;
|
|
74
|
+
notificationListener: (notification: Notification) => boolean;
|
|
75
|
+
errorListener: (e: Error) => void;
|
|
76
|
+
private initConnectionForListen;
|
|
77
77
|
}
|
|
78
78
|
export default PgDb;
|