Skip to content

Commit 48996cc

Browse files
authored
Merge pull request #4 from halcyon-tech/feature/newViews
New views
2 parents 69fe409 + 8901316 commit 48996cc

27 files changed

+317
-1077
lines changed

global.d.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
interface TableColumn {
3+
COLUMN_NAME: string,
4+
SYSTEM_COLUMN_NAME: string,
5+
CONSTRAINT_NAME?: string,
6+
DATA_TYPE: string,
7+
CHARACTER_MAXIMUM_LENGTH?: number,
8+
NUMERIC_SCALE?: number,
9+
NUMERIC_PRECISION?: number,
10+
IS_NULLABLE: "Y" | "N",
11+
HAS_DEFAULT: "Y" | "N",
12+
COLUMN_DEFAULT?: string,
13+
COLUMN_TEXT: string,
14+
IS_IDENTITY: "YES" | "NO",
15+
}
16+
17+
interface SQLParm {
18+
PARAMETER_NAME: string,
19+
PARAMETER_MODE: "IN" | "OUT" | "INOUT",
20+
DATA_TYPE: string,
21+
CHARACTER_MAXIMUM_LENGTH?: number,
22+
NUMERIC_SCALE?: number,
23+
NUMERIC_PRECISION?: number,
24+
IS_NULLABLE: "Y" | "N",
25+
DEFAULT?: string,
26+
LONG_COMMENT?: string
27+
}

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@
112112
"icon": "$(add)"
113113
},
114114
{
115-
"command": "vscode-db2i.setCurrentSchema",
116-
"title": "Set current schema",
115+
"command": "vscode-db2i.generateSelect",
116+
"title": "Generate SELECT",
117117
"category": "Db2 for i"
118118
},
119119
{
120-
"command": "vscode-db2i.showObjectInfo",
121-
"title": "Show object info (Legacy)",
120+
"command": "vscode-db2i.setCurrentSchema",
121+
"title": "Set current schema",
122122
"category": "Db2 for i"
123123
},
124124
{
@@ -152,6 +152,11 @@
152152
"when": "viewItem == schema",
153153
"group": "db2@1"
154154
},
155+
{
156+
"command": "vscode-db2i.generateSelect",
157+
"when": "viewItem == table || viewItem == view || viewItem == alias",
158+
"group": "db2@1"
159+
},
155160
{
156161
"command": "vscode-db2i.generateSQL",
157162
"when": "viewItem == table || viewItem == view || viewItem == alias || viewItem == constraint || viewItem == function || viewItem == variable || viewItem == index || viewItem == procedure || viewItem == sequence || viewItem == package || viewItem == trigger || viewItem == type",
@@ -161,11 +166,6 @@
161166
"command": "vscode-db2i.removeSchemaFromSchemaBrowser",
162167
"when": "view == schemaBrowser && viewItem == schema",
163168
"group": "db2@3"
164-
},
165-
{
166-
"command": "vscode-db2i.showObjectInfo",
167-
"when": "viewItem == table || viewItem == view || viewItem == alias || viewItem == constraint || viewItem == function || viewItem == variable || viewItem == index || viewItem == procedure || viewItem == sequence || viewItem == package || viewItem == trigger || viewItem == type",
168-
"group": "db2_legacy@1"
169169
}
170170
]
171171
}

src/database/callable.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
const vscode = require(`vscode`);
3+
const {instance} = vscode.extensions.getExtension(`halcyontechltd.code-for-ibmi`).exports;
4+
5+
module.exports = class Callable {
6+
static getParms(schema, name) {
7+
const content = instance.getContent();
8+
9+
return content.runSQL([
10+
`SELECT * FROM QSYS2.SYSPARMS`,
11+
`WHERE SPECIFIC_SCHEMA = '${schema.toUpperCase()}' AND SPECIFIC_NAME = (select SPECIFIC_NAME from qsys2.sysroutines where ROUTINE_SCHEMA = '${schema.toUpperCase()}' and ROUTINE_NAME = '${name.toUpperCase()}')`,
12+
`ORDER BY ORDINAL_POSITION`
13+
].join(` `));
14+
}
15+
}

