@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 { RedisDatabase, DbKey, } from '../resource/DbResource';
|
|
4
3
|
import { Redis } from 'ioredis';
|
|
@@ -10,131 +9,121 @@ export default class RedisDriver extends BaseDriver {
|
|
|
10
9
|
super(conRes);
|
|
11
10
|
this.databases = 16;
|
|
12
11
|
}
|
|
13
|
-
connectSub() {
|
|
14
|
-
|
|
12
|
+
async connectSub() {
|
|
13
|
+
try {
|
|
14
|
+
const options = Object.assign({
|
|
15
|
+
port: 6379,
|
|
16
|
+
host: '127.0.0.1',
|
|
17
|
+
password: 'auth',
|
|
18
|
+
db: 0,
|
|
19
|
+
}, {
|
|
20
|
+
port: this.conRes.port,
|
|
21
|
+
host: this.conRes.host,
|
|
22
|
+
password: this.conRes.password,
|
|
23
|
+
db: this.conRes.database,
|
|
24
|
+
retryStrategy: function () {
|
|
25
|
+
return 'No!';
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if (this.isNeedsSsh()) {
|
|
29
|
+
options.host = '127.0.0.1';
|
|
30
|
+
options.port = this.sshLocalPort;
|
|
31
|
+
}
|
|
32
|
+
options.connectTimeout = 5000;
|
|
33
|
+
if (this.conRes.hasUrl()) {
|
|
34
|
+
this.client = new Redis(this.conRes.url);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.client = new Redis(options);
|
|
38
|
+
}
|
|
15
39
|
try {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
db: this.conRes.database,
|
|
26
|
-
retryStrategy: function () {
|
|
27
|
-
return 'No!';
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
if (this.isNeedsSsh()) {
|
|
31
|
-
options.host = '127.0.0.1';
|
|
32
|
-
options.port = this.sshLocalPort;
|
|
33
|
-
}
|
|
34
|
-
options.connectTimeout = 5000;
|
|
35
|
-
if (this.conRes.hasUrl()) {
|
|
36
|
-
this.client = new Redis(this.conRes.url);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
this.client = new Redis(options);
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
const dbs = yield this.client
|
|
43
|
-
.multi()
|
|
44
|
-
.info()
|
|
45
|
-
.config('GET', 'databases')
|
|
46
|
-
.exec();
|
|
47
|
-
if (dbs && dbs.length > 1 && dbs[1].length > 1) {
|
|
48
|
-
const dbs2 = dbs[1][1];
|
|
49
|
-
if (dbs2 && dbs2.length > 1) {
|
|
50
|
-
this.databases = parseInt(dbs2[1], 10);
|
|
51
|
-
}
|
|
40
|
+
const dbs = await this.client
|
|
41
|
+
.multi()
|
|
42
|
+
.info()
|
|
43
|
+
.config('GET', 'databases')
|
|
44
|
+
.exec();
|
|
45
|
+
if (dbs && dbs.length > 1 && dbs[1].length > 1) {
|
|
46
|
+
const dbs2 = dbs[1][1];
|
|
47
|
+
if (dbs2 && dbs2.length > 1) {
|
|
48
|
+
this.databases = parseInt(dbs2[1], 10);
|
|
52
49
|
}
|
|
53
50
|
}
|
|
54
|
-
catch (e) {
|
|
55
|
-
this.databases = 16;
|
|
56
|
-
}
|
|
57
51
|
}
|
|
58
52
|
catch (e) {
|
|
59
|
-
|
|
53
|
+
this.databases = 16;
|
|
60
54
|
}
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return e.message;
|
|
58
|
+
}
|
|
59
|
+
return '';
|
|
63
60
|
}
|
|
64
|
-
test(with_connect = false) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return con_result;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
yield this.client.ping();
|
|
75
|
-
if (with_connect) {
|
|
76
|
-
yield this.disconnect();
|
|
61
|
+
async test(with_connect = false) {
|
|
62
|
+
let errorReason = '';
|
|
63
|
+
try {
|
|
64
|
+
if (with_connect) {
|
|
65
|
+
const con_result = await this.connect();
|
|
66
|
+
if (con_result) {
|
|
67
|
+
return con_result;
|
|
77
68
|
}
|
|
78
69
|
}
|
|
79
|
-
|
|
80
|
-
|
|
70
|
+
await this.client.ping();
|
|
71
|
+
if (with_connect) {
|
|
72
|
+
await this.disconnect();
|
|
81
73
|
}
|
|
82
|
-
|
|
83
|
-
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
errorReason = e.message;
|
|
77
|
+
}
|
|
78
|
+
return errorReason;
|
|
84
79
|
}
|
|
85
|
-
requestSql(sql, options) {
|
|
86
|
-
return
|
|
87
|
-
return ResultSetDataHolder.createEmpty();
|
|
88
|
-
});
|
|
80
|
+
async requestSql(sql, options) {
|
|
81
|
+
return ResultSetDataHolder.createEmpty();
|
|
89
82
|
}
|
|
90
|
-
countTables(tables, options) {
|
|
91
|
-
return
|
|
92
|
-
return new Array();
|
|
93
|
-
});
|
|
83
|
+
async countTables(tables, options) {
|
|
84
|
+
return new Array();
|
|
94
85
|
}
|
|
95
|
-
executeCommand(req) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (!this.client) {
|
|
99
|
-
return ret;
|
|
100
|
-
}
|
|
101
|
-
yield this.client.select(req.index);
|
|
102
|
-
let r = '';
|
|
103
|
-
switch (req.command) {
|
|
104
|
-
case RedisCommandType.GetValue:
|
|
105
|
-
{
|
|
106
|
-
r = yield this.getValueByKey(this.client, req.key, req.type);
|
|
107
|
-
const ttl = yield this.client.ttl(req.key);
|
|
108
|
-
ret = new DbKey(req.key, req.type, ttl);
|
|
109
|
-
if (ret.ttl > 0) {
|
|
110
|
-
ret.ttlConfirmationDatetime = new Date().getTime();
|
|
111
|
-
}
|
|
112
|
-
ret.val = r;
|
|
113
|
-
}
|
|
114
|
-
break;
|
|
115
|
-
case RedisCommandType.SetValue:
|
|
116
|
-
if (req.options) {
|
|
117
|
-
yield this.client.set(req.key, req.options.val);
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
case RedisCommandType.Flushall:
|
|
121
|
-
ret = yield this.client.flushall();
|
|
122
|
-
break;
|
|
123
|
-
case RedisCommandType.Flushdb:
|
|
124
|
-
ret = yield this.client.flushdb();
|
|
125
|
-
break;
|
|
126
|
-
case RedisCommandType.Dbsize:
|
|
127
|
-
ret = yield this.client.dbsize();
|
|
128
|
-
break;
|
|
129
|
-
case RedisCommandType.Info:
|
|
130
|
-
ret = yield this.client.info(req.options.section);
|
|
131
|
-
break;
|
|
132
|
-
default:
|
|
133
|
-
console.error('undefined.', req.command);
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
86
|
+
async executeCommand(req) {
|
|
87
|
+
let ret = '';
|
|
88
|
+
if (!this.client) {
|
|
136
89
|
return ret;
|
|
137
|
-
}
|
|
90
|
+
}
|
|
91
|
+
await this.client.select(req.index);
|
|
92
|
+
let r = '';
|
|
93
|
+
switch (req.command) {
|
|
94
|
+
case RedisCommandType.GetValue:
|
|
95
|
+
{
|
|
96
|
+
r = await this.getValueByKey(this.client, req.key, req.type);
|
|
97
|
+
const ttl = await this.client.ttl(req.key);
|
|
98
|
+
ret = new DbKey(req.key, req.type, ttl);
|
|
99
|
+
if (ret.ttl > 0) {
|
|
100
|
+
ret.ttlConfirmationDatetime = new Date().getTime();
|
|
101
|
+
}
|
|
102
|
+
ret.val = r;
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case RedisCommandType.SetValue:
|
|
106
|
+
if (req.options) {
|
|
107
|
+
await this.client.set(req.key, req.options.val);
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case RedisCommandType.Flushall:
|
|
111
|
+
ret = await this.client.flushall();
|
|
112
|
+
break;
|
|
113
|
+
case RedisCommandType.Flushdb:
|
|
114
|
+
ret = await this.client.flushdb();
|
|
115
|
+
break;
|
|
116
|
+
case RedisCommandType.Dbsize:
|
|
117
|
+
ret = await this.client.dbsize();
|
|
118
|
+
break;
|
|
119
|
+
case RedisCommandType.Info:
|
|
120
|
+
ret = await this.client.info(req.options.section);
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
console.error('undefined.', req.command);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
return ret;
|
|
138
127
|
}
|
|
139
128
|
scan(db_index, key, count, with_value, progressCallback) {
|
|
140
129
|
return new Promise((resolve) => {
|
|
@@ -161,78 +150,72 @@ export default class RedisDriver extends BaseDriver {
|
|
|
161
150
|
}
|
|
162
151
|
const parallels = [];
|
|
163
152
|
ret.forEach((keyRes) => {
|
|
164
|
-
parallels.push((() =>
|
|
165
|
-
keyRes.type = RedisKeyType.parse(
|
|
166
|
-
keyRes.ttl =
|
|
153
|
+
parallels.push((async () => {
|
|
154
|
+
keyRes.type = RedisKeyType.parse(await currentClient.type(keyRes.getName()));
|
|
155
|
+
keyRes.ttl = await currentClient.ttl(keyRes.getName());
|
|
167
156
|
if (keyRes.ttl > 0) {
|
|
168
157
|
keyRes.ttlConfirmationDatetime = new Date().getTime();
|
|
169
158
|
}
|
|
170
159
|
if (with_value) {
|
|
171
|
-
keyRes.val =
|
|
160
|
+
keyRes.val = await this.getValueByKey(currentClient, keyRes.getName(), keyRes.type);
|
|
172
161
|
}
|
|
173
|
-
})
|
|
162
|
+
})());
|
|
174
163
|
});
|
|
175
|
-
(() =>
|
|
176
|
-
|
|
164
|
+
(async () => {
|
|
165
|
+
await Promise.all(parallels);
|
|
177
166
|
progressCallback('Key scanning done.', 100);
|
|
178
167
|
resolve(ret);
|
|
179
|
-
})
|
|
168
|
+
})();
|
|
180
169
|
});
|
|
181
170
|
});
|
|
182
171
|
}
|
|
183
|
-
getValueByKey(client, key, type) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
return undefined;
|
|
200
|
-
});
|
|
172
|
+
async getValueByKey(client, key, type) {
|
|
173
|
+
switch (type) {
|
|
174
|
+
case RedisKeyType.string:
|
|
175
|
+
return await client.get(key);
|
|
176
|
+
case RedisKeyType.list:
|
|
177
|
+
return await client.lrange(key, 0, -1);
|
|
178
|
+
case RedisKeyType.set:
|
|
179
|
+
return await client.smembers(key);
|
|
180
|
+
case RedisKeyType.zset:
|
|
181
|
+
return await client.zrange(key, 0, -1);
|
|
182
|
+
case RedisKeyType.hash:
|
|
183
|
+
return await client.hgetall(key);
|
|
184
|
+
default:
|
|
185
|
+
console.log('whattype??', type);
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
201
188
|
}
|
|
202
|
-
getInfomationSchemas(options) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
189
|
+
async getInfomationSchemas(options) {
|
|
190
|
+
if (!this.conRes) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
const dbResources = new Array();
|
|
194
|
+
const keyspace = await this.client.info('keyspace');
|
|
195
|
+
const re = /db([0-9]+):keys=([0-9]+),expires=([0-9]+),avg_ttl=([0-9]+)/g;
|
|
196
|
+
let m;
|
|
197
|
+
while ((m = re.exec(keyspace))) {
|
|
198
|
+
const db = m[1];
|
|
199
|
+
const keys = parseInt(m[2], 10);
|
|
200
|
+
const expires = parseInt(m[3], 10);
|
|
201
|
+
const avg_ttl = parseInt(m[4], 10);
|
|
202
|
+
const dbRes = new RedisDatabase(db, keys, expires, avg_ttl);
|
|
203
|
+
dbResources.push(dbRes);
|
|
204
|
+
}
|
|
205
|
+
for (let i = 0; i < this.databases; i++) {
|
|
206
|
+
const name = `${i}`;
|
|
207
|
+
if (!dbResources.some((r) => r.getName() === name)) {
|
|
208
|
+
const dbRes = new RedisDatabase(name, 0, 0, 0);
|
|
217
209
|
dbResources.push(dbRes);
|
|
218
210
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if (!dbResources.some((r) => r.getName() === name)) {
|
|
222
|
-
const dbRes = new RedisDatabase(name, 0, 0, 0);
|
|
223
|
-
dbResources.push(dbRes);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return dbResources;
|
|
227
|
-
});
|
|
211
|
+
}
|
|
212
|
+
return dbResources;
|
|
228
213
|
}
|
|
229
|
-
closeSub() {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return '';
|
|
235
|
-
});
|
|
214
|
+
async closeSub() {
|
|
215
|
+
if (this.client) {
|
|
216
|
+
await this.client.quit();
|
|
217
|
+
}
|
|
218
|
+
return '';
|
|
236
219
|
}
|
|
237
220
|
}
|
|
238
221
|
//# sourceMappingURL=RedisDriver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/RedisDriver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../../../src/db/drivers/RedisDriver.ts"],"names":[],"mappings":"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"}
|