*DECK DB$RLDN 
USETEXT RQPARTX 
      PROC DB$RLDN (RLORD,RUSLIST); 
      BEGIN 
 #
* *   DB$RLDN                                    PAGE  1
* *   READ RELATION PREPROCESSOR
* *   W P CEAGLIO                                DATE 11/22/76
* *   J J JANIK                                  DATE  11/07/78 
* 
* DC  PURPOSE 
* 
*     INITIALIZE FIT PARAMETERS IN FITLIST. 
* 
*     CONSTRUCT THE BUFFER CONTAINING ALL DATA NAME VALUES USED IN A
*     RESTRICT CLAUSE BY THE RUN-UNIT FOR A GIVEN RELATION. 
* 
* DC  ENTRY CONDITIONS
* 
*     ADDRESS OF THE RELATION ORDINAL IS PASSED AS A FORMAL PARAMETER.
* 
*     THE ADDRESS OF THE RELATION USAGE LIST IS PASSED AS A FORMAL
*     PARAMETER.
* 
*     ADDRESS OF THE FITLIST IS IN THE REQUEST PACKET.
* 
* DC  EXIT CONDITIONS 
* 
*     FIT PARAMETERS ARE STORED IN FITLIST FOR PASSING TO CDCS. 
* 
*     IF THERE ARE NO RESTRICT VALUES TO PROCESS, THE PERTINENT FIELDS
*     IN THE REQUEST PACKET ARE SET TO ZERO.
* 
*     THE DATA NAME VALUES ARE EXTRACTED FROM THEIR RESPECTIVE
*     LOCATIONS AND INSERTED LEFT-JUSTIFIED IN A BUFFER.  EACH VALUE
*     IS PRECEDED BY A WORD CONTAINING THE VALUE LENGTH IN CHARACTERS 
*     AND WORDS.  THE ADDRESS OF THIS BUFFER IS RECORDED IN THE 
*     REQUEST PACKET. 
* 
*     THE BUFFER IS ALLOCATED VIA CMM 
* 
* DC  CALLING ROUTINES
* 
*     DB$REL     READ RELATION RANDOM OBJECT-TIME ROUTINE 
*     DB$RELS    READ RELATION SEQUENTIAL OBJECT-TIME ROUTINE 
* 
* DC  CALLED ROUTINES 
* 
*     DB$MFA     CMM INTERFACE
*     DC$MBIT    MOVE BIT STRING
* 
* DC  DESCRIPTION 
* 
*     -  FIND THE ENTRY IN THE RELATION USAGE LIST FOR THE GIVEN
*        RELATION ORDINAL. IF NOT FOUND THEN SET THE
*        RELATION ORDINAL IN THE REQUEST PACKET TO ZERO 
*        AND RETURN TO CALLER. THE SYMBIONT DB$REL$ CHECKS
*        FOR RELATION ORDINAL EQUAL TO ZERO AND WILL
*        TERMINATE THE REQUEST. 
* 
*     -  ZERO THE DATA NAME INFO IN THE REQUEST PACKET AND COMPLETE 
*        THE RELATION ORDINAL ENTRY.
* 
*     -  EXTRACT FIT PARAMETERS TO PASS TO CDCS.
* 
*     -  IF NO DATA NAMES, RETURN.
* 
*     -  ALLOCATE A CMM BUFFER FOR THE DATA NAMES OF A RELATION AFTER 
*        CALCULATING THE SPACE NEEDED.
* 
*     -  FOR EACH DATA NAME ENTRY IN THE LIST, EXTRACT THE VALUE AND
*        STORE IT LEFT-JUSTIFIED IN THE NEXT AVAILABLE SLOT IN THE
*        ALLOCATED BUFFER.
* 
*     -  COMPLETE THE SIZE AND ADDRESS ENTRIES IN THE REQUEST PACKET
*        FOR THE DATA NAME BUFFER.
* 
*     -  RETURN TO CALLER.
* 
 #
      CONTROL NOLIST;        # CDGDFDCLS, RQPARDCLS                    #
  
  
# EXTERNAL REFERENCES                                                  #
  
      XREF
        BEGIN 
  
      CONTROL LIST; 
        END 
  
      XREF PROC DC$MBIT;                # MOVE BIT STRING              #
      XREF PROC DB$MFA;                 # CMM MEMORY REQUEST INTERFACE #
  
