Skip to content

Commit d334256

Browse files
committed
Initial work for supporting bind prefix
Signed-off-by: worksofliam <mrliamallan@live.co.uk>
1 parent 4db6d01 commit d334256

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

src/language/providers/logic/parse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function getSqlDocument(document: TextDocument): Document|undefined {
1818
}
1919
}
2020

21-
const newAsp = new Document(document.getText());
21+
const newAsp = new Document(document.getText(), false);
2222
cached.set(uri, { ast: newAsp, version: document.version });
2323

2424
return newAsp;

src/views/results/binding.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { TextEditor } from "vscode";
2+
import { getSqlDocument } from "../../language/providers/logic/parse";
3+
import { StatementGroup } from "../../language/sql/types";
4+
import { SqlParameter } from "./resultSetPanelProvider";
5+
6+
export function getPriorBindableStatement(editor: TextEditor, offset: number): string|undefined {
7+
const sqlDocument = getSqlDocument(editor.document);
8+
9+
const groups = sqlDocument.getStatementGroups();
10+
if (groups.length === 0) {
11+
return undefined;
12+
}
13+
14+
const currentGroupI = groups.findIndex(g => g.range.start <= offset && g.range.end >= offset);
15+
for (let i = currentGroupI - 1; i >= 0; i--) {
16+
const group = groups[i];
17+
if (group.statements.length === 1) {
18+
const statement = group.statements[0];
19+
if (!statement.getLabel()) {
20+
return sqlDocument.content.substring(group.range.start, group.range.end);
21+
}
22+
}
23+
}
24+
25+
return undefined;
26+
}
27+
28+
export function getLiteralsFromStatement(group: StatementGroup): SqlParameter[] {
29+
const literals: SqlParameter[] = [];
30+
for (const statement of group.statements) {
31+
for (const token of statement.tokens) {
32+
if (token.type === `string`) {
33+
literals.push(token.value);
34+
}
35+
}
36+
}
37+
38+
return literals;
39+
}

src/views/results/index.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import { ExplainTree } from "./explain/nodes";
1212
import { DoveResultsView, ExplainTreeItem } from "./explain/doveResultsView";
1313
import { DoveNodeView, PropertyNode } from "./explain/doveNodeView";
1414
import { DoveTreeDecorationProvider } from "./explain/doveTreeDecorationProvider";
15-
import { ResultSetPanelProvider } from "./resultSetPanelProvider";
15+
import { ResultSetPanelProvider, SqlParameter } from "./resultSetPanelProvider";
1616
import { generateSqlForAdvisedIndexes } from "./explain/advice";
1717
import { updateStatusBar } from "../jobManager/statusBar";
1818
import { DbCache } from "../../language/providers/logic/cache";
1919
import { ExplainType } from "../../connection/types";
2020
import { queryResultToRpgDs } from "./codegen";
2121
import Configuration from "../../configuration";
22+
import { getSqlDocument } from "../../language/providers/logic/parse";
23+
import { getLiteralsFromStatement, getPriorBindableStatement } from "./binding";
2224

2325
export type StatementQualifier = "statement" | "bind" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql" | "rpg";
2426

@@ -317,7 +319,6 @@ async function runHandler(options?: StatementInfo) {
317319
const inWindow = Boolean(options && options.viewColumn);
318320

319321
if (statementDetail.qualifier === `cl`) {
320-
// TODO: handle noUi
321322
if (statementDetail.noUi) {
322323
setCancelButtonVisibility(true);
323324
const command = statementDetail.content.split(` `)[0].toUpperCase();
@@ -338,13 +339,24 @@ async function runHandler(options?: StatementInfo) {
338339
isCL: true,
339340
}); // Never errors
340341
}
341-
342-
} else if ([`statement`, `update`, `cl`].includes(statementDetail.qualifier)) {
342+
343+
} else if ([`statement`, `update`, `bind`].includes(statementDetail.qualifier)) {
344+
let parameters: SqlParameter[] = [];
345+
if (editor && statementDetail.qualifier === `bind`) {
346+
const position = editor.selection.active;
347+
const runStatement = getPriorBindableStatement(editor, editor.document.offsetAt(position));
348+
349+
if (runStatement) {
350+
parameters = getLiteralsFromStatement(statementDetail.group);
351+
statementDetail.content = runStatement;
352+
}
353+
}
354+
343355
// If it's a basic statement, we can let it scroll!
344356
if (statementDetail.noUi) {
345357
setCancelButtonVisibility(true);
346358
chosenView.setLoadingText(`Running SQL statement... (${possibleTitle})`, false);
347-
await JobManager.runSQL(statementDetail.content, undefined, 1);
359+
await JobManager.runSQL(statementDetail.content, {parameters}, 1);
348360

349361
} else {
350362
if (inWindow) {
@@ -360,6 +372,7 @@ async function runHandler(options?: StatementInfo) {
360372
basicSelect: statementDetail.content,
361373
withCancel: inWindow,
362374
ref: updatableTable,
375+
parameters,
363376
})
364377
}
365378

@@ -551,7 +564,7 @@ export function parseStatement(editor?: vscode.TextEditor, existingInfo?: Statem
551564
const document = editor.document;
552565
const cursor = editor.document.offsetAt(editor.selection.active);
553566

554-
sqlDocument = new Document(document.getText());
567+
sqlDocument = getSqlDocument(document);
555568
statementInfo.group = sqlDocument.getGroupByOffset(cursor);
556569
}
557570

0 commit comments

Comments
 (0)