Sample program SYCTSAX4

 SYCTSAX4: PROC OPTIONS(MAIN REENTRANT);
  /*       @(#) syctsax4.pli 1.1 4/18/96       */
 
  /****** SYCTSAX4 - Open Server, Open Client - PL/1 - CICS ***********/
  /*                                                                  */
  /*  TRANID:        SYX4                                             */
  /*  PROGRAM:       SYCTSAX4                                         */
  /*  TABLE:         SYBASE.SAMPLETB                                  */
  /*                                                                  */
  /*  The purpose of the program is primarily to demonstrate the      */
  /*  ability to act as a server and a client within one program.     */
  /*                                                                  */
  /*  This program is invoked via an RPC request and will in turn     */
  /*  execute a language request against a server and return the      */
  /*  results back to the client.                                     */
  /*                                                                  */
  /*  It will issue the following SQL statement:                      */
  /*                                                                  */
  /*   "SELECT FIRSTNME FROM SYBASE.SAMPLETB"                         */
  /*                                                                  */
  /*  Make sure that the server you wish to access has an entry       */
  /*  in the Connection Router Table for that Server and the          */
  /*  MCG(s) that you wish to use.                                    */
  /*                                                                  */
  /*  Server Library calls:                                           */
  /*                                                                  */
  /*    TDACCEPT      accept request from client                      */
  /*    TDESCRIB      describe a column in the result row             */
  /*    TDFREE        free TDPROC structure                           */
  /*    TDINFPRM      get information about one rpc parameter         */
  /*    TDINIT        establish environment                           */
  /*    TDNUMPRM      get total nr of rpc parameters                  */
  /*    TDRCVPRM      retrieve rpc parameter from client              */
  /*    TDSNDDON      send results-completion to client               */
  /*    TDSNDMSG      send error messages back to the client          */
  /*    TDSNDROW      send a row of data back to the client           */
  /*                                                                  */
  /*  Open Client calls:                                              */
  /*                                                                  */
  /*    CSBCTXDROP    drop a context                                  */
  /*    CTBBIND       bind a column variable                          */
  /*    CTBCLOSE      close a server connection                       */
  /*    CTBCMDALLOC   allocate a command                              */
  /*    CTBCMDDROP    drop a command                                  */
  /*    CTBCOMMAND    initiate remote procedure call                  */
  /*    CTBCONALLOC   allocate a connection                           */
  /*    CTBCONDROP    drop a connection                               */
  /*    CTBCONPROPS   alter properties of a connection                */
  /*    CTBCONNECT    open a server connection                        */
  /*    CTBDIAG       retrieve SQLCODE messages                       */
  /*    CTBEXIT       exit client library                             */
  /*    CTBFETCH      fetch result data                               */
  /*    CTBINIT       init client library                             */
  /*    CTBRESULTS    sets up result data                             */
  /*    CTBSEND       send a request to the server                    */
  /*                                                                  */
  /* History:                                                         */
  /*                                                                  */
  /* Date    BTS#   Descrition                                        */
  /* ======= ====== ================================================= */
  /* Feb1795        Create                                            */
  /* Oct3095 99999  Rewrite and add front end to the program          */
  /*                                                                  */
  /*                                                                  */
  /********************************************************************/
 
  /*------------------------------------------------------------------*/
  /* CLIENT LIBRARY PL/1 COPY BOOK                                    */
  /*------------------------------------------------------------------*/
%INCLUDE CTPUBLIC;
/*------------------------------------------------------------------*/
  /* SERVER LIBRARY PL/1 COPY BOOK                                    */
  /*------------------------------------------------------------------*/
%INCLUDE SYGWPLI;
/*------------------------------------------------------------------*/
  /* CICS Standard Attention Identifiers PL/1 Copy Book               */
  /*------------------------------------------------------------------*/
%INCLUDE DFHAID;
/*------------------------------------------------------------------*/
  /* SERVER LIBRARY ROUTINE DECLARATIONS                              */
  /*------------------------------------------------------------------*/
          DCL
              TDACCEPT ENTRY OPTIONS(INTER ASSEMBLER),
              TDESCRIB ENTRY OPTIONS(INTER ASSEMBLER),
              TDFREE   ENTRY OPTIONS(INTER ASSEMBLER),
              TDINFPRM ENTRY OPTIONS(INTER ASSEMBLER),
              TDINIT   ENTRY OPTIONS(INTER ASSEMBLER),
              TDNUMPRM ENTRY OPTIONS(INTER ASSEMBLER),
              TDRCVPRM ENTRY OPTIONS(INTER ASSEMBLER),
              TDSNDDON ENTRY OPTIONS(INTER ASSEMBLER),
              TDSNDMSG ENTRY OPTIONS(INTER ASSEMBLER),
              TDSNDROW ENTRY OPTIONS(INTER ASSEMBLER);
/********************************************************************/
/* CLIENT LIBRARY ROUTINE DECLARATIONS                              */
/********************************************************************/
          DCL
              CSBCTXDR     ENTRY OPTIONS(INTER ASSEMBLER),
              CTBBIND      ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCLOSE     ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCMDALLOC  ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCMDDROP   ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCOMMAND   ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCONALLOC  ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCONDROP   ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCONPROPS  ENTRY OPTIONS(INTER ASSEMBLER),
              CTBCONNECT   ENTRY OPTIONS(INTER ASSEMBLER),
              CTBDIAG      ENTRY OPTIONS(INTER ASSEMBLER),
              CTBEXIT      ENTRY OPTIONS(INTER ASSEMBLER),
              CTBFETCH     ENTRY OPTIONS(INTER ASSEMBLER),
              CTBINIT      ENTRY OPTIONS(INTER ASSEMBLER),
              CTBRESULTS   ENTRY OPTIONS(INTER ASSEMBLER),
              CTBSEND      ENTRY OPTIONS(INTER ASSEMBLER);
/********************************************************************/
/* BUILT-IN FUNCTION DECLARATIONS                                   */
/********************************************************************/
          DCL
              ADDR      BUILTIN,
              LENGTH    BUILTIN,
              STG       BUILTIN,
              SUBSTR    BUILTIN;
/********************************************************************/
/* WORK AREAS SERVER LIBRARY                                        */
/********************************************************************/
          DCL
              01  GW_LIB_MISC_FIELDS,
                  05  GWL_TDPROC              PTR,
                  05  GWL_RC                  FIXED BIN(31);
DCL
              01  PARM_FIELDS,
                  05  PF_PARM_ID              FIXED BIN(31),
                  05  PF_DATATYPE             FIXED BIN(31),
                  05  PF_ACTUAL_DATA_LENGTH   FIXED BIN(31),
                  05  PF_MAX_DATA_LENGTH      FIXED BIN(31),
                  05  PF_PARM_STATUS          FIXED BIN(31),
                  05  PF_PARM_NAME            CHAR(30),
                  05  PF_PARM_NAME_LENGTH     FIXED BIN(31),
                  05  PF_USER_DATATYPE        FIXED BIN(31),
                  05  PF_NUM_OF_PARMS         FIXED BIN(31);
DCL
              01  SNA_FIELDS,
                  05  SNA_SUBC                FIXED BIN(31),
                  05  SNA_CONNECTION_NAME     CHAR(08) INIT(' ');
DCL
              01  WORK_FIELDS,
                  05  WRK_DONE_STATUS         FIXED BIN(31);
