FTN4 PROGRAM DBRST(3,80),92069-16126 REV.2013 790413 C C C***************************************************************** C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED. C NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR C TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR C WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. C****************************************************************** C C C SOURCE: 92069-18126 C RELOC: 92069-16126 C C C****************************************************************: C C C************************************************ C THIS FILE CONTAINS THE CODE FOR BOTH DBRST AND SETIN. C C DBRST RESTORES A DATA BASE FROM TAPE TO DISC. THE TAPE C MUST HAVE BEEN SAVED FROM DISC WITH PROGRAM DBSTR. C C CALLING SEQUENCE: C :RU,DBRST,CONSOLE,TAPE,ROOT,LEVEL,ABORT C C LU1, TAPE, ROOT, LVLWD, AND P5 ARE 6-WORD ARRAYS AS FOLLOWS: C 1) LU OR FIRST TWO CHARACTERS C 2) 0 OR SECOND TWO CHARACTERS IF NAMR. C 3) 0 OR THIRD TWO CHARACTERS IF NAMR. C 4) 0 IF NULL, 1 IF INTEGER(LU), 3 IF ASCII(NAMR) C 5) O OR SECURITY CODE IF NAMR. C 6) 0 OR CARTRIDGE NUMBER IF NAMR. C C HDR = TAPE AND REELHEADER WITH INFO ENTERED BY USER. C C BUFR = BUFFER USED THROUGHOUT PROGRAM FOR EVERYTHING. C BUFSZ= SIZE OF ABOVE BUFFER. C SETNUM= NUMBER OF DATA SETS TO RESTORE, NOT COUNTING ROOT FILE. C C HDR = TAPE AND REELHEADER AS DETERMINED BY USER PARAMETERS. C TDCB = DCB USED TO READ FROM THE MAG TAPE DEVICE (TYPE 0 OR TYPE 1) C TDSZ = SIZE OF ABOVE DCB. C C FIRST LEVEL SUBRS CALLED ARE: C GTPRM = GETS FIVE PARAMETERS AND DOES PRELIMINARY CHECKS. C P5STR = STORES ROOT AND P5 AWAY FOR LATER RETRIEVAL. C TLOCL = CHECKS IF THE TAPE DRIVE IS LOCAL OR ON-LINE. C CKTHD = CHECK TAPE HEADER. C SETIN = WRITES AN ENTIRE DATA SET FROM MAG TAPE TO DISC. C************************************************** C COMMON DECLARATIONS. C INTEGER LU1(6),TAPE(6),ROOT(6),LVLWD(6),P5(6) INTEGER HDR(24) COMPLEX HDR1(6) EQUIVALENCE (HDR1,HDR) INTEGER TDCB(144),TDSZ C******************************************************* COMMON/TPHDR/HDR,TDCB,TDSZ,P5 C*************************************************** C LOCAL VARIABLES. C INTEGER BUFR(2072),BUFSZ INTEGER BUF1(256),BUF1SZ INTEGER SETNUM DATA BUFSZ/2072/ DATA BUF1SZ/256/ C**************************************************** C GET THE PARAMETERS. UNTIL YOU GET LU1, LOG ERRORS ON SCHEDULING LU. C LU=LOGLU(IDUMY) CALL STPLU(LU) CALL GETST(BUF1,BUF1SZ,LENGTH) CALL GTPRM(LU,LU1,TAPE,ROOT,LVLWD,P5,BUF1,LENGTH,IERR) IF (IERR .LT. 0) STOP C************************************************************* C CHANGE THE LU FOR STOP MESSAGES TO LU1, CHECK TAPE DEVICE. C CALL STPLU(LU1) IF (TAPE(4) .EQ. 1) CALL TLOCL(LU1,TAPE,IERR) IF (IERR .LT. 0) STOP C********************************************************** C SET UP THE HEADER WITH INFO USER ENTERED. C HDR1(1)=8HDBSTORE HDR1(2)=8H21XX C DO 11 J=1,6 HDR(J+8)=ROOT(J) 11 CONTINUE C HDR(17)=LVLWD(1) HDR(18)=LVLWD(2) HDR(19)=LVLWD(3) HDR(21)=1 HDR(24)=2H** C***************************************************** C OPEN UP THE TYPE 1 OR TYPE 0 FILE TO THE TAPE DEVICE. C IOPTN=0 ISECU=TAPE(5) ICR=TAPE(6) CALL OPENF(TDCB,IERR,TAPE,IOPTN,ISECU,ICR,TDSZ) IF (IERR .GE. 0) IERR=0 CALL DBER2(LU1,IERR,TAPE,6HDBRS2 ,2HAB) C****************************************************** C CHECK THE TAPEHEADER AGAINST THE INFO ENTERED. C CALL TAPER(LU1,TAPE,BUFR,BUFSZ,LEN,EOF,IERR) IF (IERR .LT. 0) GO TO 9100 CALL CKTHD(LU1,HDR,BUFR,IERR) IF (IERR .LT. 0) GO TO 9100 C*************************************************************** C TRANSFER THE NUMBER OF SETS STORED ON THE TAPE FROM THE TAPE HEADER C INTO THE LOCAL HEADER, AND INTO SETNUM. C HDR(20)=BUFR(20) SETNUM=HDR(20) C************************************************************* C WRITE THE ROOT FILE FROM STORAGE DEVICE TO THE DISC. C IF SETIN ENCOUNTERS A DUPLICATE ROOT FILE THAT IT'S NOT C SUPPOSED TO PURGE, DON'T PURGE IT HERE EITHER. C CALL SETIN(LU1,TAPE,0,BUFR,BUFSZ,P5,IERR) IF (IERR .EQ. -2) GO TO 9100 IF (IERR .LT. 0) GO TO 9000 C************************************************************** C WRITE ALL THE DATA SETS FROM MAG TAPE TO C DISC. SETIN ASSUMES THE MAG TAPE IS LOCATED AT THE FILEHEADER C FOR THE JTH FILE WHEN ITS CALLED. C DO 10 J=1,SETNUM CALL SETIN(LU1,TAPE,J,BUFR,BUFSZ,P5,IERR) IF (IERR .LT. 0) GO TO 9000 10 CONTINUE C********************************************************** C WRITE MESSAGE AND GET OUT. C CALL REIO(2,LU1,29H DATA BASE RESTORE COMPLETED.,-29) IERR=0 GO TO 9100 C************************************************************** C PURGE ROOT FILE ON ERROR. C 9000 CONTINUE CALL PURGE(BUF1,IERR,ROOT,ROOT(5),ROOT(6)) 9100 IERR=0 CALL ECLOS(TDCB) 9999 END C C C SUBROUTINE SETIN(LU1,TAPE,J,BUFR,BUFSZ,P5,IERR) +,92069-16126 REV.2013 790413 C******************************************************** C SETIN WRITES THE JTH FILE FROM MAG TAPE TO DISC. IT C ASSUMES THAT THE TAPE IS POSITIONED AT THE FILE HEADER C FOR THE JTH FILE, AND THAT THE DATA FOR THE JTH FILE C IMMEDIATELY FOLLOWS THE FILE HEADER. C C NAMR = 6-WORD ARRAY HOLDING INFO ON FILE BEING WRITTEN TO DISC C DCB2 = THE DCB USED TO WRITE THE DATA TO THE FILE. C DCB2SZ = THE SIZE OF DCB2 C C JBLK= 4-WORD ARRAY USED IN ECREA CALL TO CREATE AN FMP FILE. C (=DOUBLE WORD NUMBER OF BLOCKS+2-WORD DUMMY) C HDSZ = LENGTH OF DATA HEADER. C BLKNO= THE BLOCK NUMBER OF THE BUFR YOU'RE TRANSFERRING. C EOF = LOGICAL FLAG TAPER SETS WHEN IT HITS EOF. C******************************************************* INTEGER LU1,TAPE,J,BUFR(1),BUFSZ,P5,IERR INTEGER NAMR(6) INTEGER DCB2(272),DCB2SZ INTEGER JBLK(4) INTEGER HDSZ INTEGER BLKNO LOGICAL EOF DATA DCB2SZ/256/ DATA HDSZ/24/ C******************************************************* C CALL CKFHD TO DO THE FOLLOWING: C 1)READ THE FILE HEADER ON THE TAPE. C 2) VERIFY THAT ITS A FILEHEAD. C 3) RETURN INFO IN NAMR,JBLK,JREC,AND ITYPE. C CALL CKFHD(LU1,TAPE,BUFR,BUFSZ,NAMR,JBLK,JREC,ITYPE,IERR) IF (IERR .LT. 0) RETURN C****************************************************** C CALL NWFIL TO CREATE A NEW FILE (IF P5 .EQ. 'AB', NWFIL RETURNS C A NEGATIVE ERROR CODE ON DUPLICATE FILES. IF P5 .NE. 'AB', NWFIL C PURGES THE OLD FILE AND CREATES A NEW ONE.) C JBLK(3) AND JBLK(4) = THE RECORD SIZE FOR A TYPE TWO FILE CREATE. C JBLK(3)=0 JBLK(4)=JREC CALL NWFIL(LU1,IERR,DCB2,DCB2SZ,NAMR,JBLK,ITYPE,P5) IF (IERR .LT. 0) RETURN C******************************************************* C BY HERE, FILE IS CREATED. OPEN IT AS TYPE 1 FILE, C EXCLUSIVE USE, BINARY DATA. C IOPTN=104B ISECU=NAMR(5) ICR=NAMR(6) CALL OPENF(DCB2,IERR,NAMR,IOPTN,ISECU,ICR,DCB2SZ) IF (IERR .GE. 0) IERR=0 CALL DBER2(LU1,IERR,NAMR,6HSETIN ,2HXX) IF (IERR .LT. 0) RETURN IERR=0 C************************************************** C READ IN DATA RECORD FROM TAPE TO BUFFER. C 10 EOF=.FALSE. CALL TAPER(LU1,TAPE,BUFR,BUFSZ,LEN,EOF,IERR) IF (IERR .LT. 0) RETURN IF (EOF) GO TO 9000 CALL CKDHD(LU1,NAMR,BLKNO,BUFR,IERR) IF (IERR .LT. 0) RETURN BLKNO=BLKNO+1 C************************************************* C WRITE ALL WORDS PAST DATA HEAD INTO FILE. C CALL EWRIT(DCB2,IERR,BUFR(HDSZ+1),LEN-HDSZ,0.0) CALL DBER2(LU1,IERR,NAMR,6HSETIN ,2HXX) IF (IERR .LT. 0) RETURN GO TO 10 C**************************************************** C EOF RETURN POINT. C 9000 CONTINUE CALL CLOSE(DCB2,IERR) CALL DBER2(LU1,IERR,NAMR,6HSETIN ,2HXX) EOF=.FALSE. IERR=0 RETURN END