@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 * as mysql from 'mysql2/promise';
|
|
4
3
|
import ResultSetDataHolder, { RdhKey } from '../resource/ResultSetDataHolder';
|
|
@@ -20,204 +19,189 @@ export default class MySQLDriver extends BaseDriver {
|
|
|
20
19
|
}
|
|
21
20
|
return key;
|
|
22
21
|
}
|
|
23
|
-
connectSub() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
22
|
+
async connectSub() {
|
|
23
|
+
let errorMessage = '';
|
|
24
|
+
const options = {
|
|
25
|
+
connectionLimit: 4,
|
|
26
|
+
multipleStatements: true,
|
|
27
|
+
port: this.conRes.port,
|
|
28
|
+
host: this.conRes.host,
|
|
29
|
+
user: this.conRes.user,
|
|
30
|
+
password: this.conRes.password,
|
|
31
|
+
database: this.conRes.database,
|
|
32
|
+
};
|
|
33
|
+
this.client = mysql.createPool(options);
|
|
34
|
+
try {
|
|
35
|
+
errorMessage = await this.test();
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
errorMessage = e.message;
|
|
39
|
+
}
|
|
40
|
+
return errorMessage;
|
|
41
|
+
}
|
|
42
|
+
async test(with_connect = false) {
|
|
43
|
+
let errorReason = '';
|
|
44
|
+
if (with_connect) {
|
|
45
|
+
errorReason = await this.connect();
|
|
46
|
+
}
|
|
47
|
+
if (!errorReason) {
|
|
48
|
+
const rdh = await this.requestSql('SELECT 1 from DUAL');
|
|
49
|
+
if (rdh && rdh.errorMessage) {
|
|
50
|
+
return rdh.errorMessage;
|
|
38
51
|
}
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
if (with_connect) {
|
|
53
|
+
await this.disconnect();
|
|
41
54
|
}
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
}
|
|
56
|
+
return errorReason;
|
|
44
57
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
async requestSql(sql, options) {
|
|
59
|
+
let rdh = new ResultSetDataHolder([]);
|
|
60
|
+
if (this.client) {
|
|
61
|
+
let binds = [];
|
|
62
|
+
if (options && options.binds) {
|
|
63
|
+
binds = options.binds;
|
|
50
64
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return rdh.errorMessage;
|
|
55
|
-
}
|
|
56
|
-
if (with_connect) {
|
|
57
|
-
yield this.disconnect();
|
|
58
|
-
}
|
|
65
|
+
let resolver;
|
|
66
|
+
if (options && options.needs_column_resolve === true) {
|
|
67
|
+
resolver = this.createColumnResolver(sql);
|
|
59
68
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
'fieldCount',
|
|
81
|
-
'affectedRows',
|
|
82
|
-
'insertId',
|
|
83
|
-
'serverStatus',
|
|
84
|
-
'warningStatus',
|
|
85
|
-
'changedRows',
|
|
86
|
-
]);
|
|
87
|
-
rdh.addRow({
|
|
88
|
-
fieldCount: results.fieldCount,
|
|
89
|
-
affectedRows: results.affectedRows,
|
|
90
|
-
insertId: results.insertId,
|
|
91
|
-
serverStatus: results.serverStatus,
|
|
92
|
-
warningStatus: results.warningStatus,
|
|
93
|
-
changedRows: results.changedRows,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
rdh = new ResultSetDataHolder(fields === undefined
|
|
98
|
-
? []
|
|
99
|
-
: fields.map((f) => this.fieldInfo2Key(f, resolver)));
|
|
100
|
-
rows.forEach((result) => {
|
|
101
|
-
rdh.addRow(result);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
69
|
+
const [rows, fields] = await this.client.execute(sql, binds);
|
|
70
|
+
try {
|
|
71
|
+
if (fields === undefined) {
|
|
72
|
+
const results = rows;
|
|
73
|
+
rdh = new ResultSetDataHolder([
|
|
74
|
+
'fieldCount',
|
|
75
|
+
'affectedRows',
|
|
76
|
+
'insertId',
|
|
77
|
+
'serverStatus',
|
|
78
|
+
'warningStatus',
|
|
79
|
+
'changedRows',
|
|
80
|
+
]);
|
|
81
|
+
rdh.addRow({
|
|
82
|
+
fieldCount: results.fieldCount,
|
|
83
|
+
affectedRows: results.affectedRows,
|
|
84
|
+
insertId: results.insertId,
|
|
85
|
+
serverStatus: results.serverStatus,
|
|
86
|
+
warningStatus: results.warningStatus,
|
|
87
|
+
changedRows: results.changedRows,
|
|
88
|
+
});
|
|
104
89
|
}
|
|
105
|
-
|
|
106
|
-
rdh = ResultSetDataHolder
|
|
90
|
+
else {
|
|
91
|
+
rdh = new ResultSetDataHolder(fields === undefined
|
|
92
|
+
? []
|
|
93
|
+
: fields.map((f) => this.fieldInfo2Key(f, resolver)));
|
|
94
|
+
rows.forEach((result) => {
|
|
95
|
+
rdh.addRow(result);
|
|
96
|
+
});
|
|
107
97
|
}
|
|
108
98
|
}
|
|
109
|
-
|
|
110
|
-
|
|
99
|
+
catch (err) {
|
|
100
|
+
rdh = ResultSetDataHolder.create(err);
|
|
111
101
|
}
|
|
112
|
-
|
|
113
|
-
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
new Error('No connection');
|
|
105
|
+
}
|
|
106
|
+
return rdh;
|
|
114
107
|
}
|
|
115
|
-
countTables(tables, options) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
options.progress_callback(`Count ${prefix}${st.table}`, 70);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
const sql = `SELECT COUNT(*) as count FROM ${prefix}${st.table}`;
|
|
130
|
-
try {
|
|
131
|
-
const [results] = yield this.client.query(sql, []);
|
|
132
|
-
if (results && results.length > 0) {
|
|
133
|
-
const row = results[0];
|
|
134
|
-
const obj = Object.assign({ count: row.count }, st);
|
|
135
|
-
list.push(obj);
|
|
136
|
-
}
|
|
108
|
+
async countTables(tables, options) {
|
|
109
|
+
const list = new Array();
|
|
110
|
+
let counter = 1;
|
|
111
|
+
for (const st of tables.list) {
|
|
112
|
+
let prefix = '';
|
|
113
|
+
if (st.schema) {
|
|
114
|
+
prefix = st.schema + '.';
|
|
115
|
+
}
|
|
116
|
+
if (options && options.progress_callback) {
|
|
117
|
+
if (counter % 5 === 0) {
|
|
118
|
+
options.progress_callback(`Count ${prefix}${st.table}`, 70);
|
|
137
119
|
}
|
|
138
|
-
|
|
139
|
-
|
|
120
|
+
}
|
|
121
|
+
const sql = `SELECT COUNT(*) as count FROM ${prefix}${st.table}`;
|
|
122
|
+
try {
|
|
123
|
+
const [results] = await this.client.query(sql, []);
|
|
124
|
+
if (results && results.length > 0) {
|
|
125
|
+
const row = results[0];
|
|
126
|
+
const obj = Object.assign({ count: row.count }, st);
|
|
127
|
+
list.push(obj);
|
|
140
128
|
}
|
|
141
|
-
counter++;
|
|
142
129
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
getInfomationSchemas(options) {
|
|
147
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
-
if (!this.conRes) {
|
|
149
|
-
return [];
|
|
130
|
+
catch (e) {
|
|
131
|
+
console.error(e);
|
|
150
132
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
133
|
+
counter++;
|
|
134
|
+
}
|
|
135
|
+
return list;
|
|
136
|
+
}
|
|
137
|
+
async getInfomationSchemas(options) {
|
|
138
|
+
if (!this.conRes) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const dbResources = new Array();
|
|
142
|
+
const dbDatabase = new DbDatabase(this.conRes.database);
|
|
143
|
+
dbResources.push(dbDatabase);
|
|
144
|
+
let progress = 10;
|
|
145
|
+
if (options.progress_callback) {
|
|
146
|
+
options.progress_callback(`${dbResources.length} Databases found.`, progress);
|
|
147
|
+
}
|
|
148
|
+
const dbSchemas = await this.getSchemas(dbDatabase);
|
|
149
|
+
dbSchemas.forEach((res) => {
|
|
150
|
+
dbDatabase.addChild(res);
|
|
151
|
+
});
|
|
152
|
+
this.resetDefaultSchema(dbDatabase);
|
|
153
|
+
progress = 30;
|
|
154
|
+
if (options.progress_callback) {
|
|
155
|
+
options.progress_callback(`${dbSchemas.length} Schemas found.`, progress);
|
|
156
|
+
}
|
|
157
|
+
const incrPerSchema = Math.round(20 / dbSchemas.length);
|
|
158
|
+
for (const dbSchema of dbSchemas) {
|
|
159
|
+
const dbTables = await this.getTables(dbSchema);
|
|
160
|
+
dbTables.forEach((res) => dbSchema.addChild(res));
|
|
155
161
|
if (options.progress_callback) {
|
|
156
|
-
|
|
162
|
+
progress += incrPerSchema;
|
|
163
|
+
options.progress_callback(`${dbTables.length} Tables found in Schema[${dbSchema.getName()}].`, progress);
|
|
157
164
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
dbDatabase.addChild(res);
|
|
161
|
-
});
|
|
162
|
-
this.resetDefaultSchema(dbDatabase);
|
|
163
|
-
progress = 30;
|
|
165
|
+
}
|
|
166
|
+
for (const dbSchema of dbSchemas) {
|
|
164
167
|
if (options.progress_callback) {
|
|
165
|
-
|
|
168
|
+
progress += incrPerSchema;
|
|
169
|
+
options.progress_callback(`Commnets finding now... in Schema[${dbSchema.getName()}].`, progress);
|
|
166
170
|
}
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
dbTables.forEach((res) => dbSchema.addChild(res));
|
|
171
|
-
if (options.progress_callback) {
|
|
172
|
-
progress += incrPerSchema;
|
|
173
|
-
options.progress_callback(`${dbTables.length} Tables found in Schema[${dbSchema.getName()}].`, progress);
|
|
174
|
-
}
|
|
171
|
+
for (const dbTable of dbSchema.getChildren()) {
|
|
172
|
+
const dbColumns = await this.getColumns(dbTable);
|
|
173
|
+
dbColumns.forEach((res) => dbTable.addChild(res));
|
|
175
174
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
progress += incrPerSchema;
|
|
179
|
-
options.progress_callback(`Commnets finding now... in Schema[${dbSchema.getName()}].`, progress);
|
|
180
|
-
}
|
|
181
|
-
for (const dbTable of dbSchema.getChildren()) {
|
|
182
|
-
const dbColumns = yield this.getColumns(dbTable);
|
|
183
|
-
dbColumns.forEach((res) => dbTable.addChild(res));
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return dbResources;
|
|
187
|
-
});
|
|
175
|
+
}
|
|
176
|
+
return dbResources;
|
|
188
177
|
}
|
|
189
|
-
getSchemas(dbDatabase) {
|
|
190
|
-
|
|
191
|
-
const rdh = yield this.requestSql(`SELECT SCHEMA_NAME AS name
|
|
178
|
+
async getSchemas(dbDatabase) {
|
|
179
|
+
const rdh = await this.requestSql(`SELECT SCHEMA_NAME AS name
|
|
192
180
|
FROM INFORMATION_SCHEMA.SCHEMATA
|
|
193
181
|
WHERE LOWER(SCHEMA_NAME) NOT IN ('information_schema', 'sys', 'performance_schema')
|
|
194
182
|
ORDER BY name`);
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
});
|
|
183
|
+
return rdh.rows.map((r) => {
|
|
184
|
+
const res = new DbSchema(r.values.name);
|
|
185
|
+
return res;
|
|
199
186
|
});
|
|
200
187
|
}
|
|
201
|
-
getTables(dbSchema) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
.requestSql(`SELECT TABLE_NAME as name, CASE TABLE_TYPE
|
|
188
|
+
async getTables(dbSchema) {
|
|
189
|
+
const rdh = await this
|
|
190
|
+
.requestSql(`SELECT TABLE_NAME as name, CASE TABLE_TYPE
|
|
205
191
|
WHEN 'BASE TABLE' THEN 'TABLE'
|
|
206
192
|
WHEN 'SYSTEM VIEW' THEN 'VIEW'
|
|
207
193
|
ELSE 'TABLE' END AS table_type,
|
|
208
194
|
TABLE_COMMENT as comment
|
|
209
195
|
FROM INFORMATION_SCHEMA.TABLES
|
|
210
196
|
WHERE TABLE_SCHEMA = '${dbSchema.getName()}' `);
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
});
|
|
197
|
+
return rdh.rows.map((r) => {
|
|
198
|
+
const res = new DbTable(r.values.name, r.values.table_type, r.values.comment);
|
|
199
|
+
return res;
|
|
215
200
|
});
|
|
216
201
|
}
|
|
217
|
-
getColumns(dbTable) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
const rdh = yield this.requestSql(`SELECT COLUMN_NAME as name,
|
|
202
|
+
async getColumns(dbTable) {
|
|
203
|
+
const binds = [dbTable.getParent().getName(), dbTable.getName()];
|
|
204
|
+
const rdh = await this.requestSql(`SELECT COLUMN_NAME as name,
|
|
221
205
|
DATA_TYPE as col_type,
|
|
222
206
|
CASE WHEN IS_NULLABLE = 'YES' THEN 1 ELSE 0 END as nullable,
|
|
223
207
|
COLUMN_KEY as col_key,
|
|
@@ -226,30 +210,27 @@ export default class MySQLDriver extends BaseDriver {
|
|
|
226
210
|
COLUMN_COMMENT as comment
|
|
227
211
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
228
212
|
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?`, { binds });
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
});
|
|
213
|
+
return rdh.rows.map((r) => {
|
|
214
|
+
const type_name = EnumValues.getNameFromValue(MySQLColumnType, MySQLColumnType.parse(r.values.col_type));
|
|
215
|
+
const res = new DbColumn(r.values.name, GeneralColumnType.parse(type_name), {
|
|
216
|
+
nullable: r.values.nullable === 1,
|
|
217
|
+
key: r.values.col_key,
|
|
218
|
+
default: r.values.col_default,
|
|
219
|
+
extra: r.values.col_extra,
|
|
220
|
+
}, r.values.comment);
|
|
221
|
+
return res;
|
|
239
222
|
});
|
|
240
223
|
}
|
|
241
|
-
closeSub() {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
yield this.client.end();
|
|
246
|
-
}
|
|
247
|
-
return '';
|
|
248
|
-
}
|
|
249
|
-
catch (e) {
|
|
250
|
-
return e.message;
|
|
224
|
+
async closeSub() {
|
|
225
|
+
try {
|
|
226
|
+
if (this.client) {
|
|
227
|
+
await this.client.end();
|
|
251
228
|
}
|
|
252
|
-
|
|
229
|
+
return '';
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
return e.message;
|
|
233
|
+
}
|
|
253
234
|
}
|
|
254
235
|
}
|
|
255
236
|
//# sourceMappingURL=MySQLDriver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MySQLDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/MySQLDriver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MySQLDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/MySQLDriver.ts"],"names":[],"mappings":"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"}
|