Sign in

docs Examples

cartinfo

cartinfo

CRTRPGMOD MODULE(&O/&FNR) SRCSTMF(‘&FP’) </ CRTSRVPGM SRVPGM(&O/&FNR) EXPORT(ALL) - </ TEXT(‘Cartridge_Info’) </

**free
/if not defined( Copying_prototypes )
//---------------------------------------------------------------/
//                                                               /
//  Brief description of collection of procedures.               /
//                                                               /
//  Procedures:                                                  /
//                                                               /
//  Cartidge_Info         - return info about tape cartridges.   /
//                                                               /
//  Compilation:                                                 /
//                                                               /
//*>  CRTRPGMOD MODULE(&O/&FNR) SRCSTMF('&FP')                 <*/
//*>  CRTSRVPGM SRVPGM(&O/&FNR) EXPORT(*ALL)                 - <*/
//*>              TEXT('Cartridge_Info')                       <*/
//                                                               /
//---------------------------------------------------------------/
//  2016-08-19 : Christian Jorgensen                             /
//               Create module.                                  /
//---------------------------------------------------------------/

ctl-opt debug;
ctl-opt option( *Srcstmt : *NoDebugIO );
ctl-opt thread( *serialize );

ctl-opt nomain;

//----------------------------------------------------------------
// Exported procedures:

/endif

/if not defined( CARTINFO_prototype_copied )

// Procedure:    Cartridge_Info
// Description:  Return information about tape cartridges.

dcl-pr Cartridge_Info extproc( *dclcase );
  // Incoming parameters
  p_TapMlb                                               varchar( 10 ) const;
  p_CartID                                               varchar(  6 ) const;
  p_CatName                                              varchar( 10 ) const;
  p_CatSys                                               varchar(  8 ) const;
  // Returned parameters
  p_Cartridge_ID                                         varchar(  6 );
  p_Volume_ID                                            varchar( 10 );
  p_Tape_library_name                                    varchar( 10 );
  p_Category                                             varchar( 10 );
  p_Category_system                                      varchar(  8 );
  p_Density                                              varchar( 10 );
  p_Changed_timestamp                                    timestamp;
  p_Referenced_timestamp                                 timestamp;
  p_Location                                             varchar( 10 );
  p_Location_indicator                                   varchar( 32 );
  p_Volume_status                                        varchar( 32 );
  p_Owner_ID                                             varchar( 32 );
  p_Write_protected                                      varchar( 32 );
  p_Encoding                                             varchar( 32 );
  p_Cartridge_ID_source                                  varchar( 32 );
  p_In_Import_Export_slot                                varchar( 32 );
  p_Media_type                                           varchar( 32 );
  // Null indicators for incoming parameters
  n_TapMlb                                               int( 5 ) const;
  n_CartID                                               int( 5 ) const;
  n_CatName                                              int( 5 ) const;
  n_CatSys                                               int( 5 ) const;
  // Null indicators for returned parameters
  n_Cartridge_ID                                         int( 5 );
  n_Volume_ID                                            int( 5 );
  n_Tape_library_name                                    int( 5 );
  n_Category                                             int( 5 );
  n_Category_system                                      int( 5 );
  n_Density                                              int( 5 );
  n_Changed_timestamp                                    int( 5 );
  n_Referenced_timestamp                                 int( 5 );
  n_Location                                             int( 5 );
  n_Location_indicator                                   int( 5 );
  n_Volume_status                                        int( 5 );
  n_Owner_ID                                             int( 5 );
  n_Write_protected                                      int( 5 );
  n_Encoding                                             int( 5 );
  n_Cartridge_ID_source                                  int( 5 );
  n_In_Import_Export_slot                                int( 5 );
  n_Media_type                                           int( 5 );

  // SQL parameters.
  Sql_State   char( 5 );
  Function    varchar( 517 ) const;
  Specific    varchar( 128 ) const;
  MsgText     varchar( 70 );
  CallType    int( 5 )       const;
end-pr;

//----------------------------------------------------------------
// Exported data:

/define CARTINFO_prototype_copied
/if defined( Copying_prototypes )
/eof

