@webda/postgres 4.0.0-beta.2 → 4.0.0-beta.4

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.
@@ -1,115 +0,0 @@
1
- import { CoreModel } from "@webda/core";
2
- import pg, { ClientConfig, PoolConfig } from "pg";
3
- import { SQLResult, SQLStore, SQLStoreParameters } from "./sqlstore.js";
4
- /**
5
- *
6
- */
7
- export declare class PostgresParameters extends SQLStoreParameters {
8
- /**
9
- * @default true
10
- */
11
- usePool?: boolean;
12
- /**
13
- * By default use environment variables
14
- */
15
- postgresqlServer?: ClientConfig | PoolConfig;
16
- /**
17
- * Auto create table if not exists
18
- * @default true
19
- */
20
- autoCreateTable?: boolean;
21
- /**
22
- * View name prefix
23
- */
24
- viewPrefix?: string;
25
- /**
26
- * Regexp of models to include
27
- *
28
- * @default [".*"]
29
- */
30
- views?: string[];
31
- constructor(params: any, store: PostgresStore);
32
- }
33
- /**
34
- * Store data within PostgreSQL with JSONB
35
- *
36
- * The table should be created before with
37
-
38
- * ```sql
39
- * CREATE TABLE IF NOT EXISTS ${tableName}
40
- * (
41
- * uuid uuid NOT NULL,
42
- * data jsonb,
43
- * CONSTRAINT ${tableName}_pkey PRIMARY KEY (uuid)
44
- * );
45
- * ```
46
- *
47
- * @WebdaModda
48
- */
49
- export declare class PostgresStore<T extends CoreModel = CoreModel, K extends PostgresParameters = PostgresParameters> extends SQLStore<T, K> {
50
- client: pg.Client | pg.Pool;
51
- /**
52
- * @override
53
- */
54
- loadParameters(params: any): PostgresParameters;
55
- /**
56
- * @override
57
- */
58
- init(): Promise<this>;
59
- /**
60
- * Ensure your table exists
61
- */
62
- checkTable(): Promise<void>;
63
- /**
64
- * Return the postgresql client
65
- * @returns
66
- */
67
- getClient(): pg.Client | pg.Pool;
68
- /**
69
- * Execute a query on the server
70
- *
71
- * @param query
72
- * @returns
73
- */
74
- executeQuery(query: string, values?: any[]): Promise<SQLResult<T>>;
75
- /**
76
- * Create views for each models
77
- *
78
- * @param [prefix=""] prefix to add to the view name
79
- * @param [skips=[]] list of models to skip
80
- */
81
- createViews(): Promise<void>;
82
- /**
83
- * @override
84
- */
85
- mapExpressionAttribute(attribute: string[]): string;
86
- /**
87
- * @override
88
- */
89
- _patch(object: any, uid: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<any>;
90
- /**
91
- * @override
92
- */
93
- _removeAttribute(uuid: string, attribute: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<void>;
94
- /**
95
- * @override
96
- */
97
- getQueryCondition(itemWriteCondition: any, itemWriteConditionField: string, params: any[]): string;
98
- /**
99
- * @override
100
- */
101
- _incrementAttributes(uid: string, params: {
102
- property: string;
103
- value: number;
104
- }[], updateDate: Date): Promise<any>;
105
- /**
106
- * @override
107
- */
108
- _upsertItemToCollection(uuid: string, attribute: string, item: any, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
109
- /**
110
- * @override
111
- */
112
- _deleteItemFromCollection(uuid: string, attribute: string, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
113
- }
114
- export default PostgresStore;
115
- //# sourceMappingURL=postgresstore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresstore.d.ts","sourceRoot":"","sources":["../src/postgresstore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuE,MAAM,aAAa,CAAC;AAE7G,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAarE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IAC7C;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;gBAEL,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa;CAO9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa,CACxB,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;IAE5B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,GAAG;IAI1B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;OAEG;IACG,UAAU;IAahB;;;OAGG;IACH,SAAS;IAIT;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAS5E;;;;;OAKG;IACG,WAAW;IA6DjB;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAInD;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,uBAAuB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAYhH;;OAEG;IACG,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,GAAG,EACxB,uBAAuB,CAAC,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACH,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;IAMzF;;OAEG;IACG,oBAAoB,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,EAC7C,UAAU,EAAE,IAAI,GACf,OAAO,CAAC,GAAG,CAAC;IAkBf;;OAEG;IACG,uBAAuB,CAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,GAAG,EACvB,uBAAuB,EAAE,MAAM,EAC/B,UAAU,EAAE,IAAI,GACf,OAAO,CAAC,GAAG,CAAC;IAyBf;;OAEG;IACG,yBAAyB,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,GAAG,EACvB,uBAAuB,EAAE,MAAM,EAC/B,UAAU,EAAE,IAAI,GACf,OAAO,CAAC,GAAG,CAAC;CAkBhB;AAED,eAAe,aAAa,CAAC"}
@@ -1,271 +0,0 @@
1
- import { RegExpStringValidator, StoreNotFoundError, UpdateConditionFailError } from "@webda/core";
2
- import pg from "pg";
3
- import { SQLStore, SQLStoreParameters } from "./sqlstore.js";
4
- /*
5
- * Ideas:
6
- * - Make views for each models to have a better query: https://dba.stackexchange.com/questions/151838/postgresql-json-column-to-view
7
- * - CREATE VIEW my_view AS SELECT uuid,data->>'status' as status from table;
8
- * - could auto resolve FK
9
- * - Use STORED generated model to define FK: https://stackoverflow.com/questions/24489647/json-foreign-keys-in-postgresql
10
- * - FKs should be defined based on relationship
11
- * - Define colums dynamically based on the schema -> benchmark to see if it is useful
12
- * - Allow to define indexes on fields
13
- */
14
- /**
15
- *
16
- */
17
- export class PostgresParameters extends SQLStoreParameters {
18
- constructor(params, store) {
19
- super(params, store);
20
- this.autoCreateTable ?? (this.autoCreateTable = true);
21
- this.usePool ?? (this.usePool = false);
22
- this.viewPrefix ?? (this.viewPrefix = "");
23
- this.views ?? (this.views = ["regex:.*"]);
24
- }
25
- }
26
- /**
27
- * Store data within PostgreSQL with JSONB
28
- *
29
- * The table should be created before with
30
-
31
- * ```sql
32
- * CREATE TABLE IF NOT EXISTS ${tableName}
33
- * (
34
- * uuid uuid NOT NULL,
35
- * data jsonb,
36
- * CONSTRAINT ${tableName}_pkey PRIMARY KEY (uuid)
37
- * );
38
- * ```
39
- *
40
- * @WebdaModda
41
- */
42
- export class PostgresStore extends SQLStore {
43
- /**
44
- * @override
45
- */
46
- loadParameters(params) {
47
- return new PostgresParameters(params, this);
48
- }
49
- /**
50
- * @override
51
- */
52
- async init() {
53
- if (this.parameters.usePool) {
54
- this.client = new pg.Pool(this.parameters.postgresqlServer);
55
- }
56
- else {
57
- this.client = new pg.Client(this.parameters.postgresqlServer);
58
- }
59
- await this.client.connect();
60
- await this.checkTable();
61
- await super.init();
62
- return this;
63
- }
64
- /**
65
- * Ensure your table exists
66
- */
67
- async checkTable() {
68
- if (!this.parameters.autoCreateTable) {
69
- return;
70
- }
71
- this.log("DEBUG", `CREATE TABLE IF NOT EXISTS ${this.parameters.table} (uuid VARCHAR(255) NOT NULL, data jsonb, CONSTRAINT ${this.parameters.table}_pkey PRIMARY KEY (uuid))`);
72
- await this.client.query(`CREATE TABLE IF NOT EXISTS ${this.parameters.table} (uuid VARCHAR(255) NOT NULL, data jsonb, CONSTRAINT ${this.parameters.table}_pkey PRIMARY KEY (uuid))`);
73
- }
74
- /**
75
- * Return the postgresql client
76
- * @returns
77
- */
78
- getClient() {
79
- return this.client;
80
- }
81
- /**
82
- * Execute a query on the server
83
- *
84
- * @param query
85
- * @returns
86
- */
87
- async executeQuery(query, values = []) {
88
- this.log("DEBUG", "Query", query);
89
- const res = await this.client.query(query, values);
90
- return {
91
- rows: res.rows.map(r => this.initModel(r.data)),
92
- rowCount: res.rowCount
93
- };
94
- }
95
- /**
96
- * Create views for each models
97
- *
98
- * @param [prefix=""] prefix to add to the view name
99
- * @param [skips=[]] list of models to skip
100
- */
101
- async createViews() {
102
- // CREATE VIEW my_view AS SELECT uuid,data->>'status' as status from table;
103
- const webda = this.getWebda();
104
- const models = webda.getModels();
105
- const app = webda.getApplication();
106
- const validator = new RegExpStringValidator(this.parameters.views);
107
- for (const model of Object.values(models)) {
108
- const store = webda.getModelStore(model);
109
- if (!(store instanceof PostgresStore)) {
110
- continue;
111
- }
112
- const fields = ["uuid"];
113
- const schema = model.getSchema();
114
- console.log("SCHEMA", schema, model.getIdentifier(false), validator.validate(model.getIdentifier(false)), this.parameters.views);
115
- if (!schema || !validator.validate(model.getIdentifier(false))) {
116
- continue;
117
- }
118
- const plural = webda.getApplication().getModelPlural(model.getIdentifier());
119
- for (const field of Object.keys(schema.properties)) {
120
- if (field === "uuid" || !field.match(/^[0-9a-zA-Z-_$]+$/)) {
121
- continue;
122
- }
123
- let cast = "";
124
- const type = schema.properties[field].type;
125
- if (type === "number") {
126
- cast = "::bigint";
127
- }
128
- else if (type === "boolean") {
129
- cast = "::boolean";
130
- }
131
- else if (type === "string") {
132
- cast = "::text";
133
- }
134
- else if (type === "array") {
135
- cast = "::jsonb";
136
- }
137
- else if (type === "object") {
138
- cast = "::jsonb";
139
- }
140
- fields.push(`(data->>'${field}')${cast} as ${field}`);
141
- }
142
- let query = `CREATE OR REPLACE VIEW ${this.parameters.viewPrefix}${plural} AS SELECT ${fields.join(",")} FROM ${store.getParameters().table}`;
143
- if (store.handleModel(model) > 0) {
144
- query += ` WHERE (data#>>'{__types}')::jsonb ? '${app.getShortId(app.getModelName(model))}'`;
145
- }
146
- try {
147
- this.log("INFO", "Dropping view");
148
- await store.getClient().query(`DROP VIEW IF EXISTS ${this.parameters.viewPrefix}${plural}`);
149
- this.log("INFO", query);
150
- await store.getClient().query(query);
151
- }
152
- catch (err) {
153
- this.log("ERROR", err);
154
- }
155
- }
156
- }
157
- /**
158
- * @override
159
- */
160
- mapExpressionAttribute(attribute) {
161
- return `data#>>'{${attribute.join(",")}}'`;
162
- }
163
- /**
164
- * @override
165
- */
166
- async _patch(object, uid, itemWriteCondition, itemWriteConditionField) {
167
- let query = `UPDATE ${this.parameters.table} SET data = data || $1::jsonb WHERE uuid = $2`;
168
- const args = [JSON.stringify(object), this.getUuid(uid)];
169
- if (itemWriteCondition) {
170
- query += this.getQueryCondition(itemWriteCondition, itemWriteConditionField, args);
171
- }
172
- const res = await this.sqlQuery(query, args);
173
- if (res.rowCount === 0) {
174
- throw new UpdateConditionFailError(uid, itemWriteConditionField, itemWriteCondition);
175
- }
176
- }
177
- /**
178
- * @override
179
- */
180
- async _removeAttribute(uuid, attribute, itemWriteCondition, itemWriteConditionField) {
181
- let query = `UPDATE ${this.parameters.table} SET data = data - $1 WHERE uuid = $2`;
182
- const args = [attribute, this.getUuid(uuid)];
183
- if (itemWriteCondition) {
184
- query += this.getQueryCondition(itemWriteCondition, itemWriteConditionField, args);
185
- }
186
- const res = await this.sqlQuery(query, args);
187
- if (res.rowCount === 0) {
188
- if (itemWriteCondition) {
189
- throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
190
- }
191
- else {
192
- throw new StoreNotFoundError(uuid, this.getName());
193
- }
194
- }
195
- }
196
- /**
197
- * @override
198
- */
199
- getQueryCondition(itemWriteCondition, itemWriteConditionField, params) {
200
- const condition = itemWriteCondition instanceof Date ? itemWriteCondition.toISOString() : itemWriteCondition;
201
- params.push(condition);
202
- return ` AND data->>'${itemWriteConditionField}'=$${params.length}`;
203
- }
204
- /**
205
- * @override
206
- */
207
- async _incrementAttributes(uid, params, updateDate) {
208
- let data = "data";
209
- const args = [this.getUuid(uid)];
210
- params.forEach((p, index) => {
211
- args.push(p.value);
212
- data = `jsonb_set(${data}, '{${p.property}}', (COALESCE(data->>'${p.property}','0')::int + $${index + 2})::text::jsonb)::jsonb`;
213
- });
214
- const query = `UPDATE ${this.parameters.table} SET data = jsonb_set(${data}, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
215
- const res = await this.sqlQuery(query, args);
216
- if (res.rowCount === 0) {
217
- throw new StoreNotFoundError(uid, this.getName());
218
- }
219
- }
220
- /**
221
- * @override
222
- */
223
- async _upsertItemToCollection(uuid, attribute, item, index, itemWriteCondition, itemWriteConditionField, updateDate) {
224
- let query = `UPDATE ${this.parameters.table} SET data = jsonb_set(jsonb_set(data::jsonb, array['${attribute}'],`;
225
- const args = [this.getUuid(uuid)];
226
- if (index === undefined) {
227
- query += `COALESCE((data->'${attribute}')::jsonb, '[]'::jsonb) || '[${JSON.stringify(item)}]'::jsonb)::jsonb`;
228
- }
229
- else {
230
- query += `jsonb_set(COALESCE((data->'${attribute}')::jsonb, '[]'::jsonb), '{${index}}', '${JSON.stringify(item)}'::jsonb)::jsonb)`;
231
- }
232
- query += `, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
233
- if (itemWriteCondition) {
234
- args.push(itemWriteCondition);
235
- query += ` AND (data#>>'{${attribute}, ${index}}')::jsonb->>'${itemWriteConditionField}'=$${args.length}`;
236
- }
237
- const res = await this.sqlQuery(query, args);
238
- if (res.rowCount === 0) {
239
- if (itemWriteCondition) {
240
- throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
241
- }
242
- else {
243
- throw new StoreNotFoundError(uuid, this.getName());
244
- }
245
- }
246
- }
247
- /**
248
- * @override
249
- */
250
- async _deleteItemFromCollection(uuid, attribute, index, itemWriteCondition, itemWriteConditionField, updateDate) {
251
- let query = `UPDATE ${this.parameters.table} SET data = jsonb_set(jsonb_set(data::jsonb, array['${attribute}'], COALESCE(`;
252
- const args = [this.getUuid(uuid)];
253
- query += `((data->'${attribute}')::jsonb - ${index})`;
254
- query += `, '[]'::jsonb))::jsonb, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
255
- if (itemWriteCondition) {
256
- args.push(itemWriteCondition);
257
- query += ` AND (data#>>'{${attribute}, ${index}}')::jsonb->>'${itemWriteConditionField}'=$2`;
258
- }
259
- const res = await this.sqlQuery(query, args);
260
- if (res.rowCount === 0) {
261
- if (itemWriteCondition) {
262
- throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
263
- }
264
- else {
265
- throw new StoreNotFoundError(uuid, this.getName());
266
- }
267
- }
268
- }
269
- }
270
- export default PostgresStore;
271
- //# sourceMappingURL=postgresstore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresstore.js","sourceRoot":"","sources":["../src/postgresstore.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { Ident } from "@webda/core";
2
- import { StoreTest } from "@webda/core/lib/stores/store.spec.js";
3
- import PostgresStore from "./postgresstore.js";
4
- export declare class PostgresTest extends StoreTest<PostgresStore> {
5
- getIdentStore(): Promise<PostgresStore<any>>;
6
- getUserStore(): Promise<PostgresStore<any>>;
7
- getModelClass(): typeof Ident;
8
- deleteConcurrent(): Promise<void>;
9
- createTable(): Promise<void>;
10
- cov(): Promise<void>;
11
- stoppedPostgres(): Promise<void>;
12
- createViews(): Promise<void>;
13
- }
14
- //# sourceMappingURL=postgresstore.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresstore.spec.d.ts","sourceRoot":"","sources":["../src/postgresstore.spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,EAAS,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAG9D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAc5C,qBACa,YAAa,SAAQ,SAAS,CAAC,aAAa,CAAC;IAClD,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAY5C,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAYjD,aAAa;IAKP,gBAAgB;IAKhB,WAAW;IAuBX,GAAG;IAaH,eAAe;IAUf,WAAW;CA4BlB"}
@@ -1,130 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { suite, test } from "@testdeck/mocha";
8
- import { Ident } from "@webda/core";
9
- import { StoreTest } from "@webda/core/lib/stores/store.spec.js";
10
- import * as assert from "assert";
11
- import pg from "pg";
12
- import PostgresStore from "./postgresstore.js";
13
- const params = {
14
- database: "webda.io",
15
- postgresqlServer: {
16
- host: "localhost",
17
- user: "webda.io",
18
- database: "webda.io",
19
- password: "webda.io",
20
- statement_timeout: 60000,
21
- max: 2
22
- }
23
- };
24
- let PostgresTest = class PostgresTest extends StoreTest {
25
- async getIdentStore() {
26
- return this.addService(PostgresStore, {
27
- ...params,
28
- asyncDelete: true,
29
- table: "idents",
30
- model: "Webda/Ident"
31
- }, "idents");
32
- }
33
- async getUserStore() {
34
- return this.addService(PostgresStore, {
35
- ...params,
36
- table: "users",
37
- model: "Webda/User"
38
- }, "users");
39
- }
40
- getModelClass() {
41
- return Ident;
42
- }
43
- async deleteConcurrent() {
44
- return super.deleteConcurrent();
45
- }
46
- async createTable() {
47
- const client = new pg.Client({
48
- host: "localhost",
49
- user: "webda.io",
50
- database: "webda.io",
51
- password: "webda.io"
52
- });
53
- try {
54
- await client.connect();
55
- await client.query("DROP TABLE IF EXISTS create_test");
56
- const store = this.getService("idents");
57
- store.getParameters().table = "create_test";
58
- store.getParameters().autoCreateTable = true;
59
- await store.init();
60
- await store.save({ test: 1 });
61
- const res = await store.getClient().query("SELECT * FROM create_test");
62
- assert.strictEqual(res.rowCount, 1);
63
- }
64
- finally {
65
- await client.end();
66
- }
67
- }
68
- async cov() {
69
- const store = this.identStore;
70
- store.getParameters().usePool = false;
71
- await store.init();
72
- await store.query("test = TRUE");
73
- //assert.rejects(() => store._find({}, 12, 10), /Query should be a string/);
74
- assert.strictEqual(store.getClient(), store.client);
75
- // Test checkTable
76
- store.getParameters().autoCreateTable = false;
77
- await store.checkTable();
78
- }
79
- async stoppedPostgres() {
80
- const obj = await this.identStore.save({
81
- test: 0
82
- });
83
- await obj.patch({ test: 1 });
84
- await new Promise(resolve => setTimeout(resolve, 20000));
85
- await obj.patch({ test: 2 });
86
- }
87
- async createViews() {
88
- const store = this.identStore;
89
- let info = await store.getClient().query(`SELECT 'DROP VIEW ' || table_name || ';'
90
- FROM information_schema.views
91
- WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
92
- AND table_name !~ '^pg_';`);
93
- store.getParameters().viewPrefix = "view_";
94
- // Execute all the drop views
95
- await store.createViews();
96
- info = await store
97
- .getClient()
98
- .query("SELECT table_name FROM information_schema.views WHERE table_schema NOT IN ('pg_catalog', 'information_schema')");
99
- assert.deepStrictEqual(info.rows.sort((a, b) => a.table_name.localeCompare(b.table_name)), [
100
- { table_name: "view_idents" },
101
- { table_name: "view_myidents" },
102
- { table_name: "view_mysimpleusers" },
103
- { table_name: "view_simpleusers" },
104
- { table_name: "view_testidents" },
105
- { table_name: "view_users" }
106
- ]);
107
- store.getParameters().viewPrefix = "";
108
- await store.createViews();
109
- }
110
- };
111
- __decorate([
112
- test
113
- ], PostgresTest.prototype, "deleteConcurrent", null);
114
- __decorate([
115
- test
116
- ], PostgresTest.prototype, "createTable", null);
117
- __decorate([
118
- test
119
- ], PostgresTest.prototype, "cov", null);
120
- __decorate([
121
- test
122
- ], PostgresTest.prototype, "stoppedPostgres", null);
123
- __decorate([
124
- test
125
- ], PostgresTest.prototype, "createViews", null);
126
- PostgresTest = __decorate([
127
- suite
128
- ], PostgresTest);
129
- export { PostgresTest };
130
- //# sourceMappingURL=postgresstore.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresstore.spec.js","sourceRoot":"","sources":["../src/postgresstore.spec.ts"],"names":[],"mappings":"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"}