Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.mainResponder.adminSite.prefs.updateNowButton
on updateNowButton (flInTable=true) {
<<Changes
<<12/16/03; 3:41:23 AM by JES
<<If the user updates their databases without error, clear the pending updates table so we don't show them stuff they've already seen.
<<6/26/02; 11:07:31 PM by JES
<<Created.
local (pta = html.getPageTableAddress ());
local (htmltext = "");
on add (s) {
htmltext = htmltext + s;};
local (confirmText = "", totalNewParts = 0, flError = false);
if pta^.method == "POST" {
if defined (pta^.postArgs.updateNow) { //catch the submit button
on addToConfirmText (ctNewParts, databaseName) {
confirmText = confirmText + ctNewParts + " new part";
if ctNewParts != 1 {
confirmText = confirmText + "s"};
confirmText = confirmText + " added to " + databaseName + ".root.<br />"};
on addErrorToConfirmText (databaseName) {
confirmText = confirmText + "<b>Couldn't update " + databaseName + ".root because the server didn't respond within 2 minutes.</b><br />"};
on updateOneRoot (nameInRoot, adrCtNewParts) {
local (scriptText);
scriptText = "local (params = {@" + nameInRoot + ", true, @system.temp.Frontier.ctNewParts});\r";
scriptText = scriptText + "thread.callScript (@rootUpdates.update, params)";
local (adr = @system.temp.Frontier.doThreadedUpdate);
new (scriptType, adr);
local (oldtarget = target.set (adr));
op.setLineText (scriptText);
try {target.set (oldtarget)};
script.getcode (adr, adr); //use script.getcode to avoid dialogs asking if you want to compile before closing
adr^ ();
local (now = clock.now (), flTimeout = false);
while not defined (system.temp.Frontier.ctNewParts) { //loop until the update is complete, or we time out
thread.sleepTicks (6); //0.1 seconds
if clock.now () - now > 120 { //2 minute timeout
flTimeout = true;
break}};
if not flTimeout { //udpate completed -- set confirmation message, delete temporary objects
adrCtNewParts^ = system.temp.Frontier.ctNewParts;
delete (@system.temp.Frontier.ctNewParts)};
return (not flTimeout)};
local (ctNewParts);
if updateOneRoot ("root", @ctNewParts) {
addToConfirmText (ctNewParts, "Frontier");
totalNewParts = totalNewParts + ctNewParts}
else {
addErrorToConfirmText ("Frontier");
flError = true};
if updateOneRoot ("mainResponder", @ctNewParts) {
addToConfirmText (ctNewParts, "mainResponder");
totalNewParts = totalNewParts + ctNewParts}
else {
addErrorToConfirmText ("mainResponder");
flError = true};
if updateOneRoot ("manilaSuite", @ctNewParts) {
addToConfirmText (ctNewParts, "manila");
totalNewParts = totalNewParts + ctNewParts}
else {
addErrorToConfirmText ("manila");
flError = true};
if updateOneRoot ("prefsSuite", @ctNewParts) {
addToConfirmText (ctNewParts, "prefs");
totalNewParts = totalNewParts + ctNewParts}
else {
addErrorToConfirmText ("prefs");
flError = true};
msg ("");
if not flError { //empty out the pending updates table
try {new (tableType, @config.mainResponder.stats.pendingUpdates)}}}};
add ("<input type=\"submit\" name=\"updateNow\" value=\"Update Now\" />");
if confirmText != "" { //render the confirm text
if totalNewParts > 0 or flError {
add ("<p><b>Thanks for updating. " + totalNewParts + " new or changed parts were installed. ");
if flError {
add ("At least one error occurred.")};
add ("The number of new parts installed in each database is listed below:</b></p>");
add (confirmText)}
else {
add ("<p><b>There are no new features or fixes at this time. Your copy of Frontier is up to date.</b></p>")}};
if flInTable {
return ("<tr><td colspan=\"2\">" + htmltext + "</td></tr>")}
else {
return (htmltext)}}
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.