/endif
/endif

//----------------------------------------------------------------
// Constants:

dcl-c CALL_STARTUP    -2;
dcl-c CALL_OPEN       -1;
dcl-c CALL_FETCH       0;
dcl-c CALL_CLOSE       1;
dcl-c CALL_FINAL       2;

dcl-c PARM_NULL       -1;
dcl-c PARM_NOTNULL     0;

dcl-c CCSID_UTF16   1200;
dcl-c IMGCATLIB     'QUSRSYS   ';

//----------------------------------------------------------------
// Data types:

dcl-ds RCTG0100_t template qualified;
  Bytes_returned                                   int( 10 );
  Bytes_available                                  int( 10 );
  Offset_to_cartridge_information                  int( 10 );
  Number_of_cartridge_information_entries          int( 10 );
  Length_of_cartridge_information_entry            int( 10 );
end-ds;

dcl-ds Cartridge_entry_t template qualified;
  Cartridge_ID                                     char(  6 );
  Volume_ID                                        char(  6 );
  Tape_library_name                                char( 10 );
  Category                                         char( 10 );
  Category_system                                  char(  8 );
  Density                                          char( 10 );
  Change_date                                      char(  7 );
  Change_time                                      char(  6 );
  Reference_date                                   char(  7 );
  Reference_time                                   char(  6 );
  Location                                         char( 10 );
  Location_indicator                               char(  1 );
  Volume_status                                    char(  2 );
  Owner_ID                                         char( 17 );
  Write_protection                                 char(  1 );
  Code                                             char(  1 );
  Cartridge_ID_source                              char(  1 );
  Import_Export_slot                               char(  1 );
  Media_type                                       char(  2 );
end-ds;

//----------------------------------------------------------------
// Global data:

// API error data structure:

dcl-ds ApiError;
  AeBytPrv  int( 10 )   inz( %size( ApiError ) );
  AeBytAvl  int( 10 );
  AeExcpId  char( 7 );
  *n        char( 1 );
  AeExcpDta char( 128 );
end-ds;

//----------------------------------------------------------------
// Prototypes:

/define Copying_prototypes
/undefine Copying_prototypes

//----------------------------------------------------------------
// Procedure:    Cartridge_Info
// Description:  Return information about image catalog,

