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.
@@ -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.5";
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
- if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter)
34
- return DBService.allInstances[0].adapter.bulk(req);
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
- return i.adapter.bulk(req);
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({ error: error });
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
- if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter)
121
- return DBService.allInstances[0].adapter.query(req);
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
- return i.adapter.query(req);
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 { error: error };
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 S_MYSQL_STARTED: Signal<void>;
7
- export declare const REQ_MYSQL_QUERY: Req<MySqlQuery | MySqlQuery[], MysqlResult[]>;
8
- export declare const REQ_MYSQL_TBEGIN: Req<void, number | MysqlError>;
9
- export declare const REQ_MYSQL_TQUERY: Req<{
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 REQ_MYSQL_TCOMMIT: Req<number, MysqlError | null>;
14
- export declare const REQ_MYSQL_TROLLBACK: Req<number, MysqlError | null>;
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.REQ_MYSQL_TROLLBACK = exports.REQ_MYSQL_TCOMMIT = exports.REQ_MYSQL_TQUERY = exports.REQ_MYSQL_TBEGIN = exports.REQ_MYSQL_QUERY = exports.S_MYSQL_STARTED = void 0;
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.S_MYSQL_STARTED = new badmfck_signal_1.default();
38
- exports.REQ_MYSQL_QUERY = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_QUERY");
39
- exports.REQ_MYSQL_TBEGIN = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TRANSACTION_BEGING");
40
- exports.REQ_MYSQL_TQUERY = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TRANSACTION_ADD_OPERATION");
41
- exports.REQ_MYSQL_TCOMMIT = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TCOMMIT");
42
- exports.REQ_MYSQL_TROLLBACK = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_TROLLBACK");
43
- const executeQuery = async (query) => { return await exports.REQ_MYSQL_QUERY.request(query); };
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.REQ_MYSQL_QUERY.request({ query: "SELECT 1 @NOLIMIT", fields: [] });
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.REQ_MYSQL_QUERY.request(query); }
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.REQ_MYSQL_QUERY.listener = async (data) => {
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.REQ_MYSQL_TBEGIN.listener = async () => {
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.REQ_MYSQL_TQUERY.listener = async (data) => {
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.REQ_MYSQL_TROLLBACK.listener = async (tid) => {
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.REQ_MYSQL_TCOMMIT.listener = async (tid) => {
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 { error: conn };
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 { data: { transactionId: trxid } };
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 { error: err };
222
- return { data: true };
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 { error: {
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 { data: true };
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({ data: null, error: conn });
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
- (0, LogService_1.logDB)(query);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badmfck-api-server",
3
- "version": "3.6.5",
3
+ "version": "3.6.7",
4
4
  "description": "Simple API http server based on express",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",