@@ -7,9 +7,10 @@ import { AppComponent } from '../app/app.component';
77import { ConnectRequest , ConnectResponse , ErrorResponse , GetAllDatabasesResponse , GetAllSchemasResponse , GetStoredProceduresResponse , GetTablesResponse } from '../../services/mssql/mssql.model' ;
88import { MssqlScaffolderService } from './mssql-scaffolder.service' ;
99import { Meta } from '@angular/platform-browser' ;
10- import { GetColumnsResponse , GetSPParametersResponse , GetSPReturnColumnsResponse } from './mssql-scaffolder.model' ;
10+ import { GetColumnsResponse , GetSPReturnColumnsResponse , SPDefinition , SPParam } from './mssql-scaffolder.model' ;
1111import { RouterLink } from '@angular/router' ;
1212import { 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 > ( N U L L ) { 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
0 commit comments