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

system.verbs.builtins.radio.backup.verifyOneMonth

on verifyOneMonth (year, month, adrErrorMessage) {
	<<Changes
		<<12/3/02; 1:58:43 PM by JES
			<<Handle the case where a post does not have a categories sub-table. Added check for flNotOnHomePage.
		<<11/30/02; 4:36:23 PM by JES
			<<Created. Verify the weblog posts in one month's RSS archive file.
	on error (s) {
		adrErrorMessage^ = "Verification of backup failed because " + s};
	
	local (pc = file.getPathChar ());
	local (f = user.radio.backup.prefs.folder + "posts" + pc + year + pc + string.padwithzeros (month, 2) + ".xml");
	if not file.exists (f) {
		error ("the weblog backup for " + month + "/" + year + " does not exist.");
		return (false)};
	
	local (adrdata = radio.weblog.init ());
	local (adrposts = @adrdata^.posts);
	
	local (xtext = string (file.readwholefile (f)));
	local (posts); new (tabletype, @posts);
	try { //import the posts and compare against the posts in weblogData.posts
		radio.backup.restoreOneMonth (xtext, @posts);
		local (adr, ctposts);
		for adr in adrposts {
			local (dy, mo, yr, hr, min, sec);
			date.get (adr^.when, @dy, @mo, @yr, @hr, @min, @sec);
			if mo == month and yr == year { //post should be in the backup
				local (name = nameOf (adr^));
				local (adrbkp = @posts.[name]);
				local (postnum = number (name));
				if not defined (adrbkp^) {
					error ("post number " + postnum + " is not backed up.");
					return (false)};
				if defined (adrbkp^.categories) and defined (adr^.categories) {
					if not table.compareContents (@adrbkp^.categories, @adr^.categories) {
						error ("the category list for the backup of post number " + postnum + " is not correct.");
						return (false)}}
				else { //categories table is in only one or the other -- it must be empty or it's an error
					if defined (adrbkp^.categories) {
						if sizeOf (adrbkp^.categories) > 0 {
							error ("the category list for the backup of post number " + postnum + " is not correct.");
							return (false)}};
					if defined (adr^.categories) {
						if sizeOf (adr^.categories) > 0 {
							error ("the category list for the backup of post number " + postnum + " is not correct.");
							return (false)}}};
				bundle { //flNotOnHomePage
					local (flPostOnHomePage = true);
					if defined (adr^.flNotOnHomePage) {
						flPostOnHomePage = (not adr^.flNotOnHomePage)};
					local (flBkpOnHomePage = true);
					if defined (adrbkp^.flNotOnHomePage) {
						flBkpOnHomePage = (not adrbkp^.flNotOnHomePage)};
					if flPostOnHomePage != flBkpOnHomePage {
						if flPostOnHomePage {
							error ("the backup of post number " + postnum + " is not in the Home Page category, but the original post is.");
							return (false)}
						else {
							error ("the backup of post number " + postnum + " is in the Home Page category, but the original post is not.");
							return (false)}}};
				local (text, backuptext);
				bundle { //set text and backuptext -- we don't care about line endings or leading/trailing whitespace
					backuptext = string.trimWhiteSpace (string.replaceAll (string (adrbkp^.text), "\r\n", "\r"));
					text = string.trimWhiteSpace (string.replaceAll (string (adr^.text), "\r\n", "\r"))};
				if text != backuptext {
					error ("the backed up text of post number " + postnum + " is not correct.");
					return (false)};
				ctposts++}};
		if sizeOf (posts) != ctposts { //the backup has posts in it which have been deleted
			error ("the weblog backup for \"" + month + "/" + year + " contains posts which are not in the weblog.");
			return (false)}}
	else { //some other error
		error ("an error occurred importing backed up posts for " + month + "/" + year + ": " + tryerror);
		return (false)};
	
	return (true)};
bundle { //test code
	local (s);
	<<verifyOneMonth (2002, 11, @s)
	verifyOneMonth (2002, 1, @s);
	dialog.notify (s)}



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.