DSN8SPM

THIS MODULE DISPLAYS AN APPLICATION SELECTION PANEL.

 DSN8SPM: PROC OPTIONS (MAIN);                                          
 /********************************************************************/ 
 /*  MODULE NAME = DSN8SPM                                           */ 
 /*                                                                  */ 
 /*  DESCRIPTIVE NAME = DB2 SAMPLE APPLICATION                       */ 
 /*                     ISPF DB2 CONNECTION MANAGER                  */ 
 /*                     ISPF/TSO                                     */ 
 /*                     PL/I                                         */ 
 /*                                                                  */ 
 /*    LICENSED MATERIALS - PROPERTY OF IBM                          */ 
 /*    5695-DB2                                                      */ 
 /*    (C) COPYRIGHT 1982, 1995 IBM CORP.  ALL RIGHTS RESERVED.      */ 
 /*                                                                  */ 
 /*    STATUS = VERSION 4                                            */ 
 /*                                                                  */ 
 /*  FUNCTION = THIS MODULE DISPLAYS AN APPLICATION                  */ 
 /*             SELECTION PANEL.  THE SELECTED APPLICATION           */ 
 /*             IS INVOKED USING THE CALL ATTACH FACILITY.           */ 
 /*                                                                  */ 
 /*  NOTES = NONE                                                    */ 
 /*                                                                  */ 
 /*  MODULE TYPE =                                                   */ 
 /*     PROCESSOR   = DB2 PREPROCESSOR, PL/I COMPILER                */ 
 /*     MODULE SIZE = SEE LINKEDIT                                   */ 
 /*     ATTRIBUTES  = REUSABLE                                       */ 
 /*                                                                  */ 
 /*  ENTRY POINT =  DSN8SPM                                          */ 
 /*     PURPOSE      = SEE FUNCTION                                  */ 
 /*     LINKAGE      = ISPF                                          */ 
 /*                                                                  */ 
 /*     INPUT = PARAMETERS EXPLICITLY PASSED TO THIS PROGRAM:        */ 
 /*        SYMBOLIC LABEL/NAME = NONE                                */ 
 /*        DESCRIPTION = NOT APPLICABLE                              */ 
 /*                                                                  */ 
 /*     OUTPUT = PARAMETERS EXPLICITLY RETURNED:                     */ 
 /*        SYMBOLIC LABEL/NAME = NONE                                */ 
 /*        DESCRIPTION = NOT APPLICABLE                              */ 
 /*                                                                  */ 
 /*     EXIT-NORMAL = RETURN CODE 0                                  */ 
 /*                                                                  */ 
 /*     EXIT-ERROR =                                                 */ 
 /*        RETURN CODE    = NONE                                     */ 
 /*        ABEND CODES    = NONE                                     */ 
 /*        ERROR MESSAGES = NONE                                     */ 
 /*                                                                  */ 
 /*          DSN8080E   APPLICATION TERMINATED WITH CALL ATTACH      */ 
 /*                     REASON CODE ........                         */ 
 /*          DSN8081E   RESULTS FROM THE CALL ATTACH TRANSLATE       */ 
 /*                     SERVICE                                      */ 
 /*          DSN8082E   THE DISCONNECT TERMINATED WITH REASON        */ 
 /*                     CODE ........                                */ 
 /*          DSN8083E   AN UNKNOWN SERVICE ............ WAS          */ 
 /*                     REQUESTED                                    */ 
 /*                                                                  */ 
 /*        MESSAGES       = NONE                                     */ 
 /*                                                                  */ 
 /*     EXTERNAL REFERENCES =                                        */ 
 /*        ROUTINES/SERVICES = ISPLINK - ISPF SERVICES               */ 
 /*        DATA AREAS        = NONE                                  */ 
 /*        CONTROL BLOCKS    = NONE                                  */ 
 /*        TABLES            = NONE                                  */ 
 /*        CHANGE ACTIVITY   =                                       */ 
 /*        03-01-94 INITIALIZE THE ISPF PANEL MESSAGE WITH BLANKS    */ 
 /*                 AND UPDATE COPYRIGHT INFO  PN52970  KEF1040  @40 */ 
 /*                                                                  */ 
 /*  *PSEUDOCODE*                                                    */ 
 /*                                                                  */ 
 /*    DECLARATIONS                                                  */ 
 /*    INITIALIZATION                                                */ 
 /*    DO WHILE ^EXIT                                                */ 
 /*      DISPLAY APPLICATION SELECTION PANEL                         */ 
 /*      IF END IS REQUESTED THEN                                    */ 
 /*      --DO                                                        */ 
 /*      |   EXIT = YES                                              */ 
 /*      |   IF CONNECTED THEN                                       */ 
 /*      |   --DO                                                    */ 
 /*      |   |   DISCONNECT FROM DB2                                 */ 
 /*      |   |   IF DISCONNECT FAILED THEN                           */ 
 /*      |   |       DISPLAY LINE MODE MESSAGE                       */ 
 /*      |   --END                                                   */ 
 /*      --END                                                       */ 
 /*      IF ^EXIT THEN                                               */ 
 /*      --DO                                                        */ 
 /*      |   IF (CONNECTED TO DB2)&(SSID ^= CONNECTED SSID) THEN     */ 
 /*      |   --DO                                                    */ 
 /*      |   |   DISCONNECT FROM DB2                                 */ 
 /*      |   |   IF DISCONNECT FAILED THEN                           */ 
 /*      |   |   --DO                                                */ 
 /*      |   |   |   CONTINUE = NO                                   */ 
 /*      |   |   |   PUT REASON CODE OUT                             */ 
 /*      |   |   --END                                               */ 
 /*      |   |   ELSE                                                */ 
 /*      |   |       CONNECTED = NO                                  */ 
 /*      |   --END                                                   */ 
 /*      |   IF (^CONNECTED TO DB2) & (CONTINUE) THEN                */ 
 /*      |   --DO                                                    */ 
 /*      |   |   CONNECTION TO DB2                                   */ 
 /*      |   |   IF CONNECTION IS SUCCESSFUL THEN                    */ 
 /*      |   |   --DO                                                */ 
 /*      |   |   |   CONTINUE = YES                                  */ 
 /*      |   |   |   CONNECTED = YES                                 */ 
 /*      |   |   --END                                               */ 
 /*      |   |   ELSE                                                */ 
 /*      |   |   --DO                                                */ 
 /*      |   |   |   CONTINUE = NO                                   */ 
 /*      |   |   |   PUT OUT REASON CODE                             */ 
 /*      |   |   --END                                               */ 
 /*      |   --END                                                   */ 
 /*      |   IF CONTINUE THEN                                        */ 
 /*      |   --DO                                                    */ 
 /*      |   |   OPEN                                                */ 
 /*      |   |   IF OPEN IS SUCCESSFUL THEN                          */ 
 /*      |   |       CONTINUE = YES                                  */ 
 /*      |   |   ELSE                                                */ 
 /*      |   |   --DO                                                */ 
 /*      |   |   |   TRANSLATE                                       */ 
 /*      |   |   |   CONTINUE = NO                                   */ 
 /*      |   |   |   PUT OUT REASON CODE                             */ 
 /*      |   |   --END                                               */ 
 /*      |   --END                                                   */ 
 /*      |   IF CONTINUE THEN                                        */ 
 /*      |   --DO                                                    */ 
 /*      |   |   ISPLINK TO THE APPLICATION PROGRAM                  */ 
 /*      |   |   IF BAD RETURN THEN                                  */ 
 /*      |   |       SPECIFY 'ABRT' AS THE TERMINATION OPTION        */ 
 /*      |   |   ELSE                                                */ 
 /*      |   |       SPECIFY 'SYNC' AS THE TERMINATION OPTION        */ 
 /*      |   --END                                                   */ 
 /*      |   IF CONTINUE THEN                                        */ 
 /*      |   --DO                                                    */ 
 /*      |   |   CLOSE                                               */ 
 /*      |   |   IF CLOSE FAILS THEN                                 */ 
 /*      |   |   --DO                                                */ 
 /*      |   |   |   IF CAF-RESET THEN                               */ 
 /*      |   |   |       CONNECTED = NO                              */ 
 /*      |   |   |   PUT REASON CODE OUT                             */ 
 /*      |   |   --END                                               */ 
 /*      |   --END                                                   */ 
 /*      --END                                                       */ 
 /*    END                                                           */ 
 /********************************************************************/ 
                                                                        
 /*  PROGRAM IDENTIFICATION SECTION                                  */ 
 %DCL COMPILETIME        BUILTIN;                                       
 %DCL COMPTIME           CHAR;                                          
 %COMPTIME = '''' || COMPILETIME || '''';                               
                                                                        
 DCL 1 PROGRAM_ID STATIC,                                               
       2 PROGRAM_NAME    CHAR(20) INIT('PROGRAM DSN8SPM     '),         
       2 PROGRAM_VERSION CHAR(19) INIT('VERSION 5 COMPILED '),
       2 PROGRAM_DATIME  CHAR(18) INIT(COMPTIME);               /*@40*/ 
                                                                        
 DCL $$COIBM EXT CHAR(49)                                               
     INIT('COPYRIGHT = 5695-DB2 (C) COPYRIGHT IBM CORP. 1995'); /*@40*/ 
                                                                        
 /********************************************************************/ 
 /* BUILT-IN FUNCTION DECLARATIONS                                   */ 
 /********************************************************************/ 
                                                                        
 DCL PLIRETV     BUILTIN;                                               
 DCL STRING      BUILTIN;                                               
 DCL STG         BUILTIN;                                               
                                                                        
 /********************************************************************/ 
 /*  FILE DECLARATION FOR MESSAGES OUTSIDE OF ISPF                   */ 
 /********************************************************************/ 
                                                                        
 DCL SYSPRINT    FILE;                                                  
                                                                        
 /********************************************************************/ 
 /* INTERNAL WORKING VARIABLE DECLARATIONS                           */ 
 /********************************************************************/ 
                                                                        
 DCL CONN_SSID   CHAR(4) INIT(' ');  /* CURRENT CONNECTED SUBSYSTEM  */ 
 DCL RET_CODE    FIXED DECIMAL(4,0); /* RETURN CODE                  */ 
 DCL CONNECTED   BIT(1);             /* CONNECTION INDICATOR         */ 
 DCL CONTINUE    BIT(1);             /* CONTINUE PROCESSING FLAG     */ 
 DCL EXIT        BIT(1);             /* EXIT REQUESTED FLAG          */ 
                                                                        
 /********************************************************************/ 
 /* MISCELLANEOUS CONSTANTS                                          */ 
 /********************************************************************/ 
                                                                        
 DCL YES         BIT(1) STATIC INIT('1'B);                              
 DCL NO          BIT(1) STATIC INIT('0'B);                              
                                                                        
 /********************************************************************/ 
 /* ISPF DIALOG VARIABLE NAMES                                       */ 
 /********************************************************************/ 
                                                                        
 DCL SSID_NAME    CHAR(8) STATIC INIT('DSN8SSID');                      
 DCL PROG_NAME    CHAR(8) STATIC INIT('DSN8PROG');                      
 DCL PLAN_NAME    CHAR(8) STATIC INIT('DSN8PLAN');                      
 DCL REAS_NAME    CHAR(8) STATIC INIT('DSN8REAS');                      
 DCL MSGS_NAME    CHAR(8) STATIC INIT('DSN8MSGS');                      
 DCL SQCA_NAME    CHAR(8) STATIC INIT('DSN8SQCA');                      
 DCL TECB_NAME    CHAR(8) STATIC INIT('DSN8TECB');                      
 DCL SECB_NAME    CHAR(8) STATIC INIT('DSN8SECB');                      
 DCL TERM_NAME    CHAR(8) STATIC INIT('DSN8TERM');                      
 DCL ACTN_NAME    CHAR(8) STATIC INIT('DSN8ACTN');                      
 DCL SERV_NAME    CHAR(8) STATIC INIT('DSN8SERV');                      
                                                                        
 /********************************************************************/ 
 /* CALL ATTACH 'CLOSE THREAD' TERMINATION OPTIONS                   */ 
 /********************************************************************/ 
                                                                        
 DCL SYNC        CHAR(4) STATIC INIT('SYNC');                           
 DCL ABRT        CHAR(4) STATIC INIT('ABRT');                           
                                                                        
 /********************************************************************/ 
 /* ISPF DIALOG SERVICES DECLARATIONS                                */ 
 /********************************************************************/ 
                                                                        
 /* ISPF DIALOG SERVICE TYPES                                        */ 
 DCL I_VDEFINE   CHAR(8) STATIC INIT('VDEFINE ');                       
 DCL I_VGET      CHAR(8) STATIC INIT('VGET    ');                       
 DCL I_VPUT      CHAR(8) STATIC INIT('VPUT    ');                       
 DCL I_DISPLAY   CHAR(8) STATIC INIT('DISPLAY ');                       
 DCL I_SELECT    CHAR(8) STATIC INIT('SELECT  ');                       
                                                                        
 /* ISPF CALL MODIFIERS                                              */ 
 DCL I_CHAR      CHAR(8) STATIC INIT('CHAR');                           
 DCL I_FIXD      CHAR(8) STATIC INIT('FIXED');                          
                                                                        
 /* PANEL NAME                                                       */ 
 DCL MAIN_MENU   CHAR(8) STATIC INIT('DSN8SSM');                        
                                                                        
 /* LOCAL VARIABLES FOR ISPF VARIABLES                               */ 
 DCL SSID        CHAR(4) INIT(' ');  /* SUBSYSTEM ID                 */ 
 DCL PROGRAM     CHAR(8);            /* PROGRAM NAME                 */ 
 DCL PLAN        CHAR(8);            /* PLAN NAME                    */ 
 DCL REASON      CHAR(8);            /* CAF REASON CODE              */ 
 DCL TECB        FIXED BIN(31) INIT(0); /* TERMINATION ECB           */ 
 DCL SECB        FIXED BIN(31) INIT(0); /* START ECB                 */ 
 DCL TERM        CHAR(4);               /* TERMINATION OPTION        */ 
 DCL ACTN        CHAR(12);              /* CAF SERVICE REQUEST       */ 
 DCL 1 MSGS      CHAR(71) INIT(' ');  /* INIT ISPF PANEL MESSAGE  @40*/ 
                                                                        
 /* CALL ATTACH FACILITY ASSEMBLER INTERFACE PROGRAM                 */ 
 DCL 1 PGMCA,                                                           
       2 FILLER1                  CHAR(11) INIT('PGM(DSN8CA)');         
 DCL PGMCA_LEN                    FIXED BIN(31) INIT(STG(PGMCA));       
                                                                        
 /* APPLICATION PROGRAM                                              */ 
 DCL 1 APPL_PGM,                                                        
       2 FILLER1                  CHAR(04) INIT('PGM('),                
       2 APPL_NAME                CHAR(08),                             
       2 FILLER2                  CHAR(01) INIT(')');                   
 DCL APPL_LEN                     FIXED BIN(31) INIT(STG(APPL_PGM));    
                                                                        
 /* GENERAL ERROR MESSAGE                                            */ 
 DCL 1 MSG1,                                                            
       2 MSG_NUM                  CHAR(09) INIT(' DSN8080E'),           
       2 FILLER1                  CHAR(01) INIT(' '),                   
       2 MSG_TEXT                 CHAR(51) INIT                         
         ('APPLICATION TERMINATED WITH CALL ATTACH REASON CODE'),       
       2 FILLER2                  CHAR(01) INIT(' '),                   
       2 MSG_REAS                 CHAR(08) INIT(' '),                   
       2 FILLER3                  CHAR(01) INIT(' ');                   
                                                                        
 /* DISCONNECT ERROR MESSAGE                                         */ 
 DCL 1 DISC_MSG,                                                        
       2 DISC_NUM                 CHAR(09) INIT(' DSN8082E'),           
       2 FILLER1                  CHAR(03) INIT(' '),                   
       2 DISC_TEXT                CHAR(42) INIT                         
         ('THE DISCONNECT TERMINATED WITH REASON CODE'),                
       2 FILLER2                  CHAR(01) INIT(' '),                   
       2 DISC_REAS                CHAR(08) INIT(' '),                   
       2 FILLER3                  CHAR(08) INIT(' ');                   
                                                                        
 /* TRANSLATE MESSAGE                                                */ 
 DCL 1 TRAN_MSG,                                                        
       2 TRAN_NUM                 CHAR(09) INIT(' DSN8081E'),           
       2 FILLER1                  CHAR(03) INIT(' '),                   
       2 TRAN_TEXT                CHAR(46) INIT                         
         ('RESULTS FROM THE CALL ATTACH TRANSLATE SERVICE'),            
       2 FILLER2                  CHAR(13) INIT(' ');                   
                                                                        
 /* INVALID SERVICE REQUEST MESSAGE                                  */ 
 DCL 1 BADFN_MSG,                                                       
       2 FN_NUM                   CHAR(09) INIT(' DSN8083E'),           
       2 FILLER1                  CHAR(03) INIT(' '),                   
       2 FN_TEXT1                 CHAR(19) INIT                         
         ('AN UNKNOWN SERVICE '),                                       
       2 SERV                     CHAR(12) INIT(' '),                   
       2 FN_TEXT2                 CHAR(14) INIT                         
         (' WAS REQUESTED'),                                            
       2 FILLER2                  CHAR(14) INIT(' ');                   
                                                                        
 /********************************************************************/ 
 /* CALL ATTACH FACILITY SERVICES DECLARATIONS                       */ 
 /********************************************************************/ 
                                                                        
 DCL CONN_FN                       CHAR(12) INIT('CONNECT     ');       
 DCL OPEN_FN                       CHAR(12) INIT('OPEN        ');       
 DCL CLOS_FN                       CHAR(12) INIT('CLOSE       ');       
 DCL DISC_FN                       CHAR(12) INIT('DISCONNECT  ');       
 DCL XLAT_FN                       CHAR(12) INIT('TRANSLATE   ');       
                                                                        
 /********************************************************************/ 
 /* REASON CODE WHEN CAF HAS CLEANED UP AFTER DB2 HAS BEEN DOWN      */ 
 /********************************************************************/ 
                                                                        
 DCL CAF_RES                       CHAR(08) INIT('00C10824');           
                                                                        
 /********************************************************************/ 
 /* SQL COMMUNICATION AREA                                           */ 
 /********************************************************************/ 
                                                                        
 EXEC SQL INCLUDE SQLCA;                                                
                                                                        
 /********************************************************************/ 
 /* EXTERNAL ENTRY DECLARATION                                       */ 
 /********************************************************************/ 
                                                                        
 DCL ISPLINK     EXTERNAL ENTRY OPTIONS(ASM INTER RETCODE);             
                                                                        
 /********************************************************************/ 
 /* DEFINE PL/I - SPF VARIABLES                                      */ 
 /********************************************************************/ 
                                                                        
 CALL ISPLINK(I_VDEFINE, SSID_NAME, SSID    , I_CHAR, STG(SSID    ));   
 CALL ISPLINK(I_VDEFINE, PROG_NAME, PROGRAM , I_CHAR, STG(PROGRAM ));   
 CALL ISPLINK(I_VDEFINE, PLAN_NAME, PLAN    , I_CHAR, STG(PLAN    ));   
 CALL ISPLINK(I_VDEFINE, MSGS_NAME, MSGS    , I_CHAR, STG(MSGS    ));   
 CALL ISPLINK(I_VDEFINE, REAS_NAME, REASON  , I_CHAR, STG(REASON  ));   
 CALL ISPLINK(I_VDEFINE, SQCA_NAME, SQLCA   , I_CHAR, STG(SQLCA   ));   
 CALL ISPLINK(I_VDEFINE, TECB_NAME, TECB    , I_FIXD, STG(TECB    ));   
 CALL ISPLINK(I_VDEFINE, SECB_NAME, SECB    , I_FIXD, STG(SECB    ));   
 CALL ISPLINK(I_VDEFINE, TERM_NAME, TERM    , I_CHAR, STG(TERM    ));   
 CALL ISPLINK(I_VDEFINE, ACTN_NAME, ACTN    , I_CHAR, STG(ACTN    ));   
 CALL ISPLINK(I_VDEFINE, SERV_NAME, SERV    , I_CHAR, STG(SERV    ));   
                                                                        
 /********************************************************************/ 
 /* INITIALIZATION                                                   */ 
 /********************************************************************/ 
                                                                        
 CONNECTED  = NO;                       /* NOT INITIALLY CONNECTED   */ 
 EXIT = NO;                             /* EXIT NOT PRESSED          */ 
 CALL ISPLINK(I_VGET, SSID_NAME);       /* GET SSID FROM ISPF POOL   */ 
 IF SSID = ' ' THEN SSID = 'DSN';       /* DEFAULT SSID              */ 
                                                                        
 /********************************************************************/ 
 /* DISPLAY SELECTION PANEL UNTIL EXIT REQUESTED                     */ 
 /********************************************************************/ 
                                                                        
 DO WHILE (^EXIT);                                                      
   CONTINUE = YES;                      /* RESET THE CONTINUE FLAG   */ 
   CALL ISPLINK(I_VPUT, MSGS_NAME);     /* SET/RESET MSG ON PANEL    */ 
   CALL ISPLINK(I_DISPLAY, MAIN_MENU);  /* DISPLAY SELECTION PANEL   */ 
   RET_CODE = PLIRETV;                                                  
   IF RET_CODE = 8 THEN                 /* EXIT REQUESTED?           */ 
     DO;                                                                
       EXIT = YES;                      /* SET EXIT FLAG             */ 
                                                                        
       /**************************************************************/ 
       /* IF CONNECTED TO DB2, DISCONNECT                            */ 
       /**************************************************************/ 
                                                                        
       IF CONNECTED THEN                /* IF CONNECTED TO DB2       */ 
         DO;                                                            
           ACTN = DISC_FN;              /* DISCONNECT FROM DB2       */ 
           CALL ISPLINK(I_VPUT, ACTN_NAME);                             
           CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);                    
           RET_CODE = PLIRETV;                                          
                                                                        
           /**********************************************************/ 
           /* IF THE DISCONNECT IS NOT SUCCESSFUL THEN PUT OUT AN    */ 
           /* ERROR MESSAGE                                          */ 
           /**********************************************************/ 
                                                                        
           IF RET_CODE ^= 0 THEN                 /* DISC FAILED      */ 
             DO;                                                        
               CALL ISPLINK(I_VGET, REAS_NAME);  /* GET REASON CODE  */ 
               DISC_REAS = REASON;                                      
               PUT SKIP LIST(STRING(DISC_MSG));  /* PUT OUT MESSAGE  */ 
             END;                                                       
           ELSE                   /* DISCONNECT WAS SUCCESSFUL       */ 
               CONNECTED = NO;    /* NO LONGER CONNECTED TO DB2      */ 
         END;                     /* END IF CONNECTED                */ 
     END;                         /* END IF EXIT REQUESTED           */ 
                                                                        
     /****************************************************************/ 
     /* IF EXIT NOT REQUESTED, PROCESS THE REQUEST                   */ 
     /****************************************************************/ 
                                                                        
     IF ^EXIT THEN                                                      
       DO;                                                              
         CALL ISPLINK(I_VGET, SSID_NAME);  /* GET SSID FROM PANEL    */ 
         MSGS = ' ';                       /* RESET MESSAGE FIELD    */ 
                                                                        
         /************************************************************/ 
         /* IF ALREADY CONNECTED TO A DIFFERENT SUBSYSTEM, DISCONNECT*/ 
         /************************************************************/ 
                                                                        
         IF CONNECTED & (SSID ^= CONN_SSID) THEN                        
           DO;                                                          
             ACTN = DISC_FN;               /* DISCONNECT FROM DB2    */ 
             CALL ISPLINK(I_VPUT, ACTN_NAME);                           
             CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);                  
             RET_CODE = PLIRETV;                                        
                                                                        
             /********************************************************/ 
             /* IF DISCONNECT IS NOT SUCCESSFUL THEN PUT OUT AN      */ 
             /* ERROR MESSAGE                                        */ 
             /********************************************************/ 
                                                                        
             IF RET_CODE ^= 0 THEN         /* IF DISC FAILED         */ 
               DO;                                                      
                 CONTINUE = NO;            /* DO NOT PROCESS FURTHER */ 
                 CALL ISPLINK(I_VGET, REAS_NAME);                       
                 DISC_REAS = REASON;                                    
                 MSGS = STRING(DISC_MSG);  /* FILL THE MESSAGE FIELD */ 
               END;                        /* END IF DISC FAILED     */ 
             ELSE                          /* DISCONNECT SUCCESSFUL  */ 
               CONNECTED = NO;             /* NO LONGER CONNECTED    */ 
           END;                            /* END IF DIFF DB2 CONN   */ 
                                                                        
         /************************************************************/ 
         /* IF NOT CONNECTED, MAKE THE CONNECTION                    */ 
         /************************************************************/ 
                                                                        
         IF ^CONNECTED & CONTINUE THEN        /* TRY CONNECT TO DB2  */ 
           DO;                                                          
             ACTN = CONN_FN;                  /* CONNECT TO DB2      */ 
             CALL ISPLINK(I_VPUT, ACTN_NAME);                           
             CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);                  
             RET_CODE = PLIRETV;                                        
                                                                        
             /********************************************************/ 
             /* IF CONNECT IS SUCCESSFUL THEN SET FLAGS AND SAVE     */ 
             /* THE SSID THAT IS CURRENTLY CONNECTED                 */ 
             /********************************************************/ 
                                                                        
             IF RET_CODE = 0 THEN             /* CONNECT SUCCESSFUL  */ 
               DO;                                                      
                 CONN_SSID = SSID;            /* SAVE CONNECTED SSID */ 
                 CONTINUE = YES;              /* CONTINUE TO PROCESS */ 
                 CONNECTED = YES;             /* CONNECTED TO DB2    */ 
               END;                           /* END CONN SUCCESSFUL */ 
                                                                        
             /********************************************************/ 
             /* THE CONNECT FAILED.  FILL THE MESSAGE FIELD WITH     */ 
             /* AN ERROR MESSAGE                                     */ 
             /********************************************************/ 
                                                                        
             ELSE                             /* CONNECT FAILED      */ 
               DO;                                                      
                 CONTINUE = NO;               /* STOP PROCESSING     */ 
                 CALL ISPLINK(I_VGET, REAS_NAME);                       
                 MSG_REAS = REASON;                                     
                 MSGS = STRING(MSG1);         /* FILL MESSAGE FIELD  */ 
               END;                           /* END CONNECT FAILED  */ 
           END;                               /* END TRY DB2 CONN    */ 
                                                                        
         /************************************************************/ 
         /* IF CONTINUE, OPEN DB2 THREAD                             */ 
         /************************************************************/ 
                                                                        
         IF CONTINUE THEN                     /* DB2 CONNECTION MADE */ 
           DO;                                /* TRY TO OPEN THREAD  */ 
             ACTN = OPEN_FN;                  /* OPEN A THREAD       */ 
             CALL ISPLINK(I_VPUT, ACTN_NAME);                           
             CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);                  
             RET_CODE = PLIRETV;                                        
             IF RET_CODE = 0 THEN             /* OPEN SUCCESSFUL     */ 
               CONTINUE = YES;                /* PROCESS FURTHER     */ 
                                                                        
             /********************************************************/ 
             /* THE OPEN FAILED.  REQUEST THE CALL ATTACH FACILITY   */ 
             /* TRANSLATE SERVICE TO OBTAIN MORE INFORMATION ABOUT   */ 
             /* THE OPEN FAILURE.  THE SQLCA WILL BE DISPLAYED.      */ 
             /********************************************************/ 
                                                                        
             ELSE                             /* OPEN FAILED         */ 
               DO;                                                      
                 CONTINUE = NO;               /* STOP PROCESSING     */ 
                 CALL ISPLINK(I_VGET, REAS_NAME);                       
                 MSG_REAS = REASON;                                     
                 MSGS = STRING(MSG1);                                   
                 ACTN = XLAT_FN;              /* TRANSLATE           */ 
                 CALL ISPLINK(I_VPUT, ACTN_NAME);                       
                 CALL ISPLINK(I_VPUT, SQCA_NAME);                       
                 CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);              
                 PUT SKIP LIST(STRING(TRAN_MSG));   /* FILL MSG FLD  */ 
                 CALL ISPLINK(I_VGET, SQCA_NAME);   /* GET SQLCA     */ 
                 PUT SKIP DATA(SQLCA);        /* DISPLAY SQLCA       */ 
               END;                           /* END OPEN FAIL       */ 
           END;                               /* END TRY OPEN THREAD */ 
                                                                        
         /************************************************************/ 
         /* IF CONTINUE, CALL THE APPLICATION PROGRAM                */ 
         /************************************************************/ 
                                                                        
         IF CONTINUE THEN                     /* LINK TO APPL PGM    */ 
           DO;                                                          
             CALL ISPLINK(I_VGET, PROG_NAME);                           
             APPL_PGM.APPL_NAME = PROGRAM;                              
             CALL ISPLINK(I_SELECT, APPL_LEN, APPL_PGM);                
             RET_CODE = PLIRETV;                                        
                                                                        
             /********************************************************/ 
             /*  IF THE RETURN CODE FROM THE APPLICATION IS NOT ZERO */ 
             /*  THE APPLICATION ENCOUNTERED ERRORS.  THE OPTION IN  */ 
             /*  CLOSING THE THREAD SHOULD SPECIFY ROLLBACK.  IF THE */ 
             /*  RETURN CODE IS ZERO, THE OPTION IN CLOSING THE      */ 
             /*  THREAD SHOULD SPECIFY COMMIT.                       */ 
             /********************************************************/ 
                                                                        
             IF RET_CODE ^= 0 THEN            /* PROBLEMS IN APPL    */ 
                 TERM = ABRT;                 /* ROLLBACK OPTION     */ 
             ELSE                                                       
                 TERM = SYNC;                 /* COMMIT OPTION       */ 
             CALL ISPLINK(I_VPUT, TERM_NAME);                           
             CALL ISPLINK(I_VGET, MSGS_NAME); /* WAS MSG SET BY APPL?*/ 
           END;                               /* END LINK TO APPL    */ 
                                                                        
         /************************************************************/ 
         /* IF CONTINUE, CLOSE THE DB2 THREAD                        */ 
         /************************************************************/ 
                                                                        
         IF CONTINUE THEN                     /* TRY CLOSE THREAD    */ 
           DO;                                                          
             ACTN = CLOS_FN;                  /* CLOSE THE THREAD    */ 
             CALL ISPLINK(I_VPUT, ACTN_NAME);                           
             CALL ISPLINK(I_SELECT, PGMCA_LEN, PGMCA);                  
             RET_CODE = PLIRETV;                                        
                                                                        
             /********************************************************/ 
             /*  THE CLOSE FAILED.  IF THE REASON CODE IS 00C10824   */ 
             /*  THE CALL ATTACH FACILITY WILL RESET THE CONTROL     */ 
             /*  BLOCKS.  THIS MEANS THAT THE CONNECTION TO DB2 NO   */ 
             /*  LONGER EXISTS.                                      */ 
             /********************************************************/ 
                                                                        
             IF RET_CODE > 0 THEN             /* CLOSE FAILED        */ 
               DO;                                                      
                 CALL ISPLINK(I_VGET, REAS_NAME);                       
                 IF REASON = CAF_RES THEN     /* REASON = CAF RESET? */ 
                   CONNECTED = NO;            /* NO DB2 CONNECTION   */ 
                 MSG_REAS = REASON;                                     
                 MSGS = STRING(MSG1);         /* FILL MESSAGE FIELD  */ 
               END;                           /* END CLOSE FAILED    */ 
           END;                               /* END TRY TO CLOSE    */ 
       END;                                   /* END IF ^EXIT        */ 
                                                                        
  /*******************************************************************/ 
  /* A SERVICE WAS REQUESTED THAT WAS NOT RECOGNIZED AS A VALID      */ 
  /* SERVICE REQUEST                                                 */ 
  /*******************************************************************/ 
                                                                        
   IF RET_CODE = 11 THEN                      /* UNKNOWN SERVICE REQ */ 
      DO;                                                               
        CALL ISPLINK(I_VGET, SERV_NAME);                                
        MSGS = STRING(BADFN_MSG);             /* FILL MESSAGE FIELD  */ 
      END;                                    /* END UNKNOWN SERVICE */ 
   END;                                       /* END WHILE ^EXIT     */ 
 END DSN8SPM;