*DECK DB$ACCN 
USETEXT CDCSCTX 
      PROC DB$ACCN; 
 #
* *   DB$ACCN   ACCOUNT TABLE TALLY              PAGE  1
* *   R.C.KLOENNE                                2/11/77
* *   KENDALL, G. F.                             2/22/79
* *   P. L. KENNY - LOGGING ACCOUNTING CHANGES   1/30/81
* 
* DC  PURPOSE 
* 
*     THIS ROUTINE ADDS UP ACCOUNT INFORMATION BASED ON TABLE DB$ACCT.
* 
* DC  ENTRY CONDITIONS
* 
*     END TASK PROCESSING IS TAKING PLACE.
*     THE FOLLOWING BASED ARRAYS MUST BE CORRECTLY POINTED -
*       CSFIXED, RCB, RSARBLK, SAL, TQT.
* 
* DC  EXIT CONDITIONS 
* 
*     CHARGES HAVE BEEN ADDED UP FOR THE LAST REQUEST.
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$ACCL  I;        # LOCATE BASED ARRAY DB$ACCT        #
      XREF PROC DB$FLOP;           # GENERATE FLOW POINT               #
      XREF ITEM DB$NOS B;          # TRUE IF OS IS NOS                 #
      XREF PROC DB$SFCL;           # ISSUE SUB-SYSTEM FUNCTION         #
# 
* DC  CALLING ROUTINES
* 
*     DB$WRP
* 
* DC  NON LOCAL VARIABLES MODIFIED
* 
*     TQACCP    - CP TIME FOR THIS TASK 
*     TQACIO    - IO TIME FOR THIS TASK 
*     TQACUMCP  - ACCUMULATIVE CP TIME
*     TQACUMIO  - ACCUMULATIVE IO TIME
* 
* DC  DESCRIPTION 
* 
*     ADD UP ALL ACCOUNT CHARGES WHICH PERTAIN TO THIS CDCS TASK. 
* 
*     CDCS ACCOUNTING IS ACCOMPLISHED BY DOING A TABLE LOOKUP TO FIND CP
*     AND IO CHARGES (TIMES, IN MICROSECONDS) FOR EACH FUNCTION 
*     PERFORMED. THIS METHOD WAS CHOSEN TO GIVE CONSISTANT FIGURES
*     ACROSS RUNS, REGARDLESS OF SYSTEM LOAD, MULTIPLE RUN UNITS
*     ACCESSING ONE AREA, ETC.
* 
* 
*     EXECUTION BEGINS WITH THE LOCAL VARIABLE REQORD BEING SET TO
*     THE CURRENT REQUEST (FUNCTION) CODE (OBTAINED FROM THE INPUT
*     REQUEST PACKAGE). ALL CHARGES AND FLAGS MENTIONED BELOW ARE 
*     THOSE OBTAINED BY ACCESSING THE REQORD-TH ENTRY OF THE ACCOUNT
*     TABLE (DB$ACCT), WITH THE EXCEPTION OF JOURNAL AND QRF LOG CHARGES
*     WHICH ARE STORED IN THE ZERO-TH ENTRY.
* 
*     IF THE PRIMARY/ALTERNATE KEY FLAG OR THE MODIFY FLAG IS TRUE
*     THEN  - THE BASED ARRAYS OFT, UFT, AND CSAREBLK ARE POINTED 
*           - THE VALUE OF INDEX IS SET TO INDICATE WHICH FILE
*               ORGANIZATION IS IN USE
* 
*     IF THE FIXED FLAG IS TRUE 
*     THEN - ADD FIXED CHARGE 
* 
*     IF THE ACCOUNTING ALREADY TALLIED FLAG IS FALSE 
*     THEN - IF MODIFY FLAG IS TRUE 
*            THEN - ADD CHARGES FOR PRIMARY AND ALTERNATE KEY ACCESSES
*            ELSE - IF PRIMARY/ALTERNATE KEY FLAG IS TRUE 
*                   THEN - IF KEY POINTER FIELDS AND KEY WORD 
*                          LOCATIONS IN OFT AND UFT ARE EQUAL 
*                          THEN - ADD CHARGES FOR PRIMARY KEY ACCESS
*                          ELSE - ADD CHARGES FOR ALTERNATE KEY ACCESS
* 
*            IF JOURNAL LOG FLAG IS TRUE
*            THEN - ADD CHARGES FOR JOURNAL LOGGING 
* 
*            IF AREA LOG FLAG IS TRUE 
*            THEN - SET NLOGWRT TO THE NUMBER OF WRITES TO JOURNAL
*                     LOG FILES (0,1, OR 2) 
*                 - ADD CHARGES FOR AREA LOGGING
*                     (NLOGWRT * CHARGES FOR LOGGING) 
* 
*            IF QRF LOG FLAG IS TRUE
*            THEN - IF QRF LOGGING IS SPECIFIED 
*                   THEN - ADD CHARGES FOR QRF LOGGING
* 
*     ADD CHARGES FOR REQUEST TO ACCUMULATIVE CHARGES 
* 
*     RETURN
* 
* 
*         FLAG    ALGORITHM 
* 
*      ACPRAFL    PRIMARY KEY XOR ALTERNATE KEY CHARGE ADDED
*                 FOR THIS REQUEST
* 
*      ACFIXFL    FIXED CHARGE ADDED
* 
*      ACTALFL    ACCOUNTING ALREADY TALLIED
* 
*      ACJNLFL    JOURNAL LOGGING CHARGE ADDED
* 
*      ACARLFL    AREA LOGGING CHARGE ADDED (LOGGING SPECIFIED FOR THE
*                 AREA THIS REQUEST ACTS ON)
* 
*      ACQRFFL    QRF LOGGING CHARGE ADDED
* 
*      ACMODFL    PRIMARY KEY (FOR THIS FILE ORGANIZATION) PLUS 
*                 ALTERNATE KEY CHARGES ADDED (DATABASE WAS MODIFIED) 
* 
 #
      CONTROL NOLIST;  # CDCSCOMMN,CSTARDCLS                           #