dcl-proc Cartridge_Info export;

  dcl-pi *n;
    // Incoming parameters
    p_TapMlb                                               varchar( 10 ) const;
    p_CartID                                               varchar(  6 ) const;
    p_CatName                                              varchar( 10 ) const;
    p_CatSys                                               varchar(  8 ) const;
    // Returned parameters
    p_Cartridge_ID                                         varchar(  6 );
    p_Volume_ID                                            varchar( 10 );
    p_Tape_library_name                                    varchar( 10 );
    p_Category                                             varchar( 10 );
    p_Category_system                                      varchar(  8 );
    p_Density                                              varchar( 10 );
    p_Changed_timestamp                                    timestamp;
    p_Referenced_timestamp                                 timestamp;
    p_Location                                             varchar( 10 );
    p_Location_indicator                                   varchar( 32 );
    p_Volume_status                                        varchar( 32 );
    p_Owner_ID                                             varchar( 32 );
    p_Write_protected                                      varchar( 32 );
    p_Encoding                                             varchar( 32 );
    p_Cartridge_ID_source                                  varchar( 32 );
    p_In_Import_Export_slot                                varchar( 32 );
    p_Media_type                                           varchar( 32 );
    // Null indicators for incoming parameters
    n_TapMlb                                               int( 5 ) const;
    n_CartID                                               int( 5 ) const;
    n_CatName                                              int( 5 ) const;
    n_CatSys                                               int( 5 ) const;
    // Null indicators for returned parameters
    n_Cartridge_ID                                         int( 5 );
    n_Volume_ID                                            int( 5 );
    n_Tape_library_name                                    int( 5 );
    n_Category                                             int( 5 );
    n_Category_system                                      int( 5 );
    n_Density                                              int( 5 );
    n_Changed_timestamp                                    int( 5 );
    n_Referenced_timestamp                                 int( 5 );
    n_Location                                             int( 5 );
    n_Location_indicator                                   int( 5 );
    n_Volume_status                                        int( 5 );
    n_Owner_ID                                             int( 5 );
    n_Write_protected                                      int( 5 );
    n_Encoding                                             int( 5 );
    n_Cartridge_ID_source                                  int( 5 );
    n_In_Import_Export_slot                                int( 5 );
    n_Media_type                                           int( 5 );

    // SQL parameters.
    Sql_State   char( 5 );
    Function    varchar( 517 ) const;
    Specific    varchar( 128 ) const;
    MsgText     varchar( 70 );
    CallType    int( 5 )       const;
  end-pi;

  dcl-pr QTARCTGI extpgm( 'QTARCTGI' );
    *n likeds( RCTG0100_t );
    *n int( 10 )    const;
    *n char( 8 )    const;
    *n char( 10 )   const;
    *n char( 6 )    const;
    *n char( 18 )   const;
    *n char( 1024 ) const options( *varsize );
  end-pr;

  dcl-s  LoTapMlb         char( 10 );
  dcl-s  LoCartID         char(  6 );
  dcl-s  LoCatName        char( 10 );
  dcl-s  LoCatSys         char(  8 );
  dcl-s  SaveCallType     like( CallType  ) static;  // Save CallType from previous call...
  dcl-s  SaveLoTapMlb     like( LoTapMlb  ) static;  // Save tape library from previous call...
  dcl-s  SaveLoCartID     like( LoCartID  ) static;  // Save cartridge ID from previous call...
  dcl-s  SaveLoCatName    like( LoCatName ) static;  // Save category name from previous call...
  dcl-s  SaveLoCatSys     like( LoCatSys  ) static;  // Save category system from previous call...

  dcl-ds CartInfoHdr      likeds( RCTG0100_t ) based( ptrCartInfoHdr );
  dcl-s  ptrCartInfoHdr   pointer static;
  dcl-ds CartInfoDtl      likeds( Cartridge_entry_t ) based( ptrCartInfoDtl );
  dcl-s  ptrCartInfoDtl   pointer static;

  dcl-s  CurEntry         like( RCTG0100_t.Number_of_cartridge_information_entries ) static;

  dcl-s  Buffer_size         int( 10 );

  // Start all fields at not NULL.

  n_Cartridge_ID                                         = PARM_NOTNULL;
  n_Volume_ID                                            = PARM_NOTNULL;
  n_Tape_library_name                                    = PARM_NOTNULL;
  n_Category                                             = PARM_NOTNULL;
  n_Category_system                                      = PARM_NOTNULL;
  n_Density                                              = PARM_NOTNULL;
  n_Changed_timestamp                                    = PARM_NOTNULL;
  n_Referenced_timestamp                                 = PARM_NOTNULL;
  n_Location                                             = PARM_NOTNULL;
  n_Location_indicator                                   = PARM_NOTNULL;
  n_Volume_status                                        = PARM_NOTNULL;
  n_Owner_ID                                             = PARM_NOTNULL;
  n_Write_protected                                      = PARM_NOTNULL;
  n_Encoding                                             = PARM_NOTNULL;
  n_Cartridge_ID_source                                  = PARM_NOTNULL;
  n_In_Import_Export_slot                                = PARM_NOTNULL;
  n_Media_type                                           = PARM_NOTNULL;

  //  Open, fetch & close...

  select;
    when  CallType = CALL_OPEN;

      // Verify that tape library device was specified.

      if ( n_TapMlb = PARM_NULL ) or
         ( p_TapMlb = '' );
          SQL_State = '38999';
          MsgText = 'Tape library device must be specified';
          return;
      else;
        LoTapMlb= p_TapMlb;
      endif;

      // Verify that cartridge ID was specified.

      if ( n_CartID = PARM_NULL ) or
         ( p_CartID = '' );
          SQL_State = '38999';
          MsgText = 'Cartridge ID must be specified';
          return;
      else;
        LoCartID = p_CartID;
      endif;

      // Verify that category name was specified.

      if ( n_CatName = PARM_NULL ) or
         ( p_CatName = '' );
          SQL_State = '38999';
          MsgText = 'Category name must be specified';
          return;
      else;
        LoCatName = p_CatName;
      endif;

      // Verify that category system was specified.
      // If category name is *SHARE400, *INSERT or *EJECT, ignore system.

      if ( %scan( p_CatName : '*SHARE400,*INSERT,*EJECT' ) = 0 );
        if ( n_CatSys = PARM_NULL ) or
           ( p_CatSys = '' );
            SQL_State = '38999';
            MsgText = 'Category system must be specified';
            return;
        else;
          LoCatSys = p_CatSys;
        endif;
      else;
        clear LoCatSys;
      endif;

      // Get cartidge basic info.

      ptrCartInfoHdr = %alloc( %size( CartInfoHdr ) );
      ptrCartInfoDtl = *null;
      QTARCTGI( CartInfoHdr
              : %size( CartInfoHdr )
              : 'RCTG0100'
              : LoTapMlb
              : LoCartID
              : LoCatName + LoCatSys
              : ApiError
              );

      if ( AeBytAvl > 0 );
        if ( AeExcpID = 'CPF67D2' ); // CPF67D2 returns EOF...
          SQL_State = '02000';
          dealloc ptrCartInfoHdr;
          return;
        else;
          SQL_State = '38999';
          MsgText = 'Error ' + AeExcpID + ', please check joblog.';
          return;
        endif;
      endif;

      // Expand buffer and get cartridge entries.

      Buffer_size = CartInfoHdr.Bytes_Available + ( CartInfoHdr.Number_of_cartridge_information_entries * CartInfoHdr.Length_of_cartridge_information_entry );
      ptrCartInfoHdr = %realloc( ptrCartInfoHdr : Buffer_size );
      QTARCTGI( CartInfoHdr
              : Buffer_size
              : 'RCTG0100'
              : LoTapMlb
              : LoCartID
              : LoCatName + LoCatSys
              : ApiError
              );
      if ( AeBytAvl > 0 );
        SQL_State = '38999';
        MsgText = 'Error ' + AeExcpID + ', please check joblog.';
        return;
      endif;

      ptrCartInfoDtl = ptrCartInfoHdr + CartInfoHdr.Offset_to_cartridge_information;

      // Reset current entry before fetching.

      CurEntry = 0;

    when  CallType = CALL_FETCH;

      // If previous call was for fetch and no more entries, return EOF.

      if ( CallType  = SaveCallType  ) and
         ( LoTapMlb  = SaveLoTapMlb  ) and
         ( LoCartID  = SaveLoCartID  ) and
         ( LoCatName = SaveLoCatName ) and
         ( LoCatSys  = SaveLoCatSys  ) and
         ( CurEntry  = CartInfoHdr.Number_of_cartridge_information_entries );
        SQL_State = '02000';
        return;
      endif;

      // If there are cartridge entries, get next entry.

      if ( CartInfoHdr.Number_of_cartridge_information_entries > 0 );
        CurEntry += 1;
        ptrCartInfoDtl = ptrCartInfoHdr + CartInfoHdr.Offset_to_cartridge_information
                                        + ( CartInfoHdr.Length_of_cartridge_information_entry * ( CurEntry - 1 ) );


        // Copy cartridge entry data to parameters.

        p_Cartridge_ID                             = %trimr( CartInfoDtl.Cartridge_ID        );

        select;
          when ( CartInfoDtl.Volume_ID = '*NL' );
            p_Volume_ID = 'NON-LABELED';
          when ( CartInfoDtl.Volume_ID = '' );
            p_Volume_ID = 'UNKNOWN';
          other;
            p_Volume_ID                            = %trimr( CartInfoDtl.Volume_ID           );
        endsl;

        p_Tape_library_name                        = %trimr( CartInfoDtl.Tape_library_name   );
        p_Category                                 = %trimr( CartInfoDtl.Category            );
        p_Category_system                          = %trimr( CartInfoDtl.Category_system     );
        p_Density                                  = %trimr( CartInfoDtl.Density             );
        p_Changed_timestamp                        = CvtToTimestamp( CartInfoDtl.Change_date : CartInfoDtl.Change_time );
        p_Referenced_timestamp                     = CvtToTimestamp( CartInfoDtl.Reference_date : CartInfoDtl.Reference_time );
        p_Location                                 = %triml( %trimr( CartInfoDtl.Location ) : '0' );

        select;
          when ( CartInfoDtl.Location_indicator = '0' );
            p_Location_indicator = 'DRIVE';
          when ( CartInfoDtl.Location_indicator = '1' );
            p_Location_indicator = 'SLOT';
        endsl;

        select;
          when ( CartInfoDtl.Volume_status = '01' );
            p_Volume_status = 'AVAILABLE';
          when ( CartInfoDtl.Volume_status = '02' );
            p_Volume_status = 'MOUNTED';
          when ( CartInfoDtl.Volume_status = '03' );
            p_Volume_status = 'NOT_AVAILABLE';
          when ( CartInfoDtl.Volume_status = '04' );
            p_Volume_status = 'EJECTED';
          when ( CartInfoDtl.Volume_status = '05' );
            p_Volume_status = 'ERROR_STATE';
          when ( CartInfoDtl.Volume_status = '06' );
            p_Volume_status = 'INSERTED';
          when ( CartInfoDtl.Volume_status = '07' );
            p_Volume_status = 'DUPLICATE_ID';
        endsl;


        select;
          when ( CartInfoDtl.Owner_ID = '*NL' );
            p_Owner_ID = 'NON-LABELED';
          when ( CartInfoDtl.Owner_ID = '*BLANK' );
            p_Owner_ID = 'BLANK';
          when ( CartInfoDtl.Owner_ID = '' );
            p_Owner_ID = 'UNKNOWN';
          other;
            p_Owner_ID                             = %trimr( CartInfoDtl.Owner_ID            );
        endsl;

        select;
          when ( CartInfoDtl.Write_protection = '0' );
            p_Write_protected = 'NO';
          when ( CartInfoDtl.Write_protection = '1' );
            p_Write_protected = 'YES';
          other;
            p_Write_protected = 'UNKNOWN';
        endsl;

        select;
          when ( CartInfoDtl.Code = '0' );
            p_Encoding = 'ASCII';
          when ( CartInfoDtl.Code = '1' );
            p_Encoding = 'EBCDIC';
          other;
            p_Encoding = 'UNKNOWN';
        endsl;

        select;
          when ( CartInfoDtl.Cartridge_ID_source = '0' );
            p_Cartridge_ID_source = 'VOLUME_ID';
          when ( CartInfoDtl.Cartridge_ID_source = '1' );
            p_Cartridge_ID_source = 'SYSTEM';
          when ( CartInfoDtl.Cartridge_ID_source = '2' );
            p_Cartridge_ID_source = 'BARCODE';
        endsl;

        select;
          when ( CartInfoDtl.Import_Export_slot = '0' );
            p_In_Import_Export_slot = 'NO';
          when ( CartInfoDtl.Import_Export_slot = '1' );
            p_In_Import_Export_slot = 'YES';
        endsl;

        p_Media_type                               = %trimr( CartInfoDtl.Media_type          );
      endif;

    when  CallType = CALL_CLOSE;
      if ( ptrCartInfoHdr <> *null );
        dealloc ptrCartInfoHdr;
      endif;

  endsl;

  SaveCallType  = CallType;
  SaveLoCartID  = LoCartID;
  SaveLoCatName = LoCatName;
  SaveLoCatSys  = LoCatSys;

  return;

end-proc;

//----------------------------------------------------------------
// Procedure:    CvtToTimestamp
// Description:  Convert date and time to ISO timestamp.

dcl-proc CvtToTimestamp;

  dcl-pi *n timestamp;
    date    like( Cartridge_entry_t.Change_date );
    time    like( Cartridge_entry_t.Change_time );
  end-pi;

  if ( date <> *blanks ) and
     ( time <> *blanks );
    return ( %date( date : *CYMD0 ) + %time( time : *HMS0 ) );
  else;
    return ( d'0001-01-01' + t'00.00.00' );
  endif;

end-proc;