*DECK DB$ARAT 
USETEXT CDCSCTX 
      PROC DB$ARAT(DCAREAID,PFOFF); 
      BEGIN 
 #
* *   DB$ARAT - ATTACH A DB AREA                 PAGE  1
* *   J E ESLER                                  DATE  08/30/76 
* *   A W ALLEN - DATABASE VERSIONS              DATE  09/19/80 
* 
* DC  PURPOSE 
* 
*     ATTACH A DATABASE FILE AND ITS OPTIONAL INDEX FILE FOR
*     THE INDICATED DATABASE VERSION. 
*     LOAD THE HASHING DB PROCEDURE IF ONE IS SPECIFIED.
*     LOAD THE COMPRESSION/DECOMPRESSION DB PROC(S) IF SPECIFIED. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM  DCAREAID     C(4);     # AREA ID IN DISPLAY CODE FROM LOG  #
                                   # RECORD HEADER (INPUT).            #
      ITEM  PFOFF            U;    # PERMANENT FILE OFFSET FOR FILE TO #
                                   # BE ATTACHED.  AS FOUND BY DB$VEPN.#
                                   # IF VERSION = *MASTER* THEN PFOFF=0#
                                   # (INPUT).                          #
# 
* 
*     ASSUMPTIONS 
* 
*     MASTER DIRECTORY IS OPEN
*     P<SAL> = SAL ENTRY FOR SCHEMA 
*     P<APL> = 0 IF DB PROCEDURE LIST NOT LOADED. 
*            = APL IF DBP LIST IS LOADED. 
*     P<MDARDIR> (AREA DIRECTORY ENTRY) IS SET TO AN ALLOCATED CMM
*       BLOCK, BUT THE AREA DIRECTORY ENTRY HAS NOT BEEN READ FROM THE
*       MASTER DIRECTORY. 
* 
* DC  EXIT CONDITIONS 
* 
*     AREA INFORMATION TABLE HAS BEEN READ INTO MDAINFO.
*     P<AFIT> = ADDRESS OF MODEL FIT IN THE ARRAY MDAINFO.
*     AREA DIRECTORY TABLE HAS BEEN READ INTO CMM AT THE ADDRESS
*       MDARDIR.
*     APL HAS BEEN ALLOCATED AND LOADED IF IT-S NEEDED. 
*     ATTACHSTATUS (IN DB$CDCS) = 0, ATTACH COMPLETE
*                               " 0, ERROR ON ATTACH
*                               = -1, ERROR LOADING DB PROCEDURE
*            (NOTE - ONLY ONE DB AREA CAN BE ATTACHED AT A TIME IF
*             HASHING DBP"S ARE USED) 
* 
* DC  CALLING ROUTINES
* 
*     DB$RUPD - RECOVERY/RESTORE DATABASE UPDATE ROUTINE
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ATWR;           #ATTACH A PERMANENT FILE#
      XREF FUNC DB$CBIN;           #CONVERT DISPLAY CODE TO BINARY# 
      XREF FUNC DB$CDIS C(10);     #CONVERT BINARY TO DISPLAY CODE# 
      XREF PROC DB$DBPL;           #LOAD A DB PROC# 
      XREF FUNC DB$LFN;            #GENERATE LFN# 
      XREF PROC DB$MDER;           #MD ERROR PROCESSOR# 
      XREF PROC DB$MFA;            #ALLOCATE MANAGED MEMORY BLOCK#
      XREF PROC DB$MFF;            #RELEASE MANAGED MEMORY BLOCK# 
      XREF PROC DB$MSG;            #ISSUE DAYFILE MESSAGE#
      XREF PROC DB$VEFI;           # GET MODEL FIT FOR AN AREA         #
      XREF PROC DB$VEPF;           # GET PF INFO FOR VERSION OF AN AREA#
      XREF PROC DB$WGET;           #WA READ INTERFACE#
# 
* DC  NON-LOCAL VARIABLES 
# 
      XREF ARRAY DB$FTMD;;         #MASTER DIRECTORY FIT# 
 #
# 
      CONTROL NOLIST;              # RVRSCOMMN                         #
*CALL     RVRSCOMMN 
      CONTROL LIST; 
 #
* 
* DC  DESCRIPTION 
* 
*     IF PRIMARY VERSION NAME IS *MASTER*   (IF PFOFF=0)
*     THEN
*       READ AREA INFO ENTRY FROM MASTER DIRECTORY (DB$WGET). 
*     ELSE
*       READ MD AREA INFO FOR MODEL FIT (DB$VEFI).
*       READ MD PF INFO FOR VERSIONS (DB$VEPF). 
* 
*     ATTACH THE AREA FILE AND OPTIONAL INDEX FILE. 
*     READ MD AREA DIRECTORY ENTRY. 
*     IF THERE ARE NOT ANY DBP-S FOR DATA COMPRESSION OR DA HASHING 
*     THEN
*       RETURN. 
* 
*     IF THE APL IS NOT ALREADY LOADED
*     THEN
*       GET SCHEMA PROCEDURE LIST, ATTACH PROCEDURE LIBRARY AND 
*         CONSTRUCT APL (BUILDAPL). 
* 
*     LOAD DATA-BASE PROCEDURES.
* 
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM AREAID;                 # AREA ID (INTEGER)                 #
      ITEM FDLERROR C(35) = " FDL ERROR XXX LOADING DBP XXXXXXX:";
      BASED ARRAY DUMMY;;          #DUMMY ARRAY FOR PARAMETER PASSING#
      CONTROL EJECT;
      PROC BUILDAPL;
      BEGIN 
 #
* *   DB$ARAT                                    PAGE  1
* *   BUILDAPL - BUILD APL IN MANAGED MEMORY
* *   J E ESLER                                  DATE  08/30/76 
 #
      ITEM NW;                     #SCRATCH CELL# 
      ITEM PLFN;                   #PROCEDURE LIBRARY LFN#
      BASED ARRAY MDDPT;
        BEGIN 
*CALL MDDPDDCLS 
        END 
  
#         GET SPACE FOR SCHEMA PROCEDURE LIST AND READ IT FROM THE MD  #
  
          NW = SASCDPSZ [0];
          DB$MFA (NW,P<MDDPT>); 
          DB$WGET (DB$FTMD,MDDPT,NW,SASCWADP[0],DB$MDER); 
  
#         GET SPACE FOR APL AND INTIALIZE HEADER                       #
  
          NW = (MDDPNBEN[0]+1)*DFAPLENSIZE; 
          DB$MFA(NW,P<APL>);
          SADBPPTR[0] = P<APL>; 
      PLFN = DB$LFN("P",SASCHID[SALX]); 
      APDBPLFN[0] = PLFN; 
          APDBPSZ [0] = MDDPNBEN [0]; 
          APWORD1 [0] = 0;
  
#         ISSUE ATTACH REQUEST FOR PROCEDURE LIBRARY. IF ATTACH IS NOT #
#         SUCCESSFUL, EXIT                                             #
  
          P<DUMMY> = LOC(MDDPPF[0]);
          DB$ATWR(PLFN,DUMMY,ATTACHSTATUS); 
          P<APL> = SADBPPTR [0];
          IF ATTACHSTATUS NQ 0  THEN
            BEGIN 
            RETURN; 
            END 
  
#     CONSTRUCT THE ACTIVE PROCEDURE LIST                              #
  
          P<APL> = P<APL> + DFAPLENSIZE;
          APLL = MDDPNBEN [0] - 1;
          FOR APLX=0 STEP 1 UNTIL APLL  DO
            BEGIN 
            APDBPNAM [APLX] = B<0,42>MDDPPNAM [APLX]; 
            APWORD1 [APLX] = 0; 
            END 
      P<APL> = P<APL> - DFAPLENSIZE;
  
#     RELEASE ALLOCATED SPACE FOR SCHEMA PROCEDURE LIST                #
  
          DB$MFF (P<MDDPT>);
      END 
      CONTROL EJECT;
  
  
#     S T A R T   O F   D B $ A R A T   E X E C U T A B L E   C O D E  #
  
  
      AREAID = DB$CBIN(DCAREAID,4,10);
      P<AFIT> = LOC(MDAIAFIT);          #SET FIT POINTER# 
      IF PFOFF EQ 0                # IF PRIMARY VERSION IS "MASTER"    #
      THEN
        BEGIN 
        DB$WGET(DB$FTMD,MDAINFO,DFMDAIEN
               ,SASCWAAD[0] + SASCADSZ[0] + (AREAID - 1)*DFMDAIEN 
               ,DB$MDER); 
        END 
      ELSE                         # PRIMARY VERSION IS NOT "MASTER"   #
        BEGIN 
        DB$VEFI(AREAID,AFIT);      # READ MODEL FIT.                   #
        DB$VEPF(PFOFF,MDAINFO);    # READ PF INFORMATION FOR VERSION   #
                                   # FILE.                             #
        END 
# 
*     ATTACH THE AREA AND OPTIONAL INDEX FILES. 
# 
      P<DUMMY> = LOC(MDAIARPF); 
      DB$ATWR(AFITLFN,DUMMY,ATTACHSTATUS);
      IF ATTACHSTATUS NQ 0 THEN        #PFM ERROR#
        BEGIN 
        RETURN; 
        END 
      IF MDAIIXPF NQ 0 THEN 
        BEGIN 
        P<DUMMY> = LOC(MDAIIXPF); 
        DB$ATWR(AFITXN,DUMMY,ATTACHSTATUS); 
        IF ATTACHSTATUS NQ 0 THEN      #PFM ERROR#
          BEGIN 
          RETURN; 
          END 
        END 
# 
*     IF THERE ARE ANY DBP"S FOR DATA COMPRESSION OR DA HASHING 
*     CREATE AN APL IF NEEDED AND LOAD THEM 
# 
      DB$WGET(DB$FTMD,MDARDIR,DFMDADEN
             ,SASCWAAD[0] + (AREAID - 1)*DFMDADEN + 1 
             ,DB$MDER); 
      IF (MDADHSOR[0] EQ 0) AND (MDADCMOR[0] EQ 0) THEN 
        RETURN;              # NO PROCS TO LOAD # 
  
#     OTHERWISE DA HASHING OR COMPR/DECOMPR TO DO                      #
  
      IF P<APL> EQ 0  THEN    # LOAD THE PROCEDURE LIST                #
        BUILDAPL; 
      APLX = MDADHSOR[0];    # CHECK IF ANY HASHING                    #
      IF APLX NQ 0 THEN      # LOAD DA HASH ROUTINES                   #
        BEGIN 
        DB$DBPL (APWORD0[0],LOC(APDBPNAM[APLX])); 
        IF APEPADD[APLX] LQ DFMAXDBPERR THEN  # ERROR LOADING DBP # 
          BEGIN 
          C<11,3> FDLERROR = DB$CDIS (APEPADD[APLX],3,8,"0"); 
          C<27,7> FDLERROR = C<0,7> APDBPNAM[APLX]; 
          DB$MSG (FDLERROR);
          ATTACHSTATUS = -1;
          RETURN; 
  
          END 
        AFITHRL[0] = APEPADD[APLX]; 
        END 
      APLX = MDADCMOR[0];    # CHECK IF ANY COMP/DECOMP ROUTINES       #
      IF APLX NQ 0 THEN      # LOAD COMPRESSION/DECOMP ROUTINES        #
        BEGIN 
        DB$DBPL (APWORD0[0],LOC(APDBPNAM[APLX])); 
        IF APEPADD[APLX] LQ DFMAXDBPERR THEN   # ERROR LOADING DBP #
          BEGIN 
          C<11,3> FDLERROR = DB$CDIS (APEPADD[APLX],3,8,"0"); 
          C<27,7> FDLERROR = C<0,7> APDBPNAM[APLX]; 
          DB$MSG(FDLERROR); 
          ATTACHSTATUS = -1;
          RETURN; 
  
          END 
        AFITCPA[0] = APEPADD[APLX]; 
        IF MDADDEOR[0] NQ MDADCMOR[0] THEN
          BEGIN 
          APLX = MDADDEOR[0]; 
          DB$DBPL (APWORD0[0],LOC(APDBPNAM[APLX])); 
          IF APEPADD[APLX] LQ DFMAXDBPERR THEN    # ERR LOADING CAP # 
            BEGIN 
          C<11,3> FDLERROR = DB$CDIS (APEPADD[APLX],3,8,"0"); 
            C<27,7> FDLERROR = C<0,7> APDBPNAM[APLX]; 
            DB$MSG(FDLERROR); 
            ATTACHSTATUS = -1;
            RETURN; 
  
            END 
          END 
          AFITDCA[0] = APEPADD[APLX]; 
        END 
      END 
      TERM
