Function Audit_Manager_MFS(Code, BFS, Handle, Name, FMC, Record, Status)

////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
//
// This program is proprietary and is not to be used by or disclosed to others, nor is it to	
// be copied without written permission from SRP Computer Solutions, Inc.						
//
// Name       : Audit_Manager_MFS
//
// Description: MFS for tracking the audit history of a particular record.
//
// Notes:       This routine primarily passes all essential information into the Audit_Manager
//              stored procedure. This way changes to the core functionality can be made
//              without having to restart OpenInsight (which is necessary for changes directly
//              in MFS procedures.)
//
//              A check is first made to see if corresponding audit table exists for the
//              database table that triggered this MFS. Audit tables use a naming convention
//              of AUDIT_Tablename. therefore, if the CUSTOMERS table is being audited then
//              there should be an AUDIT_CUSTOMERS table available. Audit features are managed
//              by the DBW_AUDIT_MANAGER form.
//
// Parameters:																					
//    Code	    [in] -- An integer value indicating the operation to be performed (1 = read a
//                      record, 4 = delete a record, 11 = open a file, etc.)
//    BFS		[in] -- The list of MFSs and the BFS name for the current file or volume. This
//                      is a subvalue mark-delimited array, with the current MFS name as the
//                      first value in the array, and the BFS name as the last value.
//    Handle	[in] -- The file handle of the file or media map being accessed.
//    Name	    [in] -- The name (key) of the record or file being accessed.
//    FMC		[in] -- Various functions.
//    Record	[in] -- The entire record (for record-oriented functions) or a newly-created
//                      handle (for "get handle" functions).
//    Status	[in] -- A return code indicating the success or failure of an operation.
//
// History (Date, Initials, Notes)																
//    01/04/00   pcs   Original programmer
//    01/20/00   pcs   CLEARFILE requires the Arev table name to be removed before processing
//    05/20/05   axf   Process will now also track the accessing of records.
//    11/26/07   dmb   Code clean-up. No functional changes were made.
//
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////

$insert APP_INSERTS
$INSERT FILE.SYSTEM.EQUATES
$INSERT FSERRORS_HDR

Declare Subroutine Msg, Audit_Manager

ON CODE GOSUB READ.RECORD,READO.RECORD,WRITE.RECORD,DELETE.RECORD,LOCK.RECORD,UNLOCK.RECORD,SELECT,READNEXT,CLEARSELECT,CLEARFILE,OPEN.FILE,CREATE.FILE,RENAME.FILE,MOVE.FILE,DELETE.FILE,OPEN.MEDIA,CREATE.MEDIA,READ.MEDIA,WRITE.MEDIA,UNLOCK.ALL,FLUSH,INSTALL,RESERVED,RESERVED,RESERVED,OMNI.SCRIPT,CLOSE.MEDIA,RECORD.COUNT, REMAKE.FILE,CREATE.INDEX,DELETE.INDEX,UPDATE.INDEX,SELECT.INDEX,READNEXT.INDEX

Return

READ.RECORD:
	// Added Check_Update_History Gosub
	Activity = "Read"
	GoSub Check_Update_History
	GoSub Remove_Arev_Table_Name
return

READO.RECORD:
	// Added Check_Update_History Gosub
	Activity = "Read"
	GoSub Check_Update_History
	GoSub Remove_Arev_Table_Name
return

CREATE.MEDIA:
	GoSub Call_NextFS
return

OPEN.MEDIA:
	GoSub Call_NextFS
return

READ.MEDIA:
	GoSub Call_NextFS
return

WRITE.MEDIA:
	GoSub Call_NextFS
return

CLOSE.MEDIA:
	GoSub Call_NextFS
return

CLEARFILE:
	GoSub Remove_Arev_Table_Name
return

CREATE.FILE:
	GoSub Call_NextFS
return

DELETE.FILE:
	GoSub Call_NextFS
return

MOVE.FILE:
	GoSub Call_NextFS
return

