badmfck-api-server 3.6.5 → 3.6.7
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/apiServer/APIService.js +1 -1
- package/dist/apiServer/DBService.d.ts +38 -1
- package/dist/apiServer/DBService.js +139 -15
- package/dist/apiServer/MysqlService.d.ts +6 -6
- package/dist/apiServer/MysqlService.js +15 -15
- package/dist/apiServer/db/IDBAdapter.d.ts +2 -1
- package/dist/apiServer/db/MysqlAdapter.d.ts +5 -0
- package/dist/apiServer/db/MysqlAdapter.js +91 -11
- package/package.json +1 -1
@@ -95,7 +95,7 @@ async function Initializer(services) {
|
|
95
95
|
exports.Initializer = Initializer;
|
96
96
|
class APIService extends BaseService_1.BaseService {
|
97
97
|
static nextLogID = 0;
|
98
|
-
version = "3.6.
|
98
|
+
version = "3.6.7";
|
99
99
|
options;
|
100
100
|
monitor = null;
|
101
101
|
started = new Date();
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Req } from "badmfck-signal";
|
1
|
+
import Signal, { Req } from "badmfck-signal";
|
2
2
|
import { BaseService } from "./BaseService";
|
3
3
|
import { IDBAdapter } from "./db/IDBAdapter";
|
4
4
|
export interface IDBQueryField {
|
@@ -48,6 +48,10 @@ export interface IDBError {
|
|
48
48
|
export interface IDBResult {
|
49
49
|
data?: any | null;
|
50
50
|
error?: IDBError | null;
|
51
|
+
execution: {
|
52
|
+
started_at: number;
|
53
|
+
finished_at: number;
|
54
|
+
};
|
51
55
|
}
|
52
56
|
export interface IDBSericeOptions {
|
53
57
|
id: string;
|
@@ -67,6 +71,21 @@ export interface DBAdapterOptions {
|
|
67
71
|
naxTransactionWaitTime?: number;
|
68
72
|
debug?: boolean;
|
69
73
|
}
|
74
|
+
type ILongQuery = {
|
75
|
+
query: string;
|
76
|
+
started_at: number;
|
77
|
+
finished_at: number;
|
78
|
+
execution: number;
|
79
|
+
};
|
80
|
+
type IQueriesStat = {
|
81
|
+
failed: number;
|
82
|
+
success: number;
|
83
|
+
};
|
84
|
+
export interface IPoolStatus {
|
85
|
+
lastSuccessQueryTime: string;
|
86
|
+
poolConnections: number;
|
87
|
+
acquiredPoolConnections: number;
|
88
|
+
}
|
70
89
|
export declare const REQ_DB: Req<IDBQuery, IDBResult>;
|
71
90
|
export declare const REQ_DBX: Req<IDBBulkQuery, IDBResult[]>;
|
72
91
|
export declare const REQ_DB_TBEGIN: Req<{
|
@@ -80,13 +99,31 @@ export declare const REQ_DB_TROLLBACK: Req<{
|
|
80
99
|
dbid: string;
|
81
100
|
trxid: number;
|
82
101
|
}, IDBResult>;
|
102
|
+
export declare const S_DB_STAT: Signal<{
|
103
|
+
dbid: string;
|
104
|
+
stat: {
|
105
|
+
queriesStat: {
|
106
|
+
hour: string;
|
107
|
+
stat: IQueriesStat;
|
108
|
+
};
|
109
|
+
poolStatus: IPoolStatus;
|
110
|
+
longQueries: ILongQuery[];
|
111
|
+
};
|
112
|
+
}>;
|
83
113
|
export declare class DBService extends BaseService {
|
84
114
|
static allInstances: DBService[];
|
115
|
+
longQueries: ILongQuery[];
|
116
|
+
queriesStat: {
|
117
|
+
hour: string;
|
118
|
+
stat: IQueriesStat;
|
119
|
+
};
|
85
120
|
options: IDBSericeOptions;
|
86
121
|
adapter: IDBAdapter | null;
|
87
122
|
constructor(options: IDBSericeOptions);
|
88
123
|
init(): Promise<void>;
|
89
124
|
getAdapter(dbid?: string | null): IDBAdapter | IDBError;
|
125
|
+
reportQuery(result: IDBResult, req: IDBQuery): Promise<void>;
|
90
126
|
finishService(): Promise<void>;
|
91
127
|
createMysqlDatabase(): Promise<void>;
|
92
128
|
}
|
129
|
+
export {};
|
@@ -1,16 +1,43 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.DBService = exports.REQ_DB_TROLLBACK = exports.REQ_DB_TCOMMIT = exports.REQ_DB_TBEGIN = exports.REQ_DBX = exports.REQ_DB = void 0;
|
4
|
-
const badmfck_signal_1 = require("badmfck-signal");
|
26
|
+
exports.DBService = exports.S_DB_STAT = exports.REQ_DB_TROLLBACK = exports.REQ_DB_TCOMMIT = exports.REQ_DB_TBEGIN = exports.REQ_DBX = exports.REQ_DB = void 0;
|
27
|
+
const badmfck_signal_1 = __importStar(require("badmfck-signal"));
|
5
28
|
const BaseService_1 = require("./BaseService");
|
6
29
|
const MysqlAdapter_1 = require("./db/MysqlAdapter");
|
30
|
+
const LogService_1 = require("./LogService");
|
7
31
|
exports.REQ_DB = new badmfck_signal_1.Req(undefined, "REQ_DB");
|
8
32
|
exports.REQ_DBX = new badmfck_signal_1.Req(undefined, "REQ_DBX");
|
9
33
|
exports.REQ_DB_TBEGIN = new badmfck_signal_1.Req(undefined, "REQ_DB_TBEGIN");
|
10
34
|
exports.REQ_DB_TCOMMIT = new badmfck_signal_1.Req(undefined, "REQ_DB_TBEGIN");
|
11
35
|
exports.REQ_DB_TROLLBACK = new badmfck_signal_1.Req(undefined, "REQ_DB_TBEGIN");
|
36
|
+
exports.S_DB_STAT = new badmfck_signal_1.default();
|
12
37
|
class DBService extends BaseService_1.BaseService {
|
13
38
|
static allInstances = [];
|
39
|
+
longQueries = [];
|
40
|
+
queriesStat = { hour: "00", stat: { failed: 0, success: 0 } };
|
14
41
|
options;
|
15
42
|
adapter = null;
|
16
43
|
constructor(options) {
|
@@ -23,6 +50,27 @@ class DBService extends BaseService_1.BaseService {
|
|
23
50
|
}
|
24
51
|
}
|
25
52
|
DBService.allInstances.push(this);
|
53
|
+
setInterval(() => {
|
54
|
+
(0, LogService_1.logDB)("Queries (" + options.id + ") at: " + new Date().toDateString() + " " + this.queriesStat.hour + ":--\n" + "success: " + this.queriesStat.stat.success + "\nfailed: " + this.queriesStat.stat.failed);
|
55
|
+
let poolStatus = {
|
56
|
+
lastSuccessQueryTime: "-1",
|
57
|
+
poolConnections: -1,
|
58
|
+
acquiredPoolConnections: -1
|
59
|
+
};
|
60
|
+
if (this.adapter) {
|
61
|
+
poolStatus = this.adapter.poolStatus();
|
62
|
+
(0, LogService_1.logDB)("Pool status (" + options.id + ") at: " + new Date().toDateString() + " " + new Date().toTimeString() + "\n LSQT: " + poolStatus.lastSuccessQueryTime + "\nCONN: " + poolStatus.poolConnections + "\nACONN: " + poolStatus.acquiredPoolConnections);
|
63
|
+
}
|
64
|
+
(0, LogService_1.logDB)(`Long queries ${options.id}\n${this.longQueries.map(val => `exec: ${val.execution} at: ${new Date(val.started_at).toISOString()}, ${val.query}`).join("\n")}`);
|
65
|
+
exports.S_DB_STAT.invoke({
|
66
|
+
dbid: options.id,
|
67
|
+
stat: {
|
68
|
+
queriesStat: this.queriesStat,
|
69
|
+
poolStatus: poolStatus,
|
70
|
+
longQueries: this.longQueries
|
71
|
+
}
|
72
|
+
});
|
73
|
+
}, 1000 * 60 * 60);
|
26
74
|
}
|
27
75
|
async init() {
|
28
76
|
super.init();
|
@@ -30,11 +78,20 @@ class DBService extends BaseService_1.BaseService {
|
|
30
78
|
await this.createMysqlDatabase();
|
31
79
|
}
|
32
80
|
exports.REQ_DBX.listener = async (req) => {
|
33
|
-
|
34
|
-
|
81
|
+
const executionStartTime = Date.now();
|
82
|
+
if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter) {
|
83
|
+
const result = await DBService.allInstances[0].adapter.bulk(req);
|
84
|
+
for (let i = 0; i < result.length; i++)
|
85
|
+
this.reportQuery(result[i], req.bulk[i]);
|
86
|
+
return result;
|
87
|
+
}
|
35
88
|
for (let i of DBService.allInstances) {
|
36
|
-
if (i.options.id === req.dbid && i.adapter)
|
37
|
-
|
89
|
+
if (i.options.id === req.dbid && i.adapter) {
|
90
|
+
const result = await i.adapter.bulk(req);
|
91
|
+
for (let i = 0; i < result.length; i++)
|
92
|
+
this.reportQuery(result[i], req.bulk[i]);
|
93
|
+
return result;
|
94
|
+
}
|
38
95
|
}
|
39
96
|
const error = {
|
40
97
|
code: "DB_NOT_FOUND",
|
@@ -47,17 +104,26 @@ class DBService extends BaseService_1.BaseService {
|
|
47
104
|
};
|
48
105
|
let result = [];
|
49
106
|
for (let i of req.bulk) {
|
50
|
-
result.push({
|
107
|
+
result.push({
|
108
|
+
error: error, execution: {
|
109
|
+
started_at: executionStartTime,
|
110
|
+
finished_at: Date.now()
|
111
|
+
}
|
112
|
+
});
|
51
113
|
if (i.throwable)
|
52
114
|
throw error;
|
53
115
|
}
|
54
116
|
return result;
|
55
117
|
};
|
56
118
|
exports.REQ_DB_TBEGIN.listener = async (req) => {
|
119
|
+
const executionStartTime = Date.now();
|
57
120
|
const adapter = this.getAdapter(req.dbid);
|
58
121
|
if ("errno" in adapter) {
|
59
122
|
return {
|
60
|
-
error: adapter
|
123
|
+
error: adapter, execution: {
|
124
|
+
started_at: executionStartTime,
|
125
|
+
finished_at: Date.now()
|
126
|
+
}
|
61
127
|
};
|
62
128
|
}
|
63
129
|
if (adapter.tBegin && typeof adapter.tBegin === "function")
|
@@ -71,14 +137,21 @@ class DBService extends BaseService_1.BaseService {
|
|
71
137
|
name: "TRX_NOT_SUPPORTED",
|
72
138
|
message: "Transactions not supported on selected adapter",
|
73
139
|
isDuplicateError: false
|
140
|
+
}, execution: {
|
141
|
+
started_at: executionStartTime,
|
142
|
+
finished_at: Date.now()
|
74
143
|
}
|
75
144
|
};
|
76
145
|
};
|
77
146
|
exports.REQ_DB_TCOMMIT.listener = async (req) => {
|
147
|
+
const executionStartTime = Date.now();
|
78
148
|
const adapter = this.getAdapter(req.dbid);
|
79
149
|
if ("errno" in adapter) {
|
80
150
|
return {
|
81
|
-
error: adapter
|
151
|
+
error: adapter, execution: {
|
152
|
+
started_at: executionStartTime,
|
153
|
+
finished_at: Date.now()
|
154
|
+
}
|
82
155
|
};
|
83
156
|
}
|
84
157
|
if (adapter.tCommit && typeof adapter.tCommit === "function")
|
@@ -92,14 +165,21 @@ class DBService extends BaseService_1.BaseService {
|
|
92
165
|
name: "TRX_NOT_SUPPORTED",
|
93
166
|
message: "Transactions not supported on selected adapter",
|
94
167
|
isDuplicateError: false
|
168
|
+
}, execution: {
|
169
|
+
started_at: executionStartTime,
|
170
|
+
finished_at: Date.now()
|
95
171
|
}
|
96
172
|
};
|
97
173
|
};
|
98
174
|
exports.REQ_DB_TROLLBACK.listener = async (req) => {
|
175
|
+
const executionStartTime = Date.now();
|
99
176
|
const adapter = this.getAdapter(req.dbid);
|
100
177
|
if ("errno" in adapter) {
|
101
178
|
return {
|
102
|
-
error: adapter
|
179
|
+
error: adapter, execution: {
|
180
|
+
started_at: executionStartTime,
|
181
|
+
finished_at: Date.now()
|
182
|
+
}
|
103
183
|
};
|
104
184
|
}
|
105
185
|
if (adapter.tRollback && typeof adapter.tRollback === "function")
|
@@ -113,15 +193,25 @@ class DBService extends BaseService_1.BaseService {
|
|
113
193
|
name: "TRX_NOT_SUPPORTED",
|
114
194
|
message: "Transactions not supported on selected adapter",
|
115
195
|
isDuplicateError: false
|
196
|
+
}, execution: {
|
197
|
+
started_at: executionStartTime,
|
198
|
+
finished_at: Date.now()
|
116
199
|
}
|
117
200
|
};
|
118
201
|
};
|
119
202
|
exports.REQ_DB.listener = async (req) => {
|
120
|
-
|
121
|
-
|
203
|
+
const executionStartTime = Date.now();
|
204
|
+
if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter) {
|
205
|
+
const result = await DBService.allInstances[0].adapter.query(req);
|
206
|
+
this.reportQuery(result, req);
|
207
|
+
return result;
|
208
|
+
}
|
122
209
|
for (let i of DBService.allInstances) {
|
123
|
-
if (i.options.id === req.dbid && i.adapter)
|
124
|
-
|
210
|
+
if (i.options.id === req.dbid && i.adapter) {
|
211
|
+
const result = await i.adapter.query(req);
|
212
|
+
this.reportQuery(result, req);
|
213
|
+
return result;
|
214
|
+
}
|
125
215
|
}
|
126
216
|
const error = {
|
127
217
|
code: "DB_NOT_FOUND",
|
@@ -132,9 +222,16 @@ class DBService extends BaseService_1.BaseService {
|
|
132
222
|
message: "DB not found: " + req.dbid,
|
133
223
|
isDuplicateError: false
|
134
224
|
};
|
225
|
+
const errorResult = {
|
226
|
+
error: error, execution: {
|
227
|
+
started_at: executionStartTime,
|
228
|
+
finished_at: Date.now()
|
229
|
+
}
|
230
|
+
};
|
231
|
+
this.reportQuery(errorResult, req);
|
135
232
|
if (req.throwable)
|
136
233
|
throw error;
|
137
|
-
return
|
234
|
+
return errorResult;
|
138
235
|
};
|
139
236
|
}
|
140
237
|
getAdapter(dbid) {
|
@@ -155,6 +252,33 @@ class DBService extends BaseService_1.BaseService {
|
|
155
252
|
};
|
156
253
|
return error;
|
157
254
|
}
|
255
|
+
async reportQuery(result, req) {
|
256
|
+
const hour = (new Date().getHours() + 1).toString().padStart(2, "0");
|
257
|
+
if (this.queriesStat.hour !== hour) {
|
258
|
+
this.queriesStat.hour = hour;
|
259
|
+
this.queriesStat.stat = { failed: 0, success: 0 };
|
260
|
+
}
|
261
|
+
if (result.error)
|
262
|
+
this.queriesStat.stat.failed++;
|
263
|
+
else
|
264
|
+
this.queriesStat.stat.success++;
|
265
|
+
const execTime = result.execution.finished_at - result.execution.started_at;
|
266
|
+
if (execTime && execTime > 0) {
|
267
|
+
for (let i of this.longQueries) {
|
268
|
+
if (execTime > i.execution) {
|
269
|
+
this.longQueries.push({
|
270
|
+
execution: execTime,
|
271
|
+
query: req.query,
|
272
|
+
started_at: result.execution.started_at,
|
273
|
+
finished_at: result.execution.finished_at
|
274
|
+
});
|
275
|
+
}
|
276
|
+
}
|
277
|
+
this.longQueries.sort((a, b) => a.execution - b.execution);
|
278
|
+
if (this.longQueries.length > 20)
|
279
|
+
this.longQueries = this.longQueries.slice(-20);
|
280
|
+
}
|
281
|
+
}
|
158
282
|
async finishService() {
|
159
283
|
await this.adapter?.finish();
|
160
284
|
}
|
@@ -3,15 +3,15 @@ import { BaseService } from "./BaseService";
|
|
3
3
|
import Signal, { Req } from "badmfck-signal";
|
4
4
|
import * as mysql from "mysql2/promise";
|
5
5
|
import fs from "fs";
|
6
|
-
export declare const
|
7
|
-
export declare const
|
8
|
-
export declare const
|
9
|
-
export declare const
|
6
|
+
export declare const DEPRECATED_S_MYSQL_STARTED: Signal<void>;
|
7
|
+
export declare const DEPRECATED_REQ_MYSQL_QUERY: Req<MySqlQuery | MySqlQuery[], MysqlResult[]>;
|
8
|
+
export declare const DEPRECATED_REQ_MYSQL_TBEGIN: Req<void, number | MysqlError>;
|
9
|
+
export declare const DEPRECATED_REQ_MYSQL_TQUERY: Req<{
|
10
10
|
query: MySqlQuery;
|
11
11
|
tid: number;
|
12
12
|
}, MysqlResult>;
|
13
|
-
export declare const
|
14
|
-
export declare const
|
13
|
+
export declare const DEPRECATED_REQ_MYSQL_TCOMMIT: Req<number, MysqlError | null>;
|
14
|
+
export declare const DEPRECATED_REQ_MYSQL_TROLLBACK: Req<number, MysqlError | null>;
|
15
15
|
export declare const executeQuery: (query: MySqlQuery | MySqlQuery[]) => Promise<MysqlResult[]>;
|
16
16
|
export interface MysqlServiceOptions {
|
17
17
|
connectionLimit: number;
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
27
|
};
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
-
exports.MysqlService = exports.isMysqlError = exports.executeQuery = exports.
|
29
|
+
exports.MysqlService = exports.isMysqlError = exports.executeQuery = exports.DEPRECATED_REQ_MYSQL_TROLLBACK = exports.DEPRECATED_REQ_MYSQL_TCOMMIT = exports.DEPRECATED_REQ_MYSQL_TQUERY = exports.DEPRECATED_REQ_MYSQL_TBEGIN = exports.DEPRECATED_REQ_MYSQL_QUERY = exports.DEPRECATED_S_MYSQL_STARTED = void 0;
|
30
30
|
const BaseService_1 = require("./BaseService");
|
31
31
|
const badmfck_signal_1 = __importStar(require("badmfck-signal"));
|
32
32
|
const crypto_1 = require("crypto");
|
@@ -34,13 +34,13 @@ const LogService_1 = require("./LogService");
|
|
34
34
|
const mysql = __importStar(require("mysql2/promise"));
|
35
35
|
const fs_1 = __importDefault(require("fs"));
|
36
36
|
const path_1 = __importDefault(require("path"));
|
37
|
-
exports.
|
38
|
-
exports.
|
39
|
-
exports.
|
40
|
-
exports.
|
41
|
-
exports.
|
42
|
-
exports.
|
43
|
-
const executeQuery = async (query) => { return await exports.
|
37
|
+
exports.DEPRECATED_S_MYSQL_STARTED = new badmfck_signal_1.default();
|
38
|
+
exports.DEPRECATED_REQ_MYSQL_QUERY = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_QUERY");
|
39
|
+
exports.DEPRECATED_REQ_MYSQL_TBEGIN = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TRANSACTION_BEGING");
|
40
|
+
exports.DEPRECATED_REQ_MYSQL_TQUERY = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TRANSACTION_ADD_OPERATION");
|
41
|
+
exports.DEPRECATED_REQ_MYSQL_TCOMMIT = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TCOMMIT");
|
42
|
+
exports.DEPRECATED_REQ_MYSQL_TROLLBACK = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TROLLBACK");
|
43
|
+
const executeQuery = async (query) => { return await exports.DEPRECATED_REQ_MYSQL_QUERY.request(query); };
|
44
44
|
exports.executeQuery = executeQuery;
|
45
45
|
const isMysqlError = (e) => {
|
46
46
|
return e.code !== undefined && e.errno !== undefined && e.sql !== undefined && e.name !== undefined && e.message !== undefined;
|
@@ -96,7 +96,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
96
96
|
if (!this.pool)
|
97
97
|
return;
|
98
98
|
for (let i = 0; i < this.options.connectionLimit; i++) {
|
99
|
-
exports.
|
99
|
+
exports.DEPRECATED_REQ_MYSQL_QUERY.request({ query: "SELECT 1 @NOLIMIT", fields: [] });
|
100
100
|
if (this.debug)
|
101
101
|
console.log("Ping mysql on each connection in pool");
|
102
102
|
}
|
@@ -122,7 +122,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
122
122
|
}
|
123
123
|
}
|
124
124
|
}
|
125
|
-
static async executeQuery(query) { return await exports.
|
125
|
+
static async executeQuery(query) { return await exports.DEPRECATED_REQ_MYSQL_QUERY.request(query); }
|
126
126
|
async init() {
|
127
127
|
super.init();
|
128
128
|
process.on('SIGINT', async () => {
|
@@ -143,7 +143,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
143
143
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
144
144
|
}
|
145
145
|
}
|
146
|
-
exports.
|
146
|
+
exports.DEPRECATED_REQ_MYSQL_QUERY.listener = async (data) => {
|
147
147
|
if (!Array.isArray(data))
|
148
148
|
data = [data];
|
149
149
|
const promises = [];
|
@@ -169,7 +169,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
169
169
|
}
|
170
170
|
return result;
|
171
171
|
};
|
172
|
-
exports.
|
172
|
+
exports.DEPRECATED_REQ_MYSQL_TBEGIN.listener = async () => {
|
173
173
|
const conn = await this.pool?.getConnection();
|
174
174
|
if (!conn)
|
175
175
|
return { code: "NO_POOL", errno: 100000, fatal: true, sql: "", name: "NO_POOL", message: "Mysql pool not created", throwable: false };
|
@@ -201,7 +201,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
201
201
|
console.log("Transactions pool: ", this.transactions);
|
202
202
|
return tid;
|
203
203
|
};
|
204
|
-
exports.
|
204
|
+
exports.DEPRECATED_REQ_MYSQL_TQUERY.listener = async (data) => {
|
205
205
|
const trx = this.transactions.find(i => i.id === data.tid);
|
206
206
|
if (!trx)
|
207
207
|
return { err: {
|
@@ -249,7 +249,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
249
249
|
count: count
|
250
250
|
};
|
251
251
|
};
|
252
|
-
exports.
|
252
|
+
exports.DEPRECATED_REQ_MYSQL_TROLLBACK.listener = async (tid) => {
|
253
253
|
const trx = this.transactions.find(i => i.id === tid);
|
254
254
|
if (!trx) {
|
255
255
|
return {
|
@@ -265,7 +265,7 @@ class MysqlService extends BaseService_1.BaseService {
|
|
265
265
|
await this.rollbackTransaction(trx);
|
266
266
|
return null;
|
267
267
|
};
|
268
|
-
exports.
|
268
|
+
exports.DEPRECATED_REQ_MYSQL_TCOMMIT.listener = async (tid) => {
|
269
269
|
const trx = this.transactions.find(i => i.id === tid);
|
270
270
|
if (!trx) {
|
271
271
|
return {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { IDBBulkQuery, IDBQuery, IDBResult } from "../DBService";
|
1
|
+
import { IDBBulkQuery, IDBQuery, IDBResult, IPoolStatus } from "../DBService";
|
2
2
|
export interface IDBAdapter {
|
3
3
|
init(): Promise<void>;
|
4
4
|
finish(): Promise<void>;
|
@@ -8,4 +8,5 @@ export interface IDBAdapter {
|
|
8
8
|
prepareQuery(request: IDBQuery): string;
|
9
9
|
query(request: IDBQuery): Promise<IDBResult>;
|
10
10
|
bulk(request: IDBBulkQuery): Promise<IDBResult[]>;
|
11
|
+
poolStatus(): IPoolStatus;
|
11
12
|
}
|
@@ -32,6 +32,11 @@ export declare class MysqlAdapter implements IDBAdapter {
|
|
32
32
|
acquiredPoolConnections: number;
|
33
33
|
constructor(options: DBAdapterOptions);
|
34
34
|
init(): Promise<void>;
|
35
|
+
poolStatus(): {
|
36
|
+
lastSuccessQueryTime: string;
|
37
|
+
poolConnections: number;
|
38
|
+
acquiredPoolConnections: number;
|
39
|
+
};
|
35
40
|
setupTimers(): void;
|
36
41
|
recreatePool(): Promise<boolean>;
|
37
42
|
tBegin(): Promise<IDBResult>;
|
@@ -61,6 +61,13 @@ class MysqlAdapter {
|
|
61
61
|
}
|
62
62
|
this.setupTimers();
|
63
63
|
}
|
64
|
+
poolStatus() {
|
65
|
+
return {
|
66
|
+
lastSuccessQueryTime: new Date(this.lastSuccessQueryTime).toISOString(),
|
67
|
+
poolConnections: this.poolConnections,
|
68
|
+
acquiredPoolConnections: this.acquiredPoolConnections
|
69
|
+
};
|
70
|
+
}
|
64
71
|
setupTimers() {
|
65
72
|
setInterval(() => {
|
66
73
|
const now = Date.now();
|
@@ -155,9 +162,16 @@ class MysqlAdapter {
|
|
155
162
|
return true;
|
156
163
|
}
|
157
164
|
async tBegin() {
|
165
|
+
const executionStartTime = Date.now();
|
158
166
|
const conn = await this.getConnection();
|
159
167
|
if (isError(conn))
|
160
|
-
return {
|
168
|
+
return {
|
169
|
+
error: conn,
|
170
|
+
execution: {
|
171
|
+
started_at: executionStartTime,
|
172
|
+
finished_at: Date.now()
|
173
|
+
}
|
174
|
+
};
|
161
175
|
for (let i of this.transactions) {
|
162
176
|
if (i.conn === conn) {
|
163
177
|
(0, LogService_1.logError)("Selected connection is in transaction");
|
@@ -170,6 +184,10 @@ class MysqlAdapter {
|
|
170
184
|
name: "CONN_IN_TRX",
|
171
185
|
message: "Selected connection already in transaction",
|
172
186
|
isDuplicateError: false
|
187
|
+
},
|
188
|
+
execution: {
|
189
|
+
started_at: executionStartTime,
|
190
|
+
finished_at: Date.now()
|
173
191
|
}
|
174
192
|
};
|
175
193
|
}
|
@@ -194,9 +212,16 @@ class MysqlAdapter {
|
|
194
212
|
this.transactions.push(trxRequest);
|
195
213
|
if (this.options.debug)
|
196
214
|
(0, LogService_1.logDB)("Transactions pool: ", this.transactions.map(t => "id:" + t.id + ", queries: " + t.queries.length));
|
197
|
-
return {
|
215
|
+
return {
|
216
|
+
data: { transactionId: trxid },
|
217
|
+
execution: {
|
218
|
+
started_at: executionStartTime,
|
219
|
+
finished_at: Date.now()
|
220
|
+
}
|
221
|
+
};
|
198
222
|
}
|
199
223
|
async tCommit(trxid) {
|
224
|
+
const executionStartTime = Date.now();
|
200
225
|
const trx = this.transactions.find(i => i.id === trxid);
|
201
226
|
if (!trx) {
|
202
227
|
return {
|
@@ -208,6 +233,10 @@ class MysqlAdapter {
|
|
208
233
|
name: "NO_TRX",
|
209
234
|
message: "Transaction not found",
|
210
235
|
isDuplicateError: false
|
236
|
+
},
|
237
|
+
execution: {
|
238
|
+
started_at: executionStartTime,
|
239
|
+
finished_at: Date.now()
|
211
240
|
}
|
212
241
|
};
|
213
242
|
}
|
@@ -218,13 +247,27 @@ class MysqlAdapter {
|
|
218
247
|
(0, LogService_1.logDB)("Transaction pool:", this.transactions);
|
219
248
|
const err = await this.commit(trx);
|
220
249
|
if (err)
|
221
|
-
return {
|
222
|
-
|
250
|
+
return {
|
251
|
+
error: err,
|
252
|
+
execution: {
|
253
|
+
started_at: executionStartTime,
|
254
|
+
finished_at: Date.now()
|
255
|
+
}
|
256
|
+
};
|
257
|
+
return {
|
258
|
+
data: true,
|
259
|
+
execution: {
|
260
|
+
started_at: executionStartTime,
|
261
|
+
finished_at: Date.now()
|
262
|
+
}
|
263
|
+
};
|
223
264
|
}
|
224
265
|
async tRollback(trxid) {
|
266
|
+
const executionStartTime = Date.now();
|
225
267
|
const trx = this.transactions.find(i => i.id === trxid);
|
226
268
|
if (!trx) {
|
227
|
-
return {
|
269
|
+
return {
|
270
|
+
error: {
|
228
271
|
code: "NO_TRX",
|
229
272
|
errno: 100004,
|
230
273
|
fatal: true,
|
@@ -232,12 +275,24 @@ class MysqlAdapter {
|
|
232
275
|
name: "NO_TRX",
|
233
276
|
message: "Transaction not found",
|
234
277
|
isDuplicateError: false
|
235
|
-
}
|
278
|
+
},
|
279
|
+
execution: {
|
280
|
+
started_at: executionStartTime,
|
281
|
+
finished_at: Date.now()
|
282
|
+
}
|
283
|
+
};
|
236
284
|
}
|
237
285
|
await this.rollbackTransaction(trx);
|
238
|
-
return {
|
286
|
+
return {
|
287
|
+
data: true,
|
288
|
+
execution: {
|
289
|
+
started_at: executionStartTime,
|
290
|
+
finished_at: Date.now()
|
291
|
+
}
|
292
|
+
};
|
239
293
|
}
|
240
294
|
async bulk(request) {
|
295
|
+
const executionStartTime = Date.now();
|
241
296
|
const results = [];
|
242
297
|
let queries = [];
|
243
298
|
let conn = null;
|
@@ -245,7 +300,13 @@ class MysqlAdapter {
|
|
245
300
|
conn = await this.getConnection();
|
246
301
|
if (isError(conn)) {
|
247
302
|
for (let i of request.bulk)
|
248
|
-
results.push({
|
303
|
+
results.push({
|
304
|
+
data: null, error: conn,
|
305
|
+
execution: {
|
306
|
+
started_at: executionStartTime,
|
307
|
+
finished_at: Date.now()
|
308
|
+
}
|
309
|
+
});
|
249
310
|
return results;
|
250
311
|
}
|
251
312
|
}
|
@@ -322,13 +383,20 @@ class MysqlAdapter {
|
|
322
383
|
};
|
323
384
|
}
|
324
385
|
async query(request, conn) {
|
386
|
+
let executionStartTime = Date.now();
|
325
387
|
const query = this.prepareQuery(request);
|
326
|
-
if (this.options.debug || request.debug)
|
327
|
-
(
|
388
|
+
if (this.options.debug || request.debug) {
|
389
|
+
if (query.toLowerCase().trim().indexOf("select 1") === -1)
|
390
|
+
(0, LogService_1.logDB)(query);
|
391
|
+
}
|
328
392
|
if (request.parseQueryOnly) {
|
329
393
|
return {
|
330
394
|
data: [{ query }],
|
331
395
|
error: null,
|
396
|
+
execution: {
|
397
|
+
started_at: executionStartTime,
|
398
|
+
finished_at: Date.now()
|
399
|
+
}
|
332
400
|
};
|
333
401
|
}
|
334
402
|
let doCloseConnection = false;
|
@@ -339,6 +407,10 @@ class MysqlAdapter {
|
|
339
407
|
return {
|
340
408
|
data: null,
|
341
409
|
error: conn,
|
410
|
+
execution: {
|
411
|
+
started_at: executionStartTime,
|
412
|
+
finished_at: Date.now()
|
413
|
+
}
|
342
414
|
};
|
343
415
|
}
|
344
416
|
}
|
@@ -349,7 +421,11 @@ class MysqlAdapter {
|
|
349
421
|
this.finalizeConnection(conn);
|
350
422
|
return {
|
351
423
|
data: result[0],
|
352
|
-
error: null
|
424
|
+
error: null,
|
425
|
+
execution: {
|
426
|
+
started_at: executionStartTime,
|
427
|
+
finished_at: Date.now()
|
428
|
+
}
|
353
429
|
};
|
354
430
|
}
|
355
431
|
catch (e) {
|
@@ -371,6 +447,10 @@ class MysqlAdapter {
|
|
371
447
|
return {
|
372
448
|
data: null,
|
373
449
|
error: error,
|
450
|
+
execution: {
|
451
|
+
started_at: executionStartTime,
|
452
|
+
finished_at: Date.now()
|
453
|
+
}
|
374
454
|
};
|
375
455
|
}
|
376
456
|
}
|