DSN8SDM

THIS MODULE DISPLAYS AN APPLICATION / / SELECTION PANEL.

 /********************************************************************/ 00000100
 /*  MODULE NAME = DSN8SDM                                           */ 00000200
 /*                                                                  */ 00000300
 /*  DESCRIPTIVE NAME = DB2 SAMPLE APPLICATION                       */ 00000400
 /*                     ISPF DB2 CONNECTION MANAGER                  */ 00000500
 /*                     ISPF/TSO                                     */ 00000600
 /*                     C                                            */ 00000700
 /*                                                                  */ 00000800
 /*    LICENSED MATERIALS - PROPERTY OF IBM                          */ 00000900
 /*    5675-DB2                                                      */ 00001000
 /*    (C) COPYRIGHT 1998, 2000 IBM CORP. ALL RIGHTS RESERVED.        * 00001100
 /*                                                                  */ 00001200
 /*    STATUS = VERSION 7                                            */ 00001300
 /*                                                                  */ 00001400
 /*  FUNCTION = THIS MODULE DISPLAYS AN APPLICATION                  */ 00001500
 /*             SELECTION PANEL.  THE SELECTED APPLICATION           */ 00001600
 /*             IS INVOKED USING THE CALL ATTACH FACILITY.           */ 00001700
 /*                                                                  */ 00001800
 /*  NOTES = NONE                                                    */ 00001900
 /*                                                                  */ 00002000
 /*  MODULE TYPE =                                                   */ 00002100
 /*     PROCESSOR   = DB2 PREPROCESSOR, C/370 COMPILER               */ 00002200
 /*     MODULE SIZE = SEE LINKEDIT                                   */ 00002300
 /*     ATTRIBUTES  = REUSABLE                                       */ 00002400
 /*                                                                  */ 00002500
 /*  ENTRY POINT =  DSN8SDM                                          */ 00002600
 /*     PURPOSE      = SEE FUNCTION                                  */ 00002700
 /*     LINKAGE      = ISPF                                          */ 00002800
 /*                                                                  */ 00002900
 /*     INPUT = PARAMETERS EXPLICITLY PASSED TO THIS PROGRAM:        */ 00003000
 /*        SYMBOLIC LABEL/NAME = NONE                                */ 00003100
 /*        DESCRIPTION = NOT APPLICABLE                              */ 00003200
 /*                                                                  */ 00003300
 /*     OUTPUT = PARAMETERS EXPLICITLY RETURNED:                     */ 00003400
 /*        SYMBOLIC LABEL/NAME = NONE                                */ 00003500
 /*        DESCRIPTION = NOT APPLICABLE                              */ 00003600
 /*                                                                  */ 00003700
 /*     EXIT-NORMAL = RETURN CODE 0                                  */ 00003800
 /*                                                                  */ 00003900
 /*     EXIT-ERROR =                                                 */ 00004000
 /*        RETURN CODE    = NONE                                     */ 00004100
 /*        ABEND CODES    = NONE                                     */ 00004200
 /*        ERROR MESSAGES = NONE                                     */ 00004300
 /*                                                                  */ 00004400
 /*          DSN8080E   APPLICATION TERMINATED WITH CALL ATTACH      */ 00004500
 /*                     REASON CODE ........                         */ 00004600
 /*          DSN8081E   RESULTS FROM THE CALL ATTACH TRANSLATE       */ 00004700
 /*                     SERVICE                                      */ 00004800
 /*          DSN8082E   THE DISCONNECT TERMINATED WITH REASON        */ 00004900
 /*                     CODE ........                                */ 00005000
 /*          DSN8083E   AN UNKNOWN SERVICE ............ WAS          */ 00005100
 /*                     REQUESTED                                    */ 00005200
 /*                                                                  */ 00005300
 /*        MESSAGES       = NONE                                     */ 00005400
 /*                                                                  */ 00005500
 /*     EXTERNAL REFERENCES =                                        */ 00005600
 /*        ROUTINES/SERVICES = ISPLINK - ISPF SERVICES               */ 00005700
 /*        DATA AREAS        = NONE                                  */ 00005800
 /*        CONTROL BLOCKS    = NONE                                  */ 00005900
 /*        TABLES            = NONE                                  */ 00006000
 /*        CHANGE ACTIVITY   =                                       */ 00006100
 /*        03-01-94 INITIALIZE THE ISPF PANEL MESSAGE WITH BLANKS    */ 00006200
 /*                 AND UPDATE COPYRIGHT INFO  PN52970  KEF1040  @40 */ 00006300
 /*                                                                  */ 00006400
 /*  *PSEUDOCODE*                                                    */ 00006500
 /*                                                                  */ 00006600
 /*    DECLARATIONS                                                  */ 00006700
 /*    INITIALIZATION                                                */ 00006800
 /*    DO WHILE ^QUIT                                                */ 00006900
 /*      DISPLAY APPLICATION SELECTION PANEL                         */ 00007000
 /*      IF END IS REQUESTED THEN                                    */ 00007100
 /*      --DO                                                        */ 00007200
 /*      |   QUIT = YES                                              */ 00007300
 /*      |   IF CONNECTED THEN                                       */ 00007400
 /*      |   --DO                                                    */ 00007500
 /*      |   |   DISCONNECT FROM DB2                                 */ 00007600
 /*      |   |   IF DISCONNECT FAILED THEN                           */ 00007700
 /*      |   |       DISPLAY LINE MODE MESSAGE                       */ 00007800
 /*      |   --END                                                   */ 00007900
 /*      --END                                                       */ 00008000
 /*      IF ^QUIT THEN                                               */ 00008100
 /*      --DO                                                        */ 00008200
 /*      |   IF (CONNECTED TO DB2)&(SSID ^= CONNECTED SSID) THEN     */ 00008300
 /*      |   --DO                                                    */ 00008400
 /*      |   |   DISCONNECT FROM DB2                                 */ 00008500
 /*      |   |   IF DISCONNECT FAILED THEN                           */ 00008600
 /*      |   |   --DO                                                */ 00008700
 /*      |   |   |   CONTINUE = NO                                   */ 00008800
 /*      |   |   |   PUT REASON CODE OUT                             */ 00008900
 /*      |   |   --END                                               */ 00009000
 /*      |   |   ELSE                                                */ 00009100
 /*      |   |       CONNECTED = NO                                  */ 00009200
 /*      |   --END                                                   */ 00009300
 /*      |   IF (^CONNECTED TO DB2) & (CONTINUE) THEN                */ 00009400
 /*      |   --DO                                                    */ 00009500
 /*      |   |   CONNECTION TO DB2                                   */ 00009600
 /*      |   |   IF CONNECTION IS SUCCESSFUL THEN                    */ 00009700
 /*      |   |   --DO                                                */ 00009800
 /*      |   |   |   CONTINUE = YES                                  */ 00009900
 /*      |   |   |   CONNECTED = YES                                 */ 00010000
 /*      |   |   --END                                               */ 00010100
 /*      |   |   ELSE                                                */ 00010200
 /*      |   |   --DO                                                */ 00010300
 /*      |   |   |   CONTINUE = NO                                   */ 00010400
 /*      |   |   |   PUT OUT REASON CODE                             */ 00010500
 /*      |   |   --END                                               */ 00010600
 /*      |   --END                                                   */ 00010700
 /*      |   IF CONTINUE THEN                                        */ 00010800
 /*      |   --DO                                                    */ 00010900
 /*      |   |   OPEN                                                */ 00011000
 /*      |   |   IF OPEN IS SUCCESSFUL THEN                          */ 00011100
 /*      |   |       CONTINUE = YES                                  */ 00011200
 /*      |   |   ELSE                                                */ 00011300
 /*      |   |   --DO                                                */ 00011400
 /*      |   |   |   TRANSLATE                                       */ 00011500
 /*      |   |   |   CONTINUE = NO                                   */ 00011600
 /*      |   |   |   PUT OUT REASON CODE                             */ 00011700
 /*      |   |   --END                                               */ 00011800
 /*      |   --END                                                   */ 00011900
 /*      |   IF CONTINUE THEN                                        */ 00012000
 /*      |   --DO                                                    */ 00012100
 /*      |   |   ISPLINK TO THE APPLICATION PROGRAM                  */ 00012200
 /*      |   |   IF BAD RETURN THEN                                  */ 00012300
 /*      |   |       SPECIFY 'ABRT' AS THE TERMINATION OPTION        */ 00012400
 /*      |   |   ELSE                                                */ 00012500
 /*      |   |       SPECIFY 'SYNC' AS THE TERMINATION OPTION        */ 00012600
 /*      |   --END                                                   */ 00012700
 /*      |   IF CONTINUE THEN                                        */ 00012800
 /*      |   --DO                                                    */ 00012900
 /*      |   |   CLOSE                                               */ 00013000
 /*      |   |   IF CLOSE FAILS THEN                                 */ 00013100
 /*      |   |   --DO                                                */ 00013200
 /*      |   |   |   IF CAF-RESET THEN                               */ 00013300
 /*      |   |   |       CONNECTED = NO                              */ 00013400
 /*      |   |   |   PUT REASON CODE OUT                             */ 00013500
 /*      |   |   --END                                               */ 00013600
 /*      |   --END                                                   */ 00013700
 /*      --END                                                       */ 00013800
 /*    END                                                           */ 00013900
 /********************************************************************/ 00014000
 /********************** C library definitions ***********************/ 00014100
 #include <stdlib.h>                                                    00014200
 #include <stdio.h>                                                     00014300
 #include <string.h>                                                    00014400
                                                                        00014500
                                                                        00014600
 /***************************** Equates ******************************/ 00014700
 #define     NO                  0     /*                            */ 00014800
 #define     YES                 1     /*                            */ 00014900
                                                                        00015000
 #define     TIAR_DIM           10     /* Max no. of DSNTIAR msgs    */ 00015100
 #define     TIAR_LEN           80     /* Length of DSNTIAR messages */ 00015200
                                                                        00015300
                                                                        00015400
                                                                        00015500
 /*************************** ISPF Linkage ***************************/ 00015600
 #pragma linkage(isplink,OS)                                            00015700
                                                                        00015800
                                                                        00015900
 /*************************** ISPF Syntax ****************************/ 00016000
 char        CHAR[9]      = "CHAR    ";                                 00016100
 char        DISPLAY[9]   = "DISPLAY ";                                 00016200
 char        FIXD[9]      = "FIXED   ";                                 00016300
 char        SELECT[9]    = "SELECT  ";                                 00016400
 char        VDEFINE[9]   = "VDEFINE ";                                 00016500
 char        VGET[9]      = "VGET    ";                                 00016600
 char        VPUT[9]      = "VPUT    ";                                 00016700
 char        VRESET[9]    = "VRESET  ";                                 00016800
                                                                        00016900
 /********************** ISPF Shared Variables ***********************/ 00017000
 char        SSID_NAME[9] = "DSN8SSID";/*                            */ 00017100
 char        PROG_NAME[9] = "DSN8PROG";/*                            */ 00017200
 char        PLAN_NAME[9] = "DSN8PLAN";/*                            */ 00017300
 char        REAS_NAME[9] = "DSN8REAS";/*                            */ 00017400
 char        MSGS_NAME[9] = "DSN8MSGS";/*                            */ 00017500
 char        SQCA_NAME[9] = "DSN8SQCA";/*                            */ 00017600
 char        TECB_NAME[9] = "DSN8TECB";/*                            */ 00017700
 char        SECB_NAME[9] = "DSN8SECB";/*                            */ 00017800
 char        TERM_NAME[9] = "DSN8TERM";/*                            */ 00017900
 char        ACTN_NAME[9] = "DSN8ACTN";/*                            */ 00018000
 char        SERV_NAME[9] = "DSN8SERV";/*                            */ 00018100
 char        SSID[5]      = "    ";    /* SUBSYSTEM ID               */ 00018200
 char        PROGRAM[9]   = "        ";/* PROGRAM NAME               */ 00018300
 char        PLAN[9]      = "        ";/* PLAN NAME                  */ 00018400
 char        REASON[9]    = "        ";/* CAF REASON CODE            */ 00018500
 long int    TECB         = 0;         /* TERMINATION ECB            */ 00018600
 long int    SECB         = 0;         /* START ECB                  */ 00018700
 char        TERM[5]      = "    ";    /* TERMINATION OPTION         */ 00018800
 char        ACTN[13];                 /* CAF SERVICE REQUEST        */ 00018900
 char        SERV[13];                 /* CAF SERVICE REQUEST        */ 00019000
 char        MSGS[72];                 /* INIT ISPF PANEL MESSAGE    */ 00019100
                                                                        00019200
 /************************ ISPF Panel Names **************************/ 00019300
 char        MAIN_MENU[9] = "DSN8SSM ";/*                            */ 00019400
                                                                        00019500
 /********************************************************************/ 00019600
 /* CALL ATTACH 'CLOSE THREAD' TERMINATION OPTIONS                   */ 00019700
 /********************************************************************/ 00019800
                                                                        00019900
 char        SYNC[5]      = "SYNC";    /*                            */ 00020000
 char        ABRT[5]      = "ABRT";    /*                            */ 00020100
                                                                        00020200
 /********************************************************************/ 00020300
 /* INTERNAL WORKING VARIABLE DECLARATIONS                           */ 00020400
 /********************************************************************/ 00020500
                                                                        00020600
 char        CONN_SSID[5] = "    ";    /* CURRENT CONNECTED SUBSYSTEM*/ 00020700
 short int   ISPFrc       = 0;         /* RETURN CODE                */ 00020800
 short int   CONNECTED;                /* CONNECTION INDICATOR       */ 00020900
 short int   CONTINUE;                 /* CONTINUE PROCESSING FLAG   */ 00021000
 short int   QUIT;                     /* QUIT REQUESTED FLAG        */ 00021100
 char        blank72[72]  = "                                    "      00021200
                            "                                  \0";     00021300
                                                                        00021400
                                                                        00021500
 /* CALL ATTACH FACILITY ASSEMBLER INTERFACE PROGRAM *****************/ 00021600
 struct {                                                               00021700
   char      FILLER1[11];                                               00021800
 }         PGMCA = {                                                    00021900
             "PGM(DSN8CA)"                                              00022000
           };                                                           00022100
 long int    PGMCA_LEN    = 11;                                         00022200
                                                                        00022300
 /* APPLICATION PROGRAM **********************************************/ 00022400
 struct {                                                               00022500
   char      FILLER1[4];                                                00022600
   char      APPL_NAME[8];                                              00022700
   char      FILLER2[1];                                                00022800
 }         APPL_PGM = {                                                 00022900
             "PGM(",                                                    00023000
             "        ",                                                00023100
             ")"                                                        00023200
           };                                                           00023300
 long int    APPL_LEN     = 13;                                         00023400
                                                                        00023500
 /* GENERAL ERROR MESSAGE ********************************************/ 00023600
 struct {                                                               00023700
   char      MSG_NUM[9];                                                00023800
   char      MSG_TEXT[53];                                              00023900
   char      MSG_REAS[8];                                               00024000
   char      FILLER[1];                                                 00024100
 }         MSG1 = {                                                     00024200
             " DSN8080E",                                               00024300
             " APPLICATION TERMINATED WITH CALL ATTACH REASON CODE ",   00024400
             "        ",                                                00024500
             " "                                                        00024600
           };                                                           00024700
                                                                        00024800
 /* DISCONNECT ERROR MESSAGE *****************************************/ 00024900
 struct {                                                               00025000
   char      DISC_NUM[9];                                               00025100
   char      DISC_TEXT[46];                                             00025200
   char      DISC_REAS[8];                                              00025300
   char      FILLER[8];                                                 00025400
 }         DISC_MSG = {                                                 00025500
             " DSN8082E",                                               00025600
             "   THE DISCONNECT TERMINATED WITH REASON CODE ",          00025700
             "        ",                                                00025800
             "        "                                                 00025900
           };                                                           00026000
                                                                        00026100
 /* TRANSLATE MESSAGE ************************************************/ 00026200
 struct {                                                               00026300
   char      TRAN_NUM[9];                                               00026400
   char      TRAN_TEXT[49];                                             00026500
   char      FILLER[13];                                                00026600
 }         TRAN_MSG = {                                                 00026700
             " DSN8081E",                                               00026800
             "   RESULTS FROM THE CALL ATTACH TRANSLATE SERVICE",       00026900
             "             "                                            00027000
           };                                                           00027100
                                                                        00027200
 /* INVALID SERVICE REQUEST MESSAGE **********************************/ 00027300
 struct {                                                               00027400
    char     FN_NUM[9];                                                 00027500
    char     FN_TEXT1[22];                                              00027600
    char     FN_SERV[12];                                               00027700
    char     FN_TEXT2[28];                                              00027800
 }         BADFN_MSG = {                                                00027900
             " DSN8083E",                                               00028000
             "   AN UNKNOWN SERVICE ",                                  00028100
             "            ",                                            00028200
             " WAS REQUESTED              "                             00028300
           };                                                           00028400
                                                                        00028500
 /********************************************************************/ 00028600
 /* CALL ATTACH FACILITY SERVICES DECLARATIONS                       */ 00028700
 /********************************************************************/ 00028800
 char      CONN_FN[12]    = "CONNECT     ";                             00028900
 char      OPEN_FN[12]    = "OPEN        ";                             00029000
 char      CLOS_FN[12]    = "CLOSE       ";                             00029100
 char      DISC_FN[12]    = "DISCONNECT  ";                             00029200
 char      XLAT_FN[12]    = "TRANSLATE   ";                             00029300
                                                                        00029400
 /********************************************************************/ 00029500
 /* REASON CODE WHEN CAF HAS CLEANED UP AFTER DB2 HAS BEEN DOWN      */ 00029600
 /********************************************************************/ 00029700
 char      CAF_RES[8]     = "00C10824";                                 00029800
                                                                        00029900
 /********************************************************************/ 00030000
 /* SQL COMMUNICATION AREA                                           */ 00030100
 /********************************************************************/ 00030200
 EXEC SQL INCLUDE SQLCA;                                                00030300
                                                                        00030400
                                                                        00030500
 /********************** DB2 Message Formatter ***********************/ 00030600
 struct      error_struct {            /* DSNTIAR message structure  */ 00030700
   short int   error_len;                                               00030800
   char        error_text[TIAR_DIM][TIAR_LEN];                          00030900
   }         error_message = {TIAR_DIM * (TIAR_LEN)};                   00031000
                                                                        00031100
 #pragma linkage(dsntiar, OS)                                           00031200
                                                                        00031300
 extern short int dsntiar( struct      sqlca         *sqlca,            00031400
                           struct      error_struct  *msg,              00031500
                           int                       *len );            00031600
                                                                        00031700
 void sql_error( char *locmsg );                                        00031800
 int main( void );                                                      00031900
                                                                        00032000
                                                                        00032100
 int main( void )                                                       00032200
 {                                                                      00032300
 /********************************************************************/ 00032400
 /* DEFINE C - SPF VARIABLES                                         */ 00032500
 /********************************************************************/ 00032600
 isplink( VDEFINE, SSID_NAME, SSID    , CHAR, 4 );                      00032700
 isplink( VDEFINE, PROG_NAME, PROGRAM , CHAR, 8 );                      00032800
 isplink( VDEFINE, PLAN_NAME, PLAN    , CHAR, 8 );                      00032900
 isplink( VDEFINE, MSGS_NAME, MSGS    , CHAR, 71 );                     00033000
 isplink( VDEFINE, REAS_NAME, REASON  , CHAR, 8 );                      00033100
 isplink( VDEFINE, SQCA_NAME, sqlca   , CHAR, sizeof(sqlca) );          00033200
 isplink( VDEFINE, TECB_NAME, TECB    , FIXD, 4 );                      00033300
 isplink( VDEFINE, SECB_NAME, SECB    , FIXD, 4 );                      00033400
 isplink( VDEFINE, TERM_NAME, TERM    , CHAR, 4 );                      00033500
 isplink( VDEFINE, ACTN_NAME, ACTN    , CHAR, 12 );                     00033600
 isplink( VDEFINE, SERV_NAME, SERV    , CHAR, 12 );                     00033700
                                                                        00033800
 /********************************************************************/ 00033900
 /* INITIALIZATION                                                   */ 00034000
 /********************************************************************/ 00034100
 strncpy( MSGS,blank72,72 );            /* CLEAR MESSAGE FIELD       */ 00034200
 strncpy( ACTN,blank72,12 );            /* CLEAR ACTION FIELD        */ 00034300
 CONNECTED  = NO;                       /* NOT INITIALLY CONNECTED   */ 00034400
 QUIT = NO;                             /* EXIT NOT PRESSED          */ 00034500
 isplink( VGET, SSID_NAME );            /* GET SSID FROM ISPF POOL   */ 00034600
 if( strncmp( SSID,"    ",4 ) == 0 )                                    00034700
   strncpy( SSID,"DSN ",4 );            /* DEFAULT SSID              */ 00034800
                                                                        00034900
 /********************************************************************/ 00035000
 /* DISPLAY SELECTION PANEL UNTIL QUIT REQUESTED                     */ 00035100
 /********************************************************************/ 00035200
 while( QUIT == NO )                                                    00035300
   {                                                                    00035400
     CONTINUE = YES;                    /* RESET THE CONTINUE FLAG   */ 00035500
     isplink( VPUT, MSGS_NAME );        /* SET/RESET MSG ON PANEL    */ 00035600
     ISPFrc = isplink( DISPLAY,         /* DISPLAY SELECTION PANEL   */ 00035700
                       MAIN_MENU );                                     00035800
     if( ISPFrc == 8 )                  /* QUIT REQUESTED?           */ 00035900
       {                                                                00036000
         QUIT = YES;                    /* SET QUIT FLAG             */ 00036100
                                                                        00036200
         /************************************************************/ 00036300
         /* IF CONNECTED TO DB2, DISCONNECT                          */ 00036400
         /************************************************************/ 00036500
         if( CONNECTED == YES )          /* IF CONNECTED TO DB2      */ 00036600
           {                                                            00036700
             strncpy( ACTN,DISC_FN,12 ); /* DISCONNECT FROM DB2      */ 00036800
             isplink( VPUT, ACTN_NAME );                                00036900
             ISPFrc = isplink( SELECT, PGMCA_LEN, PGMCA );              00037000
                                                                        00037100
             /********************************************************/ 00037200
             /* IF THE DISCONNECT IS NOT SUCCESSFUL THEN PUT OUT AN  */ 00037300
             /* ERROR MESSAGE                                        */ 00037400
             /********************************************************/ 00037500
                                                                        00037600
             if( ISPFrc != 0 )           /* DISC FAILED?             */ 00037700
               {                                                        00037800
                 isplink( VGET,REAS_NAME ); /* GET REASON CODE       */ 00037900
                 strncpy( DISC_MSG.DISC_REAS,REASON,8 );                00038000
                                            /* PUT OUT MESSAGE       */ 00038100
                 printf( "%s,%s,%s,%s\n",                               00038200
                         DISC_MSG.DISC_NUM,                             00038300
                         DISC_MSG.DISC_TEXT,                            00038400
                         DISC_MSG.DISC_REAS,                            00038500
                         DISC_MSG.FILLER );                             00038600
               }                                                        00038700
             else                        /* DISCONNECT WAS SUCCESSFUL*/ 00038800
               CONNECTED = NO;           /* NO LONGER CONN TO DB2    */ 00038900
           }                             /* END IF CONNECTED         */ 00039000
       }                                 /* END IF QUIT REQUESTED    */ 00039100
                                                                        00039200
     /****************************************************************/ 00039300
     /* IF QUIT NOT REQUESTED, PROCESS THE REQUEST                   */ 00039400
     /****************************************************************/ 00039500
     if( QUIT == NO )                                                   00039600
       {                                                                00039700
         isplink( VGET,SSID_NAME );      /* GET SSID FROM PANEL      */ 00039800
         strncpy( MSGS,blank72,72 );     /* RESET MESSAGE FIELD      */ 00039900
                                                                        00040000
         /************************************************************/ 00040100
         /* IF ALREADY CONNECTED TO A DIFFERENT SUBSYS, DISCONNECT   */ 00040200
         /************************************************************/ 00040300
         if( CONNECTED == YES && ( strncmp( SSID,CONN_SSID,4 ) != 0 ) ) 00040400
           {                                                            00040500
             strncpy( ACTN,DISC_FN,12 ); /* DISCONNECT FROM DB2      */ 00040600
             isplink( VPUT,ACTN_NAME );                                 00040700
             ISPFrc = isplink( SELECT,PGMCA_LEN,PGMCA );                00040800
                                                                        00040900
             /********************************************************/ 00041000
             /* IF DISCONNECT IS NOT SUCCESSFUL THEN PUT OUT AN      */ 00041100
             /* ERROR MESSAGE                                        */ 00041200
             /********************************************************/ 00041300
             if( ISPFrc == 0 )           /* IF DISC FAILED           */ 00041400
               {                                                        00041500
                 CONTINUE = NO;          /* DON'T PROCESS FURTHER    */ 00041600
                 isplink( VGET,REAS_NAME );                             00041700
                 strncpy( DISC_MSG.DISC_REAS,REASON,8 );                00041800
                                           /* FILL THE MESSAGE FIELD */ 00041900
                 strncpy( MSGS,DISC_MSG.DISC_NUM,9 );                   00042000
                 strncat( MSGS,DISC_MSG.DISC_TEXT,46 );                 00042100
                 strncat( MSGS,DISC_MSG.DISC_REAS,8 );                  00042200
                 strncat( MSGS,DISC_MSG.FILLER,8 );                     00042300
               }                         /* END IF DISC FAILED       */ 00042400
             else                        /* DISCONNECT SUCCESSFUL    */ 00042500
               CONNECTED = NO;           /* NO LONGER CONNECTED      */ 00042600
           }                             /* END IF DIFF DB2 CONN     */ 00042700
                                                                        00042800
         /************************************************************/ 00042900
         /* IF NOT CONNECTED, MAKE THE CONNECTION                    */ 00043000
         /************************************************************/ 00043100
         if( CONNECTED == NO  &&  CONTINUE == YES )                     00043200
           {                             /* TRY CONNECT TO DB2       */ 00043300
             strncpy( ACTN,CONN_FN,12 ); /* CONNECT TO DB2           */ 00043400
             isplink( VPUT,ACTN_NAME );                                 00043500
             ISPFrc = isplink( SELECT,PGMCA_LEN,PGMCA );                00043600
                                                                        00043700
             /********************************************************/ 00043800
             /* IF CONNECT IS SUCCESSFUL THEN SET FLAGS AND SAVE     */ 00043900
             /* THE SSID THAT IS CURRENTLY CONNECTED                 */ 00044000
             /********************************************************/ 00044100
             if( ISPFrc == 0 )           /* CONNECT SUCCESSFUL       */ 00044200
               {                                                        00044300
                 strncpy( CONN_SSID,SSID,4 ); /* SAVE CONNECTED SSID */ 00044400
                 CONTINUE = YES;         /* CONTINUE TO PROCESS      */ 00044500
                 CONNECTED = YES;        /* CONNECTED TO DB2         */ 00044600
               }                         /* END CONNECT SUCCESSFUL   */ 00044700
                                                                        00044800
             /********************************************************/ 00044900
             /* THE CONNECT FAILED.  FILL THE MESSAGE FIELD WITH     */ 00045000
             /* AN ERROR MESSAGE                                     */ 00045100
             /********************************************************/ 00045200
             else                        /* CONNECT FAILED           */ 00045300
               {                                                        00045400
                 CONTINUE = NO;          /* STOP PROCESSING          */ 00045500
                 isplink( VGET,REAS_NAME );                             00045600
                 strncpy( MSG1.MSG_REAS,REASON,8 );                     00045700
                                         /* FILL THE MESSAGE FIELD   */ 00045800
                 strncpy( MSGS,MSG1.MSG_NUM,9 );                        00045900
                 strncat( MSGS,MSG1.MSG_TEXT,53 );                      00046000
                 strncat( MSGS,MSG1.MSG_REAS,8 );                       00046100
                 strncat( MSGS,MSG1.FILLER,1 );                         00046200
               }                         /* END CONNECT FAILED       */ 00046300
           }                             /* END TRY DB2 CONN         */ 00046400
                                                                        00046500
         /************************************************************/ 00046600
         /* IF CONTINUE, OPEN DB2 THREAD                             */ 00046700
         /************************************************************/ 00046800
         if( CONTINUE == YES )           /* DB2 CONNECT'N MADE       */ 00046900
           {                             /* TRY TO OPEN THREAD       */ 00047000
             strncpy( ACTN,OPEN_FN,12 ); /* OPEN A THREAD            */ 00047100
             isplink( VPUT,ACTN_NAME );                                 00047200
             ISPFrc = isplink( SELECT,PGMCA_LEN,PGMCA );                00047300
             if( ISPFrc == 0 )           /* OPEN SUCCESSFUL          */ 00047400
               CONTINUE = YES;           /* PROCESS FURTHER          */ 00047500
                                                                        00047600
             /********************************************************/ 00047700
             /* THE OPEN FAILED.  REQUEST THE CALL ATTACH FACILITY   */ 00047800
             /* TRANSLATE SERVICE TO OBTAIN MORE INFORMATION ABOUT   */ 00047900
             /* THE OPEN FAILURE.  THE SQLCA WILL BE DISPLAYED.      */ 00048000
             /********************************************************/ 00048100
             else                        /* OPEN FAILED              */ 00048200
               {                                                        00048300
                 CONTINUE = NO;          /* STOP PROCESSING          */ 00048400
                 isplink( VGET, REAS_NAME);                             00048500
                 strncpy( MSG1.MSG_REAS,REASON,8 );                     00048600
                                         /* FILL THE MESSAGE FIELD   */ 00048700
                 strncpy( MSGS,MSG1.MSG_NUM,9 );                        00048800
                 strncat( MSGS,MSG1.MSG_TEXT,53 );                      00048900
                 strncat( MSGS,MSG1.MSG_REAS,8 );                       00049000
                 strncat( MSGS,MSG1.FILLER,1 );                         00049100
                 strncpy( ACTN,XLAT_FN,12 ); /* TRANSLATE            */ 00049200
                 isplink( VPUT, ACTN_NAME );                            00049300
                 isplink( VPUT, SQCA_NAME );                            00049400
                 isplink( SELECT, PGMCA_LEN, PGMCA );                   00049500
                 printf( "%s,%s,%s\n",                                  00049600
                         TRAN_MSG.TRAN_NUM,                             00049700
                         TRAN_MSG.TRAN_TEXT,                            00049800
                         TRAN_MSG.FILLER );                             00049900
                 isplink( VGET, SQCA_NAME ); /* GET SQLCA            */ 00050000
                 printf( "%s\n",sqlca );                                00050100
                 sql_error( "DSN8DLCA @1" );                            00050200
               }                         /* END OPEN FAIL            */ 00050300
           }                             /* END TRY OPEN THREAD      */ 00050400
                                                                        00050500
         /************************************************************/ 00050600
         /* IF CONTINUE, CALL THE APPLICATION PROGRAM                */ 00050700
         /************************************************************/ 00050800
         if( CONTINUE == YES )           /* LINK TO APPLICATION PGM  */ 00050900
           {                                                            00051000
             isplink( VGET,PROG_NAME );                                 00051100
             strncpy( APPL_PGM.APPL_NAME,PROGRAM,8 );                   00051200
             isplink( "CONTROL ","ERRORS  ","RETURN  " );  /*<<<*/      00051300
             ISPFrc = isplink( SELECT,APPL_LEN,APPL_PGM );              00051400
             isplink( "CONTROL ","ERRORS  ","CANCEL  " );  /*<<<*/      00051500
                                                                        00051600
             /********************************************************/ 00051700
             /* IF THE RETURN CODE FROM THE APPLICATION IS NOT ZERO  */ 00051800
             /* THE APPLICATION ENCOUNTERED ERRORS.  THE OPTION IN   */ 00051900
             /* CLOSING THE THREAD SHOULD SPECIFY ROLLBACK.  IF THE  */ 00052000
             /* RETURN CODE IS ZERO, THE OPTION IN CLOSING THE       */ 00052100
             /* THREAD SHOULD SPECIFY COMMIT.                        */ 00052200
             /********************************************************/ 00052300
             if( ISPFrc != 0 )           /* PROBLEMS IN APPLICATION  */ 00052400
               strncpy( TERM,ABRT,4 );   /* ROLLBACK OPTION          */ 00052500
             else                                                       00052600
               strncpy( TERM,SYNC,4 );   /* COMMIT OPTION            */ 00052700
             isplink( VPUT, TERM_NAME );                                00052800
             isplink( VGET, MSGS_NAME ); /* MSG SET BY APPLICATION?  */ 00052900
           }                             /* END LINK TO APPLICATION  */ 00053000
                                                                        00053100
         /************************************************************/ 00053200
         /* IF CONTINUE, CLOSE THE DB2 THREAD                        */ 00053300
         /************************************************************/ 00053400
         if( CONTINUE == YES )           /* TRY CLOSE THREAD         */ 00053500
           {                                                            00053600
             strncpy( ACTN,CLOS_FN,12 ); /* CLOSE THE THREAD         */ 00053700
             isplink( VPUT, ACTN_NAME );                                00053800
             ISPFrc = isplink( SELECT, PGMCA_LEN, PGMCA );              00053900
                                                                        00054000
             /********************************************************/ 00054100
             /*  THE CLOSE FAILED.  IF THE REASON CODE IS 00C10824   */ 00054200
             /*  THE CALL ATTACH FACILITY WILL RESET THE CONTROL     */ 00054300
             /*  BLOCKS.  THIS MEANS THAT THE CONNECTION TO DB2 NO   */ 00054400
             /*  LONGER EXISTS.                                      */ 00054500
             /********************************************************/ 00054600
             if( ISPFrc > 0 )            /* CLOSE FAILED             */ 00054700
               {                                                        00054800
                 isplink( VGET, REAS_NAME );                            00054900
                                         /* IS REASON = CAF RESET?   */ 00055000
                 if( strncmp( REASON,CAF_RES,8 ) == 0 )                 00055100
                   CONNECTED = NO;       /* .. THEN NO DB2 CONNECTION*/ 00055200
                 strncpy( MSG1.MSG_REAS,REASON,8 );                     00055300
                                         /* FILL THE MESSAGE FIELD   */ 00055400
                 strncpy( MSGS,MSG1.MSG_NUM,9 );                        00055500
                 strncat( MSGS,MSG1.MSG_TEXT,53 );                      00055600
                 strncat( MSGS,MSG1.MSG_REAS,8 );                       00055700
                 strncat( MSGS,MSG1.FILLER,1 );                         00055800
               }                         /* END CLOSE FAILED         */ 00055900
           }                             /* END TRY TO CLOSE         */ 00056000
       }                                 /* END IF QUIT == NO        */ 00056100
                                                                        00056200
    /*****************************************************************/ 00056300
    /* A SERVICE WAS REQUESTED THAT WAS NOT RECOGNIZED AS A VALID    */ 00056400
    /* SERVICE REQUEST                                               */ 00056500
    /*****************************************************************/ 00056600
    if( ISPFrc == 11 )                   /* UNKNOWN SERVICE REQUEST  */ 00056700
      {                                                                 00056800
        isplink( VGET,SERV_NAME );                                      00056900
        strncpy( BADFN_MSG.FN_SERV,SERV,12 );                           00057000
                                         /* FILL MESSAGE FIELD       */ 00057100
        strncpy( MSGS,BADFN_MSG.FN_NUM,9 );                             00057200
        strncat( MSGS,BADFN_MSG.FN_TEXT1,22 );                          00057300
        strncat( MSGS,BADFN_MSG.FN_SERV,12 );                           00057400
        strncat( MSGS,BADFN_MSG.FN_TEXT2,28 );                          00057500
      }                                  /* END UNKNOWN SERVICE REQU */ 00057600
   }                                     /* END WHILE QUIT == NO     */ 00057700
 } /* END DSN8SDM */                                                    00057800
                                                                        00057900
                                                                        00058000
 void sql_error( char *locmsg )                                         00058100
 /********************************************************************/ 00058200
 /* SQL error handler                                                */ 00058300
 /********************************************************************/ 00058400
 {                                                                      00058500
                                                                        00058600
                                                                        00058700
   short int   rc;                     /* DSNTIAR Return code        */ 00058800
   int         j,k;                    /* Loop control               */ 00058900
   static int  lrecl = TIAR_LEN;       /* Width of message lines     */ 00059000
                                                                        00059100
   /******************************************************************* 00059200
   * print the locator message                                        * 00059300
   *******************************************************************/ 00059400
   printf( " %.80s\n", locmsg );                                        00059500
                                                                        00059600
   /******************************************************************* 00059700
   * format and print the SQL message                                 * 00059800
   *******************************************************************/ 00059900
   rc = dsntiar( &sqlca, &error_message, &lrecl );                      00060000
   if( rc == 0 )                                                        00060100
     for( j=0; j<TIAR_DIM; j++ )                                        00060200
       {                                                                00060300
         for( k=0; k<TIAR_LEN; k++ )                                    00060400
           putchar(error_message.error_text[j][k] );                    00060500
         putchar('\n');                                                 00060600
       }                                                                00060700
   else                                                                 00060800
     {                                                                  00060900
       printf( " *** ERROR: DSNTIAR could not format the message\n" );  00061000
       printf( " ***        SQLCODE is %d\n",SQLCODE );                 00061100
       printf( " ***        SQLERRM is \n" );                           00061200
       for( j=0; j<sqlca.sqlerrml; j++ )                                00061300
         printf( "%c", sqlca.sqlerrmc[j] );                             00061400
       printf( "\n" );                                                  00061500
     }                                                                  00061600
                                                                        00061700
 } /* end sql_error */                                                  00061800