<> <> <> <<>> <> <<>> 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], 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; PrintEntry: LoganBerry.EntryProc = { <<[entry: LoganBerry.Entry] RETURNS [continue: BOOL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[entry: LoganBerry.Entry] RETURNS [continue: BOOL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> 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 = { <<[cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]>> ENABLE LoganBerry.Error => { IO.PutF[cmd.err, "Error: %g - %g\n", IO.atom[ec], IO.rope[explanation]]; GOTO End; }; dbname: ROPE; 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]]; 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. <> <> <> <> <> <> <> <> <> <> <> <> <<>> <<>>