Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.upstream.oldstuff.uploadChangedFiles
on uploadChangedFiles () { <<Changes <<1/3/01; 4:59:41 PM by DW <<Rewrite. Out with the tree, keep a flat list of files. <<1/20/01; 10:41:40 AM by DW <<Add support for magic folders. <<A new table, user.radio.prefs.upstream.magicFolders, contains items whose names are slash-delimited partial paths into the www folder. If a new or changed file appears in one of those folders, it's processed by a script, that's pointed to by the element in the magicFolders table. This way new content can be routed up to servers. This is the way blog images are managed, for example. <<2/12/01; 1:31:23 PM by DW <<Get max files per message from a pref, also respect a new pref, packetSizeLimit, which isn't a maximum packet size, because some files may be larger than the limit, but once a packet has that many chars, send it and start a new one. local (now = clock.now ()); local (adrmagic = @user.radio.prefs.upstream.magicFolders); local (pc = file.getpathchar ()); local (addresslist = {}); local (folder = user.radio.prefs.upstream.folder, f, name, extension, adrfile, flwritedirectory = false); local (fdirectory = folder + radio.data.upstream.directoryFileName); fileloop (f in folder, infinity) { name = file.filefrompath (f); extension = string.nthfield (name, ".", string.countfields (name, ".")); if user.radio.prefs.upstream.severCapabilities.legalFileExtensions contains extension { if file.size (f) <= radio.data.upstream.maxFileSize { adrfile = radio.upstream.getFileTable (f); if adrfile^.upstream.flerror or (file.modified (f) > adrfile^.upstream.whenLastUploaded) { addresslist = addresslist + {adrfile}; if f != fdirectory { flwritedirectory = true}}}}; bundle { //if it's in a magic folder, flow it out that way if defined (adrmagic^) { local (adr, magicfolder); for adr in adrmagic { magicfolder = user.radio.prefs.upstream.folder + nameof (adr^); if string.lower (f) beginswith string.lower (string.replaceall (magicfolder, "/", pc)) { //got a hit! while typeof (adr^) == addressType { adr = adr^}; adrfile = radio.upstream.getFileTable (f); if adrfile^.upstream.flerror or (file.modified (f) > adrfile^.upstream.whenLastUploaded) { adrfile^.upstream.f = nameof (adrfile^); //5/13/01; DW, magic file scripts need this defined try {adr^ (@adrfile^.upstream)}; try {delete (@adrfile^.upstream.f)}; adrfile^.upstream.whenLastUploaded = clock.now ()}}}}}}; bundle { //if no files were modified, check if any were deleted, if so, write the directory if not flwritedirectory { flwritedirectory = radio.upstream.checkForDeletions ()}}; bundle { //do the second pass, upload the files via RPC while sizeof (addresslist) > 0 { local (adrlist = {}, i, adr, ctchars = 0); for i = 1 to user.radio.prefs.upstream.maxFilesPerMessage { adr = addresslist [1]; ctchars = ctchars + file.size (nameof (adr^)); if (ctchars >= user.radio.prefs.upstream.packetSizeLimit) and (sizeof (adrlist) > 0) { break}; adrlist = adrlist + {adr}; delete (@addresslist [1]); if sizeof (addresslist) == 0 { break}}; local (filelist = {}); for adr in adrlist { filelist = filelist + {nameof (adr^)}}; local (urllist = radio.upstream.uploadMultipleFiles (filelist)); local (ixurllist = 1); for adr in adrlist { url = urllist [ixurllist++]; adr^.upstream.flerror = url == ""; adr^.upstream.url = url; if defined (adr^.upstream.ctUploads) { adr^.upstream.ctUploads++} else { adr^.upstream.ctUploads = 1}; adr^.upstream.whenLastUploaded = now}}; if flwritedirectory { <<Once and for all, we can't save the directory until we've uploaded files. <<The URL will not be set if it's a new file. <<And even worse, whenLastUploaded will not be correct, or undefined if it's a new file. <<Believe me, I tried. ;-> <<Saturday, September 16, 2000 at 10:28:24 PM by DW local (f = radio.upstream.saveDirectoryXml ()); radio.upstream.uploadOneFile (f)}}}; bundle { //test code <<user.scheduler.hourly.doclock () uploadChangedFiles ()}
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.