From feaaa1b845dcb72be982ef991e4737c9dd55c6a9 Mon Sep 17 00:00:00 2001 From: Eckhard Gosch Date: Sun, 13 Sep 2026 16:51:29 +0200 Subject: [PATCH] Fehlerverarbeitung initial --- meddfn_h.rpgle | 17 +++ meddfnpr.rpgle | 73 ++++++----- meddfnsrv.rpgle | 329 +++++++++++++++++++++++++++++++++++++---------- meddfntstp.rpgle | 18 ++- 4 files changed, 338 insertions(+), 99 deletions(-) diff --git a/meddfn_h.rpgle b/meddfn_h.rpgle index 6366c46..e8dff9e 100644 --- a/meddfn_h.rpgle +++ b/meddfn_h.rpgle @@ -64,6 +64,23 @@ dcl-s MD_DeviceAllocateMinimum int(10) inz(2) const; dcl-s MD_SaveFormatAuto int(10) inz(-2) const; dcl-s MD_SaveFormatSerial int(10) inz(-1) const; dcl-s MD_SaveFormatParallel int(10) inz(0) const; + + +//===================================================================== +// Error Information +// +// Returned by all public MEDDFN procedures. +//===================================================================== + +dcl-ds MD_Error_T qualified template; + + HasError ind; + MessageID char(7); + MessageData char(128); + +end-ds; + + dcl-s MD_VOLUME_ID_LENGTH int(5) inz(6) const; //===================================================================== diff --git a/meddfnpr.rpgle b/meddfnpr.rpgle index e0381c4..56beedf 100644 --- a/meddfnpr.rpgle +++ b/meddfnpr.rpgle @@ -1,31 +1,42 @@ -**FREE -//===================================================================== -// -// Project.....: MEDDFN -// -// Member......: MEDDFNPR -// -// Description.: Public prototypes for MEDDFN service procedures. -// -//===================================================================== - -dcl-pr MD_CreateMediaDefinition; - - MediaDefinition - likeds(MD_MediaDefinition_T) const; - -end-pr; - -dcl-pr MD_DeleteMediaDefinition; - - MediaDefinition - likeds(MD_MediaDefinition_T) const; - - end-pr; - - dcl-pr MD_RetrieveMediaDefinition; - - MediaDefinition - likeds(MD_MediaDefinition_T); - - end-pr; \ No newline at end of file +**FREE +//===================================================================== +// +// Project.....: MEDDFN +// +// Member......: MEDDFNPR +// +// Description.: Public prototypes for MEDDFN service procedures. +// +//===================================================================== + +dcl-pr MD_CreateMediaDefinition; + + MediaDefinition + likeds(MD_MediaDefinition_T) const; + + Error + likeds(MD_Error_T); + +end-pr; + + +dcl-pr MD_DeleteMediaDefinition; + + MediaDefinition + likeds(MD_MediaDefinition_T) const; + + Error + likeds(MD_Error_T); + +end-pr; + + +dcl-pr MD_RetrieveMediaDefinition; + + MediaDefinition + likeds(MD_MediaDefinition_T); + + Error + likeds(MD_Error_T); + +end-pr; diff --git a/meddfnsrv.rpgle b/meddfnsrv.rpgle index 29b49f9..83b6f8c 100644 --- a/meddfnsrv.rpgle +++ b/meddfnsrv.rpgle @@ -81,6 +81,9 @@ dcl-pr MD_CreateMediaDefinition ; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -89,6 +92,9 @@ dcl-pr MD_DeleteMediaDefinition ; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -97,6 +103,9 @@ dcl-pr MD_RetrieveMediaDefinition ; MediaDefinition likeds(MD_MediaDefinition_T); + Error + likeds(MD_Error_T); + end-pr; @@ -106,11 +115,28 @@ end-pr; // //===================================================================== +dcl-pr MD_SetError; + + Error + likeds(MD_Error_T); + + MessageID + char(7) const; + + MessageData + char(128) const; + +end-pr; + + dcl-pr MD_ValidateCreate; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -119,6 +145,9 @@ dcl-pr MD_ValidateDelete; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -127,6 +156,9 @@ dcl-pr MD_ValidateRetrieve; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -135,6 +167,9 @@ dcl-pr MD_CheckApiError; ApiError likeds(MD_APIError_T) const; + Error + likeds(MD_Error_T); + end-pr; dcl-pr MD_SendMessage; @@ -181,6 +216,9 @@ dcl-pr MD_CheckDuplicateDevices; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -189,6 +227,9 @@ dcl-pr MD_CheckDuplicateSequences; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pr; @@ -207,6 +248,9 @@ dcl-proc MD_CreateMediaDefinition export; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -232,7 +276,21 @@ dcl-proc MD_CreateMediaDefinition export; // Validate //-------------------------------------------------------------- - MD_ValidateCreate(MediaDefinition); + clear Error; + + MD_ValidateCreate( + MediaDefinition : + Error); + + if Error.HasError; + + MD_SendEscape( + Error.MessageID : + Error.MessageData); + + return; + + endif; //-------------------------------------------------------------- @@ -303,7 +361,19 @@ dcl-proc MD_CreateMediaDefinition export; // dump(a); - MD_CheckApiError(ApiError); + MD_CheckApiError( + ApiError : + Error); + + if Error.HasError; + + MD_SendEscape( + Error.MessageID : + Error.MessageData); + + return; + + endif; end-proc; @@ -321,6 +391,9 @@ dcl-proc MD_DeleteMediaDefinition export; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -334,7 +407,21 @@ dcl-proc MD_DeleteMediaDefinition export; - MD_ValidateDelete(MediaDefinition); + clear Error; + + MD_ValidateDelete( + MediaDefinition : + Error); + + if Error.HasError; + + MD_SendEscape( + Error.MessageID : + Error.MessageData); + + return; + + endif; QualifiedObject.ObjectName = @@ -355,7 +442,19 @@ dcl-proc MD_DeleteMediaDefinition export; ApiError); - MD_CheckApiError(ApiError); + MD_CheckApiError( + ApiError : + Error); + + if Error.HasError; + + MD_SendEscape( + Error.MessageID : + Error.MessageData); + + return; + + endif; end-proc; @@ -373,6 +472,9 @@ dcl-proc MD_RetrieveMediaDefinition export; MediaDefinition likeds(MD_MediaDefinition_T); + Error + likeds(MD_Error_T); + end-pi; @@ -392,7 +494,21 @@ dcl-proc MD_RetrieveMediaDefinition export; dcl-s ApiReceiverLength int(10); - MD_ValidateRetrieve(MediaDefinition); + clear Error; + + MD_ValidateRetrieve( + MediaDefinition : + Error); + + if Error.HasError; + + MD_SendEscape( + Error.MessageID : + Error.MessageData); + + return; + + endif; QualifiedObject.ObjectName = @@ -422,19 +538,60 @@ dcl-proc MD_RetrieveMediaDefinition export; ApiError); - MD_CheckApiError(ApiError); + MD_CheckApiError( + ApiError : + Error); - // TODO: - // Parser folgt mit MEDDFNPRS + if Error.HasError; - // MD_ParseRetrieveBuffer( + MD_SendEscape( + Error.MessageID : + Error.MessageData); - // Receiver.Data : + return; - // MediaDefinition); + endif; + + MD_ParseRetrieveBuffer( + Receiver.Data : + MediaDefinition); end-proc; +//===================================================================== +// +// MD_SetError +// +// Stores the first error for the public procedure. +// +//===================================================================== + +dcl-proc MD_SetError; + + dcl-pi *n; + + Error + likeds(MD_Error_T); + + MessageID + char(7) const; + + MessageData + char(128) const; + + end-pi; + + + if not Error.HasError; + + Error.HasError = *on; + Error.MessageID = MessageID; + Error.MessageData = MessageData; + endif; + +end-proc; + + //===================================================================== // // MD_ValidateCreate @@ -448,6 +605,9 @@ dcl-proc MD_ValidateCreate; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -462,9 +622,10 @@ dcl-proc MD_ValidateCreate; if %trim(MediaDefinition.MediaDefinitionName) = ''; - MD_SendEscape( - 'MDF0001' : - *blanks); + MD_SetError( + Error : + 'MDF0001' : + *blanks); endif; @@ -475,9 +636,10 @@ dcl-proc MD_ValidateCreate; if %trim(MediaDefinition.LibraryName) = ''; - MD_SendEscape( - 'MDF0002' : - *blanks); + MD_SetError( + Error : + 'MDF0002' : + *blanks); endif; @@ -490,9 +652,10 @@ dcl-proc MD_ValidateCreate; or MediaDefinition.NumberOfDevices > MD_MaxDeviceDefinitions; - MD_SendEscape( - 'MDF0003' : - *blanks); + MD_SetError( + Error : + 'MDF0003' : + *blanks); endif; @@ -514,9 +677,10 @@ dcl-proc MD_ValidateCreate; other; - MD_SendEscape( - 'MDF0004' : - *blanks); + MD_SetError( + Error : + 'MDF0004' : + *blanks); endsl; @@ -538,9 +702,10 @@ dcl-proc MD_ValidateCreate; other; - MD_SendEscape( - 'MDF0005' : - *blanks); + MD_SetError( + Error : + 'MDF0005' : + *blanks); endsl; @@ -551,18 +716,20 @@ dcl-proc MD_ValidateCreate; if MediaDefinition.MaximumParallelResources < 0; - MD_SendEscape( - 'MDF0012' : - *blanks); + MD_SetError( + Error : + 'MDF0012' : + *blanks); endif; if MediaDefinition.MinimumParallelResources < 0; - MD_SendEscape( - 'MDF0013' : - *blanks); + MD_SetError( + Error : + 'MDF0013' : + *blanks); endif; @@ -570,9 +737,10 @@ dcl-proc MD_ValidateCreate; if MediaDefinition.MinimumParallelResources > MediaDefinition.MaximumParallelResources; - MD_SendEscape( - 'MDF0014' : - *blanks); + MD_SetError( + Error : + 'MDF0014' : + *blanks); endif; @@ -587,9 +755,10 @@ dcl-proc MD_ValidateCreate; if %trim( MediaDefinition.Device(DeviceIndex).DeviceName) = ''; - MD_SendEscape( - 'MDF0006' : - *blanks); + MD_SetError( + Error : + 'MDF0006' : + *blanks); endif; @@ -597,9 +766,10 @@ dcl-proc MD_ValidateCreate; if MediaDefinition.Device(DeviceIndex) .NumberOfMediaFiles < 1; - MD_SendEscape( - 'MDF0017' : - MediaDefinition.Device(DeviceIndex).DeviceName); + MD_SetError( + Error : + 'MDF0017' : + MediaDefinition.Device(DeviceIndex).DeviceName); endif; @@ -616,7 +786,8 @@ dcl-proc MD_ValidateCreate; .MediaFile(MediaFileIndex) .SequenceNumber <= 0; - MD_SendEscape( + MD_SetError( + Error : 'MDF0009' : *blanks); @@ -631,7 +802,8 @@ dcl-proc MD_ValidateCreate; .NumberOfVolumeIdentifiers > MD_MaxVolumeIdentifiers; - MD_SendEscape( + MD_SetError( + Error : 'MDF0010' : *blanks); @@ -653,9 +825,10 @@ dcl-proc MD_ValidateCreate; .VolumeIdentifier(VolumeIndex) .VolumeIdentifier) = ''; - MD_SendEscape( - 'MDF0011' : - *blanks); + MD_SetError( + Error : + 'MDF0011' : + *blanks); endif; @@ -669,9 +842,13 @@ dcl-proc MD_ValidateCreate; // Duplicate Checks //-------------------------------------------------------------- - MD_CheckDuplicateDevices(MediaDefinition); + MD_CheckDuplicateDevices( + MediaDefinition : + Error); - MD_CheckDuplicateSequences(MediaDefinition); + MD_CheckDuplicateSequences( + MediaDefinition : + Error); end-proc; @@ -690,23 +867,28 @@ dcl-proc MD_ValidateDelete; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; if %trim(MediaDefinition.MediaDefinitionName) = ''; - MD_SendEscape( - 'MDF0001' : - *blanks); + MD_SetError( + Error : + 'MDF0001' : + *blanks); endif; if %trim(MediaDefinition.LibraryName) = ''; - MD_SendEscape( - 'MDF0002' : - *blanks); + MD_SetError( + Error : + 'MDF0002' : + *blanks); endif; @@ -726,23 +908,28 @@ dcl-proc MD_ValidateRetrieve; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; if %trim(MediaDefinition.MediaDefinitionName) = ''; - MD_SendEscape( - 'MDF0001' : - *blanks); + MD_SetError( + Error : + 'MDF0001' : + *blanks); endif; if %trim(MediaDefinition.LibraryName) = ''; - MD_SendEscape( - 'MDF0002' : - *blanks); + MD_SetError( + Error : + 'MDF0002' : + *blanks); endif; @@ -763,6 +950,9 @@ dcl-proc MD_CheckApiError; ApiError likeds(MD_APIError_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -779,9 +969,10 @@ dcl-proc MD_CheckApiError; // Forward IBM message //--------------------------------------------------------------- - MD_SendEscape( - ApiError.MessageId : - ''); + MD_SetError( + Error : + ApiError.MessageId : + ''); end-proc; @@ -908,6 +1099,9 @@ dcl-proc MD_CheckDuplicateDevices; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -927,7 +1121,8 @@ dcl-proc MD_CheckDuplicateDevices; %trim( MediaDefinition.Device(DeviceIndex2).DeviceName); - MD_SendEscape( + MD_SetError( + Error : 'MDF0007' : MediaDefinition.Device(DeviceIndex1).DeviceName); @@ -952,6 +1147,9 @@ dcl-proc MD_CheckDuplicateSequences; MediaDefinition likeds(MD_MediaDefinition_T) const; + Error + likeds(MD_Error_T); + end-pi; @@ -981,7 +1179,8 @@ dcl-proc MD_CheckDuplicateSequences; .MediaFile(MediaFileIndex2) .SequenceNumber; - MD_SendEscape( + MD_SetError( + Error : 'MDF0019' : %char( MediaDefinition.Device(DeviceIndex) diff --git a/meddfntstp.rpgle b/meddfntstp.rpgle index 69e83d7..6ebb613 100644 --- a/meddfntstp.rpgle +++ b/meddfntstp.rpgle @@ -43,6 +43,9 @@ dcl-ds MediaDefinition dcl-ds OriginalDefinition likeds(MD_MediaDefinition_T); +dcl-ds Error + likeds(MD_Error_T); + dcl-s DeviceIndex int(10); dcl-s MediaIndex int(10); dcl-s VolumeIndex int(10); @@ -79,8 +82,11 @@ dsply 'Deleting existing MEDDFN...'; monitor; + clear Error; + MD_DeleteMediaDefinition( - MediaDefinition); + MediaDefinition : + Error); dsply 'Delete completed'; @@ -97,8 +103,11 @@ endmon; dsply 'Creating MEDDFN...'; +clear Error; + MD_CreateMediaDefinition( - MediaDefinition); + MediaDefinition : + Error); dsply 'Create completed'; @@ -116,8 +125,11 @@ OriginalDefinition = MediaDefinition; dsply 'Retrieving MEDDFN...'; +clear Error; + MD_RetrieveMediaDefinition( - MediaDefinition); + MediaDefinition : + Error); dsply 'Retrieve completed';