Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.html.viewLog
on viewLog () { <<Changes: <<1/21/02; 9:24:50 PM by DW <<I was able to triple the performance of the page with a simple optimization, cache each of the rows in the table in the log sub-table for the event. Took about ten minutes. Admittedly this is a very simple page, that's why I chose it as a guinea pig. Also save the log database after rendering. <<1/6/02; 3:55:34 AM by JES <<Added table css classes. <<12/11/01; 11:12:28 AM by JES <<Localized. Decode entities in log item text. <<12/3/01; 12:37:45 AM by JES <<Don't add help text. It's in the help-system, linked to from the question mark at the top of the page. <<11/28/01; 6:50:28 PM by JES <<Uncommented adding of the help text. <<1/11/01; 5:33:58 PM by DW <<We're now doing hourly rollover on the log to improve performance. This script now must traverse tables that are two levels deep. <<2/15/01; 4:30:23 PM by PBS <<Prevent macros. <<2/20/01; 5:08:35 PM by PBS <<Don't call myUserLandSuite.unTaint here, as items are untainted as needed when added to the log. <<2/23/01; 10:06:26 PM by PBS <<Limit to 100 events. If displaying less than a full day of events, put a message at the top of the page saying only 100 events are displayed. <<2/24/01; 7:21:23 PM by PBS <<Help link. if defined (system.temp.radio.htmlCache.viewEventsLog) { return (system.temp.radio.htmlCache.viewEventsLog)}; local (pta = html.getpagetableaddress ()); pta^.title = radio.string.getlocalizedstring ("eventsLog.title"); local (adrlog = log.getGuestSubTable (radio.data.strings.radioLogName)); local (htmltext = "\r", indentlevel = 0); on add (s) { htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"}; add ("<p>" + radio.string.getlocalizedstring ("eventsLog.intro") + " "+ radio.userInterface.helpLink ("The Events Log page") + "</p>"); add ("<table class=\"dwsFrameTable\" cellspacing=\"0\" cellpadding=\"0\"><tr bgcolor=\"" + radio.data.htmlColors.framecolor + "\"><td>"); indentlevel++; add ("<table border=\"0\" cellspacing=\"1\" cellpadding=\"5\">"); indentlevel++; bundle { //add header add ("<tr bgcolor=\"" + radio.data.htmlColors.cellbgcolor + "\"><td class=\"dwsTableCell\"><b>" + radio.string.getlocalizedstring ("eventsLog.eventHeader") + "</b></td><td class=\"dwsTableCell\"><b>" + radio.string.getlocalizedstring ("eventsLog.whatHappenedHeader") + "</b></td><td class=\"dwsTableCell\" align=\"right\"><b>" + radio.string.getlocalizedstring ("eventsLog.timeHeader") + "</b></td><td class=\"dwsTableCell\" align=\"right\"><b>" + radio.string.getlocalizedstring ("eventsLog.secsHeader") + "</b></td></tr>")}; local (adrhour, adritem, i, j, ct = 0); for i = sizeof (adrlog^) downto 1 { adrhour = @adrlog^ [i]; for j = sizeof (adrhour^) downto 1 { adritem = @adrhour^ [j]; if defined (adritem^.cache) { add (adritem^.cache)} else { local (s); s = s + "<tr bgcolor=\"" + radio.data.htmlColors.cellbgcolor + "\">"; s = s + "<td class=\"dwsTableCell\" valign=\"top\" nowrap>" + adritem^.eventType + "</td>"; s = s + "<td class=\"dwsTableCell\" valign=\"top\">" + radio.string.decodeEntities (adritem^.htmlText) + "</td>"; s = s + "<td class=\"dwsTableCell\" valign=\"top\" align=\"right\" nowrap>" + date.timestring (xml.convertToDisplayName (nameof (adritem^))) + "</td>"; s = s + "<td class=\"dwsTableCell\" valign=\"top\" align=\"right\" nowrap>" + adritem^.secs + "</td>"; s = s + "</tr>"; adritem^.cache = s; add (s)}; ct++; if ct >= 100 { break}}; if ct >= 100 { break}}; add ("</table>"); indentlevel--; add ("</table>"); indentlevel--; <<add ("<a name=\"helpText\"></a>" + radio.string.getlocalizedstring ("eventsLog.helpText")) filemenu.savemyroot (adrlog); system.temp.radio.htmlCache.viewEventsLog = htmlText; return (htmlText)} <<bundle //test code <<local (pt) <<new (tabletype, @pt) <<new (tabletype, @pt.radioresponder) <<pt.radioresponder.flsamemachine = true <<html.setpagetableaddress (@pt) << <<Before cache: 190 ticks; after: 44. <<local (tc = clock.ticks ()) <<viewLog () <<dialog.alert (clock.ticks () - tc)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.