src/database/procedure.js

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/database/schemas.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ module.exports = class Database {
4545

4646
case `functions`:
4747
objects = await content.runSQL([
48-
`select ROUTINE_NAME as NAME, ROUTINE_TEXT as TEXT from QSYS2.SYSFUNCS`,
48+
`select ROUTINE_NAME as NAME, coalesce(ROUTINE_TEXT, LONG_COMMENT) as TEXT from QSYS2.SYSFUNCS`,
4949
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and ROUTINE_NAME like '%${details.filter}%'`: ``}`,
5050
`order by ROUTINE_NAME asc`,
5151
`${details.limit ? `limit ${details.limit}` : ``} ${details.offset ? `offset ${details.offset}` : ``}`

src/database/table.js

Lines changed: 25 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -3,99 +3,37 @@ const vscode = require(`vscode`);
33
const {instance} = vscode.extensions.getExtension(`halcyontechltd.code-for-ibmi`).exports;
44

55
module.exports = class Table {
6-
constructor(schema, tableName) {
7-
this.schema = schema.toUpperCase();
8-
this.tableName = tableName.toUpperCase();
9-
}
10-
11-
async getInfo() {
12-
const content = instance.getContent();
13-
14-
const [info] = await content.runSQL([
15-
`SELECT * FROM QSYS2.SYSTABLES`,
16-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.tableName}'`
17-
].join(` `));
18-
19-
return info;
20-
}
21-
22-
getColumns() {
23-
const content = instance.getContent();
24-
25-
return content.runSQL([
26-
`SELECT * FROM QSYS2.SYSCOLUMNS2`,
27-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.tableName}'`,
28-
`ORDER BY ORDINAL_POSITION`
29-
].join(` `));
30-
}
31-
32-
getConstraints() {
33-
const content = instance.getContent();
34-
35-
return content.runSQL([
36-
`SELECT * FROM QSYS2.SYSCST`,
37-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.tableName}'`,
38-
`order by CONSTRAINT_NAME asc`
39-
].join(` `));
40-
}
41-
42-
getConstraintColumns() {
43-
const content = instance.getContent();
44-
45-
return content.runSQL([
46-
`SELECT * FROM QSYS2.SYSCSTCOL`,
47-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.tableName}'`
48-
].join(` `));
49-
}
50-
51-
getForeignKeys() {
52-
const content = instance.getContent();
53-
54-
return content.runSQL([
55-
`SELECT a.CONSTRAINT_NAME AS NAME, d.COLUMN_NAME as KEY_COLUMN, d.TABLE_SCHEMA as PARENT_SCHEMA, d.TABLE_NAME as PARENT_TABLE, c.DELETE_RULE as DELETE_RULE, c.UPDATE_RULE as UPDATE_RULE`,
56-
`FROM QSYS2.SYSCST as A `,
57-
`inner join QSYS2.SYSCSTCOL as B`,
58-
` on`,
59-
` a.CONSTRAINT_NAME = b.CONSTRAINT_NAME and a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA`,
60-
`inner join qsys2.SYSREFCST as C`,
61-
` on`,
62-
` C.CONSTRAINT_SCHEMA = a.CONSTRAINT_SCHEMA and C.CONSTRAINT_NAME = a.CONSTRAINT_NAME`,
63-
`inner join qsys2.SYSCSTCOL as D`,
64-
` on`,
65-
` D.CONSTRAINT_SCHEMA = a.CONSTRAINT_SCHEMA and D.CONSTRAINT_NAME = c.UNIQUE_CONSTRAINT_NAME`,
66-
`WHERE `,
67-
` a.CONSTRAINT_TYPE in ('FOREIGN KEY') AND `,
68-
` a.TABLE_NAME = '${this.tableName}' AND `,
69-
` a.CONSTRAINT_SCHEMA = '${this.schema}'`
70-
].join(` `));
71-
}
72-
736
/**
74-
* list comes from getConstraints().filter(c => c.CONSTRAINT_TYPE === 'CHECK')
75-
* @param {{CONSTRAINT_SCHEMA: string, CONSTRAINT_NAME: string, ENABLED: string, CONSTRAINT_TEXT: string}[]} list
7+
* @param {string} schema
8+
* @param {string} name
9+
* @returns {Promise<TableColumn[]>}
7610
*/
77-
async getCheckConstraintsInfo(list) {
78-
if (list.length === 0) return [];
79-
11+
static async getItems(schema, name) {
8012
const content = instance.getContent();
8113

8214
const sql = [
83-
`SELECT CONSTRAINT_NAME, CHECK_CLAUSE FROM QSYS2.SYSCHKCST`,
84-
`WHERE ${list.map(cst => `(CONSTRAINT_SCHEMA = '${cst.CONSTRAINT_SCHEMA}' AND CONSTRAINT_NAME = '${cst.CONSTRAINT_NAME}')`).join(` and `)}`
15+
`SELECT `,
16+
` column.COLUMN_NAME,`,
17+
` key.CONSTRAINT_NAME,`,
18+
` column.DATA_TYPE, `,
19+
` column.CHARACTER_MAXIMUM_LENGTH,`,
20+
` column.NUMERIC_SCALE, `,
21+
` column.NUMERIC_PRECISION,`,
22+
` column.IS_NULLABLE, `,
23+
` column.HAS_DEFAULT, `,
24+
` column.COLUMN_DEFAULT, `,
25+
` column.COLUMN_TEXT, `,
26+
` column.IS_IDENTITY`,
27+
`FROM QSYS2.SYSCOLUMNS2 as column`,
28+
`LEFT JOIN QSYS2.syskeycst as key`,
29+
` on `,
30+
` column.table_schema = key.table_schema and`,
31+
` column.table_name = key.table_name and`,
32+
` column.column_name = key.column_name`,
33+
`WHERE column.TABLE_SCHEMA = '${schema.toUpperCase()}' AND column.TABLE_NAME = '${name.toUpperCase()}'`,
34+
`ORDER BY column.ORDINAL_POSITION`,
8535
].join(` `);
86-
87-
const rows = await content.runSQL(sql);
88-
89-
return rows.map(row => {
90-
const {CONSTRAINT_NAME, CHECK_CLAUSE} = row;
91-
const existingInfo = list.find(cst => cst.CONSTRAINT_NAME === CONSTRAINT_NAME);
9236

93-
return {
94-
name: CONSTRAINT_NAME,
95-
checkClause: CHECK_CLAUSE,
96-
enabled: existingInfo.ENABLED,
97-
text: existingInfo.CONSTRAINT_TEXT
98-
};
99-
});
37+
return content.runSQL(sql);
10038
}
10139
}

