DIRECTORY DB, Rope; KeyNoteDatabase: CEDAR DEFINITIONS = BEGIN 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; FilesContainingTokenObject: TYPE = RECORD [ fileName: ROPE, frequency: INTEGER, fileSize: INTEGER ]; ListOfTokensInFile: TYPE = LIST OF TokensInFile; TokensInFile: TYPE = REF ANY; TokensInFileObject: TYPE = RECORD [ token: ROPE, frequency: INTEGER, frequencyInUniverse: INTEGER ]; OpenDatabase: PROC [databaseName: ROPE, readonly: BOOLEAN, oldDatabaseHandle: DatabaseHandle _ NIL] RETURNS [db: DatabaseHandle]; CloseDatabase: PROC [db: DatabaseHandle]; Abort: PROC [db: DatabaseHandle]; CommitChanges: PROC [db: DatabaseHandle]; 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]; FindFrequencyWordInUniverse: PROC [db: DatabaseHandle, token: ROPE] RETURNS [numberOfFilesContainingToken: INTEGER]; 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]; Error: SIGNAL [ec: ErrorCode, explanation: ROPE _ NIL]; ErrorCode: TYPE = ATOM; END. KeyNoteDatabase.mesa Copyright Σ 1985, 1986 by Xerox Corporation. All rights reserved. Jack Kent February 23, 1988 10:13:32 am PST 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 FilesContainingToken: TYPE = REF FilesContainingTokenObject; TokensInFile: TYPE = REF TokensInFileObject; 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 procedures that either read or write to database: All these operations are "carefully applied" in the Walnut sense. finds the frequency of a given word in a given file finds the number of documents containing token 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 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" ΚΖ˜codešœ™KšœB™BKšœ+™+K™šΟk ˜ Kšœ˜K˜K˜——KšΟnœœ œ˜*K˜K˜K˜Kšž œ,™5K™Kšœ-œ‘™ΑK™K™™Kšœœœ˜Kšœœœ˜0Kšœœ˜Kš œ œ œœœœ˜2Kš œœ œœœœ,˜hKšœœœ˜;Kš œœœœœ œ œ˜dK˜K˜Kšœœœœ˜@Jšœœœœ˜%Kšœœœ™<šœœœ˜,Kšœ œ˜Kšœ œ˜Kšœ ˜K˜—Kšœœœœ˜0Jšœœœœ˜Kšœœœ™,šœœœ˜$Kšœœ˜ Kšœ œ˜Kšœ˜K˜—K˜—Kšœ ™ K™K™AšœP™PK™—™Kš ž œœœ œ&œœ˜K˜Kšž œœ˜)K˜Kšžœœ˜!K˜Kšž œœ˜)K˜K˜—K™1™AKš žœœ œ*œœ˜pK˜Kšžœœ;˜UK™Kš žœœœ œœœ˜yK˜K™3Kš žœœœœ œ˜uKšœ.™.Kšžœœœœ:˜ˆK˜Kšžœœ œœ*˜sK˜Kšžœœœœ˜IK˜Kšžœœœœ˜IK˜K˜Kš žœœ œœœ˜hK˜K™½Kšžœœœœ˜7šœ œœ˜Kšœ™KšœΟc:™MKšœŸ2™7KšœŸ&™*K™K™—˜K˜K˜—Kšœ˜—J˜J˜—…—~\