*DECK CAPLOG
USETEXT TAREATB 
USETEXT TFIT
USETEXT TLOGDEF 
      PROC CAPLOG(TYPE, RC);
#----------------------------------------------------------------------#
#                                                                      #
#     C A P L O G                                                      #
#                                                                      #
# INTERFACE TO DBU LOGGING ROUTINES.  *CAPLOG* IS THE ACTIVE           #
# PART THAT CALLS DF$LOG. IT LOOKS AT THE TARGET AREATABLE FOR MOST OF #
# ITS INFORMATION.                                                     #
# -TYPE- SPECIFIES WHAT KIND OF LOG ENTRY IS DESIRED.                  #
# -RC- IS THE RETURN CODE FOR LOG.                                     #
  
  
      BEGIN 
                                                                         LOG
      ITEM TYPE I;                 # TYPE OF LOG ENTRY TO BE WRITTEN.  #
                                   # REFER TO STATUS LIST -RQTYPE- FOR #
                                   # A LIST OF VALUES.                 #
      ITEM RC I;                   # RETURN CODE - ZERO IF ALL WENT OK #
  
  
      XREF PROC DF$LOG;            # DBU LOGGING ROUTINE               #
      XREF PROC GETJN;             # ROUTINE TO GET THE JOBNAME        #
      XREF ITEM AREATBLPTR I;      # LOCATION OF FIRST AREA TABLE      #
  
      XREF BASED ARRAY BIMAGE;;    # BEFORE-IMAGE ARRAY                #
      XREF ITEM LGBIMAGE I;        # LENGTH OF THE -BEFORE- IMAGE      #
      XREF BASED ARRAY QUIWSA;;    # TRANSMISSION BUFFER               #
      XREF ITEM TARGETAREA I;      # POINTER TO THE AREA TABLE OF THE  #
                                   # TARGET AREA...THE ONE TO UPDATE   #
      XREF ITEM TRANSLG I;         # LENGTH OF THE CURRENT TRANSMISSION#
  
      DEF LOGTBLLG # 10 #;         # LENGTH OF THE LOG TABLE           #
      ARRAY LOGTABLE [0] S(LOGTBLLG);  # PARAMETER TABLE TO DF$LOG     #
        BEGIN 
        ITEM RQCODE    U(00,00,06);  # REQUEST CODE - IDENTIFIES THE   #
                                     # TYPE OF LOGGING ENTRY BEING MADE#
  
        ITEM DCODE     U(00,06,06);  # DIRECTIVE CODE - IDENTIFIES     #
                                     # THE DIRECTIVE THAT CAUSED THE   #
                                     # CHANGE IN THIS RECORD.          #
  
        ITEM RETCODE   U(00,54,06);  # STATUS/RETURN CODE - ZERO IF    #
                                     # ALL WENT WELL.                  #
  
        ITEM AFITLFN  U(01,00,42);                                       LOG
  
        ITEM AFITADDR  U(01,42,18);  # AREA FIT ADDRESS                #
  
        ITEM LOGLFN    C(02,00,07);  # LOGFILE LFN                     #
  
        ITEM KEYPOS    U(03,00,04);  # KEY POSITION -                  #
  
        ITEM KEYLNG    U(03,04,08);  # KEY LENGTH/TRANSACTION LENGTH - #
                                     # LENGTH OF TRANSACTION IF LOGGING#
                                     # A TRANSACTION, ELSE LENGTH OF   #
                                     # RECORD KEY.                     #
  
        ITEM RKP       U(03,20,04);  # RELATIVE KEY POSITION (CHAR)    #
  
        ITEM RKW       U(03,24,12);  # RELATIVE KEY WORD               #
  
        ITEM KEYTYPE   U(03,36,06);  # KEY TYPE - DISTINGUISHES        #
                                     # PRIMARY KEYS FROM ALTERNATE KEYS#
                                     # ETC.                            #
  
        ITEM KEYADDR   U(03,42,18);  # KEY ADDRESS                     #
  
        ITEM BILENG    U(04,00,18);  # BEFORE-IMAGE LENGTH             #
  
        ITEM BIADDR    U(04,18,18);  # BEFORE-IMAGE ADDRESS            #
  
        ITEM AILENG    U(05,00,18);  # AFTER-IMAGE LENGTH              #
  
        ITEM AIADDR    U(05,18,18);  # AFTER-IMAGE ADDRESS             #
  
        ITEM AFITMRL   U(04,36,24);  # AREA FIT MRL                    #
  
        ITEM PROGID    C(06,00,10);  # PROGRAM IDENTIFICATION - NAME   #
                                     # BY WHICH THIS IS KNOWN IN THE   #
                                     # SYSTEM DAYFILE.                 #
  
        ITEM SSNAME    C(07,00,30);  # SUBSCHEMA NAME                  #
  
        END 
  
  