*CALL CSTARDCLS 
      CONTROL LIST ;
*CALL ACCNT 
  
  
  
#     LOCAL VARIABLES                                                  #
  
      ITEM  NLOGWRT      I;  # NUMBER OF WRITES TO JOURNAL LOG FILE(S) #
      ITEM  REQORD       U;  # REQUEST ORDINAL                         #
  
  
  
#     B E G I N   D B $ A C C N   E X E C U T A B L E   C O D E .      #
  
      BEGIN 
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("ACCN   "); 
      CONTROL ENDIF;
  
      P<ACCNT> = DB$ACCL;    # POSITION ACCOUNTING TABLE               #
      REQORD = RCIRFUNC[0];  # SET REQUEST ORDINAL FROM RCB            #
  
      IF ( ACPRAFL[REQORD]                   # IF PRIMARY/ALTERNATE KEY#
        OR ACMODFL[REQORD] )                 # CHARGE OR MODIFY CHARGE #
                                             # APPLIES TO THIS REQUEST #
        AND LOC(RSARBLK) GR 0 
      THEN
        BEGIN 
        P<OFT> = RSAROFIT[0]; 
        P<UFT> = LOC(OFUFT[0]); 
        P<FKL> = RSFFKLLOC[0];
        IF RSARFPT[0] NQ 0
        THEN
          BEGIN 
          P<FPT> = LOC(FKL) + RSARFPT[0]; 
          END 
        P<CSAREBLK> = P<CSFIXED> + RSARCSTP[0];  # PT TO AR WORK BLOCK #
  
        END 
  
      IF ACFIXFL[REQORD]  # IF FIXED CHARGE IS TO BE ADDED             #
      THEN
        BEGIN 
        TQACCP[0] = TQACCP[0] + ACFIXCP[REQORD];
        TQACIO[0] = TQACIO[0] + ACFIXIO[REQORD];
        END 
  
  
  
      IF NOT ACTALFL[REQORD]  # IF CHARGES NOT ALREADY TALLIED         #
        AND LOC(RSARBLK) GR 0 
      THEN
        BEGIN 
        IF ACMODFL[REQORD]  # IF MODIFY CHARGE APPLIES                 #
        THEN
          BEGIN 
          IF UFFITFO[0] EQ DFFITFOIS       #IF FILE ORGANIZATION IS IS #
          THEN
            BEGIN 
            TQACCP[0] = TQACCP[0] + (CSAALTNO[0] * ACALTCP[REQORD]) 
              + ACPISCP[REQORD];
            TQACIO[0] = TQACIO[0] + (CSAALTNO[0] * ACALTIO[REQORD]) 
              + ACPISIO[REQORD];
            END 
          ELSE
            IF UFFITFO[0] EQ DFFITFODA     #IF FILE ORGANIZATION IS DA #
            THEN
              BEGIN 
              TQACCP[0] = TQACCP[0] + (CSAALTNO[0] * ACALTCP[REQORD]) 
                + ACPDACP[REQORD];
              TQACIO[0] = TQACIO[0] + (CSAALTNO[0] * ACALTIO[REQORD]) 
                + ACPDAIO[REQORD];
              END 
            ELSE
              IF UFFITFO[0] EQ DFFITFOAK   #IF FILE ORGANIZATION IS AK #
              THEN
                BEGIN 
                TQACCP[0] = TQACCP[0] + (CSAALTNO[0] * ACALTCP[REQORD]) 
                  + ACPAKCP[REQORD];
                TQACIO[0] = TQACIO[0] + (CSAALTNO[0] * ACALTIO[REQORD]) 
                  + ACPAKIO[REQORD];
                END 
          END 
        ELSE
          IF ACPRAFL[REQORD]  # IF PRI XOR ALT KEY CHARGE APPLIES      #
          THEN
            BEGIN 
            IF UFFITFO[0] EQ DFFITFOIS   #IF FILE ORGANIZATION IS IS   #
            THEN
              BEGIN 
              TQACCP[0] = TQACCP[0] + ACPISCP[REQORD];
              TQACIO[0] = TQACIO[0] + ACPISIO[REQORD];
              END 
            ELSE
              IF UFFITFO[0] EQ DFFITFODA   #IF FILE ORGANIZATION IS DA #
              THEN
                BEGIN 
                TQACCP[0] = TQACCP[0] + ACPDACP[REQORD];
                TQACIO[0] = TQACIO[0] + ACPDAIO[REQORD];
                END 
              ELSE
                IF UFFITFO[0] EQ DFFITFOAK       #IF FILE ORGAN. IS AK #
                THEN
                  BEGIN 
                  TQACCP[0] = TQACCP[0] + ACPAKCP[REQORD];
                  TQACIO[0] = TQACIO[0] + ACPAKIO[REQORD];
                  END 
  
