Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.aggregator.init
<<Changes <<1/11/06; 4:35:05 AM by DW <<Initialize security sub-table of prefs for RPC handlers. <<3/5/03; 1:43:51 PM by JES <<In Frontier, initialize adrdata^.prefs.flSaveItemData to true instead of false -- it's needed for features of a modern news aggregator like comment links and permalinks. <<11/14/02; 7:06:08 PM by JES <<Initialize adrdata^.prefs.flSaveItemData. <<4/5/02; 7:50:24 PM by DW <<Initialize callback table for scripts that run when a user unsubscribes from afeed. <<4/5/02; 4:39:38 PM by DW <<Initialize callback table for scripts that run when a user subscribes to a new feed. <<1/23/02; 3:38:57 PM by JES <<If the aggregator is enabled, always make sure that the everyMinute scheduler script is installed. This fixes a problem in Radio where after a re-install, the aggregator would stop working. <<1/12/02; 8:46:05 PM by DW <<Instead of initializing aggregatorData.prefs.minuteToRead to 0, initialize it to a random number between 5 and 55. There are already too many people scanning at 0, and I offset by 5 because clocks are not generally synchronized. Thanks to Aaron Swartz for this suggestion. <<http://groups.yahoo.com/group/radio-userland/message/11005 <<12/27/01; 6:00:32 PM by PBS <<Set up flBehindFirewall pref on Frontier. In Radio the pref is at user.radio.prefs.flBehindFirewall. In Frontier the pref is in the adrdata^.prefs table. <<12/4/01; 7:20:44 PM by DW <<Initialize callback tables for pre and post scan. <<12/3/01; 5:50:18 PM by DW <<Initialize aggregatorData.prefs.maxErrorsBeforeAutoUnsubscribe. <<11/30/01; 1:52:55 PM by DW <<Initialize prefs.flScanOnStartup. <<11/7/01; 6:52:19 PM by DW <<Don't initialize system.temp.aggregator. <<Initialize adrdata^.stats.lastRun, which contains all the fields of the old temp table, ctThreads, lastChannelRead, ctNewStories, and status. <<10/19/01; 7:51:37 PM by DW <<Initialize stuff for hourly archives. local (adrdata = frontier.openDataFile ("aggregatorData")); bundle { //stats if not defined (adrdata^.stats) { new (tabletype, @adrdata^.stats)}; if not defined (adrdata^.stats.lastRun) { new (tabletype, @adrdata^.stats.lastRun)}; if not defined (adrdata^.stats.lastRun.ctThreads) { adrdata^.stats.lastRun.ctThreads = 0}; if not defined (adrdata^.stats.lastRun.ctNewStories) { adrdata^.stats.lastRun.ctNewStories = 0}; if not defined (adrdata^.stats.lastRun.lastChannelRead) { adrdata^.stats.lastRun.lastChannelRead = ""}; if not defined (adrdata^.stats.lastRun.status) { adrdata^.stats.lastRun.status = ""}; if not defined (adrdata^.stats.lastRun.whenComplete) { adrdata^.stats.lastRun.whenComplete = date (0)}; if not defined (adrdata^.stats.lastRun.flScanRunningNow) { adrdata^.stats.lastRun.flScanRunningNow = false}}; bundle { //prefs if not defined (adrdata^.prefs) { new (tabletype, @adrdata^.prefs)}; if not defined (adrdata^.prefs.flLogHourlyScan) { adrdata^.prefs.flLogHourlyScan = true}; if not defined (adrdata^.prefs.flLogNotification) { adrdata^.prefs.flLogNotification = true}; if not defined (adrdata^.prefs.flChannelChange) { adrdata^.prefs.flChannelChange = true}; if not defined (adrdata^.prefs.maxThreads) { if defined (myUserLandData.prefs.maxThreads) { adrdata^.prefs.maxThreads = myUserLandData.prefs.maxThreads} else { adrdata^.prefs.maxThreads = 2}}; if not defined (adrdata^.prefs.appSignatureUrl) { adrdata^.prefs.appSignatureUrl = "http://frontier.userland.com/xmlAggregator"}; if not defined (adrdata^.prefs.nextStoryNum) { if defined (myUserLandData.prefs.nextStoryNum) { adrdata^.prefs.nextStoryNum = myUserLandData.prefs.nextStoryNum} else { adrdata^.prefs.nextStoryNum = 1}}; if not defined (adrdata^.prefs.enabled) { adrdata^.prefs.enabled = true}; if not defined (adrdata^.prefs.minuteToRead) { if defined (myUserLandData.prefs.minuteToDoHourlyScan) { adrdata^.prefs.minuteToRead = myUserLandData.prefs.minuteToDoHourlyScan} else { adrdata^.prefs.minuteToRead = random (5, 55)}}; if not defined (adrdata^.prefs.minuteToArchive) { if defined (myUserLandData.prefs.minuteToArchive) { adrdata^.prefs.minuteToArchive = myUserLandData.prefs.minuteToArchive} else { adrdata^.prefs.minuteToArchive = 58}}; if not defined (adrdata^.prefs.hoursBeforeArchive) { if defined (myUserLandData.prefs.hoursBetweenArchives) { adrdata^.prefs.hoursBeforeArchive = myUserLandData.prefs.hoursBetweenArchives} else { adrdata^.prefs.hoursBeforeArchive = 24}}; if not defined (adrdata^.prefs.flArchive) { if defined (myUserLandData.prefs.flArchiveStoriesNightly) { adrdata^.prefs.flArchive = myUserLandData.prefs.flArchiveStoriesNightly} else { adrdata^.prefs.flArchive = true}}; if not defined (adrdata^.prefs.flSaveArchiveXmlFiles) { adrdata^.prefs.flSaveArchiveXmlFiles = false}; if not defined (adrdata^.prefs.flLogArchiveStories) { if defined (myUserLandData.prefs.flLogArchiveStories) { adrdata^.prefs.flLogArchiveStories = myUserLandData.prefs.flLogArchiveStories} else { adrdata^.prefs.flLogArchiveStories = true}}; if not defined (adrdata^.prefs.flScanOnStartup) { adrdata^.prefs.flScanOnStartup = false}; if not defined (adrdata^.prefs.maxErrorsBeforeAutoUnsubscribe) { adrdata^.prefs.maxErrorsBeforeAutoUnsubscribe = 24 * 2}; if not defined (adrdata^.prefs.flSaveItemData) { //JES 11/14/02: passed to xml.rss.readService adrdata^.prefs.flSaveItemData = true}; //JES 3/4/03: always init to true -- needed for "modern" aggregator features to work <<bundle //old code/notes <<11/14/02 JES: The aggregator XML-RPC API returns the title and link along with the item. xml.rss.readService takes an optional parameter, flSaveData, which determines whether to save the title and link in the item sub-table of the compilation. <<Previously, the default value for this parameter was false. In Radio, it needs to be passed in as true, so that the aggregator API will get the right data. <<We initialize to true in Radio, and false in Frontier. Then in xml.aggregator.subscribeService and xml.aggregator.readService, we pass the value of the pref. <<if system.environment.isRadio <<adrdata^.prefs.flSaveItemData = true <<else <<adrdata^.prefs.flSaveItemData = false if not system.environment.isRadio { //PBS 12/27/01: set up flBehindFirewall pref on Frontier <<In Radio the pref is at user.radio.prefs.flBehindFirewall. In Frontier the pref is in the adrdata^.prefs table. if not defined (adrdata^.prefs.flBehindFirewall) { adrdata^.prefs.flBehindFirewall = false}}; bundle { //init security sub-table of prefs for RPC handlers, 1/11/06 by DW if not defined (adrdata^.prefs.security) { new (tableType, @adrdata^.prefs.security)}; if not defined (adrdata^.prefs.security.username) { adrdata^.prefs.security.username = user.prefs.mailAddress}; if not defined (adrdata^.prefs.security.password) { adrdata^.prefs.security.password = ""}; if not defined (adrdata^.prefs.security.flRpcInterfaceEnabled) { adrdata^.prefs.security.flRpcInterfaceEnabled = false}}}; bundle { //services if not defined (adrdata^.services) { if defined (myUserLandData.services) { adrdata^.services = myUserLandData.services} else { new (tabletype, @adrdata^.services)}}}; bundle { //stories if not defined (adrdata^.stories) { if defined (myUserLandData.stories) { adrdata^.stories = myUserLandData.stories} else { new (tabletype, @adrdata^.stories)}}}; bundle { //trash if not defined (adrdata^.trash) { new (tabletype, @adrdata^.trash)}}; bundle { //cache if not defined (adrdata^.cache) { new (tabletype, @adrdata^.cache)}}; bundle { //settings if not defined (adrdata^.settings) { new (tabletype, @adrdata^.settings)}}; bundle { //callbacks if not defined (adrdata^.callbacks) { new (tabletype, @adrdata^.callbacks)}; if not defined (adrdata^.callbacks.storyArrived) { if defined (myUserLandData.callbacks.storyArrived) { adrdata^.callbacks.storyArrived = myUserLandData.callbacks.storyArrived} else { new (tabletype, @adrdata^.callbacks.storyArrived)}}; if not defined (adrdata^.callbacks.preScan) { new (tabletype, @adrdata^.callbacks.preScan)}; if not defined (adrdata^.callbacks.postScan) { new (tabletype, @adrdata^.callbacks.postScan)}; if not defined (adrdata^.callbacks.subscribeService) { new (tabletype, @adrdata^.callbacks.subscribeService)}; if not defined (adrdata^.callbacks.unsubscribeService) { new (tabletype, @adrdata^.callbacks.unsubscribeService)}}; bundle { //rpcHandlers if not defined (user.betty.rpcHandlers.aggregator) { user.betty.rpcHandlers.aggregator = @xml.aggregator.rpcHandlers}; if not defined (user.betty.soapHandlers.aggregator) { user.soap.rpcHandlers.aggregator = @xml.aggregator.rpcHandlers}}; bundle { //make sure everyMinute script is installed, if necessary <<if not defined (adrdata^.settings.flInstalled) if adrdata^.prefs.enabled { if not defined (user.scheduler.everyMinute.aggregator) { user.scheduler.everyMinute.aggregator = @xml.aggregator.everyMinute}}}; <<adrdata^.settings.flInstalled = true //only do this once <<bundle //system.temp.aggregator <<if not defined (system.temp.aggregator) <<new (tabletype, @system.temp.aggregator) <<if not defined (system.temp.aggregator.ctNewStories) <<system.temp.aggregator.ctNewStories = 0 <<if not defined (system.temp.aggregator.ctThreads) <<system.temp.aggregator.ctThreads = 0 <<if not defined (system.temp.aggregator.lastChannelRead) <<system.temp.aggregator.lastChannelRead = "" <<if not defined (system.temp.aggregator.status) <<system.temp.aggregator.status = "" return (adrdata)
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.