# THE FOLLOWING ARE THE REQUEST CODES FOR INTERFACING WITH -DF$LOG-    #
      DEF RQOPEN    # O"01" #;     # REQUEST CODE FOR -LOG AN OPEN-    #
      DEF RQTRANS   # O"02" #;     # REQUEST CODE FOR -LOG TRANSACTION-#
      DEF RQBEFORE  # O"04" #;     # REQUEST CODE FOR -LOG BEFORE-     #
      DEF RQAFTER   # O"10" #;     # REQUEST CODE FOR -LOG AFTER-      #
      DEF RQCLOSE   # O"20" #;     # REQUEST CODE FOR -LOG A CLOSE-    #
      DEF RQTERM    # O"40" #;     # REQUEST CODE FOR LOG TERMINATION  #
  
  
  
  
      ITEM IMAGEREQUEST B;         # TRUE IF REQUEST WOULD LOG AN IMAGE#
  
      ITEM INDEX I;                # SCRATCH INDUCTION VARIABLE        #
      XREF ITEM JOBNAME C(10);     # JOBNAME BY WHICH THE JOB IS KNOWN #
                                   # IN THE SYSTEM DAYFILE             #
  
      ITEM LOGDC C(10) = "HIEECEF";  # STRING OF DIRECTIVE CODES FOR   #
                                     # LOGTABLE. WITH *TYPE* AS A CHAR #
                                     # INDEX, THE PROPER CHAR IS PULLED#
  
      BASED ARRAY ZEROLOG;
        BEGIN 
        ITEM LOGWORD   U(00,00,60);  # WHOLE WORD DEFINITION FOR USE IN#
                                     # ZEROING THE LOG TABLE           #
        END 
  
      BASED ARRAY FDB;
        BEGIN 
        ITEM FDBLFN    C(04,00,07);  # LFN WORD IN AN FDB.             #
        END 
  
      BASED ARRAY SCHEMAFDB;       # TEMPORARY FOR LOCATING SCHEMA NAME#
        BEGIN 
        ITEM SCHEMANAME   C(00,00,30);  # SCHEMA NAME - FROM THE FDB   #
        END 
  
      SWITCH LOGTYPE               # LOG TYPE SWITCH FOR DIFFERENT     #
                                   # KINDS OF LOG ENTRIES. TYPE IS INDX#
        LOGOPEN,                   # 0 - LOG AN OPEN ENTRY             #
        LOGCLOSE,                  # 1 - LOG A CLOSE ENTRY             #
        LOGTERM,                   # 2 - TERMINATE LOG PROCESSING      #
        LOGTRANS,                  # 3 - LOG A TRANSACTION             #
        LOGINSERT,                 # 4 - LOG AN INSERT                 #
        LOGUPDATE,                 # 5 - LOG AN UPDATE                 #
        LOGDELETE;                 # 6 - LOG A DELETE                  #
  
  
  
#----------------------------------------------------------------------#
#                                                                      #
# S T A R T    E X E C U T A B L E    C O D E                          #
#                                                                      #
      RC = 0; 
      P<AREA$TABLE> = TARGETAREA;  # POINT TO THE TARGET AREA TABLE.   #
  
                                   # IF THIS IS A REQUEST FOR TRANS-   #
                                   # ACTION LOGGING YET NO LOGGING OF  #
                                   # TRANSACTIONS WAS SPECIFIED FOR    #
                                   # THIS AREA, DO NOTHING AND RETURN. #
  
      IF TYPE EQ RQTYPE"TRANSACTION" AND NOT AT$LOGT THEN 
        BEGIN 
        RETURN; 
        END 
  
      IMAGEREQUEST = TYPE EQ RQTYPE"INSERT" OR  # TRUE IF LOG AN INSERT#
                     TYPE EQ RQTYPE"DELETE" OR  # TRUE IF LOG A  DELETE#
                     TYPE EQ RQTYPE"UPDATE";    # TRUE IF LOG AN UPDATE#
  
                                   # IF THIS IS A REQUEST TO LOG SOME  #
                                   # KIND OF IMAGE YET NO IMAGE LOGGING#
                                   # WAS SPECIFIED FOR THIS AREA, DO   #
                                   # NOTHING AND RETURN.               #
  
      IF IMAGEREQUEST AND NOT (AT$LOGA OR AT$LOGB) THEN 
        BEGIN 
        RETURN; 
        END 
  
      P<ZEROLOG> = LOC(LOGTABLE);  # PREPARE TO ZERO THE LOG TABLE     #
      FOR INDEX = 0 STEP 1 UNTIL LOGTBLLG - 1 DO  # FOR EACH LOGTBL WRD#
        BEGIN 
        LOGWORD[INDEX] = 0;        # ZERO THIS WORD                    #
        END 
      P<FIT> = LOC(AT$AFITPOS); 
      AFITLFN = FITLFN;                                                  LOG
      PROGID = JOBNAME;            # INSERT INTO LOGTBL                #
      DCODE = C<TYPE> LOGDC;       # TAKE THE DC FOR THIS TYPE OF LOG  #
      GOTO LOGTYPE[TYPE];          # BRANCH TO SPECIFIC TYPE PROCESSING#
  
  
  