OPEN.FILE:
	// Attaching Arev Table name to Handle for checking purposes
	GoSub Call_NextFS
	If Index(RECORD, @TM, 1) EQ 0 then
	    RECORD = NAME:@TM:RECORD
	end
return

REMAKE.FILE:
	GoSub Call_NextFS
return

RENAME.FILE:
	GoSub Call_NextFS
return

SELECT:
	GoSub Remove_Arev_Table_Name
return

READNEXT:
	GoSub Remove_Arev_Table_Name
return

CLEARSELECT:
	GoSub Remove_Arev_Table_Name
return

LOCK.RECORD:
	GoSub Remove_Arev_Table_Name
return

UNLOCK.RECORD:
	GoSub Remove_Arev_Table_Name
return

CREATE.INDEX:
	GoSub Remove_Arev_Table_Name
return

UPDATE.INDEX:
	GoSub Remove_Arev_Table_Name
return

DELETE.INDEX:
	GoSub Remove_Arev_Table_Name
return

SELECT.INDEX:
	GoSub Remove_Arev_Table_Name
return

READNEXT.INDEX:
	GoSub Remove_Arev_Table_Name
return

RESERVED:
	GoSub Call_NextFS
return

OMNI.SCRIPT:
	GoSub Remove_Arev_Table_Name
return

RECORD.COUNT:
	GoSub Remove_Arev_Table_Name
return

LOCK.SEMAPHORE:
	GoSub Call_NextFS
return

UNLOCK.SEMAPHORE:
	GoSub Call_NextFS
return

SET.USER.SEMAPHORE:
	GoSub Call_NextFS
return

WRITE.RECORD:
    GoSub Prep_Vars
    Activity = "Write"
    GoSub Check_Update_History
    GoSub Remove_Arev_Table_Name
return

DELETE.RECORD:
	Activity = "Delete"
	GoSub Check_Update_History
	GoSub Remove_Arev_Table_Name
return

NEXT_FS:
	GoSub Call_NextFS
return

// Install, unlock all and flush are called directly, no need to call next FS.
INSTALL:
	STATUS = TRUE$
return

FLUSH:
	STATUS = TRUE$
return

UNLOCK.ALL:
	STATUS = TRUE$
return

Prep_Vars:
    TempUseTable = Field(HANDLE, @TM, 1)
    UseTable = Field(TempUseTable, "*", 1)
    UseID = Name
return

Check_Update_History:
	Temp_File_Name = Field(HANDLE, @TM, 1)
	FileName = Field(Temp_File_Name, "*", 1)
	Real_Handle = Field(HANDLE, @TM, 2)
	History_table = "AUDIT_":FileName
	Open History_table to HistoryCheck then
		GoSub Get_Original_Record
		Audit_Manager(Name, FileName, Record, OrigRecord, Activity)
	end
return

Get_Original_Record:
	OrigRecord = ""
	CALL RTP57(READO.RECORD, "RTP57", Real_Handle, NAME, FMC, OrigRecord, Temp_status)
    // If Temp_status is Null then it is a new record or an error reading.
return

Call_NextFS:
	FS = DELETE(BFS, 1, 1, 1)
	NEXTFS = FS<1, 1, 1>
	@FILE.ERROR = ""
	CALL @NEXTFS(CODE, FS, HANDLE, NAME, FMC, RECORD, STATUS)
return

Remove_Arev_Table_Name:
* 	FileName = Field(HANDLE, @TM, 1)
* 	If FileName EQ HANDLE then
*	    Real_Handle = HANDLE
* 	end else
*	    Real_Handle = Field(HANDLE, @TM, 2)
* 	end
	FS = DELETE(BFS, 1, 1, 1)
	NEXTFS = FS<1, 1, 1>
	@FILE.ERROR = ""
	
	If Index(FS, @SVM, 1) GT 0 then
	    Real_Handle = HANDLE
 	end else
	    Real_Handle = Field(HANDLE, @TM, 2)
 	end
	    
	CALL @NEXTFS(CODE, FS, Real_Handle, NAME, FMC, RECORD, STATUS)
return