src/database/trigger.js

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/database/view.js

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,12 @@ const vscode = require(`vscode`);
33
const {instance} = vscode.extensions.getExtension(`halcyontechltd.code-for-ibmi`).exports;
44

55
module.exports = class View {
6-
constructor(schema, viewName) {
7-
this.schema = schema.toUpperCase();
8-
this.viewName = viewName.toUpperCase();
9-
}
10-
11-
async getInfo() {
12-
const content = instance.getContent();
13-
14-
const [info] = await content.runSQL([
15-
`SELECT * FROM QSYS2.SYSVIEWS`,
16-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.viewName}'`
17-
].join(` `));
18-
19-
return info;
20-
}
21-
22-
getColumns() {
6+
static getColumns(schema, name) {
237
const content = instance.getContent();
248

259
return content.runSQL([
2610
`SELECT * FROM QSYS2.SYSCOLUMNS`,
27-
`WHERE TABLE_SCHEMA = '${this.schema}' AND TABLE_NAME = '${this.viewName}'`,
11+
`WHERE TABLE_SCHEMA = '${schema.toUpperCase()}' AND TABLE_NAME = '${name.toUpperCase()}'`,
2812
`ORDER BY ORDINAL_POSITION`
2913
].join(` `));
3014
}

0 commit comments

Comments
 (0)