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