#     IF READ BY ALTERNATE KEY, ADDITIONAL CHARGES MUST BE ADDED.      #
#     PRIMARY AND ALTERNATE KEY READS CAN BE DISTINGUISHED BY          #
#     COMPARING RKP AND RKW FIELDS IN OFT AND FPT.                     #
            IF LOC(FPT) GR 0
              AND OFPRIKWKP[0] NQ FPFITKWKP[0]   # IF ALTERNATE KEY    #
            THEN
              BEGIN 
              TQACCP[0] = TQACCP[0] + ACALTCP[REQORD];
              TQACIO[0] = TQACIO[0] + ACALTIO[REQORD];
              END 
            END 
  
  
  
  
#       ACCUMULATE CHARGES FOR JOURNAL AND QRF LOGGING                 #
  
        IF SASCJAFG[SALX]    # IF JOURNAL LOGGING SPECIFIED FOR SCHEMA #
        THEN
          BEGIN 
          IF ACJNLFL[REQORD] # IF JOURNAL LOGGING APPLIES TO THIS REQ  #
          THEN
            BEGIN 
            TQACCP[0] = TQACCP[0] + ACLOGCP[0]; 
            TQACIO[0] = TQACIO[0] + ACLOGIO[0]; 
            END 
  
          IF ACARLFL[REQORD]  # IF IMAGE LOGGING APPLIES TO REQUEST    #
          THEN
            BEGIN 
  
