@l-v-yonsama/multi-platform-database-drivers 0.1.11 → 0.1.13
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/built/src/db/drivers/AwsS3Driver.js +99 -122
- package/built/src/db/drivers/AwsS3Driver.js.map +1 -1
- package/built/src/db/drivers/BaseDriver.js +54 -61
- package/built/src/db/drivers/BaseDriver.js.map +1 -1
- package/built/src/db/drivers/MySQLDriver.js +168 -187
- package/built/src/db/drivers/MySQLDriver.js.map +1 -1
- package/built/src/db/drivers/PostgresDriver.js +152 -173
- package/built/src/db/drivers/PostgresDriver.js.map +1 -1
- package/built/src/db/drivers/RedisDriver.js +152 -169
- package/built/src/db/drivers/RedisDriver.js.map +1 -1
- package/built/src/service/DBAccessService.js +239 -262
- package/built/src/service/DBAccessService.js.map +1 -1
- package/built/src/service/DBDriverResolver.js +14 -14
- package/built/src/service/DBDriverResolver.js.map +1 -1
- package/package.json +3 -5
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
1
|
import BaseDriver from './BaseDriver';
|
|
3
2
|
import ResultSetDataHolder, { RdhKey } from '../resource/ResultSetDataHolder';
|
|
4
3
|
import { DbDatabase, DbSchema, DbTable, DbColumn, } from '../resource/DbResource';
|
|
@@ -18,189 +17,172 @@ export default class PostgresDriver extends BaseDriver {
|
|
|
18
17
|
const key = new RdhKey(fieldInfo.name, GeneralColumnType.parse(name), super.resolveColumnComment(fieldInfo.name, resolver));
|
|
19
18
|
return key;
|
|
20
19
|
}
|
|
21
|
-
connectSub() {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
database: this.conRes.database,
|
|
37
|
-
});
|
|
38
|
-
this.pool = new pg.Pool(options);
|
|
39
|
-
errorReason = yield this.test();
|
|
40
|
-
return errorReason;
|
|
20
|
+
async connectSub() {
|
|
21
|
+
let errorReason = '';
|
|
22
|
+
const options = Object.assign({
|
|
23
|
+
port: 5432,
|
|
24
|
+
host: '127.0.0.1',
|
|
25
|
+
database: 'postgres',
|
|
26
|
+
}, {
|
|
27
|
+
max: 1,
|
|
28
|
+
idleTimeoutMillis: 3000,
|
|
29
|
+
connectionTimeoutMillis: 1000,
|
|
30
|
+
port: this.conRes.port,
|
|
31
|
+
host: this.conRes.host,
|
|
32
|
+
user: this.conRes.user,
|
|
33
|
+
password: this.conRes.password,
|
|
34
|
+
database: this.conRes.database,
|
|
41
35
|
});
|
|
36
|
+
this.pool = new pg.Pool(options);
|
|
37
|
+
errorReason = await this.test();
|
|
38
|
+
return errorReason;
|
|
42
39
|
}
|
|
43
|
-
test(with_connect = false) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
errorReason = yield this.connect();
|
|
49
|
-
}
|
|
50
|
-
const rdh = yield this.requestSql('SELECT NOW()');
|
|
51
|
-
if (rdh && rdh.errorMessage) {
|
|
52
|
-
errorReason = rdh.errorMessage;
|
|
53
|
-
}
|
|
40
|
+
async test(with_connect = false) {
|
|
41
|
+
let errorReason = '';
|
|
42
|
+
try {
|
|
43
|
+
if (with_connect) {
|
|
44
|
+
errorReason = await this.connect();
|
|
54
45
|
}
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
const rdh = await this.requestSql('SELECT NOW()');
|
|
47
|
+
if (rdh && rdh.errorMessage) {
|
|
48
|
+
errorReason = rdh.errorMessage;
|
|
57
49
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
errorReason = e.message;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (with_connect) {
|
|
56
|
+
await this.disconnect();
|
|
62
57
|
}
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
}
|
|
59
|
+
return errorReason;
|
|
65
60
|
}
|
|
66
|
-
requestSql(sql, options) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
binds = options.binds;
|
|
73
|
-
}
|
|
74
|
-
const results = yield this.pool.query(sql, binds);
|
|
75
|
-
if (results) {
|
|
76
|
-
let resolver;
|
|
77
|
-
if (options && options.needs_column_resolve === true) {
|
|
78
|
-
resolver = this.createColumnResolver(sql);
|
|
79
|
-
}
|
|
80
|
-
const fields = results.fields;
|
|
81
|
-
rdh = new ResultSetDataHolder(fields === undefined
|
|
82
|
-
? []
|
|
83
|
-
: fields.map((f) => this.fieldInfo2Key(f, resolver)));
|
|
84
|
-
if (results.rows) {
|
|
85
|
-
results.rows.forEach((result) => {
|
|
86
|
-
rdh.addRow(result);
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
61
|
+
async requestSql(sql, options) {
|
|
62
|
+
let rdh = new ResultSetDataHolder([]);
|
|
63
|
+
try {
|
|
64
|
+
let binds = [];
|
|
65
|
+
if (options && options.binds) {
|
|
66
|
+
binds = options.binds;
|
|
90
67
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
countTables(tables, options) {
|
|
98
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
const list = new Array();
|
|
100
|
-
let counter = 1;
|
|
101
|
-
for (const st of tables.list) {
|
|
102
|
-
let prefix = '';
|
|
103
|
-
if (st.schema) {
|
|
104
|
-
prefix = st.schema + '.';
|
|
105
|
-
}
|
|
106
|
-
if (options && options.progress_callback) {
|
|
107
|
-
if (counter % 5 === 0) {
|
|
108
|
-
options.progress_callback(`Count ${prefix}${st.table}`, 70);
|
|
109
|
-
}
|
|
68
|
+
const results = await this.pool.query(sql, binds);
|
|
69
|
+
if (results) {
|
|
70
|
+
let resolver;
|
|
71
|
+
if (options && options.needs_column_resolve === true) {
|
|
72
|
+
resolver = this.createColumnResolver(sql);
|
|
110
73
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
74
|
+
const fields = results.fields;
|
|
75
|
+
rdh = new ResultSetDataHolder(fields === undefined
|
|
76
|
+
? []
|
|
77
|
+
: fields.map((f) => this.fieldInfo2Key(f, resolver)));
|
|
78
|
+
if (results.rows) {
|
|
79
|
+
results.rows.forEach((result) => {
|
|
80
|
+
rdh.addRow(result);
|
|
81
|
+
});
|
|
119
82
|
}
|
|
120
|
-
catch (e) { }
|
|
121
|
-
counter++;
|
|
122
83
|
}
|
|
123
|
-
|
|
124
|
-
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
rdh = ResultSetDataHolder.create(err);
|
|
87
|
+
}
|
|
88
|
+
return rdh;
|
|
125
89
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
90
|
+
async countTables(tables, options) {
|
|
91
|
+
const list = new Array();
|
|
92
|
+
let counter = 1;
|
|
93
|
+
for (const st of tables.list) {
|
|
94
|
+
let prefix = '';
|
|
95
|
+
if (st.schema) {
|
|
96
|
+
prefix = st.schema + '.';
|
|
130
97
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const dbSchemas = yield this.getSchemas(dbDatabase);
|
|
136
|
-
dbSchemas.forEach((res) => {
|
|
137
|
-
dbDatabase.addChild(res);
|
|
138
|
-
});
|
|
139
|
-
this.resetDefaultSchema(dbDatabase);
|
|
140
|
-
for (const dbSchema of dbSchemas) {
|
|
141
|
-
const dbTables = yield this.getTables(dbSchema);
|
|
142
|
-
dbTables.forEach((res) => dbSchema.addChild(res));
|
|
98
|
+
if (options && options.progress_callback) {
|
|
99
|
+
if (counter % 5 === 0) {
|
|
100
|
+
options.progress_callback(`Count ${prefix}${st.table}`, 70);
|
|
101
|
+
}
|
|
143
102
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
103
|
+
const sql = `SELECT COUNT(*) as count FROM ${prefix}${st.table}`;
|
|
104
|
+
try {
|
|
105
|
+
const results = await this.pool.query(sql, []);
|
|
106
|
+
if (results && results.rows && results.rows.length > 0) {
|
|
107
|
+
const row = results.rows[0];
|
|
108
|
+
const obj = Object.assign({ count: row.count }, st);
|
|
109
|
+
list.push(obj);
|
|
148
110
|
}
|
|
149
111
|
}
|
|
150
|
-
|
|
112
|
+
catch (e) { }
|
|
113
|
+
counter++;
|
|
114
|
+
}
|
|
115
|
+
return list;
|
|
116
|
+
}
|
|
117
|
+
async getInfomationSchemas(options) {
|
|
118
|
+
if (!this.conRes) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const dbResources = new Array();
|
|
122
|
+
const db_list = await this.asyncGetDatabases(this.conRes.database);
|
|
123
|
+
db_list.forEach((db) => dbResources.push(db));
|
|
124
|
+
const dbDatabase = db_list.find((d) => d.name === this.conRes.database);
|
|
125
|
+
const dbSchemas = await this.getSchemas(dbDatabase);
|
|
126
|
+
dbSchemas.forEach((res) => {
|
|
127
|
+
dbDatabase.addChild(res);
|
|
151
128
|
});
|
|
129
|
+
this.resetDefaultSchema(dbDatabase);
|
|
130
|
+
for (const dbSchema of dbSchemas) {
|
|
131
|
+
const dbTables = await this.getTables(dbSchema);
|
|
132
|
+
dbTables.forEach((res) => dbSchema.addChild(res));
|
|
133
|
+
}
|
|
134
|
+
for (const dbSchema of dbSchemas) {
|
|
135
|
+
for (const dbTable of dbSchema.getChildren()) {
|
|
136
|
+
const dbColumns = await this.getColumns(dbTable);
|
|
137
|
+
dbColumns.forEach((res) => dbTable.addChild(res));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return dbResources;
|
|
152
141
|
}
|
|
153
|
-
asyncGetDatabases(connection_database) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
.requestSql(`SELECT datname AS name, pg_encoding_to_char(encoding) AS comment
|
|
142
|
+
async asyncGetDatabases(connection_database) {
|
|
143
|
+
const rdh = await this
|
|
144
|
+
.requestSql(`SELECT datname AS name, pg_encoding_to_char(encoding) AS comment
|
|
157
145
|
FROM pg_database ORDER BY datname`);
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
});
|
|
146
|
+
return rdh.rows.map((r) => {
|
|
147
|
+
const res = new DbDatabase(r.values.name);
|
|
148
|
+
res.comment = r.values.comment;
|
|
149
|
+
res.disabled = res.name !== connection_database;
|
|
150
|
+
return res;
|
|
164
151
|
});
|
|
165
152
|
}
|
|
166
|
-
getSchemas(dbDatabase) {
|
|
167
|
-
|
|
168
|
-
const rdh = yield this.requestSql(`SELECT SCHEMA_NAME AS name
|
|
153
|
+
async getSchemas(dbDatabase) {
|
|
154
|
+
const rdh = await this.requestSql(`SELECT SCHEMA_NAME AS name
|
|
169
155
|
FROM INFORMATION_SCHEMA.SCHEMATA
|
|
170
156
|
WHERE LOWER(SCHEMA_NAME) NOT IN ('information_schema', 'sys', 'performance_schema', 'pg_catalog', 'pg_toast', 'pg_temp_1', 'pg_toast_temp_1')
|
|
171
157
|
ORDER BY name`);
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
});
|
|
158
|
+
return rdh.rows.map((r) => {
|
|
159
|
+
const res = new DbSchema(r.values.name);
|
|
160
|
+
return res;
|
|
176
161
|
});
|
|
177
162
|
}
|
|
178
|
-
getTables(dbSchema) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
.requestSql(`select quote_ident(m.relname) as qname, COALESCE(d.description, '') as comment
|
|
163
|
+
async getTables(dbSchema) {
|
|
164
|
+
let rdh = await this
|
|
165
|
+
.requestSql(`select quote_ident(m.relname) as qname, COALESCE(d.description, '') as comment
|
|
182
166
|
from pg_stat_all_tables as m
|
|
183
167
|
LEFT JOIN pg_description as d ON (m.relid = d.objoid AND d.objsubid=0)
|
|
184
168
|
WHERE m.schemaname='${dbSchema.getName()}'
|
|
185
169
|
ORDER BY m.relname`);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
170
|
+
const list = rdh.rows.map((r) => {
|
|
171
|
+
const res = new DbTable(r.values.qname, 'TABLE', r.values.comment);
|
|
172
|
+
return res;
|
|
173
|
+
});
|
|
174
|
+
rdh = await this
|
|
175
|
+
.requestSql(`select quote_ident(viewname) as qname, definition from pg_catalog.pg_views
|
|
192
176
|
where schemaname = '${dbSchema.getName()}'
|
|
193
177
|
order by viewname`);
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
});
|
|
178
|
+
return list.concat(rdh.rows.map((r) => {
|
|
179
|
+
const res = new DbTable(r.values.qname, 'VIEW', '');
|
|
180
|
+
return res;
|
|
181
|
+
}));
|
|
199
182
|
}
|
|
200
|
-
getColumns(dbTable) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const rdh = yield this.requestSql(`select
|
|
183
|
+
async getColumns(dbTable) {
|
|
184
|
+
const binds = [dbTable.getParent().getName(), dbTable.getName()];
|
|
185
|
+
const rdh = await this.requestSql(`select
|
|
204
186
|
col.COLUMN_NAME as name,
|
|
205
187
|
quote_ident(col.COLUMN_NAME) as qname,
|
|
206
188
|
data_type as col_type,
|
|
@@ -253,30 +235,27 @@ export default class PostgresDriver extends BaseDriver {
|
|
|
253
235
|
col.table_schema = $1 AND quote_ident(col.table_name) = $2
|
|
254
236
|
order by
|
|
255
237
|
col.ordinal_position`, { binds });
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
});
|
|
238
|
+
return rdh.rows.map((r) => {
|
|
239
|
+
const type_name = EnumValues.getNameFromValue(PostgresColumnType, PostgresColumnType.parse(r.values.col_type));
|
|
240
|
+
const res = new DbColumn(r.values.qname, GeneralColumnType.parse(type_name), {
|
|
241
|
+
nullable: r.values.nullable === 1,
|
|
242
|
+
key: r.values.col_key,
|
|
243
|
+
default: r.values.col_default,
|
|
244
|
+
extra: r.values.col_extra,
|
|
245
|
+
}, r.values.comment);
|
|
246
|
+
return res;
|
|
266
247
|
});
|
|
267
248
|
}
|
|
268
|
-
closeSub() {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
yield this.pool.end();
|
|
273
|
-
}
|
|
274
|
-
return '';
|
|
249
|
+
async closeSub() {
|
|
250
|
+
try {
|
|
251
|
+
if (this.pool) {
|
|
252
|
+
await this.pool.end();
|
|
275
253
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
254
|
+
return '';
|
|
255
|
+
}
|
|
256
|
+
catch (e) {
|
|
257
|
+
return e.message;
|
|
258
|
+
}
|
|
280
259
|
}
|
|
281
260
|
}
|
|
282
261
|
//# sourceMappingURL=PostgresDriver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/PostgresDriver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PostgresDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/PostgresDriver.ts"],"names":[],"mappings":"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"}
|