KeyNoteDatabase.mesa
Copyright Ó 1985, 1986 by Xerox Corporation. All rights reserved.
Jack Kent February 23, 1988 10:13:32 am PST
DIRECTORY
DB,
Rope;
KeyNoteDatabase: CEDAR DEFINITIONS = BEGIN
Important: KeyNote maintains the following invariant:
A KeyNote database will never have more than ONE version of a file. [Thus, before a version mumble!X is added to the database, we check to see if there is a mumble!X-1 and if so we delete it.]
Types
ROPE: TYPE = Rope.ROPE;
DatabaseHandle: TYPE = REF DatabaseHandleObject;
DatabaseHandleObject: TYPE;
SimpleProc: TYPE = PROCEDURE [] RETURNS [REF ANY];
GetTokenProc: TYPE = PROCEDURE [clientData: REF ANY] RETURNS [tokenProcReturnData: TokenProcReturnData];
TokenProcReturnData: TYPE = REF TokenProcReturnDataObject;
TokenProcReturnDataObject: TYPE = RECORD[newClientData: REF ANY, token: ROPE, frequency: INTEGER ];
ListOfFilesContainingToken: TYPE = LIST OF FilesContainingToken;
FilesContainingToken: TYPE = REF ANY;
FilesContainingToken: TYPE = REF FilesContainingTokenObject;
FilesContainingTokenObject: TYPE = RECORD [
fileName: ROPE,
frequency: INTEGER,
fileSize: INTEGER
];
ListOfTokensInFile: TYPE = LIST OF TokensInFile;
TokensInFile: TYPE = REF ANY;
TokensInFile: TYPE = REF TokensInFileObject;
TokensInFileObject: TYPE = RECORD [
token: ROPE,
frequency: INTEGER,
frequencyInUniverse: INTEGER
];
Procedures
these are the procedures that interact with a KeyNote database.
either databaseName must be empty or it should be the name of a KeyNote database
adminstrative procedures
OpenDatabase: PROC [databaseName: ROPE, readonly: BOOLEAN, oldDatabaseHandle: DatabaseHandle ← NIL] RETURNS [db: DatabaseHandle];
CloseDatabase: PROC [db: DatabaseHandle];
Abort: PROC [db: DatabaseHandle];
CommitChanges: PROC [db: DatabaseHandle];
procedures that either read or write to database:
All these operations are "carefully applied" in the Walnut sense.
AddTokensToDatabase: PROC [db: DatabaseHandle, fileName: ROPE, getTokenProc: GetTokenProc, clientData: REF ANY];
DoForEachTokenInFile: PROC [db: DatabaseHandle, forEachTokenInFileProc: SimpleProc ];
FindFrequencyWordInFile: PROC [db: DatabaseHandle, token: ROPE, fileName: ROPE] RETURNS [frequencyOfWordInFile: INTEGER];
finds the frequency of a given word in a given file
FindFrequencyWordInUniverse: PROC [db: DatabaseHandle, token: ROPE] RETURNS [numberOfFilesContainingToken: INTEGER];
finds the number of documents containing token
GetListOfFilesContainingToken: PROC [db: DatabaseHandle, token: ROPE] RETURNS [listOfFilesContainingToken: ListOfFilesContainingToken];
GetListOfTokensInFile: PROC [db: DatabaseHandle, fileName: ROPE] RETURNS [listOfTokensInFile: ListOfTokensInFile];
GetNumberOfTokensInUniverse: PROC [db: DatabaseHandle] RETURNS [INTEGER];
GetNumberOfFilesInUniverse: PROC [db: DatabaseHandle] RETURNS [INTEGER];
VerifyFileNonExistence: PROC [db: DatabaseHandle, fileName: ROPE] RETURNS [fileNotInDatabase: BOOLEAN];
Errors raised during the execution of an operation indicate uncommon or abnormal conditions. Clients should be prepared to catch these. Error is a signal because aborts might want to retry
Error: SIGNAL [ec: ErrorCode, explanation: ROPENIL];
ErrorCode: TYPE = ATOM;
The possible ErrorCodes are:
$MultipleVersions -- encountered multiple versions of a file in databaseName
$bug -- such as "Bad value passed to FinishTransaction"
$db -- such as ""Can't access transaction"
END.