Skip to content

Commit 083ba23

Browse files
committed
Merge branch 'main' of github.com:halcyon-tech/vscode-db2i
2 parents 4d244ac + 4ec2377 commit 083ba23

File tree

10 files changed

+91
-61
lines changed

10 files changed

+91
-61
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,7 @@
13941394
"webpack-cli": "^4.5.0"
13951395
},
13961396
"dependencies": {
1397-
"@ibm/mapepire-js": "^0.3.0",
1397+
"@ibm/mapepire-js": "^0.5.0",
13981398
"@octokit/rest": "^21.1.1",
13991399
"chart.js": "^4.4.2",
14001400
"csv": "^6.1.3",

src/connection/SCVersion.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11

2-
export const VERSION = `2.1.4`;
2+
export const VERSION = `2.2.2`;
33
export const SERVER_VERSION_TAG = `v${VERSION}`;
44
export const SERVER_VERSION_FILE = `mapepire-server-${VERSION}.jar`;

src/connection/manager.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,17 @@ export class SQLJobManager {
119119
// 2147483647 is NOT arbitrary. On the server side, this is processed as a Java
120120
// int. This is the largest number available without overflow (Integer.MAX_VALUE)
121121

122+
// const s = performance.now()
123+
// console.log(`Running statement: ${query.padEnd(40).substring(0, 40)}`);
124+
122125
const statement = await this.getPagingStatement<T>(query, opts);
123126
const results = await statement.execute(rowsToFetch);
124127
statement.close();
128+
129+
// const e = performance.now()
130+
// console.log(`Statement executed in ${e - s} ms. ${results.data.length} rows returned.`);
131+
// console.log(`\t${query.padEnd(40).substring(0, 40)}`)
132+
125133
return results.data;
126134
}
127135

src/connection/sqlJob.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { getInstance } from "../base";
22
import { ServerComponent } from "./serverComponent";
33
import { SelfValue } from "../views/jobManager/selfCodes/nodes";
44
import { SQLJob } from "@ibm/mapepire-js";
5-
import { ConnectionResult, JobStatus, QueryResult, ServerRequest, ServerResponse } from "@ibm/mapepire-js/dist/src/types";
6-
import { JobLogEntry } from "./types";
5+
import { ConnectionResult, QueryResult, ServerRequest, ServerResponse } from "@ibm/mapepire-js/dist/src/types";
6+
import { JobLogEntry, JobStatus } from "./types";
77
import Statement from "../database/statement";
88

99
const DB2I_VERSION = (process.env[`DB2I_VERSION`] || `<version unknown>`) + ((process.env.DEV) ? ``:`-dev`);
@@ -106,7 +106,7 @@ export class OldSQLJob extends SQLJob {
106106
getStatus(): JobStatus {
107107
const currentListenerCount = this.responseEmitter.eventNames().length;
108108

109-
return this.channel && currentListenerCount > 0 ? "busy" : this.status;
109+
return this.channel && currentListenerCount > 0 ? JobStatus.BUSY : this.status;
110110
}
111111

112112
async connect(): Promise<ConnectionResult> {
@@ -116,12 +116,12 @@ export class OldSQLJob extends SQLJob {
116116

117117
this.channel.on(`error`, (err) => {
118118
ServerComponent.writeOutput(err);
119-
this.dispose();
119+
this.end();
120120
})
121121

122122
this.channel.on(`close`, (code: number) => {
123123
ServerComponent.writeOutput(`Exited with code ${code}.`)
124-
this.dispose();
124+
this.end();
125125
})
126126

127127
const props = Object
@@ -147,10 +147,10 @@ export class OldSQLJob extends SQLJob {
147147
const connectResult = await this.send<ConnectionResult>(connectionObject);
148148

149149
if (connectResult.success === true) {
150-
this.status = "ready";
150+
this.status = JobStatus.READY;
151151
} else {
152-
this.dispose();
153-
this.status = "notStarted";
152+
this.end();
153+
this.status = JobStatus.NOT_STARTED;
154154
throw new Error(connectResult.error || `Failed to connect to server.`);
155155
}
156156

@@ -217,13 +217,13 @@ export class OldSQLJob extends SQLJob {
217217
}));
218218
});
219219

220-
this.dispose();
220+
this.end();
221221
}
222222

223-
dispose() {
223+
private end() {
224224
this.channel.close();
225225
this.channel = undefined;
226-
this.status = "ended";
226+
this.status = JobStatus.ENDED;
227227
this.responseEmitter.removeAllListeners();
228228
}
229229
}

