DIRECTORY Commander USING [CommandProc, Handle, Register], IO USING [atom, BreakProc, EndOfStream, GetTokenRope, IDProc, PutF, PutRope, TokenProc, RIS, rope, STREAM], LoganBerryBrowser USING [AttributePatterns, CreateTool, FilteredQuery, PatternsToEntry, ReadAttributePatterns, SyntaxError, Tool, ToolBody], LoganBerryStub USING [AttributeType, AttributeValue, BuildIndices, Close, CompactLogs, DeleteEntry, Describe, Entry, EntryProc, Error, Open, OpenDB, SchemaInfo, WriteEntry], Process USING [CheckForAbort], Rope USING [Equal, ROPE]; LoganBerryCommandsImpl: CEDAR PROGRAM IMPORTS Commander, IO, LoganBerry: LoganBerryStub, LoganBerryBrowser, Process, Rope ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; currentName: ROPE _ "#"; currentDB: LoganBerry.OpenDB; -- cache of most recently used db DescribeCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; info: LoganBerry.SchemaInfo; [dbname,,msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; info _ LoganBerry.Describe[db: Open[dbname]]; IO.PutF[cmd.out, "Database: %g\n", IO.rope[info.dbName]]; IO.PutRope[cmd.out, " keys:"]; FOR k: LIST OF LoganBerry.AttributeType _ info.keys, k.rest WHILE k # NIL DO IO.PutF[cmd.out, " %g", IO.atom[k.first]]; ENDLOOP; IO.PutRope[cmd.out, "\n"]; IO.PutRope[cmd.out, " index files:"]; FOR l: LIST OF ROPE _ info.indexNames, l.rest WHILE l # NIL DO IO.PutF[cmd.out, " %g", IO.rope[l.first]]; ENDLOOP; IO.PutRope[cmd.out, "\n"]; IO.PutRope[cmd.out, " log files:"]; FOR l: LIST OF ROPE _ info.logNames, l.rest WHILE l # NIL DO IO.PutF[cmd.out, " %g", IO.rope[l.first]]; ENDLOOP; IO.PutRope[cmd.out, "\n"]; EXITS End => RETURN; }; QueryCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; PrintEntry: LoganBerry.EntryProc = { Process.CheckForAbort[]; FOR e: LoganBerry.Entry _ entry, e.rest UNTIL e = NIL DO IO.PutF[cmd.out, "%g: %g\n", IO.atom[e.first.type], IO.rope[e.first.value]]; ENDLOOP; IO.PutRope[cmd.out, "\n"]; RETURN[TRUE]; }; dbname: ROPE; ap: LoganBerryBrowser.AttributePatterns; db: LoganBerry.OpenDB; [dbname, ap, msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; db _ Open[dbname]; LoganBerryBrowser.FilteredQuery[db: db, patterns: ap, proc: PrintEntry]; EXITS End => RETURN; }; WriteCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; ap: LoganBerryBrowser.AttributePatterns; db: LoganBerry.OpenDB; entry: LoganBerry.Entry; [dbname, ap, msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; db _ Open[dbname]; entry _ LoganBerryBrowser.PatternsToEntry[ap]; LoganBerry.WriteEntry[db: db, entry: entry]; EXITS End => RETURN; }; DeleteCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; GetAttributeValue: PROC [entry: LoganBerry.Entry, type: LoganBerry.AttributeType] RETURNS [LoganBerry.AttributeValue] ~ { FOR e: LoganBerry.Entry _ entry, e.rest WHILE e # NIL DO IF e.first.type = type THEN RETURN[e.first.value]; ENDLOOP; RETURN[NIL]; }; DeleteEntry: LoganBerry.EntryProc = { value: LoganBerry.AttributeValue _ GetAttributeValue[entry, primaryKey]; Process.CheckForAbort[]; LoganBerry.DeleteEntry[db: db, key: primaryKey, value: value]; IO.PutF[cmd.out, "Deleted %g: %g\n", IO.atom[primaryKey], IO.rope[value]]; RETURN[TRUE]; }; dbname: ROPE; ap: LoganBerryBrowser.AttributePatterns; db: LoganBerry.OpenDB; primaryKey: LoganBerry.AttributeType; [dbname, ap, msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; db _ Open[dbname]; primaryKey _ LoganBerry.Describe[db: db].info.keys.first; LoganBerryBrowser.FilteredQuery[db: db, patterns: ap, proc: DeleteEntry]; EXITS End => RETURN; }; CloseCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; [dbname,,msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; LoganBerry.Close[db: Open[dbname]]; EXITS End => RETURN; }; BuildIndicesCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; [dbname,,msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; LoganBerry.BuildIndices[db: Open[dbname]]; EXITS End => RETURN; }; CompactLogsCmd: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; [dbname,,msg] _ ParseArgs[cmd]; IF msg#NIL THEN RETURN; LoganBerry.CompactLogs[db: Open[dbname]]; EXITS End => RETURN; }; MakeBrowserTool: Commander.CommandProc = { ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; tool: LoganBerryBrowser.Tool _ NEW[LoganBerryBrowser.ToolBody]; argStream: IO.STREAM _ IO.RIS[cmd.commandLine]; dbname _ IO.GetTokenRope[argStream, IO.IDProc ! IO.EndOfStream => {msg _ "No database name supplied.\n"; GOTO End}].token; LoganBerryBrowser.CreateTool[db: Open[dbname], tool: tool]; EXITS End => RETURN; }; ParseArgs: PROC [cmd: Commander.Handle] RETURNS [dbname: ROPE _ NIL, ap: LoganBerryBrowser.AttributePatterns _ NIL, errMsg: ROPE _ NIL] ~ { argStream: IO.STREAM _ IO.RIS[cmd.commandLine]; dbname _ IO.GetTokenRope[argStream, IO.IDProc ! IO.EndOfStream => {errMsg _ "No database name supplied.\n"; GOTO End}].token; ap _ LoganBerryBrowser.ReadAttributePatterns[argStream ! LoganBerryBrowser.SyntaxError => {errMsg _ explanation; GOTO End}]; EXITS End => RETURN; }; Open: PROC [dbname: ROPE] RETURNS [db: LoganBerry.OpenDB] ~ { IF Rope.Equal[dbname, currentName] THEN RETURN[currentDB]; db _ currentDB _ LoganBerry.Open[dbName: dbname]; }; Commander.Register[key: "LBDescribe", proc: DescribeCmd, interpreted: FALSE, doc: "Get schema information about a LoganBerry database.\n usage: LBDescribe " ]; Commander.Register[key: "LBQuery", proc: QueryCmd, interpreted: FALSE, doc: "Query a LoganBerry database.\n usage: LBQuery ..." ]; Commander.Register[key: "LBRead", proc: QueryCmd, interpreted: FALSE, doc: "synonym for LBQuery." ]; Commander.Register[key: "LBWrite", proc: WriteCmd, interpreted: FALSE, doc: "Write an entry into a LoganBerry database.\n usage: LBWrite ..." ]; Commander.Register[key: "LBDelete", proc: DeleteCmd, interpreted: FALSE, doc: "Delete entries from a LoganBerry database.\n usage: LBDelete ..." ]; Commander.Register[key: "LBClose", proc: CloseCmd, interpreted: FALSE, doc: "Close a LoganBerry database.\n usage: LBClose " ]; Commander.Register[key: "LBBuildIndices", proc: BuildIndicesCmd, interpreted: FALSE, doc: "Rebuild the indices for a LoganBerry database.\n usage: LBBuildIndices " ]; Commander.Register[key: "LBCompactLogs", proc: CompactLogsCmd, interpreted: FALSE, doc: "Compact a LoganBerry database.\n usage: LBCompactLogs " ]; Commander.Register[key: "LoganBerryBrowser", proc: MakeBrowserTool, doc: "Create a LoganBerry browser." ]; Commander.Register[key: "LBBrowser", proc: MakeBrowserTool, doc: "Create a LoganBerry browser." ]; END. ”LoganBerryCommandsImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Doug Terry, January 28, 1987 9:09:29 pm PST Registers a collection of CommandTool commands for performing operations on a LoganBerry database. LoganBerry commands [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [entry: LoganBerry.Entry] RETURNS [continue: BOOL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [entry: LoganBerry.Entry] RETURNS [continue: BOOL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] Opens the database with the given name; a distinquished name "#" indicates that the most recently opened database should be used. A cache of opened databases could be maintained, but we don't bother for now. Command registrations Doug Terry, October 20, 1986 10:45:54 am PDT Created. changes to: DIRECTORY, LoganBerryCommandsImpl, IMPORTS, EXPORTS, DescribeCmd, QueryCmd, WriteCmd, DeleteCmd, CloseCmd, BuildIndicesCmd, CompactLogsCmd, ParseArgs, Commander, Commander, Commander, Commander, Commander, Commander, Commander, Commander, END, ~, ParseArgs, AttributeBreakProc (local of ReadAttributePatterns), ReadAttributePattern (local of ReadAttributePatterns), Open, WriteAttributePatterns, DoQuery, NamedFilter, WriteAttributePattern (local of WriteAttributePatterns), OptimalStart, PrintEntry (local of QueryCmd), DeleteEntry (local of DeleteCmd), GetAttributeValue, FilteredQuery Doug Terry, October 31, 1986 2:58:29 pm PST Exports LoganBerryBrowser. changes to: DIRECTORY, EXPORTS, QueryCmd, WriteCmd, DeleteCmd, ParseArgs, ReadAttributePatterns, ReadAttributePattern (local of ReadAttributePatterns), WriteAttributePatterns, WriteAttributePattern (local of WriteAttributePatterns), PatternsToEntry, EntryToPatterns, FilteredQuery Doug Terry, November 2, 1986 6:38:02 pm PST Added support for subrange filter. changes to: DIRECTORY, OptimalStart, NamedFilter, ToDash, Subrange, GetAttributeValue Doug Terry, November 23, 1986 8:59:16 pm PST Moved support for filtered queries to LoganBerryBrowserImpl; added command for creating a browser. Now this is simply a client of LoganBerry and LoganBerryBrowser. changes to: ~, ParseArgs, Open, Commander, MakeBrowserTool Doug Terry, January 28, 1987 9:09:29 pm PST changes to: MakeBrowserTool, Open, CheckOps Κ m˜codešœ™Kšœ Οmœ1™Kšžœ(˜*Kšžœ˜—Kšžœ˜Kšžœ#˜%š žœžœžœžœžœžœž˜˜>Jšžœ#žœžœ˜JKšžœžœ˜ K˜—Kšœžœ˜ Kšœ(˜(Kšœ˜Kšœ%˜%Kšœ#˜#Kšžœžœžœžœ˜Kšœ˜Kšœ9˜9KšœI˜Išž˜Kšœžœ˜—K˜K˜—–L -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]š‘œ˜#Kš’H™Hšžœ˜Kšžœ#žœ žœ˜HKšžœ˜ K˜—Kšœžœ˜ Kšœ˜Kšžœžœžœžœ˜Kšœ#˜#šž˜Kšœžœ˜—K˜K˜—–L -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]š‘œ˜*Kš’H™Hšžœ˜Kšžœ#žœ žœ˜HKšžœ˜ K˜—Kšœžœ˜ Kšœ˜Kšžœžœžœžœ˜Kšœ*˜*šž˜Kšœžœ˜—K˜K˜—–L -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]š‘œ˜)Kš’H™Hšžœ˜Kšžœ#žœ žœ˜HKšžœ˜ K˜—Kšœžœ˜ Kšœ˜Kšžœžœžœžœ˜Kšœ)˜)šž˜Kšœžœ˜—K˜K˜—šΠbnœ˜*Kš’H™Hšžœ˜Kšžœ#žœ žœ˜HKšžœ˜ K˜—Kšœžœ˜ Kšœžœ˜?Kš œ žœžœžœžœ˜/Kš œ žœžœ žœ7žœ ˜zKšœ;˜;šž˜Kšœžœ˜—K˜K˜—š‘ œžœžœ žœžœ,žœ žœžœ˜‹Kš œ žœžœžœžœ˜/Kš œ žœžœ žœ:žœ ˜}Kšœqžœ˜|šž˜Kšœžœ˜—K˜K˜—š‘œžœ žœžœ˜=K™ΠKšžœ!žœžœ ˜:Kšœ1˜1K˜K˜——™šœFžœ˜LJšœZ˜Z—šœ@žœ˜FJšœ\˜\—šœ?žœ˜EJšœ˜—šœ@žœ˜FJšœa˜a—šœBžœ˜HJšœk˜k—šœ@žœ˜FJšœ@˜@—šœNžœ˜TJšœY˜Y—šœLžœ˜RJšœH˜H—šœC˜CJšœ&˜&—šœ;˜;Jšœ&˜&——K˜Kšžœ˜™,K™Kš œ Οr”œ!€œ!€Kœ"€œ€ œ€"™Χ—™+K™Kšœ €iœ!€/œ"€1™˜—™+K™"Kšœ €I™U—™,K™€Kšœ €.™:—K™™+Kšœ €™+—K™—…—Δ3Ε