LOGOPEN:                           # HERE TO LOG AN OPEN OF TARGET AREA#
  
      P<FDB> = P<AREA$TABLE> + AT$LOGFDB;  # POSITION TO LOG FDB IN    #
                                           # AREA TABLE.               #
      LOGLFN = FDBLFN;
      RQCODE = RQOPEN;
      AFITADDR = AT$FITLOG; 
      AFITMRL = FITMRL;            # TRANSFER FIT MRL TO LOG TABLE     #
      P<AREA$TABLE> = AREATBLPTR;  # POINT TO FIRST AREA TABLE(SCHEMA) #
      P<SCHEMAFDB> = P<AREA$TABLE> + AT$SBSCNAME;  # POINT TO SUBSCHEMA#
      P<AREA$TABLE> = TARGETAREA;  # RESET AREA$TABLE TO POINT TO      #
                                   # THE AREA WE ARE UPDATING          #
      SSNAME = SCHEMANAME;         # TRANSFER THE SUBSCHEMA NAME TO    #
                                   # THE LOGTBL.                       #
      GOTO CALLDF$LOG;
  
  
  
LOGCLOSE: 
  
      RQCODE = RQCLOSE; 
      GOTO CALLDF$LOG;
  
  
  
LOGTERM:    
  
      RQCODE = RQTERM;
      GOTO CALLDF$LOG;
  
  
  
LOGTRANS: 
  
      IF NOT AT$LOGT THEN          # IF NO TRANSACTION LOGGING FOR AREA#
        BEGIN 
        RETURN; 
        END 
      RQCODE = RQTRANS; 
      KEYADDR = LOC(QUIWSA);
      KEYLNG = TRANSLG; 
      GOTO CALLDF$LOG;
  
  
  
LOGINSERT:  
  
      IF AT$LOGB THEN              # IF BEFORE-IMAGE LOGGING REQUESTED #
        BEGIN 
        RQCODE = RQCODE + RQBEFORE; 
        BIADDR = FITWSA;
        BILENG = 0; 
        END 
      IF AT$LOGA THEN              # IF AFTER-IMAGE LOGGING REQUESTED  #
        BEGIN 
        RQCODE = RQCODE + RQAFTER;
        AIADDR = FITWSA;
        AILENG = FITRL; 
        END 
      GOTO COMMONIMAGE;            # TO PROCESS COMMON TABLE INFO      #
  
  
  
LOGUPDATE:  
  
      IF AT$LOGB THEN              # IF BEFORE-IMAGE LOGGING REQUESTED #
        BEGIN 
        RQCODE = RQCODE + RQBEFORE; 
        BIADDR = LOC(BIMAGE); 
        BILENG = LGBIMAGE;
        END 
      IF AT$LOGA THEN              # IF AFTER-IMAGE LOGGING REQUESTED  #
        BEGIN 
        RQCODE = RQCODE + RQAFTER;
        AIADDR = FITWSA;
        AILENG = FITRL; 
        END 
      GOTO COMMONIMAGE;            # TO PROCESS COMMON TABLE INFO      #
  
  
  
LOGDELETE:  
  
      IF AT$LOGB THEN              # IF BEFORE-IMAGE LOGGING REQUESTED #
        BEGIN 
        RQCODE = RQCODE + RQBEFORE; 
        BIADDR = FITWSA;
        BILENG = FITRL; 
        END 
      IF AT$LOGA THEN              # IF AFTER-IMAGE LOGGING REQUESTED  #
        BEGIN 
        RQCODE = RQCODE + RQAFTER;
        AIADDR = FITWSA;
        AILENG = 0; 
        END 
      GOTO COMMONIMAGE;            # TO PROCESS COMMON TABLE INFO      #
  
  
  
COMMONIMAGE:  
                                   # TO PROCESS COMMON IMAGE TBL INFO  #
      KEYADDR = FITKA;
      KEYPOS = FITKP; 
      RKP    = FITRKP;
      RKW    = FITRKW;
      KEYLNG = FITKL; 
      KEYTYPE = FITKT;
      GOTO CALLDF$LOG;             # NOW READY TO CALL DF$LOG FOR IMAGE#
  
  
  
CALLDF$LOG:                        # HERE TO CALL DBU LOGGING ROUTINE  #
  
      RETCODE = 0;                 # INITIALIZE LOGTABLE RETURN CODE   #
      DF$LOG(LOGTABLE);            # CALL DBU LOGGING ROUTINE          #
      RC = RETCODE;                # PICK UP RETURN CODE FROM LOGTABLE #
      RETURN; 
      END 
      TERM
