Monday, November 08, 2010 at 12:07 AM.

system.verbs.builtins.xml.aggregator.updateArchives

<<Changes
	<<3/25/07; 9:06:39 AM by DW
		<<In the past, we wouldn't archive an item with an enclosure if there wasn't a sub-element named "f". Today we changed the policy. If you haven't downloaded the enclosure within a reasonable amount of time, we consume it. Otherwise these enclosures accumulate in the stories table, for no purpose.
	<<2/4/02; 4:02:23 AM by JES
		<<When archiving stories, make sure that adr^.time is defined. If not, then the archiving loop will fail, and stories will accumulate, bloating the database. If not defined, set adr^.time to timeCreated (adr) -- the time the story table was created.
		<<Note: This situation can occur if the app crashes or is Quit during a scan.
	<<12/27/01; 5:53:54 PM by PBS
		<<Call radio.log.add in a try because this may be running in Frontier where radio.log.add is not defined.
	<<10/30/01; 7:11:00 AM by DW
		<<Clarified log message to use the term "aggregator news items."
	<<10/21/01; 11:28:21 AM by DW
		<<Tightened-up log message, only log the archive if you're actually creating an archive file.
	<<10/20/01; 8:37:23 AM by DW
		<<Rewrite for Radio 7.1.
	<<4/15/01; 5:30:33 PM by JES
		<<Fixed the calculation of the cutoff age for archiving stories, per http://groups.yahoo.com/group/radio-userland/message/8874.
	<<1/23/01; 6:45:27 PM by DW
		<<Ooops, if we archive undownloaded enclosures the Last Yard won't work. Don't do it.
	<<1/23/01; 12:23:02 PM by DW
		<<Assume we're archiving every myUserLandData.prefs.hoursBetweenArchives hours, not every 24.
		<<We archive all stories that are older than myUserLandData.prefs.hoursBetweenArchives hours.
		<<We used to *not* archive stories with categories or enclosures, but now that they're part of the blog and not the stories table, we can safely archive them. Goodbye old friends.
	<<1/14/01; 9:24:02 AM by DW
		<<Don't archive the story if it has an enclosure.
	<<1/14/01; 8:11:08 AM by DW
		<<Moved the archiving code from the thread to this script.
	<<1/13/01; 11:21:12 AM by DW
		<<Created. Copy all stories that are older than midnight today to the archives.
		<<Return the number of stories that were archived.

local (adrdata = xml.aggregator.init ());
local (startticks = clock.ticks (), now = clock.now (), ct = 0);

local (day, month, year, hour, minute, second);
date.get (now, @day, @month, @year, @hour, @minute, @second);

local (cutoff = now - (adrdata^.prefs.hoursBeforeArchive * 3600)); //keep stories newer than this date

local (archivedRadioStories); //this name appears in the XML file
bundle { //delete too-old stories, fill archivedRadioStories if XML archiving is on
	local (i, adr);
	new (tabletype, @archivedRadioStories);
	for i = sizeof (adrdata^.stories) downto 1 {
		adr = @adrdata^.stories [i];
		if not defined (adr^.time) {
			adr^.time = timeCreated (adr)};
		if adr^.time < cutoff {
			local (flarchive = true);
			<<if defined (adr^.enclosure) //3/25/07 by DW -- commented
				<<if not defined (adr^.enclosure.f)
					<<flarchive = false
			if flarchive {
				if adrdata^.prefs.flSaveArchiveXmlFiles {
					archivedRadioStories.[nameof (adr^)] = adr^};
				delete (adr)}}}};

local (f);
if adrdata^.prefs.flSaveArchiveXmlFiles {
	local (pc = file.getpathchar ());
	local (basefolder = frontier.pathstring + "backups" + pc + "aggregatorArchive" + pc);
	local (xmltext = table.tableToXml (@archivedRadioStories));
	month = string.padwithzeros (month, 2);
	day = string.padwithzeros (day, 2);
	hour = string.padwithzeros (hour, 2);
	f = basefolder + year + pc + month + pc + day + pc + hour + ".xml";
	file.surefilepath (f);
	file.writewholefile (f, xmltext);
	if adrdata^.prefs.flLogArchiveStories {
		try {radio.log.add ("Archive", ct + " aggregator news items archived in <a href=\"" + html.getfileurl (f) + "\">" + file.filefrompath (f) + "</a>.", startticks)}}}; //PBS 12/27/01: use a try because this might be running in Frontier where radio.log.add is not defined

xml.aggregator.clearCache ();
return (ct)



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.