A Simple MFS

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.

This routine uses the Logical, File.System.Equates, and File.System.OnGoSub inserts.

SIMPLE_MFS
Subroutine SIMPLE_MFS (CODE, BFS, HANDLE, NAME, FMC, RECORD, STATUS)

/* Name       : SIMPLE_MFS

 * Description: Hides Fields 3, 4, and 5 on a read if [[environment|@ADMIN]] = 0

 *              Ensures that fields 3, 4, and 5 are unchanged on a write if [[environment|@ADMIN]] = 0.

 *              Prevents a file delete, record delete or CLEARFILE unless [[environment|@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