Monday, April 04, 2011 at 1:05 AM.
feedhoseSuite.getBackItems
on getBackItems (hosename, seed, adrreturnx, startticks = clock.ticks (), adrctitems = nil) {
<<Changes
<<12/7/10; 5:06:33 PM by DW
<<Add optional parameter, adrctitems.
<<12/2/10; 4:29:57 AM by DW
<<If the seed points to an item we don't have, it's either a bad seed or an old one. In either case, we can't do anything with it, so we return an empty items table.
<<9/29/10; 12:18:50 PM by DW
<<Add hosename parameter.
<<9/25/10; 6:59:47 PM by DW
<<Return true if there are actually some items in the table, false otherwise.
<<9/25/10; 2:45:48 PM by DW
<<seed is of the form 2010-09-24-00250, which indicates the 250th item on 9/24/10.
<<We return a table filled with all the items that have posted since then.
local (adrdata = feedHoseSuite.init (), items, adrlastitem);
local (adrhose = feedhosesuite.inithose (hosename));
local (adrcal = @adrhose^.calendar, maxhoseitems = adrdata^.server.prefs.maxHoseItems);
on encode (s) {
if system.environment.isMac { //02/22/2001 JES: convert to Latin text
return (xml.entityEncode (latinToMac.macToLatin (s), true))}
else {
return (xml.entityEncode (s, true))}};
bundle { //fill items table
local (adrseed, year, month, day, itemname);
new (tabletype, @items);
on visit (adritem) {
if adritem == adrseed { //we've already seen this one
return (false)};
local (adrx = xml.addtable (@items, "item"));
adrx^ = adritem^.xitem;
bundle { //add feed info
local (feedurl = adritem^.riveritem.feedurl);
xml.addvalue (adrx, "feedUrl", feedurl);
xml.addvalue (adrx, "feedTitle", config.river2.feeds.[feedurl].feedinfo.title);
xml.addvalue (adrx, "feedLink", config.river2.feeds.[feedurl].feedinfo.link)};
bundle { //add thumbnail, if present, 10/14/10 by DW
try {
if defined (adritem^.riveritem.thumbnail) {
xml.addvalue (adrx, "thumbUrl", adritem^.riveritem.thumbnail.url);
xml.addvalue (adrx, "thumbWidth", adritem^.riveritem.thumbnail.width);
xml.addvalue (adrx, "thumbHeight", adritem^.riveritem.thumbnail.height)}}};
if sizeof (items) >= maxhoseitems {
return (false)};
return (true)}; //keep visiting
bundle { //set year, month, day, itemname
year = string.nthfield (seed, "-", 1);
month = string.nthfield (seed, "-", 2);
day = string.nthfield (seed, "-", 3);
itemname = string.nthfield (seed, "-", 4)};
bundle { //set adrseed, if it worked (the seed is good), try to fill the items table
try {
adrseed = @adrcal^.[year].[month].[day].[itemname];
mainresponder.calendar.visitReverseChronologic (adrcal, @visit)}}};
<<bundle //set adrlastitem
<<local (nomad = adrcal)
<<nomad = @nomad^ [sizeof (nomad^)] //last year
<<nomad = @nomad^ [sizeof (nomad^)] //last month
<<nomad = @nomad^ [sizeof (nomad^)] //last day
<<nomad = @nomad^ [sizeof (nomad^)] //last item
<<adrlastitem = nomad
bundle { //re-order items table
local (adr, ix = sizeof (items), name);
for adr in @items {
name = string.padwithzeros (ix--, 8) + "\titem";
table.rename (adr, name)}};
<<target.set (@items)
<<table.sortby ("Name")
<<scratchpad.items = items
bundle { //build the return table, an "feedHose" wrapper, containing the items
local (adrfeedhose, adritems, adrmetadata);
new (tabletype, adrreturnx);
adrfeedhose = xml.addtable (adrreturnx, "feedHose");
if sizeof (items) > 0 {
adritems = xml.addtable (adrfeedhose, "items"); adritems^ = items};
adrmetadata = xml.addtable (adrfeedhose, "metadata");
xml.addvalue (adrmetadata, "seed", feedhoseSuite.getCurrentSeed (hosename));
bundle { //add a secs element
<<local (s = string (double (clock.ticks () - startticks) / 60))
<<local (lod = string.nthfield (s, ".", 1))
<<local (rod = string.nthfield (s, ".", 2) + "00")
<<if sizeof (rod) > 3
<<rod = string.mid (rod, 1, 3)
<<xml.addvalue (adrmetadata, "secs", lod + "." + rod)
xml.addvalue (adrmetadata, "secs", string.formatdouble (double (clock.ticks () - startticks) / 60))}};
bundle { //set adrctitems^, 12/7/10 by DW
if adrctitems != nil {
adrctitems^ = sizeof (items)}};
return (sizeof (items) > 0)};
bundle { //test code
getBackItems ("nytimes", "2010-12-01-00033", @scratchpad.items)}
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.