#           CALCULATE NUMBER OF RECORDS WRITTEN TO LOG FILE FOR REQUEST#
  
            NLOGWRT = 0;
                             # IF BEFORE-IMAGE RECORD LOGGING SPECIFIED#
            IF LOC(RSARBLK) GR 0
              AND RSARLGBR[0] 
            THEN
              BEGIN 
              NLOGWRT = NLOGWRT + 1;
              END 
                             # IF AFTER-IMAGE RECORD LOGGING SPECIFIED #
            IF LOC(RSARBLK) GR 0
              AND RSARLGAR[0] 
            THEN
              BEGIN 
              NLOGWRT = NLOGWRT + 1;
              END 
  
#           ADD RECORD IMAGE JOURNAL LOG CHARGES                       #
  
            TQACCP[0] = TQACCP[0] + (NLOGWRT * ACLOGCP[0]); 
            TQACIO[0] = TQACIO[0] + (NLOGWRT * ACLOGIO[0]); 
            END 
  
          END 
  
        IF ACQRFFL[REQORD]  # IF QRF LOGGING APPLIES TO THIS REQUEST   #
        THEN
          BEGIN 
          IF RSARLGBB[0]     # IF BEFORE-IMAGE BLOCK LOGGING SPECIFIED #
                             # FOR THE AREA THIS REQUEST IS ACTING ON  #
          THEN
            BEGIN 
            TQACCP[0] = TQACCP[0] + ACQRFCP[0]; 
            TQACIO[0] = TQACIO[0] + ACQRFIO[0]; 
            END 
  
          END 
  
        END 
  
  
  
  
#     ADD CHARGES FOR THIS REQUEST TO ACCUMULATIVE CHARGES             #
  
      TQACUMCP[0] = TQACUMCP[0] + TQACCP[0];
      TQACUMIO[0] = TQACUMIO[0] + TQACIO[0];
  
#     CONVERT (SECONDS * .000,001 [WHAT THE TABLE CONTAINS]) TO        #
#     (SECONDS / 4096 [WHAT THE  OPERATING SYSTEM EXPECTS])            #
  
      TQACCP[0] = TQACCP[0] / 256.0 + 0.5;
      TQACIO[0] = TQACIO[0] / 256.0 + 0.5;
  
      IF DB$NOS              # IF THE OPERATING SYSTEM IS NOS          #
      THEN
        BEGIN 
        TQACNSAC[0] = 1;     # SET THE NOS ACCOUNTING TABLE CODE       #
        IF TQACIO[0] GR O"1777" 
        THEN
  
#         THE NOS MS FIELD IS RESTRICTED TO TEN BITS                   #
  
          BEGIN 
  
          CONTROL IFGR DFFLOP,0;
            DB$FLOP("ACCN-MS");     # THE MAXIMUM WAS EXCEEDED         #
          CONTROL ENDIF;
  
          TQACNSMS[0] = O"1777";    # MAXIMUM NOS MS KILO-UNITS        #
          END 
        ELSE
          BEGIN 
          TQACNSMS[0] = TQACIO[0];  # NOS MS KILO-UNITS                #
          END 
        TQACIO[0] = 0;
        END 
      DB$SFCL(DFSFENDT,0,RCIRUCPA[0],LOC(TQACCP[0])); 
      TQACCP[0] = 0;         # ZERO THE -PER REQUEST- CHARGES          #
      TQACCPB[0] = 0; 
      TQACIO[0] = 0;
  
      RETURN; 
  
      END                    # DB$ACCN                                 #
  
      TERM
