-- File DBFile.mesa
-- Last edited by:
--   MBrown on February 7, 1983 12:10 pm
--   Cattell on July 11, 1983 10:48 am
--   Willie-Sue on February 3, 1983 10:40 am

  DIRECTORY
    DBCommon,
    Rope USING [ROPE];

DBFile: DEFINITIONS = BEGIN

  ROPE: TYPE = Rope.ROPE;
  Trans: TYPE = DBCommon.Trans;
  VersionOptions: TYPE = DBCommon.VersionOptions;
  OpenFileHandle: TYPE = DBCommon.OpenFileHandle;

  --    Transactions

  FileServerFromFileName: PROC [file: ROPE] RETURNS [server: ROPE];

  CreateTransaction: PROC [server: ROPE] RETURNS [t: Trans];      
    -- Creates a new transaction on the given server, and returns it.  Also returns
    --the welcome text from the file server.

  FinishTransaction: PROC [t: Trans, abort: BOOL, continue: BOOL];
    -- If NOT abort AND continue, then t continues as a valid transaction, all open
    --files remain open, etc, but all updates are committed.

  --    Files

  PagesFromBytes: PROC [bytes: INT] RETURNS [pages: CARDINAL];

  BytesFromPages: PUBLIC PROC [pages: CARDINAL] RETURNS [bytes: INT];
  
  OpenFile: PROC [t: Trans, file: ROPE, version: VersionOptions,
    discardFileContents: BOOL, nPagesInitial: INT, readOnly: BOOL, noLog: BOOL]
    RETURNS [f: OpenFileHandle, createdFile: BOOL];
    --  Creates an "open file" f, that is used to access file "file" under transaction "t".
    -- If version = NewFileOnly or None, will create file of nPagesInitial pages if necessary.
    -- (The full path name must contain enough information, and must be consistent with
    -- transaction t).  If discardFileContents, then the contents of the open file are
    -- undefined (and performance may be considerably better).  If noLog, then file updates
    -- need not be recoverable until after transaction commit.

  ReadFilePage: PROC [f: OpenFileHandle, p: CARDINAL, corePage: LONG POINTER];
  --  Reads page p of file f into corePage.  The page size is given by
  --DBCommon.WordsPerPage.

  WriteFilePage: PROC [f: OpenFileHandle, p: CARDINAL, corePage: LONG POINTER];
  --  Writes corePage onto page p of file f.  Raises ERROR if the user who opened f does
  --not have write access to f.  The page size is given by DBCommon.WordsPerPage.

  GetSize: PROC [f: OpenFileHandle] RETURNS [nPages: CARDINAL];
  -- Returns the size of the file (in pages).
  -- If the length of the file is not multiple of 512 bytes, ERROR Fatal[IllegalFileLength] is
  --raised.

  SetSize: PROC [f: OpenFileHandle, nPages: CARDINAL];
  --  Sets the size (number of pages) of the file.


  END.


--  Module History

Created by MBrown on January 4, 1980  2:46 PM
-- Adopted in meeting of 4 January.

Changed by Suzuki on January 14, 1980  2:33 PM
-- Suffixes Defs are deleted

Changed by Suzuki on January 14, 1980  3:48 PM
-- Added EnumerateBrokenReadLocks.

Changed by Suzuki on January 24, 1980  9:01 AM
-- Changed the arguments to BeginTransaction.

Changed by Suzuki on January 24, 1980  9:47 AM
-- Added the procedure ReleaseBrokenReadLock.

Changed by MBrown on August 5, 1980  11:02 PM
-- Added the procedure CloseFile, for use by CloseDatabase.

Changed by MBrown on August 29, 1980  2:51 PM
-- Added the server parm to BeginTransaction, for use in contacting test Juniper
--servers.

Changed by MBrown on September 3, 1980  9:41 PM
-- Changed type of lfh to POINTER for now; later this will come from UserPineDefs, NOT
--ServerPineDefs as it was before.  Ran through formatter.

Changed by MBrown on December 11, 1980  7:16 PM
-- Flushed RegisterUser.

Changed by MBrown on February 26, 1981  9:44 PM
-- Defined types Transaction and FileHandle for multiple file systems (the big LOOPHOLE).

Changed by MBrown on 19-Jun-81 14:29:22
-- STRING -> Rope.Ref.

Changed by Willie-Sue on June 24, 1982 12:10 pm
--  Rope.Ref -> Rope.ROPE

Changed by Cattell on July 12, 1982 12:26 pm
-- Changed definition of File and Transaction.  File is now FileHandle because of
--conflict with File interface.  Transaction is now DBCommon.Transaction because
--of conflict with Transaction interface.  Files are now variant records, as are
--transactions.  These changes affect DBFileJuniperImpl, DBFilePilotImpl,
--DBCommon, etc.

Changed by MBrown on November 29, 1982 10:48 am
--  Major changes to allow simultaneous access to multiple file servers.

Changed by Willie-Sue on February 3, 1983 10:40 am
--  Added noLog arg to OpenFile.