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

system.verbs.builtins.radio.backup.backupPrefTable

on backupPrefTable (adrtable, fname) {
	<<Changes
		<<1/14/03; 2:54:15 PM by JES
			<<Use xml generated by table.tableToXml for prefs table file format, instead of Fat Page format.
		<<11/29/02; 4:33:45 PM by JES
			<<Don't back up the mail-to-weblog secret subject.
		<<11/29/02; 3:59:46 PM by JES
			<<Compare the table contents with the contents of the file on disk from the last backup run. If they are identical, then don't write the file.
		<<11/13/02; 10:00:59 AM by DW
			<<Created.
	local (adrbackup = @system.temp.radioPrefsBackup);
	new (tabletype, adrbackup);
	bundle { //create and populate a directory at the top level of the table
		local (adrdirectory = @adrbackup^.directory);
		new (tabletype, adrdirectory);
		adrdirectory^.adrobject = adrtable;
		adrdirectory^.whenCreated = date.netstandardstring (timeCreated (adrtable));
		adrdirectory^.whenModified = date.netstandardstring (timeModified (adrtable));
		adrdirectory^.frontierFolder = frontier.pathstring};
	bundle { //copy table into "data" sub-table, deal with passwords
		<<What we do with passwords..
			<<All scalars whose name contains the word password or are contained within tables whose name contains password are set to the empty string.
		adrbackup^.data = adrtable^; //copy the table
		on visit (adrtable) {
			local (sizetable = sizeof (adrtable^), i);
			for i = sizetable downto 1 {
				adritem = @adrtable^ [i];
				local (flsecret = (string.lower (adritem) contains "password") );
				if not flsecret {
					flsecret = (string.lower (nameOf (adritem^)) == "secretsubject")};
				if flsecret {
					if typeof (adritem^) != tabletype {
						adritem^ = binary ("")}};
				if typeof (adritem^) == tabletype {
					visit (adritem)}}};
		visit (@adrbackup^.data)};
	bundle { //write out the file but only if it changed
		local (flwrite = true);
		local (f = user.radio.backup.prefs.folder + "prefs" + file.getpathchar () + fname + ".xml");
		local (s = table.tableToXml (adrbackup));
		<<bundle //old fat page-based file format
			<<local (f = user.radio.backup.prefs.folder + "prefs" + file.getpathchar () + fname + ".fttb")
			<<local (s = fatPages.buildFileAtts (adrbackup, false))
		file.surefilepath (f);
		if file.exists (f) {
			local (localtable, atts);
			local (filetext = file.readWholeFile (f));
			if filetext == s {
				flwrite = false}};
			<<bundle //old table comparison code
				<<if fatPages.getPageAtts (@filetext, @atts)
					<<if defined (atts.pageData)
						<<fatPages.unpackOdbObject (@atts, @localtable, flEdit:false)
						<<if table.compareContents (@adrbackup^.data, @localtable.data)
							<<flwrite = false
		if flwrite {
			local (filetype = 'TEXT');
			<<bundle //old filetype from fat page file format
				<<local (filetype = frontier.getFileType (typeOf (adrbackup^)))
			file.writeWholeFile (f, s, filetype, user.html.prefs.textFileCreator, clock.now ())}}}
<<bundle //test code
	<<backupPrefTable (@weblogData.prefs, "weblogPrefs")



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.