-- DBEnvironment.mesa
-- Common definitions for public DB interface.  This is the only Cypress interface upon
-- which recompilation of the external DB interface is dependent.
-- Last edited by
--   MBrown on February 22, 1983 11:24 am
--   Cattell on November 8, 1983 10:45 am
--   Willie-Sue on February 10, 1983 11:31 am

DIRECTORY
    Rope USING [ROPE];

DBEnvironment: CEDAR DEFINITIONS = BEGIN


-- Entity and Relship object type

  TupleObject: TYPE;

-- Other useful types

  FirstLast: TYPE = {First, Last};
  Version: TYPE = {OldOnly, NewOnly, NewOrOld};
  
-- Cypress signal definitions (these signals are exported by DBModelSystemImpl to here and DB)
  
Error: SIGNAL[code: ErrorCode]; -- Exported to be same as DB.Error

-- The Error signal is generated when an illegal operation is requested by the Cypress client.
-- This error may be due to a programming error, bad data in the database, etc.

-- Error is defined as SIGNAL rather than ERROR so that database operations can
-- sometimes be recovered by proceeding despite problems, but they are not generally
-- RESUMEable unless specified to be such here.  The client can CONTINUE from a signal 
-- and retry, if that makes any kind of sense for the particular kind of error. 
  
ErrorCode: TYPE = {
  AlreadyExists, -- DeclareEntity, DeclareRelship: already exists, but version=NewOnly
  BadUserPassword, -- User name and/or password invalid (from Alpine)
  CannotDefaultSegment, -- Segment name not built-in to Cypress, and no segment # given
  DatabaseNotInitialized, -- Attempt to perform operation without calling DB.Initialize
  DictionaryUpdate, -- Attempt to modify a dictionary relship or entity:
  EntityOrRelshipSetsOpen, -- Excessive Domain/RelationSubsets still open (CloseTransaction).
  DirectoryNotFound, -- Directory specified in segment name not found on file server
  FileNotFound, -- No existing segment found with given file name, and version=OldOnly
  IllegalAttribute, -- Attribute not of the given relship's Relation or not attribute
  IllegalDomain, -- Argument is not actually a domain
  IllegalFileName, -- No directory or machine given for segment, or invalid chars in name
  IllegalEntity, -- Argument to GetP, or etc., is not an Entity
  IllegalRelship, -- Argument to GetF, or etc., is not a Relship
  IllegalRelation, -- Argument is not a relation
  IllegalString, -- Nulls not allowed in ROPEs passed to the database system
  IllegalSuperType, -- Can't define subtype of domain that already has entities
  IllegalValue, -- Value is not REF INT, ROPE, REF BOOL, or Entity
  IllegalValueType, -- Type passed DeclareAttribute is not datatype or domain
  MismatchedProperty, -- aOf and aIs attribute not from the same relation
  MismatchedAttributeValueType, -- Value not same type as required (SetF)
  MismatchedExistingAttribute, -- Existing attribute is different (DeclareAttribute)
  MismatchedExistingSegment, -- Existing segment has different # or name
  MismatchedPropertyCardinality, -- Did GetP with aOf that is not a Key
  MismatchedSegment, -- Attempt to create reference across segment boundary (e.g., SetF)
  MismatchedValueType, -- value passed V2E, V2I, etc. not of expected type
  MultipleMatch, -- More than one relationship satisfied avl on DeclareRelship.
  MustSetKeyAttributeFirst, -- For now, must set key attribute of a Relship before others
  NonUniqueEntityName, -- Entity in domain with that name already exists
  NonUniqueKeyValue, -- Relship already exists with same value for a key attribute
  NotFound, -- Version is OldOnly but no such Entity, Relation, or etc found
  NotImplemented, -- Action requested is not currently implemented
  NILArgument, -- Attempt to perform operation on NIL argument
  NullifiedArgument, -- Entity or relationship has been deleted, or invalidated by trans abort
  ProtectionViolation, -- Read or write to segment file not permitted this user.
  QuotaExceeded, -- Database too big for Alpine page quota of segment's directory
  SegmentNotDeclared, -- Attempt to open transaction on segment with no DeclareSegment
  ServerNotFound, -- File server does not exist or does not respond
  TransactionNotOpen, -- Attempt to perform operation with no transaction open
  TransactionAlreadyOpen, -- Attempt to open transaction on segment already associated w/one
  WriteNotAllowed, -- Attempt to write data but DeclareSegment specified read-only
  Unknown -- Unknown or not yet assigned error code
  };


Aborted: ERROR [trans: REF ANY];
  -- This signal is generated when a read or write operation is performed and the transaction
  -- trans is being aborted.  Client must explicitly call AbortTransaction and OpenTransaction
  -- to proceed.  Client must normally wants to block other database calls until this is done.
  -- Other database calls before AbortTransaction is complete will also get the Aborted signal.
  -- Other database calls after that but before OpenTransaction will get Error[NullifiedArgument].
  -- Database calls after that but on entities or relationships which have not been re-initialized
  -- will also get Error[NullifiedArgument].  NOTE: trans is defined a REF ANY instead of
  -- defining type Transaction because the compiler confuses the latter with the Transaction
  -- interface (of Pilot).   

    
Failure: ERROR [what: ATOM, info: Rope.ROPE← NIL];
  -- The errors which create this signal are not recoverable.  Clients must abort the
  -- execution of the system.  Argument "what" indicate the reason for the error.  The
  -- other can be used to pass some piece of information about the error.
  -- Note that there are two kinds of fatal errors.  One is machine malfunction such as a
  -- bad disk.  The other is resource exhaustion, such as memory space exhausted.
  -- See Rick or Mark for current definition of "what"; so far alternatives include:
  --  $communication: can't talk to server
  --  $lockConflict: transactions keep aborting while opening file
  --  $serverBusy:  can talk to server but it refuses to create a transaction
  --  $allCachePagesLocked: see Rick or Mark
  --  $segmentTableOverflow: see Rick or Mark
  --  $tooManyRefs: estimate of maximum domain refs in DeclareDomain too small



InternalError: ERROR;
  -- This error should not be generated if there are no bugs in database system, all
  -- clients programs are safe, and there are no other system or hardware errors.
  -- Therefore, in normal use clients should not catch this signal,
  -- it is made visible for debugging purposes.  No error code is passed; comment
  -- should be in code at point of error generation giving more information.


END.

CHANGE LOG


Changed by Cattell on January 14, 1983 1:28 pm:
-- Got rid of old DBException interface created January 4, 1980 (!), moved all references to its contents to reference here.  Moved the Error signal from the DB interface to here.

Changed by Willie-Sue on February 10, 1983:
--  Took out references to Juniper

Changed by MBrown on February 10, 1983:
--  Flushed references to UserPine in FatalCode.  Commented-out all Alpine dependencies,
--since Alpine is not stable enough yet.

Changed by Cattell on June 6, 1983:
-- Added CommunicationFailure.

Changed by Cattell on July 18, 1983 12:27 pm:
-- Added ErrorCodes: BadUserPassword CannotDefaultSegment DirectoryNotFound QuotaExceeded.

Changed by Cattell on November 8, 1983 10:46 am:
-- Reconverted to Cedar 5.0