@or-sdk/pgsql 1.0.3-beta.1946.0 → 1.0.3-beta.1949.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/dist/cjs/Pgsql.js +128 -35
- package/dist/cjs/Pgsql.js.map +1 -1
- package/dist/cjs/utils/index.js +1 -13
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/esm/Pgsql.js +106 -28
- package/dist/esm/Pgsql.js.map +1 -1
- package/dist/esm/utils/index.js +0 -6
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/types/Pgsql.d.ts +31 -18
- package/dist/types/Pgsql.d.ts.map +1 -1
- package/dist/types/types.d.ts +20 -13
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +0 -6
- package/dist/types/utils/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/Pgsql.ts +152 -60
- package/src/types.ts +20 -18
- package/src/utils/index.ts +0 -6
- package/dist/cjs/utils/encodeValue.js +0 -17
- package/dist/cjs/utils/encodeValue.js.map +0 -1
- package/dist/cjs/utils/extractDatabaseNames.js +0 -10
- package/dist/cjs/utils/extractDatabaseNames.js.map +0 -1
- package/dist/cjs/utils/getDeleteRowsQuery.js +0 -9
- package/dist/cjs/utils/getDeleteRowsQuery.js.map +0 -1
- package/dist/cjs/utils/getEditRowQuery.js +0 -10
- package/dist/cjs/utils/getEditRowQuery.js.map +0 -1
- package/dist/cjs/utils/getInsertKeys.js +0 -9
- package/dist/cjs/utils/getInsertKeys.js.map +0 -1
- package/dist/cjs/utils/getInsertQueries.js +0 -18
- package/dist/cjs/utils/getInsertQueries.js.map +0 -1
- package/dist/esm/utils/encodeValue.js +0 -12
- package/dist/esm/utils/encodeValue.js.map +0 -1
- package/dist/esm/utils/extractDatabaseNames.js +0 -5
- package/dist/esm/utils/extractDatabaseNames.js.map +0 -1
- package/dist/esm/utils/getDeleteRowsQuery.js +0 -8
- package/dist/esm/utils/getDeleteRowsQuery.js.map +0 -1
- package/dist/esm/utils/getEditRowQuery.js +0 -10
- package/dist/esm/utils/getEditRowQuery.js.map +0 -1
- package/dist/esm/utils/getInsertKeys.js +0 -7
- package/dist/esm/utils/getInsertKeys.js.map +0 -1
- package/dist/esm/utils/getInsertQueries.js +0 -14
- package/dist/esm/utils/getInsertQueries.js.map +0 -1
- package/dist/types/utils/encodeValue.d.ts +0 -4
- package/dist/types/utils/encodeValue.d.ts.map +0 -1
- package/dist/types/utils/extractDatabaseNames.d.ts +0 -4
- package/dist/types/utils/extractDatabaseNames.d.ts.map +0 -1
- package/dist/types/utils/getDeleteRowsQuery.d.ts +0 -4
- package/dist/types/utils/getDeleteRowsQuery.d.ts.map +0 -1
- package/dist/types/utils/getEditRowQuery.d.ts +0 -4
- package/dist/types/utils/getEditRowQuery.d.ts.map +0 -1
- package/dist/types/utils/getInsertKeys.d.ts +0 -4
- package/dist/types/utils/getInsertKeys.d.ts.map +0 -1
- package/dist/types/utils/getInsertQueries.d.ts +0 -4
- package/dist/types/utils/getInsertQueries.d.ts.map +0 -1
- package/src/utils/encodeValue.ts +0 -11
- package/src/utils/extractDatabaseNames.ts +0 -7
- package/src/utils/getDeleteRowsQuery.ts +0 -10
- package/src/utils/getEditRowQuery.ts +0 -12
- package/src/utils/getInsertKeys.ts +0 -9
- package/src/utils/getInsertQueries.ts +0 -18
package/src/Pgsql.ts
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
1
2
|
import { Base, CalApiParams, List, MakeApiUrlData, makeList } from '@or-sdk/base';
|
|
2
3
|
import { LIST_SCHEMAS_QUERY, SERVICE_KEY } from './constants';
|
|
3
4
|
import {
|
|
4
5
|
AddColumnsArgs,
|
|
5
6
|
CreateDatabaseParams,
|
|
6
|
-
|
|
7
|
+
CreateTableArgs,
|
|
7
8
|
DatabaseItem,
|
|
8
9
|
DeleteRowsArgs, DropDatabaseResponse, EditRowArgs,
|
|
9
|
-
ExecuteQueryArgs, ExecuteQueryResponse, GetDBSizeResult, InsertArgs,
|
|
10
|
+
ExecuteQueryArgs, ExecuteQueryResponse, GetDBSizeResult, GetTableDataProps, InsertArgs,
|
|
10
11
|
ListDatabasesResponse,
|
|
11
|
-
PgsqlConfig, Row, SelectAllArgs,
|
|
12
|
+
PgsqlConfig, QueryField, Row, SelectAllArgs,
|
|
12
13
|
} from './types';
|
|
13
14
|
import {
|
|
14
15
|
createSchemaQuery,
|
|
15
16
|
getAddColumnsQuery,
|
|
16
17
|
getCreateTableQuery,
|
|
17
|
-
getDeleteRowsQuery,
|
|
18
18
|
getDropSchemaQuery,
|
|
19
|
-
getDropTableQuery,
|
|
19
|
+
getDropTableQuery, getGenerateTableSchemaQuery,
|
|
20
20
|
getGetPrimaryKeysQuery,
|
|
21
|
-
|
|
22
|
-
getListTablesQuery, getSelectAllCountQuery, getSelectAllQuery,
|
|
21
|
+
getListTablesQuery, getSelectAllCountQuery, getSelectAllQuery, splitPrimaryKeys,
|
|
23
22
|
} from './utils';
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
export class Pgsql extends Base {
|
|
27
|
-
private isExternal?: boolean;
|
|
28
|
-
|
|
29
26
|
constructor(params: PgsqlConfig) {
|
|
30
|
-
const { token, discoveryUrl, accountId, pgsqlUrl, version = 'master'
|
|
27
|
+
const { token, discoveryUrl, accountId, pgsqlUrl, version = 'master' } = params;
|
|
31
28
|
super({
|
|
32
29
|
token,
|
|
33
30
|
discoveryUrl,
|
|
@@ -36,7 +33,6 @@ export class Pgsql extends Base {
|
|
|
36
33
|
serviceUrl: pgsqlUrl,
|
|
37
34
|
feature: version,
|
|
38
35
|
});
|
|
39
|
-
this.isExternal = isExternal;
|
|
40
36
|
}
|
|
41
37
|
|
|
42
38
|
/**
|
|
@@ -56,7 +52,7 @@ export class Pgsql extends Base {
|
|
|
56
52
|
(params.params as any).feature = this.feature;
|
|
57
53
|
}
|
|
58
54
|
|
|
59
|
-
return this.
|
|
55
|
+
return this.callApiV2<T>(params);
|
|
60
56
|
}
|
|
61
57
|
|
|
62
58
|
makeApiUrl(data: MakeApiUrlData): string {
|
|
@@ -70,17 +66,19 @@ export class Pgsql extends Base {
|
|
|
70
66
|
* ```typescript
|
|
71
67
|
* const result = await pgsql.executeQuery({
|
|
72
68
|
* query: 'select * from table',
|
|
73
|
-
* database: 'db-name'
|
|
69
|
+
* database: 'db-name',
|
|
70
|
+
* isExternal: false,
|
|
71
|
+
* params: [],
|
|
74
72
|
* });
|
|
75
73
|
* ```
|
|
76
74
|
*/
|
|
77
|
-
public async executeQuery<T>({ query, params, database }: ExecuteQueryArgs): Promise<ExecuteQueryResponse<T>> {
|
|
75
|
+
public async executeQuery<T>({ query, params, database, isExternal }: ExecuteQueryArgs): Promise<ExecuteQueryResponse<T>> {
|
|
78
76
|
return this.makeRequest<ExecuteQueryResponse<T>>({
|
|
79
77
|
data: {
|
|
80
78
|
query,
|
|
81
79
|
params,
|
|
82
80
|
database,
|
|
83
|
-
isExternal
|
|
81
|
+
isExternal,
|
|
84
82
|
},
|
|
85
83
|
method: 'POST',
|
|
86
84
|
route: 'query',
|
|
@@ -92,6 +90,7 @@ export class Pgsql extends Base {
|
|
|
92
90
|
* ```typescript
|
|
93
91
|
* const databaseList = await pgsql.listDatabases();
|
|
94
92
|
* ```
|
|
93
|
+
* @returns {Array} database names
|
|
95
94
|
*/
|
|
96
95
|
public async listDatabases(): Promise<List<DatabaseItem>> {
|
|
97
96
|
const { databases } = await this.makeRequest<ListDatabasesResponse>({
|
|
@@ -108,8 +107,8 @@ export class Pgsql extends Base {
|
|
|
108
107
|
* const result = await pgsql.createDatabase({ database: 'db-name' });
|
|
109
108
|
* ```
|
|
110
109
|
*/
|
|
111
|
-
public async createDatabase({ database, externalCredentials }: CreateDatabaseParams): Promise<
|
|
112
|
-
return this.makeRequest<
|
|
110
|
+
public async createDatabase({ database, externalCredentials }: CreateDatabaseParams): Promise<void> {
|
|
111
|
+
return this.makeRequest<void>({
|
|
113
112
|
data: {
|
|
114
113
|
database,
|
|
115
114
|
externalCredentials,
|
|
@@ -127,18 +126,17 @@ export class Pgsql extends Base {
|
|
|
127
126
|
* const result = await pgsql.getDatabaseInfo({ database: 'db-name' });
|
|
128
127
|
* ```
|
|
129
128
|
*/
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
// }
|
|
129
|
+
public async getDatabaseInfo({ database }: { database: string; }): Promise<unknown> {
|
|
130
|
+
return this.callApiV2<unknown>({
|
|
131
|
+
method: 'GET',
|
|
132
|
+
route: `databases/${encodeURIComponent(database)}`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
137
135
|
|
|
138
136
|
/**
|
|
139
137
|
* Drop database
|
|
140
138
|
* ```typescript
|
|
141
|
-
* const result = await pgsql.dropDatabase({ database: 'db-name' });
|
|
139
|
+
* const result = await pgsql.dropDatabase({ database: 'db-name', isExternal: false });
|
|
142
140
|
* ```
|
|
143
141
|
*/
|
|
144
142
|
public async dropDatabase({ database, isExternal }: { database: string; isExternal?: boolean;}): Promise<DropDatabaseResponse> {
|
|
@@ -155,67 +153,74 @@ export class Pgsql extends Base {
|
|
|
155
153
|
/**
|
|
156
154
|
* List tables
|
|
157
155
|
* ```typescript
|
|
158
|
-
* const result = await pgsql.listTables({ database: 'db-name', schema: 'schema-name' });
|
|
156
|
+
* const result = await pgsql.listTables({ database: 'db-name', schema: 'schema-name', isExternal: false });
|
|
159
157
|
* ```
|
|
160
158
|
*/
|
|
161
|
-
public async listTables({ database, schema
|
|
159
|
+
public async listTables({ database, schema, isExternal }: { database: string; schema: string; isExternal: boolean; }): Promise<List<string>> {
|
|
162
160
|
const { rows } = await this.executeQuery<{ table_name: string; }>({
|
|
163
161
|
query: getListTablesQuery(schema),
|
|
164
162
|
database,
|
|
163
|
+
isExternal,
|
|
165
164
|
});
|
|
165
|
+
|
|
166
166
|
return makeList<string>(rows.map(x => x.table_name));
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
/**
|
|
170
170
|
* List schemas
|
|
171
171
|
* ```typescript
|
|
172
|
-
* const result = await pgsql.listSchemas({ database: 'db-name' });
|
|
172
|
+
* const result = await pgsql.listSchemas({ database: 'db-name', isExternal: false });
|
|
173
173
|
* ```
|
|
174
174
|
*/
|
|
175
|
-
public async listSchemas({ database }: { database: string; }): Promise<List<string>> {
|
|
175
|
+
public async listSchemas({ database, isExternal }: { database: string; isExternal: boolean; }): Promise<List<string>> {
|
|
176
176
|
const { rows } = await this.executeQuery<{ schema_name: string; }>({
|
|
177
177
|
query: LIST_SCHEMAS_QUERY,
|
|
178
178
|
database,
|
|
179
|
+
isExternal,
|
|
179
180
|
});
|
|
181
|
+
|
|
180
182
|
return makeList<string>(rows.map(x => x.schema_name));
|
|
181
183
|
}
|
|
182
184
|
|
|
183
185
|
/**
|
|
184
186
|
* Create schema
|
|
185
187
|
* ```typescript
|
|
186
|
-
* const result = await pgsql.createSchema({ database: 'db-name', schema: 'schema-name' });
|
|
188
|
+
* const result = await pgsql.createSchema({ database: 'db-name', schema: 'schema-name', isExternal: false });
|
|
187
189
|
* ```
|
|
188
190
|
*/
|
|
189
|
-
public async createSchema({ database, schema }: { database: string; schema: string; }): Promise<ExecuteQueryResponse<void>> {
|
|
191
|
+
public async createSchema({ database, schema, isExternal }: { database: string; schema: string; isExternal: boolean; }): Promise<ExecuteQueryResponse<void>> {
|
|
190
192
|
return this.executeQuery<void>({
|
|
191
193
|
query: createSchemaQuery(schema),
|
|
192
194
|
database,
|
|
195
|
+
isExternal,
|
|
193
196
|
});
|
|
194
197
|
}
|
|
195
198
|
|
|
196
199
|
/**
|
|
197
200
|
* Drop schema
|
|
198
201
|
* ```typescript
|
|
199
|
-
* const result = await pgsql.dropSchema({ database: 'db-name', schema: 'schema-name' });
|
|
202
|
+
* const result = await pgsql.dropSchema({ database: 'db-name', schema: 'schema-name', isExternal: false });
|
|
200
203
|
* ```
|
|
201
204
|
*/
|
|
202
|
-
public async dropSchema({ database, schema }: { database: string; schema: string; }): Promise<ExecuteQueryResponse<void>> {
|
|
205
|
+
public async dropSchema({ database, schema, isExternal }: { database: string; schema: string; isExternal: boolean; }): Promise<ExecuteQueryResponse<void>> {
|
|
203
206
|
return this.executeQuery<void>({
|
|
204
207
|
query: getDropSchemaQuery(schema),
|
|
205
208
|
database,
|
|
209
|
+
isExternal,
|
|
206
210
|
});
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
/**
|
|
210
214
|
* Drop table
|
|
211
215
|
* ```typescript
|
|
212
|
-
* const result = await pgsql.dropSchema({ database: 'db-name', schema: 'schema-name', table: 'table-name' });
|
|
216
|
+
* const result = await pgsql.dropSchema({ database: 'db-name', schema: 'schema-name', table: 'table-name', isExternal: false });
|
|
213
217
|
* ```
|
|
214
218
|
*/
|
|
215
|
-
public async dropTable({ database, schema, table }: { database: string; schema: string; table: string; }): Promise<ExecuteQueryResponse<void>> {
|
|
219
|
+
public async dropTable({ database, schema, table, isExternal }: { database: string; schema: string; table: string; isExternal: boolean; }): Promise<ExecuteQueryResponse<void>> {
|
|
216
220
|
return this.executeQuery<void>({
|
|
217
221
|
query: getDropTableQuery(schema, table),
|
|
218
222
|
database,
|
|
223
|
+
isExternal,
|
|
219
224
|
});
|
|
220
225
|
}
|
|
221
226
|
|
|
@@ -230,14 +235,16 @@ export class Pgsql extends Base {
|
|
|
230
235
|
* { name: 'col1', type: 'integer' },
|
|
231
236
|
* { name: 'col2', type: 'text' }
|
|
232
237
|
* ],
|
|
233
|
-
* primaryKey: 'col1,col2'
|
|
238
|
+
* primaryKey: 'col1,col2',
|
|
239
|
+
* isExternal: false
|
|
234
240
|
* });
|
|
235
241
|
* ```
|
|
236
242
|
*/
|
|
237
|
-
public async createTable({ database, schema, table, columns, primaryKey }: CreateTableArgs): Promise<ExecuteQueryResponse<void>> {
|
|
243
|
+
public async createTable({ database, schema, table, columns, primaryKey, isExternal }: CreateTableArgs): Promise<ExecuteQueryResponse<void>> {
|
|
238
244
|
return this.executeQuery<void>({
|
|
239
245
|
query: getCreateTableQuery(schema, table, columns, primaryKey),
|
|
240
246
|
database,
|
|
247
|
+
isExternal,
|
|
241
248
|
});
|
|
242
249
|
}
|
|
243
250
|
|
|
@@ -252,13 +259,15 @@ export class Pgsql extends Base {
|
|
|
252
259
|
* { name: 'col1', type: 'integer' },
|
|
253
260
|
* { name: 'col2', type: 'text' }
|
|
254
261
|
* ],
|
|
262
|
+
* isExternal: false
|
|
255
263
|
* });
|
|
256
264
|
* ```
|
|
257
265
|
*/
|
|
258
|
-
public async addColumns({ database, schema, table, columns }: AddColumnsArgs): Promise<ExecuteQueryResponse<void>> {
|
|
266
|
+
public async addColumns({ database, schema, table, columns, isExternal }: AddColumnsArgs): Promise<ExecuteQueryResponse<void>> {
|
|
259
267
|
return this.executeQuery<void>({
|
|
260
268
|
query: getAddColumnsQuery(schema, table, columns),
|
|
261
269
|
database,
|
|
270
|
+
isExternal,
|
|
262
271
|
});
|
|
263
272
|
}
|
|
264
273
|
|
|
@@ -273,52 +282,100 @@ export class Pgsql extends Base {
|
|
|
273
282
|
* { col1: 'value' }
|
|
274
283
|
* ],
|
|
275
284
|
* chunkSize: 300,
|
|
276
|
-
* context: { progress: 0 } // progress of insert will be set from 0 to 100
|
|
285
|
+
* context: { progress: 0 } // progress of insert will be set from 0 to 100,
|
|
286
|
+
* isExternal: false
|
|
277
287
|
* });
|
|
278
288
|
* ```
|
|
279
289
|
*/
|
|
280
|
-
public async insert({ database, schema, table, rows, chunkSize = 300, context }: InsertArgs): Promise<ExecuteQueryResponse<
|
|
290
|
+
public async insert({ database, schema, table, rows, chunkSize = 300, context, isExternal }: InsertArgs): Promise<ExecuteQueryResponse<unknown>[]> {
|
|
291
|
+
let params: any[] = [];
|
|
292
|
+
const addParam = (val: any) => {params.push(val);return `$${params.length}`;};
|
|
281
293
|
const res = [];
|
|
294
|
+
if (!_.isArray(rows)) rows = [rows];
|
|
295
|
+
const allKeys = {};
|
|
296
|
+
rows.forEach(x => Object.assign(allKeys, x));
|
|
297
|
+
const keys = Object.keys(allKeys);
|
|
298
|
+
const stringifyRow = (row: any) => `${keys.map(key => addParam(row[key])).join(', ')}`;
|
|
299
|
+
|
|
300
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
301
|
+
// @ts-ignore
|
|
302
|
+
for (const [index, chunk] of _.chunk(rows, chunkSize).entries()) {
|
|
303
|
+
params = [];
|
|
304
|
+
const query = `insert into ${schema}.${table} (${keys.join(', ')})
|
|
305
|
+
values (${chunk.map(stringifyRow).join('), (')});`;
|
|
306
|
+
res.push(await this.executeQuery({
|
|
307
|
+
query,
|
|
308
|
+
database,
|
|
309
|
+
isExternal,
|
|
310
|
+
params,
|
|
311
|
+
}));
|
|
312
|
+
if (context) context.progress = (index + 1) / (rows.length / chunkSize) * 100;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return res;
|
|
316
|
+
}
|
|
282
317
|
|
|
283
|
-
const queries = getInsertQueries(schema, table, rows, chunkSize);
|
|
284
318
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
319
|
+
// TODO: add method description and example
|
|
320
|
+
public async getDatabaseRows({ database, schema, table, chunkSize = 1000, offset = 0, limit, isExternal, params }: GetTableDataProps): Promise<{ rows: List<Row>; fields: QueryField[]; }> {
|
|
321
|
+
let fields: QueryField[] = [];
|
|
322
|
+
let rows, result: Row[] = [];
|
|
323
|
+
|
|
324
|
+
// TODO: add order by primary key?
|
|
325
|
+
// const query = `select * from ${schema}.${table} order by int`;
|
|
326
|
+
const query = `select * from ${schema}.${table}`;
|
|
327
|
+
|
|
328
|
+
if (limit && limit < chunkSize) chunkSize = limit;
|
|
329
|
+
|
|
330
|
+
do {
|
|
331
|
+
({ rows, fields } = await this.executeQuery<Row>({
|
|
332
|
+
query: getSelectAllQuery(query, offset, chunkSize),
|
|
288
333
|
database,
|
|
334
|
+
isExternal,
|
|
335
|
+
params,
|
|
289
336
|
}));
|
|
337
|
+
offset += chunkSize;
|
|
338
|
+
result = result.concat(rows);
|
|
290
339
|
|
|
291
|
-
if (
|
|
292
|
-
|
|
340
|
+
if (limit && result.length >= limit) {
|
|
341
|
+
result = result.slice(0, limit);
|
|
342
|
+
break;
|
|
293
343
|
}
|
|
294
|
-
}
|
|
344
|
+
} while (rows.length);
|
|
295
345
|
|
|
296
|
-
return
|
|
346
|
+
return {
|
|
347
|
+
rows: makeList<Row>(result),
|
|
348
|
+
fields,
|
|
349
|
+
};
|
|
297
350
|
}
|
|
298
351
|
|
|
352
|
+
|
|
299
353
|
/**
|
|
300
354
|
* Select all
|
|
301
355
|
* ```typescript
|
|
302
356
|
* const result = await pgsql.selectAll({
|
|
303
357
|
* database: 'db-name',
|
|
304
|
-
* query: 'select * from table', // must be select only, without limit and offset
|
|
358
|
+
* query: 'select * from table where id = $1', // must be select only, without limit and offset
|
|
305
359
|
* chunkSize: 300,
|
|
306
360
|
* offset: 0,
|
|
307
361
|
* limit: 0,
|
|
308
362
|
* context: { progress: 0, total: 0 } // progress of select will be set from 0 to 100
|
|
363
|
+
* isExternal: false,
|
|
364
|
+
* params: ['123']
|
|
309
365
|
* });
|
|
310
366
|
* ```
|
|
311
367
|
*/
|
|
312
|
-
public async selectAll({ database, query, context, chunkSize = 1000, offset = 0, limit }: SelectAllArgs): Promise<List<Row>> {
|
|
368
|
+
public async selectAll({ database, query, context, chunkSize = 1000, offset = 0, limit, isExternal, params }: SelectAllArgs): Promise<List<Row>> {
|
|
313
369
|
let count: number, rows, result: Row[] = [];
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}
|
|
370
|
+
|
|
371
|
+
if (limit && limit < chunkSize) chunkSize = limit;
|
|
317
372
|
|
|
318
373
|
if (context) {
|
|
319
374
|
const { rows } = await this.executeQuery<{ count: number; }>({
|
|
320
375
|
query: getSelectAllCountQuery(query),
|
|
321
376
|
database,
|
|
377
|
+
isExternal,
|
|
378
|
+
params,
|
|
322
379
|
});
|
|
323
380
|
count = rows[0].count;
|
|
324
381
|
context.total = count;
|
|
@@ -328,12 +385,16 @@ export class Pgsql extends Base {
|
|
|
328
385
|
({ rows } = await this.executeQuery<Row>({
|
|
329
386
|
query: getSelectAllQuery(query, offset, chunkSize),
|
|
330
387
|
database,
|
|
388
|
+
isExternal,
|
|
389
|
+
params,
|
|
331
390
|
}));
|
|
332
391
|
offset += chunkSize;
|
|
333
392
|
result = result.concat(rows);
|
|
393
|
+
|
|
334
394
|
if (context) {
|
|
335
395
|
context.progress = Math.min(offset / count! * 100, 100);
|
|
336
396
|
}
|
|
397
|
+
|
|
337
398
|
if (limit && result.length >= limit) {
|
|
338
399
|
result = result.slice(0, limit);
|
|
339
400
|
break;
|
|
@@ -346,13 +407,14 @@ export class Pgsql extends Base {
|
|
|
346
407
|
/**
|
|
347
408
|
* Get primary keys
|
|
348
409
|
* ```typescript
|
|
349
|
-
* const result = await pgsql.getPrimaryKeys({ database: 'db-name', schema: 'schema-name', table: 'table-name' });
|
|
410
|
+
* const result = await pgsql.getPrimaryKeys({ database: 'db-name', schema: 'schema-name', table: 'table-name', isExternal: false });
|
|
350
411
|
* ```
|
|
351
412
|
*/
|
|
352
|
-
public async getPrimaryKeys({ database, schema, table }: { database: string; schema: string; table: string; }): Promise<string> {
|
|
413
|
+
public async getPrimaryKeys({ database, schema, table, isExternal }: { database: string; schema: string; table: string; isExternal: boolean; }): Promise<string> {
|
|
353
414
|
const { rows } = await this.executeQuery<{ pk: string; }>({
|
|
354
415
|
database,
|
|
355
416
|
query: getGetPrimaryKeysQuery(schema, table),
|
|
417
|
+
isExternal,
|
|
356
418
|
});
|
|
357
419
|
return rows[0].pk;
|
|
358
420
|
}
|
|
@@ -368,13 +430,28 @@ export class Pgsql extends Base {
|
|
|
368
430
|
* value: 'new_value',
|
|
369
431
|
* row: { pk: 'pk_val', col1: 'old_value' },
|
|
370
432
|
* primaryKeys: 'pk',
|
|
433
|
+
* isExternal: false
|
|
371
434
|
* });
|
|
372
435
|
* ```
|
|
373
436
|
*/
|
|
374
|
-
public async editRow({ database, schema, table, key, value, row, primaryKeys }: EditRowArgs): Promise<ExecuteQueryResponse<void>> {
|
|
437
|
+
public async editRow({ database, schema, table, key, value, row, primaryKeys, isExternal }: EditRowArgs): Promise<ExecuteQueryResponse<void>> {
|
|
438
|
+
// TODO: maybe move query and params to utils and return both
|
|
439
|
+
const params: any[] = [];
|
|
440
|
+
const addParam = (val: any) => {
|
|
441
|
+
params.push(val);
|
|
442
|
+
return `$${params.length}`;
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
const pk = splitPrimaryKeys(primaryKeys);
|
|
446
|
+
|
|
447
|
+
// TODO: move query to utils
|
|
375
448
|
return this.executeQuery({
|
|
376
449
|
database,
|
|
377
|
-
query:
|
|
450
|
+
query: `update ${schema}.${table}
|
|
451
|
+
set ${key} = ${addParam(value)}
|
|
452
|
+
where ${pk.map(primaryKey => `${primaryKey} = ${addParam(row[primaryKey])}`).join(' AND ')}`,
|
|
453
|
+
isExternal,
|
|
454
|
+
params,
|
|
378
455
|
});
|
|
379
456
|
}
|
|
380
457
|
|
|
@@ -389,13 +466,27 @@ export class Pgsql extends Base {
|
|
|
389
466
|
* { pk: 'pk_val', col1: 'value' }
|
|
390
467
|
* ],
|
|
391
468
|
* primaryKeys: 'pk',
|
|
469
|
+
* isExternal: false
|
|
392
470
|
* });
|
|
393
471
|
* ```
|
|
394
472
|
*/
|
|
395
|
-
public async deleteRows({ database, schema, table, rows, primaryKeys }: DeleteRowsArgs): Promise<ExecuteQueryResponse<void>> {
|
|
473
|
+
public async deleteRows({ database, schema, table, rows, primaryKeys, isExternal }: DeleteRowsArgs): Promise<ExecuteQueryResponse<void>> {
|
|
474
|
+
const params: any[] = [];
|
|
475
|
+
const addParam = (val: any) => {
|
|
476
|
+
params.push(val);
|
|
477
|
+
return `$${params.length}`;
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
const pk = splitPrimaryKeys(primaryKeys);
|
|
481
|
+
// TODO: move query to util
|
|
482
|
+
const query = `delete from ${schema}.${table}
|
|
483
|
+
where (${rows.map(row => `${pk.map(primaryKey => `${primaryKey} = ${addParam(row[primaryKey])}`).join(' AND ')}`).join(') \nOR (')})`;
|
|
484
|
+
|
|
396
485
|
return this.executeQuery({
|
|
397
486
|
database,
|
|
398
|
-
query
|
|
487
|
+
query,
|
|
488
|
+
isExternal,
|
|
489
|
+
params,
|
|
399
490
|
});
|
|
400
491
|
}
|
|
401
492
|
|
|
@@ -405,10 +496,11 @@ export class Pgsql extends Base {
|
|
|
405
496
|
* const result = await pgsql.generateTableSchema({ database: 'db-name', schema: 'schema-name', table: 'table-name' });
|
|
406
497
|
* ```
|
|
407
498
|
*/
|
|
408
|
-
public async generateTableSchema({ database, schema, table }: { database: string; schema: string; table: string; }): Promise<string> {
|
|
499
|
+
public async generateTableSchema({ database, schema, table, isExternal }: { database: string; schema: string; table: string; isExternal: boolean; }): Promise<string> {
|
|
409
500
|
const { rows } = await this.executeQuery<{ code: string; }>({
|
|
410
501
|
database,
|
|
411
502
|
query: getGenerateTableSchemaQuery(schema, table),
|
|
503
|
+
isExternal,
|
|
412
504
|
});
|
|
413
505
|
|
|
414
506
|
return rows[0].code;
|
package/src/types.ts
CHANGED
|
@@ -25,11 +25,6 @@ export type PgsqlConfig = {
|
|
|
25
25
|
* Api version
|
|
26
26
|
*/
|
|
27
27
|
version?: string;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* use external database
|
|
31
|
-
*/
|
|
32
|
-
isExternal?: boolean;
|
|
33
28
|
};
|
|
34
29
|
|
|
35
30
|
export type QueryField = {
|
|
@@ -54,18 +49,9 @@ export type ExecuteQueryResponse<T> = {
|
|
|
54
49
|
|
|
55
50
|
export type ExecuteQueryArgs = {
|
|
56
51
|
query: string;
|
|
57
|
-
params?:
|
|
58
|
-
[key: string]: unknown;
|
|
59
|
-
};
|
|
52
|
+
params?: any[];
|
|
60
53
|
database: string;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
export type CreateDatabaseResponse = {
|
|
64
|
-
ok: number;
|
|
65
|
-
result: [
|
|
66
|
-
unknown[],
|
|
67
|
-
unknown[],
|
|
68
|
-
];
|
|
54
|
+
isExternal: boolean;
|
|
69
55
|
};
|
|
70
56
|
|
|
71
57
|
export type ListDatabasesResponseItem = {
|
|
@@ -87,7 +73,7 @@ export type GetDBSizeResult = {
|
|
|
87
73
|
|
|
88
74
|
export type TableColumn = {
|
|
89
75
|
name: string;
|
|
90
|
-
type:
|
|
76
|
+
type: string;
|
|
91
77
|
};
|
|
92
78
|
|
|
93
79
|
export type CreateTableArgs = {
|
|
@@ -96,6 +82,7 @@ export type CreateTableArgs = {
|
|
|
96
82
|
table: string;
|
|
97
83
|
columns: TableColumn[];
|
|
98
84
|
primaryKey: string;
|
|
85
|
+
isExternal: boolean;
|
|
99
86
|
};
|
|
100
87
|
|
|
101
88
|
export type AddColumnsArgs = {
|
|
@@ -103,6 +90,7 @@ export type AddColumnsArgs = {
|
|
|
103
90
|
schema: string;
|
|
104
91
|
table: string;
|
|
105
92
|
columns: TableColumn[];
|
|
93
|
+
isExternal: boolean;
|
|
106
94
|
};
|
|
107
95
|
|
|
108
96
|
export type Row = {
|
|
@@ -118,9 +106,19 @@ export type InsertArgs = {
|
|
|
118
106
|
context?: {
|
|
119
107
|
progress?: number;
|
|
120
108
|
};
|
|
109
|
+
isExternal: boolean;
|
|
121
110
|
};
|
|
122
111
|
|
|
123
|
-
export type
|
|
112
|
+
export type GetTableDataProps = {
|
|
113
|
+
database: string;
|
|
114
|
+
schema: string;
|
|
115
|
+
table: string;
|
|
116
|
+
isExternal: boolean;
|
|
117
|
+
chunkSize?: number;
|
|
118
|
+
offset?: number;
|
|
119
|
+
limit?: number;
|
|
120
|
+
params?: any[];
|
|
121
|
+
};
|
|
124
122
|
|
|
125
123
|
export type SelectAllArgs = {
|
|
126
124
|
database: string;
|
|
@@ -132,6 +130,8 @@ export type SelectAllArgs = {
|
|
|
132
130
|
chunkSize?: number;
|
|
133
131
|
offset?: number;
|
|
134
132
|
limit?: number;
|
|
133
|
+
isExternal: boolean;
|
|
134
|
+
params?: any[];
|
|
135
135
|
};
|
|
136
136
|
|
|
137
137
|
export type EditRowArgs = {
|
|
@@ -142,6 +142,7 @@ export type EditRowArgs = {
|
|
|
142
142
|
value: unknown;
|
|
143
143
|
row: Row;
|
|
144
144
|
primaryKeys: string;
|
|
145
|
+
isExternal: boolean;
|
|
145
146
|
};
|
|
146
147
|
|
|
147
148
|
export type DeleteRowsArgs = {
|
|
@@ -150,6 +151,7 @@ export type DeleteRowsArgs = {
|
|
|
150
151
|
table: string;
|
|
151
152
|
rows: Row[];
|
|
152
153
|
primaryKeys: string;
|
|
154
|
+
isExternal: boolean;
|
|
153
155
|
};
|
|
154
156
|
|
|
155
157
|
export type DatabaseItem = {
|
package/src/utils/index.ts
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
* @internal
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
export { default as extractDatabaseNames } from './extractDatabaseNames';
|
|
6
|
-
export { default as getInsertKeys } from './getInsertKeys';
|
|
7
|
-
export { default as encodeValue } from './encodeValue';
|
|
8
5
|
export { default as splitPrimaryKeys } from './splitPrimaryKeys';
|
|
9
6
|
export { default as getListTablesQuery } from './getListTablesQuery';
|
|
10
7
|
export { default as createSchemaQuery } from './createSchemaQuery';
|
|
@@ -12,10 +9,7 @@ export { default as getDropSchemaQuery } from './getDropSchemaQuery';
|
|
|
12
9
|
export { default as getCreateTableQuery } from './getCreateTableQuery';
|
|
13
10
|
export { default as getDropTableQuery } from './getDropTableQuery';
|
|
14
11
|
export { default as getAddColumnsQuery } from './getAddColumnsQuery';
|
|
15
|
-
export { default as getInsertQueries } from './getInsertQueries';
|
|
16
12
|
export { default as getSelectAllCountQuery } from './getSelectAllCountQuery';
|
|
17
13
|
export { default as getSelectAllQuery } from './getSelectAllQuery';
|
|
18
|
-
export { default as getEditRowQuery } from './getEditRowQuery';
|
|
19
|
-
export { default as getDeleteRowsQuery } from './getDeleteRowsQuery';
|
|
20
14
|
export { default as getGenerateTableSchemaQuery } from './getGenerateTableSchemaQuery';
|
|
21
15
|
export { default as getGetPrimaryKeysQuery } from './getGetPrimaryKeysQuery';
|
|
@@ -1,17 +0,0 @@
|
|
|
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
|
-
var lodash_1 = __importDefault(require("lodash"));
|
|
7
|
-
function encodeValue(value) {
|
|
8
|
-
if (lodash_1.default.isUndefined(value) || value === '' || lodash_1.default.isNull(value))
|
|
9
|
-
return 'NULL';
|
|
10
|
-
if (lodash_1.default.isString(value))
|
|
11
|
-
return "'".concat(value.replaceAll('\'', '\'\''), "'");
|
|
12
|
-
if (lodash_1.default.isNumber(value) || lodash_1.default.isBoolean(value))
|
|
13
|
-
return value;
|
|
14
|
-
return "'".concat(JSON.stringify(value).replaceAll('\'', '\'\''), "'");
|
|
15
|
-
}
|
|
16
|
-
exports.default = encodeValue;
|
|
17
|
-
//# sourceMappingURL=encodeValue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encodeValue.js","sourceRoot":"","sources":["../../../src/utils/encodeValue.ts"],"names":[],"mappings":";;;;;AACA,kDAAuB;AAEvB,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,gBAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,IAAI,gBAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3E,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,WAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAG,CAAC;IACpE,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,gBAAC,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,OAAO,WAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAG,CAAC;AAC/D,CAAC;AAED,kBAAe,WAAW,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function extractDatabaseNames(databaseNameArr) {
|
|
4
|
-
return databaseNameArr.map(function (_a) {
|
|
5
|
-
var name = _a.name;
|
|
6
|
-
return name;
|
|
7
|
-
});
|
|
8
|
-
}
|
|
9
|
-
exports.default = extractDatabaseNames;
|
|
10
|
-
//# sourceMappingURL=extractDatabaseNames.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extractDatabaseNames.js","sourceRoot":"","sources":["../../../src/utils/extractDatabaseNames.ts"],"names":[],"mappings":";;AAEA,SAAS,oBAAoB,CAAC,eAA4C;IACxE,OAAO,eAAe,CAAC,GAAG,CAAC,UAAC,EAAQ;YAAN,IAAI,UAAA;QAAO,OAAA,IAAI;IAAJ,CAAI,CAAC,CAAC;AACjD,CAAC;AAED,kBAAe,oBAAoB,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var utils_1 = require("../utils");
|
|
4
|
-
function getDeleteRowQuery(schema, table, rows, primaryKeys) {
|
|
5
|
-
var pk = (0, utils_1.splitPrimaryKeys)(primaryKeys);
|
|
6
|
-
return "delete from ".concat(schema, ".").concat(table, "\nwhere (").concat(rows.map(function (row) { return "".concat(pk.map(function (primaryKey) { return "".concat(primaryKey, " = ").concat((0, utils_1.encodeValue)(row[primaryKey])); }).join(' AND ')); }).join(') \nOR ('), ")");
|
|
7
|
-
}
|
|
8
|
-
exports.default = getDeleteRowQuery;
|
|
9
|
-
//# sourceMappingURL=getDeleteRowsQuery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getDeleteRowsQuery.js","sourceRoot":"","sources":["../../../src/utils/getDeleteRowsQuery.ts"],"names":[],"mappings":";;AACA,kCAAyD;AAEzD,SAAS,iBAAiB,CAAC,MAAc,EAAE,KAAa,EAAE,IAAW,EAAE,WAAmB;IACxF,IAAM,EAAE,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IACzC,OAAO,sBAAe,MAAM,cAAI,KAAK,sBAC9B,IAAI,CAAC,GAAG,CAAC,UAAA,GAAG,IAAI,OAAA,UAAG,EAAE,CAAC,GAAG,CAAC,UAAA,UAAU,IAAI,OAAA,UAAG,UAAU,gBAAM,IAAA,mBAAW,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,EAAjD,CAAiD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAE,EAA1F,CAA0F,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAG,CAAC;AACzI,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var utils_1 = require("../utils");
|
|
4
|
-
function getEditRowQuery(schema, table, key, value, row, primaryKeys) {
|
|
5
|
-
value = (0, utils_1.encodeValue)(value);
|
|
6
|
-
var pk = (0, utils_1.splitPrimaryKeys)(primaryKeys);
|
|
7
|
-
return "update ".concat(schema, ".").concat(table, "\nset ").concat(key, " = ").concat(value, "\nwhere ").concat(pk.map(function (primaryKey) { return "".concat(primaryKey, " = ").concat((0, utils_1.encodeValue)(row[primaryKey])); }).join(' AND '));
|
|
8
|
-
}
|
|
9
|
-
exports.default = getEditRowQuery;
|
|
10
|
-
//# sourceMappingURL=getEditRowQuery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getEditRowQuery.js","sourceRoot":"","sources":["../../../src/utils/getEditRowQuery.ts"],"names":[],"mappings":";;AAAA,kCAAyD;AAGzD,SAAS,eAAe,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW,EAAE,KAAc,EAAE,GAAQ,EAAE,WAAmB;IAChH,KAAK,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC;IAC3B,IAAM,EAAE,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IACzC,OAAO,iBAAU,MAAM,cAAI,KAAK,mBAC5B,GAAG,gBAAM,KAAK,qBACZ,EAAE,CAAC,GAAG,CAAC,UAAA,UAAU,IAAI,OAAA,UAAG,UAAU,gBAAM,IAAA,mBAAW,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,EAAjD,CAAiD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAE,CAAC;AAChG,CAAC;AAED,kBAAe,eAAe,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function getInsertKeys(rows) {
|
|
4
|
-
var allKeys = {};
|
|
5
|
-
rows.forEach(function (x) { return Object.assign(allKeys, x); });
|
|
6
|
-
return Object.keys(allKeys);
|
|
7
|
-
}
|
|
8
|
-
exports.default = getInsertKeys;
|
|
9
|
-
//# sourceMappingURL=getInsertKeys.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getInsertKeys.js","sourceRoot":"","sources":["../../../src/utils/getInsertKeys.ts"],"names":[],"mappings":";;AAEA,SAAS,aAAa,CAAC,IAAW;IAChC,IAAM,OAAO,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAzB,CAAyB,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,kBAAe,aAAa,CAAC"}
|