Monday, November 08, 2010 at 12:02 AM.
system.verbs.builtins.fileMenu.saveCopyOpenDatabases
on saveCopyOpenDatabases (destfolder=nil, ticksbetweensaves=0, adrfilter=nil, adrerrortable=nil, flsafecopy=false) { <<Changes <<9/21/10; 7:40:40 PM by DW <<Improved the logging messages. <<9/21/10; 12:19:35 PM by DW <<Instead of calling frontier.getFilePath () to get the path to the root, use Frontier.pathToRoot. <<10/17/09; 12:42:12 PM by DW <<Added optional parameter flsafecopy. If true, we savecopy to a temp file and rename it after it was successful. This way we don't lose the last good backup of a file (kind of the point of the exercise). Default false so as not to risk breakage. <<9/13/09; 11:43:43 AM by DW <<Commented the file.setcreated and file.setmodified calls because they crash the Intel version of the OPML Editor. <<7/14/09; 4:36:57 PM by DW <<The source of the logging event is fileMenu.saveCopyOpenDatabases. <<6/3/09; 9:54:55 AM by DW <<Use the new low-level logging facility to log the database copy. <<5/11/07; 1:01:35 PM by DW <<Instead of saving a series of backup folders, just write to a single mirror folder. <<5/11/07; 11:35:42 AM by DW <<When adding the program name, use "Frontier" and "Radio" instead of the two-word versions. I think there may be a problem with S3 uploads in this case. <<5/9/07; 10:26:22 AM by DW <<If there's an error save-copying, don't abort the process. We now optionally return an error table, indexed by relative file path, containing error messages. If there's no error, the file doesn't appear. <<10/11/06; 3:16:58 PM by DW <<Add another level of nesting, the app name. <<10/10/06; 1:04:56 PM by DW <<Preserve file creation and modification dates. <<Return the destfolder. <<9/4/06; 10:11:23 AM by DW <<Add special case for frontier.root/radio.root/opml.root. <<9/4/06; 9:59:52 AM by DW <<Add filter parameter, if it returns false, don't copy the file. <<9/1/06; 12:05:03 PM by DW <<Created. local (logsource = "fileMenu.saveCopyOpenDatabases"); local (flfirstfile = true); on callfilter (f) { local (flcopy = true); try { if adrfilter != nil { if not adrfilter^ (f) { //filter says don't copy the file flcopy = false}}} else { log2.add (logsource, "Filter error", tryerror)}; if flcopy { if not flfirstfile { if ticksbetweensaves > 0 { //pause to take a few hits clock.waitsixtieths (ticksbetweensaves)}}; flfirstfile = false}; return (flcopy)}; local (pc = file.getpathchar ()); if adrerrortable != nil { new (tabletype, adrerrortable)}; local (sourcefolder = frontier.pathstring + "Guest Databases" + pc); if destfolder == nil { destfolder = frontier.pathstring + "Mirror" + pc}; <<bundle //add the subfolder, commented 5/11/07 by DW <<local (day, month, year, hour, minute, second) <<date.get (clock.now (), @day, @month, @year, @hour, @minute, @second) <<month = string.padwithzeros (month, 2) <<day = string.padwithzeros (day, 2) <<destfolder = destfolder + (year + "-" + month + "-" + day) + pc bundle { //add the program name to folder path local (name = ""); if defined (system.environment.isOpmlEditor) { if system.environment.isOpmlEditor { name = "OPML"}}; if name == "" { if system.environment.isRadio { name = "Radio"} else { name = "Frontier"}}; destfolder = destfolder + name + pc}; on savecopy (sourcef, destf) { //5/9/07 by DW local (startticks = clock.ticks ()); try { local (f = destf); //10/17/09 by DW if flsafecopy { f = file.folderfrompath (destf) + "tmp.root"}; filemenu.savecopy (f); if flsafecopy { //10/17/09 by DW try {file.delete (destf)}; file.rename (f, file.filefrompath (destf))}; <<file.setcreated (destf, file.created (sourcef)) <<file.setmodified (destf, file.modified (sourcef)) log2.add (logsource, "Save-copy", "Backed up " + file.filefrompath (sourcef) + ". (" + string.gigabytestring (file.size (destf)) + ")", startticks)} else { local (s = string.delete (destf, 1, sizeof (destfolder))); s = string.replaceall (s, pc, "/"); if adrerrortable != nil { if sizeof (s) > 0 { adrerrortable^.[s] = tryerror}}; log2.add (logsource, "Save-copy error", tryerror, startticks)}}; bundle { //save-copy frontier.root local (oldtarget = target.set (@root)); local (f = Frontier.pathToRoot); //9/21/10 by DW local (destf = destfolder + file.filefrompath (f)); filemenu.save (f); file.surefilepath (destf); if callfilter (f) { savecopy (f, destf)}; target.set (oldtarget)}; fileloop (f in sourcefolder, infinity) { //the folder containing the app if f endswith ".root" { if window.isopen (f) { if callfilter (f) { local (adrinroot); filemenu.save (f); adrinroot = @[f]; local (destf = destfolder + string.delete (f, 1, sizeof (sourcefolder))); file.surefilepath (destf); local (oldtarget = target.set (adrinroot)); savecopy (f, destf); target.set (oldtarget)}}}}; return (destfolder)}; bundle { //test code saveCopyOpenDatabases ()}
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.