#     PARAMETERS IN CALLING SEQUENCE                                   #
  
      ITEM RLORD;                       # RELATION ORDINAL             #
      ITEM RUSLIST;                     # ADDRESS OF RELATION USAGE LST#
  
  
# LOCAL VARIABLES                                                      #
  
      ITEM I;                           # FOR LOOP CONTROL             #
      ITEM J;                           # FOR LOOP CONTROL             #
      ITEM LWDS;                        # NUMBER OF WORDS IN VALUE     #
      ITEM NW;                          # FOR CMM CALL                 #
      ITEM VPTR;                        # INDEX INTO DATA NAME BUFFER  #
  
      BASED ARRAY FITLIST;   #FITLIST FOR RELATION READ#
*CALL FTLSTDCLS 
      BASED ARRAY FIT;
*CALL FITDCLS 
*CALL DNRELDCLS 
  
      CONTROL EJECT;
  
# S T A R T  O F  D B $ R L D N  E X E C U T A B L E  C O D E          #
  
#     LOCATE ENTRY IN RELATION USAGE LIST FOR THE INPUT ORDINAL .  IF  #
#       NOT FOUND, THEN SET THE RELATION ORDINAL IN                    #
#       THE REQUEST PACKET TO ZERO AND RETURN TO CALLER.               #
#       THE SYMBIONT DB$REL$ CHECKS FOR RELATION ORDINAL               #
#       EQUAL TO ZERO AND WILL TERMINATE REQUEST.                      #
  
      P<DNAMS> = LOC(RUSLIST);
      I = 0;
      FOR I=I WHILE DNRLORD [0] NQ 0  DO
        BEGIN 
        IF RLORD EQ DNRLORD [0]  THEN 
          GOTO RELOK; 
        P<DNAMS> = LOC(DNAMS) + DNCOUNT;
        END 
  
      RQPRELOR [0] = 0; 
      RETURN; 
  
 RELOK: 
  
#     INITIALIZE ENTRIES IN REQUEST PACKET                             #
  
      RQPDNSZ [0] = 0;
      RQPDNNUM [0] = 0; 
      RQPDNPTR [0] = 0; 
      RQPRELOR [0] = DNRLORD [0]; 
  
#     SET WSA AND ES FIELDS IN FITLIST FROM FITS.                      #
  
      P<FITLIST> = RQPFITLS[0]; 
      FOR I = 0 STEP 1 WHILE FITADR[I] NQ 0 DO
        BEGIN 
        P<FIT> = FITADR[I]; 
        FITLWSA[I] = FITWSA[0]; 
        FITLES[I] = DFNOREAD;      #INITIALIZE TO NO READ STATUS# 
        END 
  
#     RETURN IF NO DATA NAME ENTRIES                                   #
  
      J = DNCOUNT[0] - 1; 
      IF J LQ 0 THEN
        RETURN; 
  
#     ALLOCATE BUFFER IN MANAGED MEMORY BASED ON THE NUMBER OF RESTRICT#
#     ENTRIES AND THE SIZE OF THE DATA NAMES                           #
  
      RQPDNNUM[0] = J;
      NW = J + 1; 
      FOR I = 1 STEP 1
        UNTIL J 
      DO
        BEGIN 
        NW = NW + (DNLENTH[I] + 9) / 10;
        END 
      DB$MFA (NW,P<DVALS>); 
  
#     FOR EACH DATA NAME IN THE LIST, EXTRACT THE VALUE AND STORE IT   #
#     LEFT-JUSTIFIED IN THE NEXT AVAILABLE SLOT IN THE ALLOCATED BUFFER#
  
      VPTR = 0; 
      FOR I=1 STEP 1 UNTIL J DO 
        BEGIN 
        LWDS = (DNLENTH[I]+9)/10; 
        DVLNCHS [VPTR] = DNLENTH [I]; 
        DVLNWDS [VPTR] = LWDS;
        DC$MBIT(DNADR[I],DNBCP[I]*6,LOC(DVVALUE[VPTR]),0,DNLENTH[I]*6); 
        VPTR = VPTR + LWDS + 1; 
        END 
  
#     COMPLETE REMAINING ENTRIES IN REQUEST PACKET                     #
  
      RQPDNPTR [0] = LOC(DVALS);
      RQPDNSZ [0] = VPTR; 
  
  
      END 
      TERM
