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.