src/connection/types.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
1-
import { QueryMetaData, QueryResult } from "@ibm/mapepire-js/dist/src/types";
1+
2+
// Redefined from mapepire-js
3+
export enum JobStatus {
4+
NOT_STARTED = "notStarted",
5+
CONNECTING = "connecting",
6+
READY = "ready",
7+
BUSY = "busy",
8+
ENDED = "ended"
9+
}
10+
11+
export enum TransactionEndType {
12+
COMMIT = "COMMIT",
13+
ROLLBACK = "ROLLBACK"
14+
}
15+
16+
export enum ExplainType {
17+
RUN = "run",
18+
DO_NOT_RUN = "doNotRun"
19+
}
20+
// End
221

322
export interface JobLogEntry {
423
MESSAGE_ID: string;

src/database/schemas.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { JobManager } from "../config";
55
import { ResolvedSqlObject, BasicSQLObject } from "../types";
66

77
export type SQLType = "schemas" | "tables" | "views" | "aliases" | "constraints" | "functions" | "variables" | "indexes" | "procedures" | "sequences" | "packages" | "triggers" | "types" | "logicals";
8-
export type PageData = { filter?: string, offset?: number, limit?: number };
8+
export type PageData = { filter?: string, offset?: number, limit?: number, sort?: boolean };
99

1010
const typeMap = {
1111
'tables': [`T`, `P`, `M`],
@@ -207,10 +207,11 @@ export default class Schemas {
207207
case `schemas`:
208208
selects.push(
209209
[
210-
`select '${type}' as OBJ_TYPE, '' as TABLE_TYPE, SCHEMA_NAME as NAME, SCHEMA_TEXT as TEXT, SYSTEM_SCHEMA_NAME as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
211-
`from QSYS2.SYSSCHEMAS`,
210+
``,
211+
`SELECT '${type}' as OBJ_TYPE, '' as TABLE_TYPE, OBJLONGNAME AS NAME, '' as TEXT, OBJNAME AS SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
212+
`FROM TABLE(QSYS2.OBJECT_STATISTICS('*ALLSIMPLE', 'LIB')) Z`,
212213
details.filter
213-
? `where UPPER(SCHEMA_NAME) = ? or UPPER(SYSTEM_SCHEMA_NAME) = ?`
214+
? `where UPPER(OBJLONGNAME) = ? or UPPER(OBJNAME) = ?`
214215
: ``,
215216
].join(` `)
216217
);
@@ -353,9 +354,21 @@ export default class Schemas {
353354
}
354355
}
355356

356-
const query = `with results as (${selects.join(
357-
" UNION ALL "
358-
)}) select * from results Order by QSYS2.DELIMIT_NAME(NAME) asc`;
357+
let query: string;
358+
359+
if (selects.length > 1) {
360+
if (details.sort) {
361+
query = `with results as (${selects.join(
362+
" UNION ALL "
363+
)}) select * from results Order by QSYS2.DELIMIT_NAME(NAME) asc`;
364+
} else {
365+
query = selects.join(` UNION ALL `);
366+
}
367+
368+
} else {
369+
// TODO: sort single
370+
query = selects[0];
371+
}
359372

360373
const objects: any[] = await JobManager.runSQL(
361374
[
@@ -373,7 +386,7 @@ export default class Schemas {
373386
type: object.OBJ_TYPE,
374387
tableType: object.TABLE_TYPE,
375388
schema,
376-
name: object.NAME || undefined,
389+
name: object.NAME || object.SYS_NAME || undefined,
377390
specificName: object.SPECNAME || undefined,
378391
text: object.TEXT || undefined,
379392
system: {

src/language/providers/completionProvider.ts

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -144,27 +144,19 @@ async function getObjectCompletions(
144144
sqlTypes: { [index: string]: CompletionType }
145145
): Promise<CompletionItem[]> {
146146
forSchema = Statement.noQuotes(Statement.delimName(forSchema, true));
147-
148-
const promises = Object.entries(sqlTypes).map(async ([_, value]) => {
149-
const data = await DbCache.getObjects(forSchema, [value.type]);
150-
return data.map((table) =>
151-
createCompletionItem(
152-
Statement.prettyName(table.name),
153-
value.icon,
154-
value.label,
155-
`Schema: ${table.schema}`,
156-
value.order
147+
const allObjects = await DbCache.getObjects(forSchema, Object.values(sqlTypes).map(k => k.type));
148+
149+
return allObjects.map((value) => {
150+
const completionData = completionTypes[value.type];
151+
return createCompletionItem(
152+
Statement.prettyName(value.name),
153+
completionData.icon,
154+
completionData.label,
155+
`Schema: ${value.schema}`,
156+
completionData.order
157157
)
158-
);
159-
});
160-
161-
const results = await Promise.allSettled(promises);
162-
const list = results
163-
.filter((result) => result.status == "fulfilled")
164-
.map((result) => (result as PromiseFulfilledResult<any>).value)
165-
.flat();
166-
167-
return list;
158+
}
159+
);
168160
}
169161

170162
async function getCompletionItemsForSchema(
@@ -339,14 +331,11 @@ async function getCompletionItemsForRefs(currentStatement: LanguageStatement.def
339331

340332
const curClause = currentStatement.getClauseForOffset(offset);
341333
const tokenAtOffset = currentStatement.getTokenByOffset(offset);
342-
let emptyObjectRefs: Boolean = false;
343-
344-
// Get all the schemas
345-
if (objectRefs.length === 0 && cteList.length === 0) {
346-
emptyObjectRefs = true;
347-
completionItems.push(...(await getCachedSchemas()));
348-
}
349-
334+
335+
// Get all the schemas
336+
if (objectRefs.length === 0 && cteList.length === 0) {
337+
completionItems.push(...(await getCachedSchemas()));
338+
}
350339
// Set the default schema for all references without one
351340
for (let ref of objectRefs) {
352341
if (!ref.object.schema) {
@@ -392,7 +381,7 @@ async function getCompletionItemsForRefs(currentStatement: LanguageStatement.def
392381
completionItems.push(...aliasItems);
393382

394383
// get completions for objects
395-
if (tokenAtOffset === undefined && (emptyObjectRefs || curClause !== ClauseType.Unknown)) {
384+
if (tokenAtOffset === undefined && (curClause !== ClauseType.Unknown)) {
396385
// get all the completion items for objects in each referenced schema
397386
completionItems.push(
398387
...(await getObjectCompletions(getDefaultSchema(), completionTypes))

src/views/jobManager/jobManagerView.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { setCancelButtonVisibility } from "../results";
1414
import { JDBCOptions } from "@ibm/mapepire-js/dist/src/types";
1515
import { registerDb2iTablesProvider } from "../../aiProviders/continue/listTablesContextProvider";
1616
import { sqlLanguageStatus } from "../../language/providers";
17+
import { TransactionEndType } from "../../connection/types";
1718

1819
const selectJobCommand = `vscode-db2i.jobManager.selectJob`;
1920
const activeColor = new vscode.ThemeColor(`minimapGutter.addedBackground`);
@@ -71,10 +72,10 @@ export class JobManagerView implements TreeDataProvider<any> {
7172

7273
switch (decision) {
7374
case `Commit and end`:
74-
await selected.job.endTransaction("commit");
75+
await selected.job.endTransaction(TransactionEndType.COMMIT);
7576
break;
7677
case `Rollback and end`:
77-
await selected.job.endTransaction("rollback");
78+
await selected.job.endTransaction(TransactionEndType.ROLLBACK);
7879
break;
7980
default:
8081
// Actually... don't end the job
@@ -245,7 +246,7 @@ export class JobManagerView implements TreeDataProvider<any> {
245246
let selected = id ? JobManager.getJob(id) : JobManager.getSelection();
246247
if (selected) {
247248
if (selected.job.underCommitControl()) {
248-
const result = await selected.job.endTransaction("commit");
249+
const result = await selected.job.endTransaction(TransactionEndType.ROLLBACK);
249250
if (!result.success) {
250251
vscode.window.showErrorMessage(`Failed to commit.` + result.error);
251252
}
@@ -261,7 +262,7 @@ export class JobManagerView implements TreeDataProvider<any> {
261262
if (selected) {
262263
if (selected.job.underCommitControl()) {
263264
try {
264-
const result = await selected.job.endTransaction("rollback");
265+
const result = await selected.job.endTransaction(TransactionEndType.ROLLBACK);
265266
if (!result.success) {
266267
vscode.window.showErrorMessage(`Failed to rollback. ` + result.error);
267268
}

src/views/results/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import { DoveTreeDecorationProvider } from "./explain/doveTreeDecorationProvider
1515
import { ResultSetPanelProvider } from "./resultSetPanelProvider";
1616
import { generateSqlForAdvisedIndexes } from "./explain/advice";
1717
import { updateStatusBar } from "../jobManager/statusBar";
18-
import { ExplainType } from "@ibm/mapepire-js/dist/src/types";
1918
import { DbCache } from "../../language/providers/logic/cache";
19+
import { ExplainType } from "../../connection/types";
2020

2121
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql";
2222

@@ -355,7 +355,7 @@ async function runHandler(options?: StatementInfo) {
355355
const onlyExplain = statementDetail.qualifier === `onlyexplain`;
356356

357357
chosenView.setLoadingText(onlyExplain ? `Explaining without running...` : `Explaining...`);
358-
const explainType: ExplainType = onlyExplain ? "doNotRun" : "run";
358+
const explainType: ExplainType = onlyExplain ? ExplainType.DO_NOT_RUN : ExplainType.RUN;
359359

360360
setCancelButtonVisibility(true);
361361
const explained = await selectedJob.job.explain(statementDetail.content, explainType); // Can throw

0 commit comments

Comments
 (0)