forge-sql-orm 2.1.11 → 2.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/README.md +800 -541
- package/dist/core/ForgeSQLAnalyseOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLAnalyseOperations.js +257 -0
- package/dist/core/ForgeSQLAnalyseOperations.js.map +1 -0
- package/dist/core/ForgeSQLCacheOperations.js +172 -0
- package/dist/core/ForgeSQLCacheOperations.js.map +1 -0
- package/dist/core/ForgeSQLCrudOperations.js +349 -0
- package/dist/core/ForgeSQLCrudOperations.js.map +1 -0
- package/dist/core/ForgeSQLORM.d.ts +1 -1
- package/dist/core/ForgeSQLORM.d.ts.map +1 -1
- package/dist/core/ForgeSQLORM.js +1191 -0
- package/dist/core/ForgeSQLORM.js.map +1 -0
- package/dist/core/ForgeSQLQueryBuilder.js +77 -0
- package/dist/core/ForgeSQLQueryBuilder.js.map +1 -0
- package/dist/core/ForgeSQLSelectOperations.js +81 -0
- package/dist/core/ForgeSQLSelectOperations.js.map +1 -0
- package/dist/core/SystemTables.js +258 -0
- package/dist/core/SystemTables.js.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/drizzle/extensions/additionalActions.d.ts.map +1 -1
- package/dist/lib/drizzle/extensions/additionalActions.js +527 -0
- package/dist/lib/drizzle/extensions/additionalActions.js.map +1 -0
- package/dist/utils/cacheContextUtils.d.ts.map +1 -1
- package/dist/utils/cacheContextUtils.js +198 -0
- package/dist/utils/cacheContextUtils.js.map +1 -0
- package/dist/utils/cacheUtils.d.ts.map +1 -1
- package/dist/utils/cacheUtils.js +383 -0
- package/dist/utils/cacheUtils.js.map +1 -0
- package/dist/utils/forgeDriver.d.ts.map +1 -1
- package/dist/utils/forgeDriver.js +139 -0
- package/dist/utils/forgeDriver.js.map +1 -0
- package/dist/utils/forgeDriverProxy.js +68 -0
- package/dist/utils/forgeDriverProxy.js.map +1 -0
- package/dist/utils/metadataContextUtils.d.ts.map +1 -1
- package/dist/utils/metadataContextUtils.js +28 -0
- package/dist/utils/metadataContextUtils.js.map +1 -0
- package/dist/utils/requestTypeContextUtils.js +10 -0
- package/dist/utils/requestTypeContextUtils.js.map +1 -0
- package/dist/utils/sqlHints.js +52 -0
- package/dist/utils/sqlHints.js.map +1 -0
- package/dist/utils/sqlUtils.d.ts.map +1 -1
- package/dist/utils/sqlUtils.js +590 -0
- package/dist/utils/sqlUtils.js.map +1 -0
- package/dist/webtriggers/applyMigrationsWebTrigger.js +77 -0
- package/dist/webtriggers/applyMigrationsWebTrigger.js.map +1 -0
- package/dist/webtriggers/clearCacheSchedulerTrigger.js +83 -0
- package/dist/webtriggers/clearCacheSchedulerTrigger.js.map +1 -0
- package/dist/webtriggers/dropMigrationWebTrigger.js +54 -0
- package/dist/webtriggers/dropMigrationWebTrigger.js.map +1 -0
- package/dist/webtriggers/dropTablesMigrationWebTrigger.js +54 -0
- package/dist/webtriggers/dropTablesMigrationWebTrigger.js.map +1 -0
- package/dist/webtriggers/fetchSchemaWebTrigger.js +82 -0
- package/dist/webtriggers/fetchSchemaWebTrigger.js.map +1 -0
- package/dist/webtriggers/index.js +40 -0
- package/dist/webtriggers/index.js.map +1 -0
- package/dist/webtriggers/slowQuerySchedulerTrigger.d.ts.map +1 -1
- package/dist/webtriggers/slowQuerySchedulerTrigger.js +80 -0
- package/dist/webtriggers/slowQuerySchedulerTrigger.js.map +1 -0
- package/package.json +28 -23
- package/src/core/ForgeSQLAnalyseOperations.ts +3 -2
- package/src/core/ForgeSQLORM.ts +33 -27
- package/src/lib/drizzle/extensions/additionalActions.ts +11 -0
- package/src/utils/cacheContextUtils.ts +9 -6
- package/src/utils/cacheUtils.ts +28 -5
- package/src/utils/forgeDriver.ts +10 -6
- package/src/utils/metadataContextUtils.ts +1 -4
- package/src/utils/sqlUtils.ts +136 -125
- package/src/webtriggers/slowQuerySchedulerTrigger.ts +40 -33
- package/dist/ForgeSQLORM.js +0 -3896
- package/dist/ForgeSQLORM.js.map +0 -1
- package/dist/ForgeSQLORM.mjs +0 -3879
- package/dist/ForgeSQLORM.mjs.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.forgeDriver = void 0;
|
|
4
|
+
exports.isUpdateQueryResponse = isUpdateQueryResponse;
|
|
5
|
+
const sql_1 = require("@forge/sql");
|
|
6
|
+
const metadataContextUtils_1 = require("./metadataContextUtils");
|
|
7
|
+
const requestTypeContextUtils_1 = require("./requestTypeContextUtils");
|
|
8
|
+
const sqlUtils_1 = require("./sqlUtils");
|
|
9
|
+
const timeoutMs = 10000;
|
|
10
|
+
const timeoutMessage = `Atlassian @forge/sql did not return a response within ${timeoutMs}ms (${timeoutMs / 1000} seconds), so the request is blocked. Possible causes: slow query, network issues, or exceeding Forge SQL limits.`;
|
|
11
|
+
/**
|
|
12
|
+
* Type guard to check if an object is an UpdateQueryResponse.
|
|
13
|
+
*
|
|
14
|
+
* @param obj - The object to check
|
|
15
|
+
* @returns True if the object is an UpdateQueryResponse
|
|
16
|
+
*/
|
|
17
|
+
function isUpdateQueryResponse(obj) {
|
|
18
|
+
return (obj !== null &&
|
|
19
|
+
typeof obj === "object" &&
|
|
20
|
+
typeof obj.affectedRows === "number" &&
|
|
21
|
+
typeof obj.insertId === "number");
|
|
22
|
+
}
|
|
23
|
+
function inlineParams(sql, params) {
|
|
24
|
+
let i = 0;
|
|
25
|
+
return sql.replace(/\?/g, () => {
|
|
26
|
+
const val = params[i++];
|
|
27
|
+
if (val === null)
|
|
28
|
+
return "NULL";
|
|
29
|
+
if (typeof val === "number")
|
|
30
|
+
return val.toString();
|
|
31
|
+
return `'${String(val).replace(/'/g, "''")}'`;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Processes DDL query results and saves metadata.
|
|
36
|
+
*
|
|
37
|
+
* @param result - The DDL query result
|
|
38
|
+
* @returns Processed result for Drizzle ORM
|
|
39
|
+
*/
|
|
40
|
+
async function processDDLResult(method, result) {
|
|
41
|
+
if (result.metadata) {
|
|
42
|
+
await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
|
|
43
|
+
}
|
|
44
|
+
if (!result?.rows) {
|
|
45
|
+
return { rows: [] };
|
|
46
|
+
}
|
|
47
|
+
if (isUpdateQueryResponse(result.rows)) {
|
|
48
|
+
const oneRow = result.rows;
|
|
49
|
+
return { ...oneRow, rows: [oneRow] };
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(result.rows)) {
|
|
52
|
+
if (method === "execute") {
|
|
53
|
+
return { rows: [result.rows] };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const rows = result.rows.map((r) => Object.values(r));
|
|
57
|
+
return { rows };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { rows: [] };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Processes execute method results (UPDATE, INSERT, DELETE).
|
|
64
|
+
*
|
|
65
|
+
* @param query - The SQL query
|
|
66
|
+
* @param params - Query parameters
|
|
67
|
+
* @returns Processed result for Drizzle ORM
|
|
68
|
+
*/
|
|
69
|
+
async function processExecuteMethod(query, params) {
|
|
70
|
+
const sqlStatement = sql_1.sql.prepare(query);
|
|
71
|
+
if (params) {
|
|
72
|
+
sqlStatement.bindParams(...params);
|
|
73
|
+
}
|
|
74
|
+
const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
|
|
75
|
+
await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
|
|
76
|
+
if (!result.rows) {
|
|
77
|
+
return { rows: [[]] };
|
|
78
|
+
}
|
|
79
|
+
return { rows: [result.rows] };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Processes all method results (SELECT queries).
|
|
83
|
+
*
|
|
84
|
+
* @param query - The SQL query
|
|
85
|
+
* @param params - Query parameters
|
|
86
|
+
* @returns Processed result for Drizzle ORM
|
|
87
|
+
*/
|
|
88
|
+
async function processAllMethod(query, params) {
|
|
89
|
+
const sqlStatement = await sql_1.sql.prepare(query);
|
|
90
|
+
if (params) {
|
|
91
|
+
await sqlStatement.bindParams(...params);
|
|
92
|
+
}
|
|
93
|
+
const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
|
|
94
|
+
await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
|
|
95
|
+
if (!result.rows) {
|
|
96
|
+
return { rows: [] };
|
|
97
|
+
}
|
|
98
|
+
const rows = result.rows.map((r) => Object.values(r));
|
|
99
|
+
return { rows };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Main Forge SQL driver function for Drizzle ORM integration.
|
|
103
|
+
* Handles DDL operations, execute operations (UPDATE/INSERT/DELETE), and select operations.
|
|
104
|
+
*
|
|
105
|
+
* @param query - The SQL query to execute
|
|
106
|
+
* @param params - Query parameters
|
|
107
|
+
* @param method - Execution method ("all" for SELECT, "execute" for UPDATE/INSERT/DELETE)
|
|
108
|
+
* @returns Promise with query results compatible with Drizzle ORM
|
|
109
|
+
*
|
|
110
|
+
* @throws {Error} When DDL operations are called with parameters
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // DDL operation
|
|
115
|
+
* await forgeDriver("CREATE TABLE users (id INT)", [], "all");
|
|
116
|
+
*
|
|
117
|
+
* // SELECT operation
|
|
118
|
+
* await forgeDriver("SELECT * FROM users WHERE id = ?", [1], "all");
|
|
119
|
+
*
|
|
120
|
+
* // UPDATE operation
|
|
121
|
+
* await forgeDriver("UPDATE users SET name = ? WHERE id = ?", ["John", 1], "execute");
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
const forgeDriver = async (query, params, method) => {
|
|
125
|
+
const operationType = await (0, requestTypeContextUtils_1.getOperationType)();
|
|
126
|
+
// Handle DDL operations
|
|
127
|
+
if (operationType === "DDL") {
|
|
128
|
+
const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql.executeDDL(inlineParams(query, params)), timeoutMessage, timeoutMs);
|
|
129
|
+
return await processDDLResult(method, result);
|
|
130
|
+
}
|
|
131
|
+
// Handle execute method (UPDATE, INSERT, DELETE)
|
|
132
|
+
if (method === "execute") {
|
|
133
|
+
return await processExecuteMethod(query, params ?? []);
|
|
134
|
+
}
|
|
135
|
+
// Handle all method (SELECT)
|
|
136
|
+
return await processAllMethod(query, params ?? []);
|
|
137
|
+
};
|
|
138
|
+
exports.forgeDriver = forgeDriver;
|
|
139
|
+
//# sourceMappingURL=forgeDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createForgeDriverProxy = createForgeDriverProxy;
|
|
4
|
+
const forgeDriver_1 = require("./forgeDriver");
|
|
5
|
+
const sqlHints_1 = require("./sqlHints");
|
|
6
|
+
const sqlUtils_1 = require("./sqlUtils");
|
|
7
|
+
/**
|
|
8
|
+
* Error codes and constants for query analysis
|
|
9
|
+
*/
|
|
10
|
+
const QUERY_ERROR_CODES = {
|
|
11
|
+
TIMEOUT: "SQL_QUERY_TIMEOUT",
|
|
12
|
+
OUT_OF_MEMORY_ERRNO: 8175,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Delay to wait for CLUSTER_STATEMENTS_SUMMARY to be populated
|
|
16
|
+
*/
|
|
17
|
+
const STATEMENTS_SUMMARY_DELAY_MS = 200;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a proxy for the forgeDriver that injects SQL hints and handles query analysis
|
|
20
|
+
* @param forgeSqlOperation - The ForgeSQL operation instance
|
|
21
|
+
* @param options - SQL hints to inject
|
|
22
|
+
* @param logRawSqlQuery - Whether to log raw SQL queries
|
|
23
|
+
* @returns A proxied version of the forgeDriver
|
|
24
|
+
*/
|
|
25
|
+
function createForgeDriverProxy(forgeSqlOperation, options, logRawSqlQuery) {
|
|
26
|
+
return async (query, params, method) => {
|
|
27
|
+
// Inject SQL hints into the query
|
|
28
|
+
const modifiedQuery = (0, sqlHints_1.injectSqlHints)(query, options);
|
|
29
|
+
if (options && logRawSqlQuery && modifiedQuery !== query) {
|
|
30
|
+
// eslint-disable-next-line no-console
|
|
31
|
+
console.debug(`SQL Hints injected: ${modifiedQuery}`);
|
|
32
|
+
}
|
|
33
|
+
const queryStartTime = Date.now();
|
|
34
|
+
try {
|
|
35
|
+
// Execute the query with injected hints
|
|
36
|
+
return await (0, forgeDriver_1.forgeDriver)(modifiedQuery, params, method);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Check if this is a timeout or out-of-memory error that we want to analyze
|
|
40
|
+
const isTimeoutError = error.code === QUERY_ERROR_CODES.TIMEOUT;
|
|
41
|
+
const isOutOfMemoryError = error?.context?.debug?.errno === QUERY_ERROR_CODES.OUT_OF_MEMORY_ERRNO;
|
|
42
|
+
if (isTimeoutError || isOutOfMemoryError) {
|
|
43
|
+
if (isTimeoutError) {
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.error(` TIMEOUT detected - Query exceeded time limit`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.error(`OUT OF MEMORY detected - Query exceeded memory limit`);
|
|
50
|
+
}
|
|
51
|
+
// Wait for CLUSTER_STATEMENTS_SUMMARY to be populated with our failed query data
|
|
52
|
+
await new Promise((resolve) => setTimeout(resolve, STATEMENTS_SUMMARY_DELAY_MS));
|
|
53
|
+
const queryEndTime = Date.now();
|
|
54
|
+
const queryDuration = queryEndTime - queryStartTime;
|
|
55
|
+
// Analyze the failed query using CLUSTER_STATEMENTS_SUMMARY
|
|
56
|
+
await (0, sqlUtils_1.printQueriesWithPlan)(forgeSqlOperation, queryDuration);
|
|
57
|
+
}
|
|
58
|
+
// Log SQL error details if requested
|
|
59
|
+
if (logRawSqlQuery) {
|
|
60
|
+
// eslint-disable-next-line no-console
|
|
61
|
+
console.debug(`SQL Error Details:`, JSON.stringify(error, null, 2));
|
|
62
|
+
}
|
|
63
|
+
// Re-throw the original error
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=forgeDriverProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgeDriverProxy.js","sourceRoot":"","sources":["../../src/utils/forgeDriverProxy.ts"],"names":[],"mappings":";;AAyBA,wDA8DC;AAvFD,+CAA4C;AAC5C,yCAAsD;AAEtD,yCAAkD;AAElD;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,mBAAmB;IAC5B,mBAAmB,EAAE,IAAI;CACjB,CAAC;AAEX;;GAEG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,iBAAoC,EACpC,OAAkB,EAClB,cAAwB;IAExB,OAAO,KAAK,EACV,KAAa,EACb,MAAa,EACb,MAAyB,EAKxB,EAAE;QACH,kCAAkC;QAClC,MAAM,aAAa,GAAG,IAAA,yBAAc,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,IAAI,cAAc,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YACzD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,wCAAwC;YACxC,OAAO,MAAM,IAAA,yBAAW,EAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,4EAA4E;YAC5E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC;YAChE,MAAM,kBAAkB,GACtB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,iBAAiB,CAAC,mBAAmB,CAAC;YAEzE,IAAI,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBACzC,IAAI,cAAc,EAAE,CAAC;oBACnB,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACxE,CAAC;gBAED,iFAAiF;gBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC;gBAEjF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;gBAEpD,4DAA4D;gBAC5D,MAAM,IAAA,+BAAoB,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC/D,CAAC;YAED,qCAAqC;YACrC,IAAI,cAAc,EAAE,CAAC;gBACnB,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,8BAA8B;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AACF,eAAO,MAAM,oBAAoB,yCAAgD,CAAC;AAElF,wBAAsB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AACF,eAAO,MAAM,oBAAoB,yCAAgD,CAAC;AAElF,wBAAsB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAetF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAEpF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metadataQueryContext = void 0;
|
|
4
|
+
exports.saveMetaDataToContext = saveMetaDataToContext;
|
|
5
|
+
exports.getLastestMetadata = getLastestMetadata;
|
|
6
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
|
+
const sqlUtils_1 = require("./sqlUtils");
|
|
8
|
+
exports.metadataQueryContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
9
|
+
async function saveMetaDataToContext(metadata) {
|
|
10
|
+
const context = exports.metadataQueryContext.getStore();
|
|
11
|
+
if (context) {
|
|
12
|
+
context.printQueriesWithPlan = async () => {
|
|
13
|
+
if (process.env.NODE_ENV !== "test") {
|
|
14
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
15
|
+
}
|
|
16
|
+
await (0, sqlUtils_1.printQueriesWithPlan)(context.forgeSQLORM, Date.now() - context.beginTime.getTime());
|
|
17
|
+
};
|
|
18
|
+
if (metadata) {
|
|
19
|
+
context.totalResponseSize += metadata.responseSize;
|
|
20
|
+
context.totalDbExecutionTime += metadata.dbExecutionTime;
|
|
21
|
+
}
|
|
22
|
+
// Log the results to console
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function getLastestMetadata() {
|
|
26
|
+
return exports.metadataQueryContext.getStore();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=metadataContextUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":";;;AAcA,sDAeC;AAED,gDAEC;AAjCD,uDAAqD;AAGrD,yCAAkD;AASrC,QAAA,oBAAoB,GAAG,IAAI,oCAAiB,EAAwB,CAAC;AAE3E,KAAK,UAAU,qBAAqB,CAAC,QAA2B;IACrE,MAAM,OAAO,GAAG,4BAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,oBAAoB,GAAG,KAAK,IAAI,EAAE;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAA,+BAAoB,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC;YACnD,OAAO,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAAC;QAC3D,CAAC;QACD,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB;IACtC,OAAO,4BAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.operationTypeQueryContext = void 0;
|
|
4
|
+
exports.getOperationType = getOperationType;
|
|
5
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
6
|
+
exports.operationTypeQueryContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
7
|
+
async function getOperationType() {
|
|
8
|
+
return exports.operationTypeQueryContext.getStore()?.operationType ?? "DML";
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=requestTypeContextUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestTypeContextUtils.js","sourceRoot":"","sources":["../../src/utils/requestTypeContextUtils.ts"],"names":[],"mappings":";;;AAQA,4CAEC;AAVD,uDAAqD;AAMxC,QAAA,yBAAyB,GAAG,IAAI,oCAAiB,EAA6B,CAAC;AAErF,KAAK,UAAU,gBAAgB;IACpC,OAAO,iCAAyB,CAAC,QAAQ,EAAE,EAAE,aAAa,IAAI,KAAK,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.injectSqlHints = injectSqlHints;
|
|
4
|
+
/**
|
|
5
|
+
* Detects the type of SQL query and injects appropriate hints
|
|
6
|
+
* @param query - The SQL query to analyze
|
|
7
|
+
* @param hints - The hints configuration
|
|
8
|
+
* @returns The modified query with injected hints
|
|
9
|
+
*/
|
|
10
|
+
function injectSqlHints(query, hints) {
|
|
11
|
+
if (!hints) {
|
|
12
|
+
return query;
|
|
13
|
+
}
|
|
14
|
+
// Normalize the query for easier matching
|
|
15
|
+
const normalizedQuery = query.trim().toUpperCase();
|
|
16
|
+
// Get the appropriate hints based on query type
|
|
17
|
+
let queryHints;
|
|
18
|
+
if (normalizedQuery.startsWith("SELECT")) {
|
|
19
|
+
queryHints = hints.select;
|
|
20
|
+
}
|
|
21
|
+
else if (normalizedQuery.startsWith("INSERT")) {
|
|
22
|
+
queryHints = hints.insert;
|
|
23
|
+
}
|
|
24
|
+
else if (normalizedQuery.startsWith("UPDATE")) {
|
|
25
|
+
queryHints = hints.update;
|
|
26
|
+
}
|
|
27
|
+
else if (normalizedQuery.startsWith("DELETE")) {
|
|
28
|
+
queryHints = hints.delete;
|
|
29
|
+
}
|
|
30
|
+
// If no hints for this query type, return original query
|
|
31
|
+
if (!queryHints || queryHints.length === 0) {
|
|
32
|
+
return query;
|
|
33
|
+
}
|
|
34
|
+
// Join all hints with spaces
|
|
35
|
+
const hintsString = queryHints.join(" ");
|
|
36
|
+
// Inject hints into the query
|
|
37
|
+
if (normalizedQuery.startsWith("SELECT")) {
|
|
38
|
+
return `SELECT /*+ ${hintsString} */ ${query.substring(6)}`;
|
|
39
|
+
}
|
|
40
|
+
else if (normalizedQuery.startsWith("INSERT")) {
|
|
41
|
+
return `INSERT /*+ ${hintsString} */ ${query.substring(6)}`;
|
|
42
|
+
}
|
|
43
|
+
else if (normalizedQuery.startsWith("UPDATE")) {
|
|
44
|
+
return `UPDATE /*+ ${hintsString} */ ${query.substring(6)}`;
|
|
45
|
+
}
|
|
46
|
+
else if (normalizedQuery.startsWith("DELETE")) {
|
|
47
|
+
return `DELETE /*+ ${hintsString} */ ${query.substring(6)}`;
|
|
48
|
+
}
|
|
49
|
+
// If no match found, return original query
|
|
50
|
+
return query;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sqlHints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlHints.js","sourceRoot":"","sources":["../../src/utils/sqlHints.ts"],"names":[],"mappings":";;AAoBA,wCA0CC;AAhDD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa,EAAE,KAAgB;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0CAA0C;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEnD,gDAAgD;IAChD,IAAI,UAAgC,CAAC;IAErC,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,2CAA2C;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/sqlUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAYV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAqB,MAAM,8BAA8B,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,
|
|
1
|
+
{"version":3,"file":"sqlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/sqlUtils.ts"],"names":[],"mappings":"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"}
|