Below is a simple MFS that illustrates the programming techniques discussed in earlier topics of this chapter.  Use this as a starting point for your own MFS programming.  Develop this MFS as a stored procedure in your SYSPROG account.

Subroutine SIMPLE_MFS (CODE, BFS, HANDLE, NAME, FMC, RECORD, STATUS)
/* Name       : SIMPLE_MFS
 * Description: Hides Fields 3, 4, and 5 on a read if @ADMIN = 0
 *              Ensures that fields 3, 4, and 5 are unchanged on a write if @ADMIN = 0.
 *              Prevents a file delete, record delete or CLEARFILE unless @ADMIN > 0
*/
$insert Logical
$insert FSErrors_100
$Insert Sysprocs, File.System.Equates
$Insert Sysprocs, File.System.OnGoSub
Return
* -------------- Main Subs -----------------
READ.RECORD:
   
    RECORD = ''
    GOSUB NEXT.MFS
    
    IF @ADMIN = 0 THEN
      RECORD<3> = 'PROTECTED'
      RECORD<4> = 'ALSO PROTECTED'
      RECORD<5> = 'ALSO PROTECTED'
      Return
     END ELSE
      GOSUB NEXT.MFS
     END
     RETURN    
READO.RECORD:
    RECORD = ''
    GOSUB NEXT.MFS
      
    IF @ADMIN = 0 THEN
      RECORD<3> = 'PROTECTED'
      RECORD<4> = 'ALSO PROTECTED'
      RECORD<5> = 'ALSO PROTECTED'
      Return
     END ELSE
      GOSUB NEXT.MFS
     END
     RETURN    
    
WRITE.RECORD:
   IF @ADMIN = 0 THEN
     TEMP = RECORD
     CODE = READ.RECORD
     
     GOSUB NEXT.MFS
     TEMP<3> = RECORD<3>
     TEMP<4> = RECORD<4>
     TEMP<5> = RECORD<5>
     RECORD = TEMP
     CODE = WRITE.RECORD
     
     CALL @NEXTFS(CODE, BFS, HANDLE, NAME, FMC, RECORD, STATUS)
   END ELSE
     GOSUB NEXT.MFS
   END
   RETURN
DELETE.RECORD:
    If @ADMIN > 0 then
      GOSUB NEXT.MFS
    END ELSE
      Call MSG(@Window,'Sorry, You do not have authority |to delete records on this file.')
      STATUS = FALSE$
    END
Return    
CLEARFILE:
    IF @ADMIN = 0 THEN
      Call MSG(@Window,'You do not have the necessary clearance to clear this file.')
      STATUS = FALSE$
    END ELSE
      GOSUB NEXT.MFS
    END
Return  
DELETE.FILE:
    IF @ADMIN = 0 THEN
     Call MSG(@Window,'Wrong bucko, you may not delete this file!')
     STATUS = FALSE$
    END ELSE
     GOSUB NEXT.MFS
    END
Return
* ---------------------------------------
* non-chained filing system calls
* ---------------------------------------
Flush:
Unlock.All:
  Record = ""
Install:
  Status = TRUE$
return
* ---------------------------------------
* ---------------------------------------
* Chained Filing System Calls
* ---------------------------------------
LOCK.RECORD:
UNLOCK.RECORD:
*--------------------------------------------------
SELECT:
READNEXT:
CLEARSELECT:
RECORD.COUNT:
* ---------------------------------------
CREATE.INDEX:
DELETE.INDEX:
UPDATE.INDEX:
SELECT.INDEX:
READNEXT.INDEX:
* ---------------------------------------
Omni.Script:
  gosub Next.MFS
return
Reserved:
*  there is a critical error if this line is reached
  Status = FALSE$
return
* ---------------------------------------
OPEN.FILE:
CREATE.FILE:
RENAME.FILE:
MOVE.FILE:
REMAKE.FILE:
* ----------------------------------------
Open.Media:
CREATE.MEDIA:
READ.MEDIA:
WRITE.MEDIA:
Close.Media:
  gosub Next.MFS
return
   
* ---------- End of Subroutine
* ==================================
* execute filing system chain
* ==================================
Next.MFS:
  * Strips this MFS leaving the next fs as first element in array
  FSList = delete(BFS, 1, 1, 1)
  NextFS = FSList<1,1,1>
  if len(NextFS) then
    call @NextFS(Code, FSList, Handle, Name, Fmc, Record, Status)
  end
return

See Also

@ADMINLogicalFile.System.EquatesFile.System.OnGoSub

  • No labels