@bhushanpawar/sqldb 1.0.0 → 1.0.2
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/README.md +1403 -93
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +2 -1
- package/dist/cache/cache-manager.js.map +1 -1
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +225 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/schema-generator.d.ts +28 -0
- package/dist/cli/schema-generator.d.ts.map +1 -0
- package/dist/cli/schema-generator.js +159 -0
- package/dist/cli/schema-generator.js.map +1 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +56 -14
- package/dist/client.js.map +1 -1
- package/dist/connection/mariadb.d.ts +21 -0
- package/dist/connection/mariadb.d.ts.map +1 -1
- package/dist/connection/mariadb.js +121 -3
- package/dist/connection/mariadb.js.map +1 -1
- package/dist/db-schema.d.ts +413 -0
- package/dist/db-schema.d.ts.map +1 -0
- package/dist/db-schema.js +1149 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/discovery/dependency-graph.d.ts +3 -0
- package/dist/discovery/dependency-graph.d.ts.map +1 -1
- package/dist/discovery/dependency-graph.js +11 -0
- package/dist/discovery/dependency-graph.js.map +1 -1
- package/dist/discovery/schema-reader.d.ts +1 -1
- package/dist/discovery/schema-reader.d.ts.map +1 -1
- package/dist/discovery/schema-reader.js +48 -19
- package/dist/discovery/schema-reader.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -3
- package/dist/index.js.map +1 -1
- package/dist/query/operations.d.ts +7 -0
- package/dist/query/operations.d.ts.map +1 -1
- package/dist/query/operations.js +204 -22
- package/dist/query/operations.js.map +1 -1
- package/dist/types/client.d.ts +32 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +3 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/config.d.ts +3 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +14 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/query.d.ts +12 -0
- package/dist/types/query.d.ts.map +1 -1
- package/dist/types/schema.d.ts +6 -0
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/warming.d.ts +47 -0
- package/dist/types/warming.d.ts.map +1 -0
- package/dist/types/warming.js +3 -0
- package/dist/types/warming.js.map +1 -0
- package/dist/warming/auto-warming-manager.d.ts +65 -0
- package/dist/warming/auto-warming-manager.d.ts.map +1 -0
- package/dist/warming/auto-warming-manager.js +256 -0
- package/dist/warming/auto-warming-manager.js.map +1 -0
- package/dist/warming/query-stats-tracker.d.ts +53 -0
- package/dist/warming/query-stats-tracker.d.ts.map +1 -0
- package/dist/warming/query-stats-tracker.js +273 -0
- package/dist/warming/query-stats-tracker.js.map +1 -0
- package/package.json +4 -1
package/dist/client.js
CHANGED
|
@@ -14,15 +14,19 @@ const operations_1 = require("./query/operations");
|
|
|
14
14
|
const table_proxy_1 = require("./query/table-proxy");
|
|
15
15
|
const hooks_manager_1 = require("./hooks/hooks-manager");
|
|
16
16
|
const query_tracker_1 = require("./query/query-tracker");
|
|
17
|
+
const query_stats_tracker_1 = require("./warming/query-stats-tracker");
|
|
18
|
+
const auto_warming_manager_1 = require("./warming/auto-warming-manager");
|
|
17
19
|
class SmartDBClient {
|
|
18
20
|
constructor(config) {
|
|
19
21
|
this.initialized = false;
|
|
20
22
|
this.discoveredTables = new Set();
|
|
23
|
+
this.tableSchemas = new Map();
|
|
21
24
|
this.config = {
|
|
22
25
|
...config,
|
|
23
26
|
cache: { ...config_1.DEFAULT_CACHE_CONFIG, ...config.cache },
|
|
24
27
|
discovery: { ...config_1.DEFAULT_DISCOVERY_CONFIG, ...config.discovery },
|
|
25
28
|
logging: { ...config_1.DEFAULT_LOGGING_CONFIG, ...config.logging },
|
|
29
|
+
warming: { ...config_1.DEFAULT_WARMING_CONFIG, ...config.warming },
|
|
26
30
|
};
|
|
27
31
|
this.queryTracker = new query_tracker_1.InMemoryQueryTracker();
|
|
28
32
|
}
|
|
@@ -53,22 +57,16 @@ class SmartDBClient {
|
|
|
53
57
|
if (this.config.discovery.refreshInterval && this.config.discovery.refreshInterval > 0) {
|
|
54
58
|
setInterval(() => this.refreshSchema(), this.config.discovery.refreshInterval);
|
|
55
59
|
}
|
|
60
|
+
// Initialize auto-warming system if enabled
|
|
61
|
+
if (this.config.warming.enabled) {
|
|
62
|
+
this.statsTracker = new query_stats_tracker_1.QueryStatsTracker(this.dbManager, this.config.warming);
|
|
63
|
+
await this.statsTracker.initialize();
|
|
64
|
+
this.warmingManager = new auto_warming_manager_1.AutoWarmingManager(this.dbManager, this.cacheManager, this.statsTracker, this.config.warming, this.config.mariadb);
|
|
65
|
+
await this.warmingManager.start();
|
|
66
|
+
this.log('info', 'Auto-warming enabled');
|
|
67
|
+
}
|
|
56
68
|
this.initialized = true;
|
|
57
69
|
this.log('info', 'SmartDBClient initialized successfully');
|
|
58
|
-
// Create dynamic table accessors using Proxy
|
|
59
|
-
return new Proxy(this, {
|
|
60
|
-
get(target, prop) {
|
|
61
|
-
// If prop exists on target, return it
|
|
62
|
-
if (prop in target) {
|
|
63
|
-
return target[prop];
|
|
64
|
-
}
|
|
65
|
-
// Otherwise, treat it as a table name
|
|
66
|
-
if (typeof prop === 'string' && !prop.startsWith('_')) {
|
|
67
|
-
return target.getTableOperations(prop);
|
|
68
|
-
}
|
|
69
|
-
return undefined;
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
70
|
}
|
|
73
71
|
async discoverSchema() {
|
|
74
72
|
this.log('info', 'Discovering database schema...');
|
|
@@ -79,6 +77,7 @@ class SmartDBClient {
|
|
|
79
77
|
this.log('info', `Discovered ${tables.length} tables`);
|
|
80
78
|
for (const table of tables) {
|
|
81
79
|
this.discoveredTables.add(table.tableName);
|
|
80
|
+
this.tableSchemas.set(table.tableName, table);
|
|
82
81
|
}
|
|
83
82
|
// Discover relationships
|
|
84
83
|
const relationships = await relationshipParser.parseRelationships();
|
|
@@ -91,6 +90,7 @@ class SmartDBClient {
|
|
|
91
90
|
async refreshSchema() {
|
|
92
91
|
this.log('info', 'Refreshing database schema...');
|
|
93
92
|
this.discoveredTables.clear();
|
|
93
|
+
this.tableSchemas.clear();
|
|
94
94
|
this.dependencyGraph.clear();
|
|
95
95
|
await this.discoverSchema();
|
|
96
96
|
this.log('info', 'Schema refreshed successfully');
|
|
@@ -113,6 +113,9 @@ class SmartDBClient {
|
|
|
113
113
|
getDiscoveredTables() {
|
|
114
114
|
return Array.from(this.discoveredTables);
|
|
115
115
|
}
|
|
116
|
+
getTableSchema(tableName) {
|
|
117
|
+
return this.tableSchemas.get(tableName);
|
|
118
|
+
}
|
|
116
119
|
getQueries(correlationId) {
|
|
117
120
|
return this.queryTracker.getQueries(correlationId);
|
|
118
121
|
}
|
|
@@ -128,14 +131,53 @@ class SmartDBClient {
|
|
|
128
131
|
overall: mariadbHealthy && redisHealthy,
|
|
129
132
|
};
|
|
130
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate TypeScript interface from database schema
|
|
136
|
+
*/
|
|
137
|
+
generateSchema(options) {
|
|
138
|
+
const { SchemaGenerator } = require('./cli/schema-generator');
|
|
139
|
+
const generator = new SchemaGenerator(this);
|
|
140
|
+
if (options?.withExample) {
|
|
141
|
+
return generator.generateWithExample(options);
|
|
142
|
+
}
|
|
143
|
+
return generator.generateCompleteSchema(options);
|
|
144
|
+
}
|
|
131
145
|
async close() {
|
|
132
146
|
this.log('info', 'Closing SmartDBClient...');
|
|
147
|
+
// Stop auto-warming if enabled
|
|
148
|
+
if (this.warmingManager) {
|
|
149
|
+
await this.warmingManager.stop();
|
|
150
|
+
}
|
|
133
151
|
await this.cacheManager.clear();
|
|
134
152
|
await this.dbManager.close();
|
|
135
153
|
await this.redisManager.close();
|
|
136
154
|
this.initialized = false;
|
|
137
155
|
this.log('info', 'SmartDBClient closed');
|
|
138
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Get auto-warming statistics
|
|
159
|
+
*/
|
|
160
|
+
getWarmingStats() {
|
|
161
|
+
return this.warmingManager?.getLastWarmingStats() || null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Manually trigger cache warming
|
|
165
|
+
*/
|
|
166
|
+
async warmCache() {
|
|
167
|
+
if (!this.warmingManager) {
|
|
168
|
+
throw new Error('Auto-warming is not enabled. Set warming.enabled = true in config.');
|
|
169
|
+
}
|
|
170
|
+
return await this.warmingManager.warmCache();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get query statistics summary
|
|
174
|
+
*/
|
|
175
|
+
async getQueryStatsSummary() {
|
|
176
|
+
if (!this.statsTracker) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
return await this.statsTracker.getStatsSummary();
|
|
180
|
+
}
|
|
139
181
|
log(level, message, meta) {
|
|
140
182
|
if (this.config.logging?.logger) {
|
|
141
183
|
this.config.logging.logger(level, message, meta);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,29 @@ export declare class MariaDBConnectionManager {
|
|
|
5
5
|
private pool;
|
|
6
6
|
private config;
|
|
7
7
|
private queryTracker?;
|
|
8
|
+
private enableQueryLogging;
|
|
8
9
|
constructor(config: MariaDBConfig, queryTracker?: QueryTracker);
|
|
9
10
|
setQueryTracker(tracker: QueryTracker): void;
|
|
11
|
+
/**
|
|
12
|
+
* Categorize query type based on SQL statement
|
|
13
|
+
*/
|
|
14
|
+
private categorizeQuery;
|
|
15
|
+
/**
|
|
16
|
+
* Extract table name from SQL query
|
|
17
|
+
*/
|
|
18
|
+
private extractTableName;
|
|
19
|
+
/**
|
|
20
|
+
* Format SQL for logging (truncate if too long)
|
|
21
|
+
*/
|
|
22
|
+
private formatSqlForLogging;
|
|
23
|
+
/**
|
|
24
|
+
* Get performance emoji based on execution time
|
|
25
|
+
*/
|
|
26
|
+
private getPerformanceEmoji;
|
|
27
|
+
/**
|
|
28
|
+
* Log query execution with nice formatting
|
|
29
|
+
*/
|
|
30
|
+
private logQuery;
|
|
10
31
|
connect(): Promise<mariadb.Pool>;
|
|
11
32
|
getConnection(): Promise<mariadb.PoolConnection>;
|
|
12
33
|
query<T = any>(sql: string, params?: any[], correlationId?: string): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mariadb.d.ts","sourceRoot":"","sources":["../../src/connection/mariadb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mariadb.d.ts","sourceRoot":"","sources":["../../src/connection/mariadb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAK7D,qBAAa,wBAAwB;IACnC,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAkB;gBAEhC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,YAAY;IAO9D,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAI5C;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiCV,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAchC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;IAKhD,KAAK,CAAC,CAAC,GAAG,GAAG,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,GAAG,EAAE,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,CAAC,CAAC;IAmEP,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,WAAW,IAAI,OAAO;CAGvB"}
|
|
@@ -39,12 +39,120 @@ const query_tracker_1 = require("../query/query-tracker");
|
|
|
39
39
|
class MariaDBConnectionManager {
|
|
40
40
|
constructor(config, queryTracker) {
|
|
41
41
|
this.pool = null;
|
|
42
|
+
this.enableQueryLogging = false;
|
|
42
43
|
this.config = config;
|
|
43
44
|
this.queryTracker = queryTracker;
|
|
45
|
+
// Enable query logging if logging is configured
|
|
46
|
+
this.enableQueryLogging = !!config.logging;
|
|
44
47
|
}
|
|
45
48
|
setQueryTracker(tracker) {
|
|
46
49
|
this.queryTracker = tracker;
|
|
47
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Categorize query type based on SQL statement
|
|
53
|
+
*/
|
|
54
|
+
categorizeQuery(sql) {
|
|
55
|
+
const trimmed = sql.trim().toUpperCase();
|
|
56
|
+
if (trimmed.startsWith('SELECT'))
|
|
57
|
+
return 'SELECT';
|
|
58
|
+
if (trimmed.startsWith('INSERT'))
|
|
59
|
+
return 'INSERT';
|
|
60
|
+
if (trimmed.startsWith('UPDATE'))
|
|
61
|
+
return 'UPDATE';
|
|
62
|
+
if (trimmed.startsWith('DELETE'))
|
|
63
|
+
return 'DELETE';
|
|
64
|
+
if (trimmed.startsWith('CREATE'))
|
|
65
|
+
return 'CREATE';
|
|
66
|
+
if (trimmed.startsWith('ALTER'))
|
|
67
|
+
return 'ALTER';
|
|
68
|
+
if (trimmed.startsWith('DROP'))
|
|
69
|
+
return 'DROP';
|
|
70
|
+
return 'OTHER';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract table name from SQL query
|
|
74
|
+
*/
|
|
75
|
+
extractTableName(sql, queryType) {
|
|
76
|
+
try {
|
|
77
|
+
const trimmed = sql.trim();
|
|
78
|
+
let match = null;
|
|
79
|
+
switch (queryType) {
|
|
80
|
+
case 'SELECT':
|
|
81
|
+
// SELECT ... FROM table_name
|
|
82
|
+
match = trimmed.match(/FROM\s+`?(\w+)`?/i);
|
|
83
|
+
break;
|
|
84
|
+
case 'INSERT':
|
|
85
|
+
// INSERT INTO table_name
|
|
86
|
+
match = trimmed.match(/INSERT\s+INTO\s+`?(\w+)`?/i);
|
|
87
|
+
break;
|
|
88
|
+
case 'UPDATE':
|
|
89
|
+
// UPDATE table_name
|
|
90
|
+
match = trimmed.match(/UPDATE\s+`?(\w+)`?/i);
|
|
91
|
+
break;
|
|
92
|
+
case 'DELETE':
|
|
93
|
+
// DELETE FROM table_name
|
|
94
|
+
match = trimmed.match(/DELETE\s+FROM\s+`?(\w+)`?/i);
|
|
95
|
+
break;
|
|
96
|
+
case 'CREATE':
|
|
97
|
+
case 'ALTER':
|
|
98
|
+
case 'DROP':
|
|
99
|
+
// CREATE/ALTER/DROP TABLE table_name
|
|
100
|
+
match = trimmed.match(/TABLE\s+(?:IF\s+(?:NOT\s+)?EXISTS\s+)?`?(\w+)`?/i);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return match ? match[1] : null;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format SQL for logging (truncate if too long)
|
|
111
|
+
*/
|
|
112
|
+
formatSqlForLogging(sql, maxLength = 100) {
|
|
113
|
+
const cleaned = sql.replace(/\s+/g, ' ').trim();
|
|
114
|
+
if (cleaned.length <= maxLength) {
|
|
115
|
+
return cleaned;
|
|
116
|
+
}
|
|
117
|
+
return cleaned.substring(0, maxLength) + '...';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get performance emoji based on execution time
|
|
121
|
+
*/
|
|
122
|
+
getPerformanceEmoji(ms) {
|
|
123
|
+
if (ms < 10)
|
|
124
|
+
return '⚡'; // Very fast
|
|
125
|
+
if (ms < 50)
|
|
126
|
+
return '🚀'; // Fast
|
|
127
|
+
if (ms < 200)
|
|
128
|
+
return '✅'; // Good
|
|
129
|
+
if (ms < 500)
|
|
130
|
+
return '⚠️'; // Slow
|
|
131
|
+
return '🐌'; // Very slow
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Log query execution with nice formatting
|
|
135
|
+
*/
|
|
136
|
+
logQuery(queryType, tableName, sql, executionTimeMs, resultCount, error) {
|
|
137
|
+
if (!this.enableQueryLogging)
|
|
138
|
+
return;
|
|
139
|
+
const emoji = error ? '❌' : this.getPerformanceEmoji(executionTimeMs);
|
|
140
|
+
const table = tableName || 'unknown';
|
|
141
|
+
const formattedSql = this.formatSqlForLogging(sql, 100 * 10);
|
|
142
|
+
const timestamp = new Date().toISOString();
|
|
143
|
+
if (error) {
|
|
144
|
+
console.log(`[${timestamp}] ${emoji} ${queryType} on ${table} - FAILED after ${executionTimeMs}ms`);
|
|
145
|
+
console.log(` SQL: ${formattedSql}`);
|
|
146
|
+
console.log(` Error: ${error}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const resultsText = queryType === 'SELECT' ? `${resultCount} rows` : `${resultCount} affected`;
|
|
150
|
+
console.log(`[${timestamp}] ${emoji} ${queryType} on ${table} - ${executionTimeMs}ms - ${resultsText}`);
|
|
151
|
+
if (executionTimeMs > 200) {
|
|
152
|
+
console.log(` SQL: ${formattedSql}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
48
156
|
async connect() {
|
|
49
157
|
if (this.pool) {
|
|
50
158
|
return this.pool;
|
|
@@ -64,6 +172,9 @@ class MariaDBConnectionManager {
|
|
|
64
172
|
const pool = await this.connect();
|
|
65
173
|
const queryId = (0, query_tracker_1.generateQueryId)();
|
|
66
174
|
const startTime = Date.now();
|
|
175
|
+
// Categorize query
|
|
176
|
+
const queryType = this.categorizeQuery(sql);
|
|
177
|
+
const tableName = this.extractTableName(sql, queryType);
|
|
67
178
|
const metadata = {
|
|
68
179
|
queryId,
|
|
69
180
|
correlationId,
|
|
@@ -74,22 +185,29 @@ class MariaDBConnectionManager {
|
|
|
74
185
|
try {
|
|
75
186
|
const result = await pool.query(sql, params);
|
|
76
187
|
const endTime = Date.now();
|
|
188
|
+
const executionTimeMs = endTime - startTime;
|
|
77
189
|
metadata.endTime = endTime;
|
|
78
|
-
metadata.executionTimeMs =
|
|
190
|
+
metadata.executionTimeMs = executionTimeMs;
|
|
79
191
|
metadata.resultCount = Array.isArray(result) ? result.length : 1;
|
|
80
192
|
if (this.queryTracker) {
|
|
81
193
|
this.queryTracker.trackQuery(metadata);
|
|
82
194
|
}
|
|
195
|
+
// Log query execution
|
|
196
|
+
this.logQuery(queryType, tableName, sql, executionTimeMs, metadata.resultCount);
|
|
83
197
|
return result;
|
|
84
198
|
}
|
|
85
199
|
catch (error) {
|
|
86
200
|
const endTime = Date.now();
|
|
201
|
+
const executionTimeMs = endTime - startTime;
|
|
202
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
87
203
|
metadata.endTime = endTime;
|
|
88
|
-
metadata.executionTimeMs =
|
|
89
|
-
metadata.error =
|
|
204
|
+
metadata.executionTimeMs = executionTimeMs;
|
|
205
|
+
metadata.error = errorMessage;
|
|
90
206
|
if (this.queryTracker) {
|
|
91
207
|
this.queryTracker.trackQuery(metadata);
|
|
92
208
|
}
|
|
209
|
+
// Log query error
|
|
210
|
+
this.logQuery(queryType, tableName, sql, executionTimeMs, 0, errorMessage);
|
|
93
211
|
throw error;
|
|
94
212
|
}
|
|
95
213
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mariadb.js","sourceRoot":"","sources":["../../src/connection/mariadb.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAGnC,0DAAyD;
|
|
1
|
+
{"version":3,"file":"mariadb.js","sourceRoot":"","sources":["../../src/connection/mariadb.ts"],"names":[],"mappings":"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"}
|