Skip to content

Commit b6ac79b

Browse files
authored
Merge branch 'main' into 31-animation-cleanup
2 parents df725a4 + b41736e commit b6ac79b

File tree

3 files changed

+45
-13
lines changed

3 files changed

+45
-13
lines changed

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.component.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import { AppComponent } from '../app/app.component';
77
import { ConnectRequest, ConnectResponse, ErrorResponse, GetAllDatabasesResponse, GetAllSchemasResponse, GetStoredProceduresResponse, GetTablesResponse } from '../../services/mssql/mssql.model';
88
import { MssqlScaffolderService } from './mssql-scaffolder.service';
99
import { Meta } from '@angular/platform-browser';
10-
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse } from './mssql-scaffolder.model';
10+
import { GetColumnsResponse, GetSPReturnColumnsResponse, SPDefinition, SPParam } from './mssql-scaffolder.model';
1111
import { RouterLink } from '@angular/router';
1212
import { valueChangeAnim } from '../../animations/common-animations';
13+
import { forkJoin } from 'rxjs';
1314

1415
@Component({
1516
selector: 'app-mssql-scaffolder',
@@ -207,24 +208,39 @@ ${res.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.DataType
207208

208209
private scaffoldSP() {
209210
const sc = this.scaffoldForm.getRawValue();
210-
this.scaffolder.getSPParameters(this.connectionID, sc.database, sc.schema, sc.sp).subscribe(ps => {
211-
ps = ps as GetSPParametersResponse[];
212-
this.scaffolder.getSPReturnColumns(this.connectionID, sc.database, sc.schema, sc.sp).subscribe(rs => {
213-
rs = rs as GetSPReturnColumnsResponse[];
214211

215-
const psc = ps.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.Type)}${p.Nullable ? '?' : ''} ${p.Parameter_name} { get; set; }`);
216-
const rsc = rs.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.system_type_name)}${p.Nullable ? '?' : ''} ${p.column} { get; set; }`);
212+
forkJoin({
213+
params: this.scaffolder.getSPDefinition(this.connectionID, sc.database, sc.schema, sc.sp),
214+
result: this.scaffolder.getSPReturnColumns(this.connectionID, sc.database, sc.schema, sc.sp)
215+
}).subscribe(vals => {
216+
const spDef = (vals.params as SPDefinition[])[0].definition;
217+
const spUpper = spDef.toUpperCase();
217218

218-
this.csCode =
219-
`${psc.length > 0 ? `public class ${sc.sp}Params {` : ''}
219+
const ps = [...(spDef.substring(spUpper.indexOf("CREATE PROCEDURE"), spUpper.indexOf("AS"))
220+
.matchAll(/@(?<name>\w+) +(?<type>\w+(\(.*\)){0,1}) *=* *(?<nul>(NULL){0,1})/gmi))].map(match => {
221+
if (match.groups)
222+
return {
223+
Parameter_name: match.groups['name'],
224+
Type: match.groups['type'],
225+
Nullable: match.groups['nul'] && match.groups['nul'].length > 0 ? true : false
226+
} as SPParam;
227+
return undefined;
228+
}).filter(v => v) as SPParam[];
229+
const rs = vals.result as GetSPReturnColumnsResponse[];
230+
231+
const psc = ps.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.Type)}${p.Nullable ? '?' : ''} ${p.Parameter_name} { get; set; }`);
232+
const rsc = rs.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.system_type_name)}${p.Nullable ? '?' : ''} ${p.column} { get; set; }`);
233+
234+
this.csCode =
235+
`${psc.length > 0 ? `public class ${sc.sp}Params {` : ''}
220236
${psc.join("\n")}
221237
${psc.length > 0 ? '}' : ''}
222238
223239
${rsc.length > 0 ? `public class ${sc.sp}Result {` : ''}
224240
${rsc.join("\n")}
225241
${rsc.length > 0 ? '}' : ''}`;
226-
this.codeFlip = !this.codeFlip;
227-
});
242+
243+
this.codeFlip = !this.codeFlip;
228244
});
229245
}
230246

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.model.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,14 @@ export interface GetColumnsResponse {
2323
column: string;
2424
system_type_name: string;
2525
Nullable: boolean;
26+
}
27+
28+
export interface SPDefinition{
29+
definition: string;
30+
}
31+
32+
export interface SPParam{
33+
Parameter_name: string;
34+
Type: string;
35+
Nullable: boolean;
2636
}

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.service.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Injectable } from '@angular/core';
22
import { MssqlService } from '../../services/mssql/mssql.service';
33
import { map, Observable } from 'rxjs';
4-
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse } from './mssql-scaffolder.model';
4+
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse, SPDefinition } from './mssql-scaffolder.model';
55
import { ErrorResponse } from '../../services/mssql/mssql.model';
66

77
@Injectable({
@@ -60,7 +60,13 @@ export class MssqlScaffolderService {
6060
);
6161
}
6262

63-
// 7. Get all return columns and their types from an SP
63+
// 7. Get SP definition lines
64+
getSPDefinition(connection_id: string, dbName: string, schemaName: string, spName: string): Observable<SPDefinition[] | ErrorResponse>{
65+
const query = `SELECT object_definition(object_id('${schemaName}.${spName}')) AS definition;`;
66+
return this.mssql.executeQuery<SPDefinition>(connection_id, query, dbName);
67+
}
68+
69+
// 8. Get all return columns and their types from an SP
6470
getSPReturnColumns(connection_id: string, dbName: string, schemaName: string, spName: string): Observable<GetSPReturnColumnsResponse[] | ErrorResponse> {
6571
const query = `
6672
SELECT name AS 'column', system_type_name, is_nullable as 'Nullable'

0 commit comments

Comments
 (0)