DCL
              01  DESCRIBE_FIELDS,
                  05  DF_COLUMN_NUMBER        FIXED BIN(31),
                  05  DF_HOST_VARIABLE_TYPE   FIXED BIN(31),
                  05  DF_HOST_VARIABLE_MAXLEN FIXED BIN(31),
                  05  DF_HOST_VARIABLE_NAME   PTR,
                  05  DF_NULL_INDICATOR_VAR   FIXED BIN(15),
                  05  DF_NULLS_ALLOWED        FIXED BIN(31),
                  05  DF_COLUMN_TYPE          FIXED BIN(31),
                  05  DF_COLUMN_MAXLEN        FIXED BIN(31),
                  05  DF_COLUMN_NAME          CHAR(30),
                  05  DF_COLUMN_NAME_LEN      FIXED BIN(31);
          DCL
              01  SNDMSG_FIELDS,
                  05  SF_MESSAGE_TYPE         FIXED BIN(31),
                  05  SF_MESSAGE_NUMBER       FIXED BIN(31),
                  05  SF_SEVERITY             FIXED BIN(31),
                  05  SF_ERROR_STATE          FIXED BIN(31),
                  05  SF_LINE_ID              FIXED BIN(31),
                  05  SF_TRANSACTION_ID       CHAR(4)     INIT('SYX4'),
                  05  SF_TRANSACTION_ID_LEN   FIXED BIN(31),
                  05  SF_MESSAGE_TEXT         CHAR(80),
                  05  SF_MESSAGE_LENGTH       FIXED BIN(31);
/*------------------------------------------------------------------*//
/* WORK AREAS OPEN CLIENT                                           */
/*------------------------------------------------------------------*/
          DCL
              01  CS_LIB_MISC_FIELDS,
                  05  CSL_CMD_HANDLE        FIXED BIN(31) INIT(0),
                  05  CSL_CON_HANDLE        FIXED BIN(31) INIT(0),
                  05  CSL_CTX_HANDLE        FIXED BIN(31) INIT(0),
                  05  CSL_RC                FIXED BIN(31);
          DCL
              01  PROPS_FIELDS,
                  05  PF_SERVER             CHAR(30),
                  05  PF_SERVER_LEN         FIXED BIN(31),
                  05  PF_USER               CHAR(08),
                  05  PF_USER_LEN           FIXED BIN(31),
                  05  PF_PWD                CHAR(30),
                  05  PF_PWD_LEN            FIXED BIN(31),
                  05  PF_OUTLEN             FIXED BIN(31),
                  05  PF_STRLEN             FIXED BIN(31),
                  05  PF_MSGLIMIT           FIXED BIN(31);
          DCL
              01  QUERY_FIELDS,
                  05  QF_LEN                FIXED BIN(15) INIT(1),
                  05  QF_MAXLEN             FIXED BIN(15) INIT(1),
                  05  QF_ANSWER             CHAR(01)      INIT(' ');
          DCL
              01  FETCH_FIELDS,
                  05  FF_ROWS_READ          FIXED BIN(31),
                  05  FF_ROW_NUM            FIXED BIN(31)  INIT(0);
          DCL
              01  COLUMN_FIELDS,
                  05  CF_COL_FIRSTNME       CHAR(12) VAR,
                  05  CF_COL_NUMBER         FIXED BIN(31)  INIT(0),
                  05  CF_COL_INDICATOR      FIXED BIN(31)  INIT(0),
                  05  CF_COL_OUTLEN         FIXED BIN(31);
          DCL
              01  LANG_FIELDS               STATIC,
                  05  LF_LANG               CHAR(36)
                      INIT ('SELECT FIRSTNME FROM SYBASE.SAMPLETB');
          DCL
              01  ERROR_MSG,
                  05  ERROR_TEXT            CHAR(50)       INIT(' '),
                  05  ERROR_LITERAL         CHAR(03)       INIT('RC='),
                  05  ERROR_RC              PIC '----9';
          DCL
              01  ERROR_MSG_STR             CHAR(58)
                                            DEFINED ERROR_MSG;
          DCL
              01  OUTPUT_MSG,
                  05  MESG                  CHAR(27)       INIT(' '),
                  05  NUM_COLS_OR_ROWS      PIC '99999';
          DCL
              01  OUTPUT_MSG_STR            CHAR(32)
                                            DEFINED OUTPUT_MSG;
          DCL
              01  INFO_MSG_STR              CHAR(80)       INIT(' ');
          DCL
              01  RESULTS_FIELDS,
                  05  RF_TYPE               FIXED BIN(31);
          DCL
              01  DATAFMT,
                  05  DF_NAME               CHAR(132),
                  05  DF_NAMELEN            FIXED BIN(31),
                  05  DF_DATATYPE           FIXED BIN(31),
                  05  DF_FORMAT             FIXED BIN(31),
                  05  DF_MAXLENGTH          FIXED BIN(31),
                  05  DF_SCALE              FIXED BIN(31),
                  05  DF_PRECISION          FIXED BIN(31),
                  05  DF_STATUS             FIXED BIN(31),
                  05  DF_COUNT              FIXED BIN(31),
                  05  DF_USERTYPE           FIXED BIN(31),
                  05  DF_LOCALE             CHAR(68);
