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

system.verbs.builtins.mainResponder.adminSite.prefs.listSubscribableDatabases

on listSubscribableDatabases () {
	<<Changes
		<<9/7/02; 10:22:30 PM by JES
			<<Be more tolerant about which databases are allowed to be subscribed.
		<<8/26/02; 5:52:49 PM by JES
			<<Created. Lists databases on this server, with checkboxes for whether or not the database should be subscribable.
	local (pta = html.getPageTableAddress ());
	local (bgcolors = {pta^.trbg1, pta^.trbg2});
	
	on findInUserDatabases (f) {
		local (lowerpath = string.lower (f));
		local (adrtable);
		for adrtable in @user.databases {
			if string.lower (adrtable^.f) == lowerpath {
				return (adrtable)}};
		return (@user.databases.[file.fileFromPath (f)] )};
	
	local (htmltext);
	on add (s) {
		htmltext = htmltext + (s + "\r");};
	
	bundle { //list the databases
		local (t); new (tableType, @t);
		bundle { //build sorted table of databases
			local (pc = file.getPathChar ());
			
			on isSubscribable (f) {
				local (lowerpath = string.lower (f));
				local (adrtable);
				for adrtable in @user.databases {
					try {
						if string.lower (adrtable^.f) == lowerpath {
							return (adrtable^.supportsSubscribe)}}};
				return (false)};
			on skipDatabase (f) {
				bundle { //skip all databases that are getting updates from elsewhere
					local (lowerfname = string.lower (file.fileFromPath (f)));
					local (adrtable);
					for adrtable in @user.rootUpdates.servers {
						try {
							if string.lower (adrtable^.dbname) == lowerfname {
								if tcp.equalNames (tcp.dns.getMyDottedId (), adrtable^.server) {
									return (false)};
								return (true)}}}};
				bundle { //skip other canonical databases
					local (lowerpath = string.lower (f));
					local (appFolder = Frontier.getSubFolder ("apps"));
					local (logFolder = Frontier.getSubFolder ("ops") + "logs" + pc);
					local (opsFolder = Frontier.getSubFolder ("ops"));
					local (datafilesFolder = Frontier.getSubFolder ("ops") + "datafiles" + pc);
					on checkOne (path) {
						if string.lower (path) == lowerpath {
							return (true)};
						return (false)};
					if checkOne (appFolder + "config.root") {return (true)};
					if checkOne (datafilesFolder + "mainResponderSearchQueue.root") {return (true)};
					if checkOne (opsFolder + "members.root") {return (true)};
					if checkOne (opsFolder + "discuss.root") {return (true)};
					if lowerpath beginsWith string.lower (logfolder) {return (true)}};
				return (false)};
			
			local (adr);
			for adr in @system.compiler.files {
				local (f = nameOf (adr^));
				if skipDatabase (f) {
					continue};
				local (dbname = file.fileFromPath (f));
				local (dbsize = file.size (f));
				local (modified = file.modified (f));
				local (folder = file.folderFromPath (f));
				local (foldername = file.fileFromPath (folder));
				local (adrdb = @[f] );
				local (dbtables = sizeOf (adrdb^));
				local (adrfolder = @t.[foldername]);
				if not defined (adrfolder^) {
					new (tableType, adrfolder)};
				local (adrdbinfo = @adrfolder^.[dbname]);
				new (tableType, adrdbinfo);
				if defined (adrdb^.["#changes"]) {
					adrdbinfo^.changes = sizeOf (adrdb^.["#changes"])}
				else {
					adrdbinfo^.changes = 0};
				adrdbinfo^.flSubscribable = isSubscribable (f);
				adrdbinfo^.f = f}};
		
		add ("<table cellpadding=\"2\" cellspacing=\"0\" border=\"0\">");
		bundle { //headers
			add ("<tr><td> </td><td><b>Folder</b></td><td><b>Database</b></td><td align=\"right\"><b>Changes</b></td></tr>")};
		local (ct = 0, adrfolder, adrdb);
		for adrfolder in @t {
			local (folder = nameOf (adrfolder^) + "  ");
			for adrdb in adrfolder {
				local (dbname = nameOf (adrdb^));
				if pta^.method == "POST" { //set up this db
					if defined (pta^.postArgs.[string.urlEncode (adrdb^.f)] ) {
						local (adrinfo = findInUserDatabases (adrdb^.f));
						if not defined (adrinfo^) { //init user.databases sub-table
							new (tableType, adrinfo);
							adrinfo^.f = adrdb^.f;
							adrinfo^.openOnStartup = true;
							adrinfo^.runStartupScript = false};
						adrinfo^.supportsSubscribe = true;
						if not defined ([adrdb^.f].["#changes"]) {
							new (tableType, @[adrdb^.f].["#changes"])};
						adrdb^.flsubscribable = true}
					else { //turn off subscriptions for this database
						local (adrinfo = findInUserDatabases (adrdb^.f));
						if defined (adrinfo^) {
							adrinfo^.supportsSubscribe = false;
							adrdb^.flsubscribable = false}}};
				add ("<tr bgcolor=\"" + bgcolors[(ct++% 2) + 1] + "\">");
				bundle { //checkbox
					local (checked = "");
					if adrdb^.flsubscribable {
						checked = " checked"};
					add ("<td> <input type=\"checkbox\" name=\"" + string.urlEncode (adrdb^.f) + "\"" + checked + " /> </td>")};
				add ("<td class=\"small\">" + folder + "</td>");
				folder = ""; //only display the folder once
				add ("<td class=\"small\">" + dbname + "</td>");
				add ("<td class=\"small\" align=\"right\">" + adrdb^.changes + " </td>");
				add ("</tr>")}};
			<<add ("<tr><td> </td></tr>"); ct = 0
		
		add ("</table>")};
	
	return (htmltext)}
<<bundle //test code
	<<html.setPageTableAddress (@workspace.pt)
	<<listSubscribableDatabases ()



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.