Skip to content

Commit 66443f6

Browse files
committed
Allow usage of named parameters
1 parent e50b5a8 commit 66443f6

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

server/node-service/src/plugins/firebirdsql/i18n/en.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ export const en = {
1313
blobAsText: "Get blob as text, only affects blob subtype 1",
1414

1515
actions: "Actions",
16-
actionName: "SQL Query",
16+
actionName: "Query",
17+
sqlInputField: "SQL Query",
18+
paramsInputField: "Query Parameters",
1719
};

server/node-service/src/plugins/firebirdsql/queryConfig.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ function getQueryConfig(i18n: FirebirdI18nTranslator) {
88
actions: [
99
{
1010
actionName: "Query",
11-
label: "Query",
11+
label: i18n.trans("actionName"),
1212
params: [
1313
{
14-
label: i18n.trans("actionName"),
14+
label: i18n.trans("sqlInputField"),
1515
key: "sql",
1616
type: "sqlInput",
1717
},
18+
{
19+
label: i18n.trans("paramsInputField"),
20+
key: "params",
21+
type: "jsonInput",
22+
},
1823
],
1924
},
2025
],

server/node-service/src/plugins/firebirdsql/run.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { DataSourceDataType } from "./dataSourceConfig";
22
import { ActionDataType } from "./queryConfig";
33
import { FirebirdI18nTranslator } from "./i18n";
4+
import { ServiceError } from "../../common/error";
45
import _ from "lodash";
56
import Firebird from "node-firebird";
67

@@ -39,11 +40,41 @@ export async function validateDataSourceConfig(dataSourceConfig: DataSourceDataT
3940
}
4041
}
4142

43+
async function prepareQueryParameters(stmt: string, parameters: object) {
44+
const re : RegExp = /(:)([_a-zA-Z0-9\[\]\.]+)/gm;
45+
46+
const placeholdersInStmt = stmt.matchAll(re);
47+
48+
let parametersArray = [];
49+
50+
for(const match of placeholdersInStmt) {
51+
const paramName: string = match[2];
52+
if (_.isNil(paramName)) {
53+
continue;
54+
}
55+
if (!_.has(parameters, paramName)) {
56+
throw new ServiceError(`Named parameter "${paramName}" not found in Query Parameters object.`);
57+
}
58+
parametersArray.push(_.get(parameters, paramName));
59+
}
60+
61+
const modifiedStmt = stmt.replaceAll(re, "?");
62+
63+
return {
64+
stmt: modifiedStmt,
65+
parametersArray: parametersArray
66+
}
67+
}
68+
4269
export default async function run(action: ActionDataType, dataSourceConfig: DataSourceDataType, i18n: FirebirdI18nTranslator) {
4370
if (action.actionName === "Query") {
4471
let db = await fbdAsync.attachAsync(getFirebirdOptions(dataSourceConfig));
4572
promisifyAll(db);
46-
const results = await db.queryAsync(action.sql);
73+
74+
const { stmt, parametersArray } = await prepareQueryParameters(action.sql, action.params);
75+
76+
const results = db.queryAsync(stmt, parametersArray);
77+
4778
db.detachAsync();
4879
return results;
4980
}

0 commit comments

Comments
 (0)