/*------------------------------------------------------------------*/
/* COMMON WORK AREAS                                                */
/*------------------------------------------------------------------*/
          DCL
              01  MSG_FIELDS                STATIC,
                  05  MSG_END_MSG           CHAR(25)
                      INIT ('All done processing rows.'),
                  05  MSG_NOT_RPC           CHAR(35)
                      INIT ('SYX4 must be begun via rpc request.'),
                  05  MSG_WRONG_NR_PARMS    CHAR(50)
                      INIT ('Number of parameters must be 2 or 3.'),
                  05  MSG_NOT_CHAR_PARM     CHAR(50)
                      INIT ('Parameter must be a CHARACTER type.'),
                  05  MSG_NOT_INT4_PARM     CHAR(50)
                      INIT ('Parameter must be a INTEGER type.'),
                  05  MSG_CANCELED          CHAR(17)
                      INIT ('Cancel requested.'),
                  05  MSG_TDRCVPRM_FAIL     CHAR(16)
                      INIT ('TDRCVPRM failed.');
          DCL
              01  CICS_FIELDS,
                  05  CICS_RESPONSE         FIXED BIN(31);
          DCL
               01  MISC_FIELDS,
                   05  BLANK                CHAR(01) INIT(' '),
                   05  BLANK_13             CHAR(13) INIT(' '),
                   05  DIAG_MSGS_INIT       BIT(1)   INIT('1'B),
                   05  FALSE                BIT(1)   INIT('0'B),
                   05  LCV                  FIXED BIN(31),
                   05  TMP_TIME             CHAR(08) INIT(' '),
                   05  TMP_DATE             CHAR(08) INIT(' '),
                   05  TRUE                 BIT(1)   INIT('1'B),
                   05  UTIME                FIXED DEC(15) INIT(0);
 
          DCL
              01  DIAG_FIELDS,
                  05  DF_MSGNO              FIXED BIN(31) INIT(1),
                  05  DF_NUM_OF_MSGS        FIXED BIN(31) INIT(0);
 
          DCL
              01 DISP_MSG,
                 05 TEST_CASE               CHAR(09) INIT('SYCTSAX4 '),
                 05 MSG,
                    10 SAMP_LIT             CHAR(05) INIT('rc = '),
                    10 SAMP_RC              PIC'99',
                    10 REST_LIT             CHAR(15)
                                              INIT('  Result Type: '),
                    10 REST_TYPE            PIC'9999',
                    10 FILLER               CHAR(03) INIT(' '),
                    10 MSGSTR               CHAR(40) INIT(' ');
 
          DCL
              01 DISP_DATE_HEADER,
                 05 DATE_HDR                CHAR(06) INIT(' DATE '),
                 05 DATE_DATA               CHAR(08),
                 05 X4_HDR                  CHAR(54) ;
 
          DCL
              01 DISP_TIME_HEADER,
                 05 TIME_HDR                CHAR(06) INIT(' TIME '),
                 05 TIME_DATA               CHAR(08);
 
          DCL
              01 DISP_SERVER,
                 05 SERVER_HDR              CHAR(09) INIT(' SERVER: '),
                 05 SERVER_DATA             CHAR(30),
                 05 USER_HDR                CHAR(10) INIT(' USER-ID: '),
                 05 USER_DATA               CHAR(08);
 
  /*------------------------------------------------------------------*/
  /* Client Message Structure                                         */
  /*------------------------------------------------------------------*/
 
          DCL
              01 CLIENT_MSG,
                 05 CM_SEVERITY             FIXED BIN(31),
                 05 CM_MSGNO                FIXED BIN(31),
                 05 CM_TEXT                 CHAR(256),
                 05 CM_TEXT_LEN             FIXED BIN(31),
                 05 CM_OS_MSGNO             FIXED BIN(31),
                 05 CM_OS_MSGTXT            CHAR(256),
                 05 CM_OS_MSGTEXT_LEN       FIXED BIN(31),
                 05 CM_STATUS               FIXED BIN(31);
 
          DCL
              01 DISP_CLIENT_MSG_1,
                 05 CM_SEVERITY_HDR         CHAR(13)
                                              INIT('  Severity:  '),
                 05 CM_SEVERITY_DATA        PIC'ZZZ9',
                 05 CM_STATUS_HDR           CHAR(12)
                                              INIT(',  Status:  '),
                 05 CM_STATUS_DATA          PIC'ZZZ9' ;
 
          DCL
              01 DISP_CLIENT_MSG_2,
                 05 CM_OC_MSGNO_HDR         CHAR(13)
                                              INIT('  OC MsgNo:  '),
                 05 CM_OC_MSGNO_DATA        PIC'ZZZZZZZ9' ;
 
          DCL
              01 DISP_CLIENT_MSG_3,
                 05 CM_OC_MSG_HDR           CHAR(13)
                                              INIT('  OC MsgTx: '),
                 05 CM_OC_MSG_DATA          CHAR(66);
 
          DCL
              01 DISP_CLIENT_MSG_3A,
                 05 CM_OC_MSG_DATA_1        CHAR(66),
                 05 CM_OC_MSG_DATA_2        CHAR(66),
                 05 CM_OC_MSG_DATA_3        CHAR(66),
                 05 CM_OC_MSG_DATA_4        CHAR(58);
 
          DCL
              01 DISP_CLIENT_MSG_3B,
                 05 FILLER                  CHAR(13) INIT(' '),
                 05 CM_OC_MSG_DATA_X        CHAR(66);
 
          DCL
              01 DISP_CLIENT_MSG_4,
                 05 CM_OS_MSG_HDR           CHAR(13)
                                              INIT('  OS MsgNo:  '),
                 05 CM_OS_MSGNO_DATA        PIC'ZZZZZZZ9' ;
 
          DCL
              01 DISP_CLIENT_MSG_5,
                 05 CM_OS_MSG_HDR_5         CHAR(13)
                                              INIT('  OS MsgTx: '),
                 05 CM_OS_MSG_DATA          CHAR(66);
 
  /*------------------------------------------------------------------*/
  /* Server Message Structure                                         */
  /*------------------------------------------------------------------*/
 
          DCL
              01 SERVER_MSG,
                 05 SM_MSGNO                FIXED BIN(31),
                 05 SM_STATE                FIXED BIN(31),
                 05 SM_SEV                  FIXED BIN(31),
                 05 SM_TEXT                 CHAR(256),
                 05 SM_TEXT_LEN             FIXED BIN(31),
                 05 SM_SVRNAME              CHAR(256),
                 05 SM_SVRNAME_LEN          FIXED BIN(31),
                 05 SM_PROC                 CHAR(256),
                 05 SM_PROC_LEN             FIXED BIN(31),
                 05 SM_LINE                 FIXED BIN(31),
                 05 SM_STATUS               FIXED BIN(31);
 
          DCL
              01 DISP_SERVER_MSG_1,
                 05 SM_MSG_NO_HDR           CHAR(13)
                                              INIT('  Message#:  '),
                 05 SM_MSG_NO_DATA          PIC'ZZZZZZZ9',
                 05 SM_SEVERITY_HDR         CHAR(14)
                                              INIT(',  Severity:  '),
                 05 SM_SEVERITY_DATA        PIC'ZZZ9',
                 05 SM_STATE_HDR            CHAR(14)
                                              INIT(',  State No:  '),
                 05 SM_STATE_DATA           PIC'ZZZ9' ;
 
          DCL
              01 DISP_SERVER_MSG_2,
                 05 SM_LINE_NO_HDR          CHAR(13)
                                              INIT('  Line  No:  '),
                 05 SM_LINE_NO_DATA         PIC'ZZZ9',
                 05 SM_STATUS_HDR           CHAR(14)
                                              INIT(',  Status  :  '),
                 05 SM_STATUS_DATA          PIC'ZZZ9' ;
 
          DCL
              01 DISP_SERVER_MSG_3,
                 05 SM_SVRNAME_HDR          CHAR(13)
                                              INIT('  Serv Nam:  '),
                 05 SM_SVRNAME_DATA         CHAR(66) ;
 
          DCL
              01 DISP_SERVER_MSG_4,
                 05 SM_PROC_ID_HDR          CHAR(13)
                                              INIT('  Proc  ID:  '),
                 05 SM_PROC_ID_DATA         CHAR(66);
 
          DCL
              01 DISP_SERVER_MSG_5,
                 05 SM_MSG_HDR              CHAR(13)
                                              INIT('  Message :  '),
                 05 SM_MSG_DATA             CHAR(66);
 
          DCL
              01 DISP_SERVER_MSG_5X,
                 05 FILLER                  CHAR(13) INIT(' '),
                 05 SM_MSG_DATA_X           CHAR(66);
  /*------------------------------------------------------------------*/
  /* Begin program here                                               */
  /*------------------------------------------------------------------*/
 
  X4_HDR = ' SYBASE PL/1 SAMPLE PROGRAM SYCTSAX4 SQL RESULT OUTPUT' ;
 
  EXEC CICS ASKTIME ABSTIME(UTIME);
 
  EXEC CICS FORMATTIME
            ABSTIME(UTIME)
            DATESEP('/')
            MMDDYY(TMP_DATE)
            TIME(TMP_TIME)
            TIMESEP ;
 
  /*------------------------------------------------------------------*/
  /* intialize the TDS environment for a client                       */
  /*------------------------------------------------------------------*/
 
  CALL TDINIT( DFHEIBLK,
               GWL_RC,
               CSL_CTX_HANDLE);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDINIT failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  /*----------------------------------------*/
  /* accept a request from a remote client */
  /*----------------------------------------*/
 
  CALL TDACCEPT( GWL_TDPROC,
                 GWL_RC,
                 CSL_CTX_HANDLE,
                 SNA_CONNECTION_NAME,
                 SNA_SUBC);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDACCEPT failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  /*------------------------------------------*/
  /* display program heading information      */
  /*------------------------------------------*/
 
  INFO_MSG_STR = BLANK ;
  CALL SEND_INFO_MESSAGE;
 
  INFO_MSG_STR = DATE_HDR  || TMP_DATE || X4_HDR ;
  CALL SEND_INFO_MESSAGE;
 
  INFO_MSG_STR = TIME_HDR  || TMP_TIME ;
  CALL SEND_INFO_MESSAGE;
 
  INFO_MSG_STR = BLANK ;
  CALL SEND_INFO_MESSAGE;
 
  /*------------------------------------------------*/
  /* determine how many parameters were sent with   */
  /* the current RPC by the remote client or server */
  /* .. better be two                               */
  /*------------------------------------------------*/
 
  CALL TDNUMPRM( GWL_TDPROC,
                 PF_NUM_OF_PARMS);
 
  IF PF_NUM_OF_PARMS = 2 | PF_NUM_OF_PARMS = 3
  THEN ;
  ELSE DO;
 
    INFO_MSG_STR = MSG_WRONG_NR_PARMS;
    CALL SEND_INFO_MESSAGE;
 
    INFO_MSG_STR = BLANK;
    CALL SEND_INFO_MESSAGE;
 
    INFO_MSG_STR =
       'syntax is: SYX4 server-nm, user-id   OR' ;
    CALL SEND_INFO_MESSAGE;
 
    INFO_MSG_STR =
       '           SYX4 server-nm, user-id, password' ;
    CALL SEND_INFO_MESSAGE;
 
    GO TO ALL_DONE;
  END;
 
  /*------------------------------------------------------------*/
  /* retrieves parameter type, datatype, and length information */
  /* about the 1st RPC parameter( server-name parameter )       */
  /*------------------------------------------------------------*/
 
  PF_PARM_ID = 1;
 
  CALL TDINFPRM( GWL_TDPROC,
                 GWL_RC,
                 PF_PARM_ID,
                 PF_DATATYPE,
                 PF_ACTUAL_DATA_LENGTH,
                 PF_MAX_DATA_LENGTH,
                 PF_PARM_STATUS,
                 PF_PARM_NAME,
                 PF_PARM_NAME_LENGTH,
                 TDS_NULL);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDINFPRM for server-name parameter failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  IF PF_DATATYPE ^= TDSCHAR & PF_DATATYPE ^= TDSVARYCHAR THEN
  DO;
    INFO_MSG_STR = 'server-name datatype must be TDSCHAR';
    CALL SEND_INFO_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  /*------------------------------------------------------------*/
  /* retrieves the data from an RPC parameter sent by a remote  */
  /* client                                                     */
  /*------------------------------------------------------------*/
 
  CALL TDRCVPRM( GWL_TDPROC,
                 GWL_RC,
                 PF_PARM_ID,
                 PF_SERVER,
                 TDSCHAR,
                 STG(PF_SERVER),
                 PF_ACTUAL_DATA_LENGTH);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDRCVPRM failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  PF_SERVER_LEN = PF_ACTUAL_DATA_LENGTH ;
 
  /*------------------------------------------------------------*/
  /* retrieves parameter type, datatype, and length information */
  /* about the 2nd RPC parameter( user-id parameter )           */
  /*------------------------------------------------------------*/
 
  PF_PARM_ID = 2;
 
  CALL TDINFPRM( GWL_TDPROC,
                 GWL_RC,
                 PF_PARM_ID,
                 PF_DATATYPE,
                 PF_ACTUAL_DATA_LENGTH,
                 PF_MAX_DATA_LENGTH,
                 PF_PARM_STATUS,
                 PF_PARM_NAME,
                 PF_PARM_NAME_LENGTH,
                 TDS_NULL);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDINFPRM for user-id parameter failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  IF PF_DATATYPE ^= TDSCHAR & PF_DATATYPE ^= TDSVARYCHAR THEN
  DO;
    INFO_MSG_STR = 'user-id datatype must be TDSCHAR';
    CALL SEND_INFO_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  /*------------------------------------------------------------*/
  /* retrieves the data from an RPC parameter sent by a remote  */
  /* client                                                     */
  /*------------------------------------------------------------*/
 
  CALL TDRCVPRM( GWL_TDPROC,
                 GWL_RC,
                 PF_PARM_ID,
                 PF_USER,
                 TDSCHAR,
                 STG(PF_USER),
                 PF_ACTUAL_DATA_LENGTH);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDRCVPRM for user-id failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  PF_USER_LEN = PF_ACTUAL_DATA_LENGTH ;

 /*------------------------------------------------------------*/
  /* retrieves parameter type, datatype, and length information */
  /* about the 3rd RPC parameter( password parameter )          */
  /*------------------------------------------------------------*/
  IF PF_NUM_OF_PARMS = 3 THEN
  DO ;
    PF_PARM_ID = 3;
 
    CALL TDINFPRM( GWL_TDPROC,
                   GWL_RC,
                   PF_PARM_ID,
                   PF_DATATYPE,
                   PF_ACTUAL_DATA_LENGTH,
                   PF_MAX_DATA_LENGTH,
                   PF_PARM_STATUS,
                   PF_PARM_NAME,
                   PF_PARM_NAME_LENGTH,
                   TDS_NULL);
 
    IF GWL_RC ^= TDS_OK THEN
    DO;
      ERROR_TEXT = 'TDINFPRM for password parameter failed.';
      ERROR_RC   = GWL_RC;
      CALL SEND_ERROR_MESSAGE;
      GO TO ALL_DONE;
    END;
 
    IF PF_DATATYPE ^= TDSCHAR & PF_DATATYPE ^= TDSVARYCHAR THEN
    DO;
      INFO_MSG_STR = 'password datatype must be TDSCHAR';
      CALL SEND_INFO_MESSAGE;
      GO TO ALL_DONE;
    END;
 
  /*------------------------------------------------------------*/
  /* retrieves the data from an RPC parameter sent by a remote  */
  /* client                                                     */
  /*------------------------------------------------------------*/
 
    CALL TDRCVPRM( GWL_TDPROC,
                   GWL_RC,
                   PF_PARM_ID,
                   PF_PWD,
                   TDSCHAR,
                   STG(PF_PWD),
                   PF_ACTUAL_DATA_LENGTH);
 
    IF GWL_RC ^= TDS_OK THEN
    DO;
      ERROR_TEXT = 'TDRCVPRM for password failed.';
      ERROR_RC   = GWL_RC;
      CALL SEND_ERROR_MESSAGE;
      GO TO ALL_DONE;
    END;
 
    PF_PWD_LEN = PF_ACTUAL_DATA_LENGTH ;
  END ;
  ELSE DO ;
    PF_PWD     = BLANK ;
    PF_PWD_LEN = 0 ;
  END ;
  /*---------------------------------------*/
  /* display server and user-id heading    */
  /*---------------------------------------*/
 
  INFO_MSG_STR = SERVER_HDR || PF_SERVER ||
                 USER_HDR   || PF_USER ;
  CALL SEND_INFO_MESSAGE;
 
  INFO_MSG_STR = BLANK ;
  CALL SEND_INFO_MESSAGE;
 
 
  INFO_MSG_STR = BLANK ;
  CALL SEND_INFO_MESSAGE;
 
  /*-----------------------------------------------------------*/
  /* describe the 1st column in a result row and the mainframe */
  /* server program variable where it is stored                */
  /*-----------------------------------------------------------*/
 
  DF_COLUMN_NUMBER = 1;
  DF_HOST_VARIABLE_TYPE   = TDSVARYCHAR;
  DF_HOST_VARIABLE_MAXLEN = STG(CF_COL_FIRSTNME) - 2;
  DF_HOST_VARIABLE_NAME   = ADDR(CF_COL_FIRSTNME);
  DF_NULL_INDICATOR_VAR   = TDS_ZERO;    /* not null */
  DF_NULLS_ALLOWED        = TDS_FALSE;
  DF_COLUMN_TYPE          = TDSVARYCHAR;
  DF_COLUMN_MAXLEN        = STG(CF_COL_FIRSTNME) - 2;
  DF_COLUMN_NAME          = 'FIRST NAME';
  DF_COLUMN_NAME_LEN      = 10;          /* length of 'FIRST NAME' */
 
  CALL TDESCRIB( GWL_TDPROC,
                 GWL_RC,
                 DF_COLUMN_NUMBER,
                 DF_HOST_VARIABLE_TYPE,
                 DF_HOST_VARIABLE_MAXLEN,
                 CF_COL_FIRSTNME,
                 DF_NULL_INDICATOR_VAR,
                 DF_NULLS_ALLOWED,
                 DF_COLUMN_TYPE,
                 DF_COLUMN_MAXLEN,
                 DF_COLUMN_NAME,
                 DF_COLUMN_NAME_LEN);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDESCRIB failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
    GO TO ALL_DONE;
  END;
 
  /*------------------------------------------------------------*/
  /* Open Client calls                                          */
  /*------------------------------------------------------------*/
 
  CALL OC_INIT;
 
  CALL OC_CONNECT;
 
  CALL OC_SEND_LANG;
 
  CALL OC_PROCESS_RESULTS;
 
  CALL OC_ALL_DONE;
 
  ALL_DONE:
 
  /*------------------------------------------------------------*/
  /* send a results completion indication to the client         */
  /*------------------------------------------------------------*/
 
  CALL TDSNDDON( GWL_TDPROC,
                 GWL_RC,
                 TDS_DONE_FINAL,
                 TDS_NULL,
                 TDS_ZERO,
                 TDS_ENDRPC);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDSNDDON failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
  END;
 
  /*------------------------------------------------------------*/
  /* free up a previously allocated GWL_TDPROC structure after  */
  /* returning results to a client                              */
  /*------------------------------------------------------------*/
 
  CALL TDFREE( GWL_TDPROC,
               GWL_RC);
 
  IF GWL_RC ^= TDS_OK THEN
  DO;
    ERROR_TEXT = 'TDFREE failed.';
    ERROR_RC   = GWL_RC;
    CALL SEND_ERROR_MESSAGE;
  END;
 
  EXEC CICS RETURN;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to initialize the Client-Library                      */
  /*------------------------------------------------------------------*/
 
  OC_INIT: PROC;
 
  /*------------------------------------------------------------------*/
  /* initialize the Client-Library                                    */
  /*------------------------------------------------------------------*/
 
          CALL CTBINIT( CSL_CTX_HANDLE,
                        CSL_RC,
                        CS_VERSION_46);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBINIT failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  END OC_INIT;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to allocate connect handler, alter properties for     */
  /* user-id and password, set up retrieval of all Open Client        */
  /* messages, and open connection to the server                      */
  /*------------------------------------------------------------------*/
 
  OC_CONNECT: PROC;
 
  /*------------------------------------------------------------*/
  /* allocate a connection to the server                        */
  /*------------------------------------------------------------*/
 
          CALL CTBCONALLOC( CSL_CTX_HANDLE,
                            CSL_RC,
                            CSL_CON_HANDLE);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCONALLOC failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  /*------------------------------------------------------------*/
  /* alter properties of the connection for user-id             */
  /*------------------------------------------------------------*/
 
          PF_STRLEN = STG(PF_USER);
 
          CALL CTBCONPROPS( CSL_CON_HANDLE,
                            CSL_RC,
                            CS_SET,
                            CS_USERNAME,
                            PF_USER,
                            PF_USER_LEN,
                            CS_FALSE,
                            CS_UNUSED);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCONPROPS for user-id failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
          PF_STRLEN = 0;
 
  /*------------------------------------------------------------*/
  /* alter properties of the connection for password            */
  /*------------------------------------------------------------*/
 
          CALL CTBCONPROPS( CSL_CON_HANDLE,
                            CSL_RC,
                            CS_SET,
                            CS_PASSWORD,
                            PF_PWD,
                            PF_PWD_LEN,
                            CS_FALSE,
                            CS_UNUSED);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCONPROPS for password failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  /*------------------------------------------------------------*/
  /* setup retrieval of All Messages                            */
  /*------------------------------------------------------------*/
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_INIT,
                        CS_ALLMSG_TYPE,
                        CS_UNUSED,
                        CS_UNUSED ) ;
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO ;
              MSGSTR = 'CTBDIAG CS_INIT failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END ;
 
  /*------------------------------------------------------------*/
  /* set the upper limit of number of messages                  */
  /*------------------------------------------------------------*/
 
          PF_MSGLIMIT = 5 ;
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_MSGLIMIT,
                        CS_ALLMSG_TYPE,
                        CS_UNUSED,
                        PF_MSGLIMIT ) ;
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO ;
              MSGSTR = 'CTBDIAG CS_MSGLIMIT failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END ;
 
  /*------------------------------------------------------------*/
  /* open connection to the server                              */
  /*------------------------------------------------------------*/
 
          CALL CTBCONNECT( CSL_CON_HANDLE,
                           CSL_RC,
                           PF_SERVER,
                           PF_SERVER_LEN,
                           CS_FALSE);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCONNECT failed' ;
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  END OC_CONNECT;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to allocate command handler, prepare and send the     */
  /* language request                                                 */
  /*------------------------------------------------------------------*/
 
  OC_SEND_LANG: PROC;
 
  /*------------------------------------------------------------*/
  /* allocate a command handle                                  */
  /*------------------------------------------------------------*/
 
          CALL CTBCMDALLOC( CSL_CON_HANDLE,
                            CSL_RC,
                            CSL_CMD_HANDLE);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCMDALLOC failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  /*------------------------------------------------------------*/
  /* prepare the language request                               */
  /*------------------------------------------------------------*/
 
          PF_STRLEN = STG(LF_LANG);
 
          CALL CTBCOMMAND( CSL_CMD_HANDLE,
                           CSL_RC,
                           CS_LANG_CMD,
                           LF_LANG,
                           PF_STRLEN,
                           CS_UNUSED);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCOMMAND failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  /*------------------------------------------------------------*/
  /* send the language request                                  */
  /*------------------------------------------------------------*/
 
          CALL CTBSEND( CSL_CMD_HANDLE,
                        CSL_RC);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBSEND failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  END OC_SEND_LANG;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to process the result                                 */
  /*------------------------------------------------------------------*/
 
  OC_PROCESS_RESULTS: PROC;
 
          DORESULTS: DO WHILE(1=1);
 
  /*------------------------------------------------------------*/
  /* set up the results data                                    */
  /*------------------------------------------------------------*/
 
              CALL CTBRESULTS( CSL_CMD_HANDLE,
                               CSL_RC,
                               RF_TYPE);
 
              IF CSL_RC ^= CS_SUCCEED
                THEN
                  LEAVE DORESULTS;
 
  /*--------------------------------------------------------*/
  /* We need to bind the data to program variables.         */
  /* We don't care about the indicator variable             */
  /* so we'll pass NULL for that parameter in CTBBIND().    */
  /*--------------------------------------------------------*/
 
              IF RF_TYPE = CS_ROW_RESULT THEN
              DO;
 
                  /*---------------------------------*/
                  /* bind the first column, FIRSTNME */
                  /* defined as VARCHAR(12)          */
                  /*---------------------------------*/
 
                  DF_DATATYPE   = CS_VARCHAR_TYPE;
                  DF_FORMAT     = CS_FMT_UNUSED;
                  DF_MAXLENGTH  = STG(CF_COL_FIRSTNME) - 2;
                  DF_COUNT = 1; /* rows per fetch */
 
                  /*-----------------------*/
                  /* bind the first column */
                  /*-----------------------*/
 
                  CF_COL_NUMBER = 1;
 
                  CALL CTBBIND( CSL_CMD_HANDLE,
                                CSL_RC,
                                CF_COL_NUMBER,
                                DATAFMT,
                                CF_COL_FIRSTNME,
                                CF_COL_OUTLEN,
                                CS_PARAM_NOTNULL,
                                CF_COL_INDICATOR,
                                CS_PARAM_NULL);
 
                  IF CSL_RC ^= CS_SUCCEED THEN
                  DO;
                      MSGSTR = 'CTBBIND first name failed.';
                      CALL ERROR_OUT;
                      GO TO ALL_DONE;
                  END;
 
                  /*-------------------------------------------*/
                  /* loop to fetch all rows in this result set */
                  /*-------------------------------------------*/
 
                  DOFETCHROW: DO WHILE(1=1);
 
                      CALL CTBFETCH( CSL_CMD_HANDLE,
                                     CSL_RC,
                                     CS_UNUSED, /* type   */
                                     CS_UNUSED, /* offset */
                                     CS_UNUSED, /* option */
                                     FF_ROWS_READ);
 
                      IF CSL_RC ^= CS_SUCCEED
                        THEN
                          LEAVE DOFETCHROW;
 
                      FF_ROW_NUM = FF_ROW_NUM + 1;
 
                  /*-------------------------------------------*/
                  /* send a row of data back to the requesting */
                  /* client                                    */
                  /*-------------------------------------------*/
 
                      CALL TDSNDROW( GWL_TDPROC,
                                     GWL_RC);
 
                      IF GWL_RC ^= TDS_OK THEN
                      DO;
                        INFO_MSG_STR = MSG_CANCELED;
                        CALL SEND_INFO_MESSAGE;
                      END;
 
                  END; /* end of DOFETCHROW */
 
  /*----------------------------------------------------*/
  /* We're done processing rows. Let's check the final  */
  /* return value of ctbfetch.                          */
  /*----------------------------------------------------*/
 
                  IF CSL_RC = CS_CANCELLED THEN
                  DO;
                      ERROR_TEXT = MSG_CANCELED;
                      ERROR_RC   = 0;
                      CALL SEND_ERROR_MESSAGE;
                  END;
 
                  ELSE IF CSL_RC = CS_END_DATA THEN
                  DO;
                      INFO_MSG_STR = BLANK;
                      CALL SEND_INFO_MESSAGE;
                      INFO_MSG_STR = MSG_END_MSG;
                      CALL SEND_INFO_MESSAGE;
                  END;
 
                  ELSE IF CSL_RC = CS_SUCCEED THEN
                  DO;
                      ERROR_TEXT = 'CTBFETCH unexpected return code';
                      ERROR_RC   = CSL_RC;
                      CALL SEND_ERROR_MESSAGE;
                  END;
 
                  ELSE DO;
                      ERROR_TEXT = 'CTBFETCH failed.';
                      ERROR_RC   = CSL_RC;
                      CALL SEND_ERROR_MESSAGE;
                  END;
 
              END; /* end rftype = cs_row_result */
 
  /*--------------------------------------------------------*/
  /* don't care about status                                */
  /*--------------------------------------------------------*/
 
              ELSE IF RF_TYPE = CS_STATUS_RESULT THEN
              DO;
                  CALL CTBFETCH( CSL_CMD_HANDLE,
                                 CSL_RC,
                                 CS_UNUSED, /* type   */
                                 CS_UNUSED, /* offset */
                                 CS_UNUSED, /* option */
                                 FF_ROWS_READ);
 
                  IF CSL_RC ^= CS_SUCCEED THEN
                  DO;
                      MSGSTR = 'CTBFETCH status failed.';
                      CALL ERROR_OUT;
                  END;
              END;
 
  /*------------------------------------------------------------*/
  /* print an error message if the server encountered an error  */
  /* while executing the request                                */
  /*------------------------------------------------------------*/
 
              ELSE IF RF_TYPE = CS_CMD_FAIL THEN
              DO;
                MSGSTR = 'CTBRESUL returned CS_CMD-FAIL restype' ;
                CALL ERROR_OUT;
 
                INFO_MSG_STR = 'bad user-id or password' ;
                CALL SEND_INFO_MESSAGE;
 
                INFO_MSG_STR = BLANK ;
                CALL SEND_INFO_MESSAGE;
              END;
 
  /*--------------------------------------------------------*/
  /* this means no rows were returned                       */
  /*--------------------------------------------------------*/
 
              ELSE IF RF_TYPE = CS_SUCCEED THEN
              DO;
              END;
 
  /*--------------------------------------------------------*/
  /* done with one result set, let's go on to the next       */
  /*--------------------------------------------------------*/
 
              ELSE IF RF_TYPE = CS_CMD_DONE THEN
              DO;
              END;
 
  /*--------------------------------------------------------*/
  /* the server encountered an error while processing our   */
  /* command                                                */
  /*--------------------------------------------------------*/
 
              ELSE IF RF_TYPE = CS_CMD_FAIL THEN
              DO;
              END;
 
  /*--------------------------------------------------------*/
  /* we got something unexpected                            */
  /*--------------------------------------------------------*/
 
              ELSE
              DO;
              END;
          END; /* end of DORESULTS */
 
  /*-------------------------------------------------------------*/
  /* We're done processing results. Let's check the return value */
  /* of CTBRESULTS() to see if everything went ok.               */
  /*-------------------------------------------------------------*/
 
          IF CSL_RC = CS_END_RESULTS THEN
          DO;
          END;
 
  /*------------------------------------------------------------*/
  /* something terrible happened                                */
  /*------------------------------------------------------------*/
 
          ELSE IF CSL_RC = CS_FAIL THEN
          DO;
              MSGSTR = 'CTBRESULTS failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  /*------------------------------------------------------------*/
  /* we got an unexpected return value                           */
  /*------------------------------------------------------------*/
 
          ELSE
          DO;
              MSGSTR = 'CTBRESULTS failed.';
              CALL ERROR_OUT;
              GO TO ALL_DONE;
          END;
 
  END OC_PROCESS_RESULTS;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to drop the command handler, to close the server      */
  /* connection, to drop the connection handler and exit              */
  /*------------------------------------------------------------------*/
 
  OC_ALL_DONE: PROC;
 
  /*------------------------------------------------------------------*/
  /* drop the command handle                                          */
  /*------------------------------------------------------------------*/
 
          CALL CTBCMDDROP( CSL_CMD_HANDLE,
                           CSL_RC);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCMDDROP failed.';
              CALL ERROR_OUT;
          END;
 
  /*------------------------------------------------------------------*/
  /* close the server connection                                      */
  /*------------------------------------------------------------------*/
 
          CALL CTBCLOSE( CSL_CON_HANDLE,
                         CSL_RC,
                         CS_UNUSED);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCLOSE failed.';
              CALL ERROR_OUT;
          END;
 
  /*------------------------------------------------------------------*/
  /* de-allocate the connection handler                               */
  /*------------------------------------------------------------------*/
 
          CALL CTBCONDROP( CSL_CON_HANDLE,
                           CSL_RC);
 
          IF CSL_RC ^= CS_SUCCEED THEN
          DO;
              MSGSTR = 'CTBCONDROP failed.';
              CALL ERROR_OUT;
          END;
 
  END OC_ALL_DONE;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to send an error message to the client                */
  /*------------------------------------------------------------------*/
 
  SEND_ERROR_MESSAGE: PROC;
 
      SF_MESSAGE_TYPE       = TDS_ERROR_MSG;
      SF_MESSAGE_NUMBER     = 0;
      SF_SEVERITY           = 10; /* TDS_ERROR_SEV */
      SF_ERROR_STATE        = 0;
      SF_LINE_ID            = 0;
      SF_TRANSACTION_ID_LEN = STG(SF_TRANSACTION_ID);
      SF_MESSAGE_TEXT       = ERROR_MSG_STR;
      SF_MESSAGE_LENGTH     = STG(SF_MESSAGE_TEXT);
 
      CALL TDSNDMSG( GWL_TDPROC,
                     GWL_RC,
                     SF_MESSAGE_TYPE,       /* msg type      */
                     SF_MESSAGE_NUMBER,     /* return_code   */
                     SF_SEVERITY,           /* TDS_ERROR_SEV */
                     SF_ERROR_STATE,        /* error state   */
                     SF_LINE_ID,            /* line #        */
                     SF_TRANSACTION_ID,     /* transaction id*/
                     SF_TRANSACTION_ID_LEN, /* tid len       */
                     SF_MESSAGE_TEXT,       /* msg           */
                     SF_MESSAGE_LENGTH);    /* msg len       */
 
  END SEND_ERROR_MESSAGE;
 
  /*------------------------------------------------------------------*/
  /* Subroutine to send an information message to the client          */
  /*------------------------------------------------------------------*/
 
  SEND_INFO_MESSAGE: PROC;
 
      SF_MESSAGE_TYPE       = TDS_INFO_MSG;
      SF_MESSAGE_NUMBER     = 0;
      SF_SEVERITY           = 0; /* TDS_INFO_SEV */
      SF_ERROR_STATE        = 0;
      SF_LINE_ID            = 0;
      SF_TRANSACTION_ID_LEN = STG(SF_TRANSACTION_ID);
      SF_MESSAGE_TEXT       = INFO_MSG_STR;
      SF_MESSAGE_LENGTH     = STG(SF_MESSAGE_TEXT);
 
      CALL TDSNDMSG( GWL_TDPROC,
                     GWL_RC,
                     SF_MESSAGE_TYPE,       /* msg type      */
                     SF_MESSAGE_NUMBER,     /* return_code   */
                     SF_SEVERITY,           /* TDS_ERROR_SEV */
                     SF_ERROR_STATE,        /* error state   */
                     SF_LINE_ID,            /* line #        */
                     SF_TRANSACTION_ID,     /* transaction id*/
                     SF_TRANSACTION_ID_LEN, /* tid len       */
                     SF_MESSAGE_TEXT,       /* msg           */
                     SF_MESSAGE_LENGTH);    /* msg len       */
 
  END SEND_INFO_MESSAGE;
 
  /*------------------------------------------------------------------*/
  /*                                                                  */
  /* Subroutine to print output messages.                             */
  /*                                                                  */
  /*------------------------------------------------------------------*/
 
  ERROR_OUT: PROC;
 
          IF DIAG_MSGS_INIT
            THEN
              CALL GET_DIAG_MESSAGES ;

 /*------------------------------------------------------------------*/
  /* display error messages                                           */
  /*------------------------------------------------------------------*/
 
          SAMP_RC   = CSL_RC;
          REST_TYPE = RF_TYPE ;
 
          INFO_MSG_STR = BLANK ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = TEST_CASE || SAMP_LIT  || SAMP_RC ||
                         REST_LIT  || REST_TYPE || '   '   ||
                         MSGSTR ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = BLANK ;
          CALL SEND_INFO_MESSAGE;
 
          SAMP_RC      = 0;
          REST_TYPE    = 0 ;
 
  END ERROR_OUT;
 
  /*------------------------------------------------------------------*/
  /*                                                                  */
  /* Subroutine to retrieve any diagnostic messages                   */
  /*                                                                  */
  /*------------------------------------------------------------------*/
  GET_DIAG_MESSAGES: PROC ;
 
  DCL CNT        FIXED BIN(15) ;
 
  /*------------------------------------------------------------------*/
  /* Disable calls to this subroutine                                 */
  /*------------------------------------------------------------------*/
 
          DIAG_MSGS_INIT = FALSE ;
 
  /*------------------------------------------------------------------*/
  /* First, get client messages                                       */
  /*------------------------------------------------------------------*/
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_STATUS,
                        CS_CLIENTMSG_TYPE,
                        CS_UNUSED,
                        DF_NUM_OF_MSGS ) ;
 
          IF CSL_RC ^= CS_SUCCEED THEN
            DO ;
              ERROR_TEXT = 'CTBDIAG CS_STATUS CLIENTMSG_TYPE failed';
              ERROR_RC   = CSL_RC;
              CALL SEND_ERROR_MESSAGE;
              GO TO ALL_DONE;
            END ;
            ELSE DO ;
              IF DF_NUM_OF_MSGS > 0 THEN
                DO ;
                  DO CNT = 1 TO DF_NUM_OF_MSGS ;
                    CALL RETRIEVE_CLIENT_MSGS ;
                  END ;
                END ;
            END ;
 
  /*------------------------------------------------------------------*/
  /* Then, get server messages                                        */
  /*------------------------------------------------------------------*/
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_STATUS,
                        CS_SERVERMSG_TYPE,
                        CS_UNUSED,
                        DF_NUM_OF_MSGS ) ;
 
          IF CSL_RC ^= CS_SUCCEED THEN
            DO ;
              ERROR_TEXT = 'CTBDIAG CS_STATUS SERVERMSG_TYPE failed' ;
              ERROR_RC   = CSL_RC;
              CALL SEND_ERROR_MESSAGE;
              GO TO ALL_DONE;
            END ;
            ELSE DO ;
              IF DF_NUM_OF_MSGS > 0 THEN
                DO ;
                  DO CNT = 1 TO DF_NUM_OF_MSGS ;
                    CALL RETRIEVE_SERVER_MSGS ;
                  END ;
                END ;
            END ;
 
  END GET_DIAG_MESSAGES ;
 
  /*------------------------------------------------------------------*/
  /*                                                                  */
  /* Subroutine to retrieve diagnostic messages from client           */
  /*                                                                  */
  /*------------------------------------------------------------------*/
  RETRIEVE_CLIENT_MSGS: PROC ;
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_GET,
                        CS_CLIENTMSG_TYPE,
                        DF_MSGNO,
                        CLIENT_MSG ) ;
 
          IF CSL_RC ^=  CS_SUCCEED THEN
          DO ;
              ERROR_TEXT = 'CTBDIAG CS_GET CS_CLIENTMSG_TYPE FAILED' ;
              ERROR_RC   = CSL_RC;
              CALL SEND_ERROR_MESSAGE;
              GO TO ALL_DONE;
          END ;
 
  /*------------------------------------------------------------------*/
  /* display message text                                             */
  /*------------------------------------------------------------------*/
 
          INFO_MSG_STR = 'Client Message:' ;
          CALL SEND_INFO_MESSAGE;
          INFO_MSG_STR = BLANK ;
          CALL SEND_INFO_MESSAGE;
 
          CM_SEVERITY_DATA = CM_SEVERITY ;
          CM_STATUS_DATA   = CM_STATUS ;
          INFO_MSG_STR     = CM_SEVERITY_HDR || CM_SEVERITY_DATA ||
                             CM_STATUS_HDR   || CM_STATUS_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          CM_OC_MSGNO_DATA = CM_MSGNO ;
          INFO_MSG_STR     = CM_OC_MSGNO_HDR || CM_OC_MSGNO_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          IF CM_MSGNO ^= 0 THEN
          DO ;
              CM_OC_MSG_DATA     = SUBSTR( CM_TEXT, 1, 66 ) ;
              INFO_MSG_STR       = CM_OC_MSG_HDR || CM_OC_MSG_DATA ;
              CALL SEND_INFO_MESSAGE;
 
              IF CM_TEXT_LEN > 66 THEN
              DO ;
                  CM_OC_MSG_DATA_X = SUBSTR( CM_TEXT, 67, 66 ) ;
                  INFO_MSG_STR     = BLANK_13 || CM_OC_MSG_DATA_X ;
                  CALL SEND_INFO_MESSAGE;
 
                  IF CM_TEXT_LEN > 132 THEN
                  DO ;
                      CM_OC_MSG_DATA_X = SUBSTR( CM_TEXT, 133, 66 ) ;
                      INFO_MSG_STR     = BLANK_13 ||
                                         CM_OC_MSG_DATA_X ;
                      CALL SEND_INFO_MESSAGE;
 
                      IF CM_TEXT_LEN > 198 THEN
                      DO ;
                          CM_OC_MSG_DATA_X = SUBSTR( CM_TEXT, 199 ) ;
                          INFO_MSG_STR     = BLANK_13 ||
                                             CM_OC_MSG_DATA_X ;
                          CALL SEND_INFO_MESSAGE;
 
                      END ;
                  END ;
              END ;
          END ;
          ELSE DO ;
            INFO_MSG_STR = '  OC MsgTx: No Message' ;
            CALL SEND_INFO_MESSAGE;
          END ;
 
          CM_OS_MSGNO_DATA = CM_OS_MSGNO ;
          INFO_MSG_STR     = '  OS MsgNo:  ' || CM_OS_MSGNO_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          IF CM_OS_MSGNO ^= 0 THEN
          DO ;
              CM_OS_MSG_DATA     = SUBSTR( CM_OS_MSGTXT, 1, 66 ) ;
              INFO_MSG_STR       = CM_OS_MSG_HDR_5 ||
                                   CM_OS_MSG_DATA ;
              CALL SEND_INFO_MESSAGE;
 
              IF CM_OS_MSGTEXT_LEN > 66 THEN
              DO ;
                  CM_OC_MSG_DATA_X = SUBSTR( CM_OS_MSGTXT, 67, 66 ) ;
                  INFO_MSG_STR     = BLANK_13 || CM_OC_MSG_DATA_X ;
                  CALL SEND_INFO_MESSAGE;
 
                  IF CM_OS_MSGTEXT_LEN > 132 THEN
                  DO ;
                      CM_OC_MSG_DATA_X = SUBSTR( CM_OS_MSGTXT,133,66 );
                      INFO_MSG_STR     = BLANK_13 || CM_OC_MSG_DATA_X ;
                      CALL SEND_INFO_MESSAGE;
 
                      IF CM_OS_MSGTEXT_LEN > 198 THEN
                      DO ;
                          CM_OC_MSG_DATA_X = SUBSTR( CM_OS_MSGTXT,199 );
                          INFO_MSG_STR     = BLANK_13 ||
                                             CM_OC_MSG_DATA_X ;
                          CALL SEND_INFO_MESSAGE;
                      END ;
                  END ;
              END ;
          END ;
          ELSE DO ;
            INFO_MSG_STR = '  OS MsgTx:  No Message!' ;
            CALL SEND_INFO_MESSAGE;
          END ;
 
  END RETRIEVE_CLIENT_MSGS ;
 
  /*------------------------------------------------------------------*/
  /*                                                                  */
  /* Subroutine to retrieve diagnostic messages from server           */
  /*                                                                  */
  /*------------------------------------------------------------------*/
  RETRIEVE_SERVER_MSGS: PROC ;
 
          CALL CTBDIAG( CSL_CON_HANDLE,
                        CSL_RC,
                        CS_UNUSED,
                        CS_GET,
                        CS_SERVERMSG_TYPE,
                        DF_MSGNO,
                        SERVER_MSG ) ;
 
          IF CSL_RC ^= CS_SUCCEED THEN
            DO ;
              ERROR_TEXT = 'CTBDIAG CS_GET CS_SERVERMSG_TYPE failed' ;
              ERROR_RC   = CSL_RC;
              CALL SEND_ERROR_MESSAGE;
              GO TO ALL_DONE;
            END ;
 
  /*------------------------------------------------------------------*/
  /* display message text                                             */
  /*------------------------------------------------------------------*/
 
          SM_MSG_NO_DATA     = SM_MSGNO ;
          SM_SEVERITY_DATA   = SM_SEV ;
          SM_STATE_DATA      = SM_STATE ;
          SM_LINE_NO_DATA    = SM_LINE ;
          SM_STATUS_DATA     = SM_STATUS ;
 
          IF SM_SVRNAME_LEN > 66
            THEN
              SM_SVRNAME_DATA = SUBSTR( SM_SVRNAME, 1, 63 ) || '...' ;
            ELSE
              SM_SVRNAME_DATA = SUBSTR( SM_SVRNAME, 1, 66 ) ;
 
          IF SM_PROC_LEN > 66
            THEN
              SM_PROC_ID_DATA = SUBSTR( SM_PROC, 1, 63 ) || '...' ;
            ELSE
              SM_PROC_ID_DATA = SUBSTR( SM_PROC, 1, 66 ) ;
 
          SM_MSG_DATA  = SUBSTR( SM_TEXT, 1, 66 ) ;
 
          INFO_MSG_STR = 'Server Message:' ;
          CALL SEND_INFO_MESSAGE;
          INFO_MSG_STR = BLANK ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = SM_MSG_NO_HDR   || SM_MSG_NO_DATA ||
                         SM_SEVERITY_HDR || SM_SEVERITY_DATA ||
                         SM_STATE_HDR    || SM_STATE_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = SM_LINE_NO_HDR  || SM_LINE_NO_DATA ||
                         SM_STATUS_HDR   || SM_STATUS_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = SM_SVRNAME_HDR  || SM_SVRNAME_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = SM_PROC_ID_HDR  || SM_PROC_ID_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          INFO_MSG_STR = SM_MSG_HDR      || SM_MSG_DATA ;
          CALL SEND_INFO_MESSAGE;
 
          IF SM_TEXT_LEN > 66 THEN
            DO ;
              SM_MSG_DATA_X = SUBSTR( SM_TEXT, 67, 66 ) ;
              INFO_MSG_STR  = BLANK_13 || SM_MSG_DATA_X ;
              CALL SEND_INFO_MESSAGE;
 
              IF SM_TEXT_LEN > 132 THEN
                DO ;
                  SM_MSG_DATA_X = SUBSTR( SM_TEXT, 133, 66 ) ;
                  INFO_MSG_STR  = BLANK_13 || SM_MSG_DATA_X ;
                  CALL SEND_INFO_MESSAGE;
 
                  IF SM_TEXT_LEN > 198 THEN
                    DO ;
                      SM_MSG_DATA_X = SUBSTR( SM_TEXT, 198 ) ;
                      INFO_MSG_STR = BLANK_13 || SM_MSG_DATA_X ;
                      CALL SEND_INFO_MESSAGE;
                    END ;
                END ;
            END ;
 
  END RETRIEVE_SERVER_MSGS ;
 
  END  SYCTSAX4;
       *@(#) syctsax5.cobol 1.2 4/18/96