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