Update all views in a database - web style
It is a bad idea to check the property "hide from Notes client" on a view. If you do this you burden your HTTP task with refreshing that view rather than leaving that to the indexer task (which would run in its own thread on its own processor(s). The better way to hide views from Notes clients (for convenience) is to start their name with
As usual YMMV
(
. The Performance impact can be quite positive once you fix them (and bad if you don't). Until you get the approval and find the time to fix the view visibility a method is needed to quickly update all database views from a web perspective. In my toolbox there is a little script that does exactly that. The nice aspect of it: it lives in a utility database and takes the database to work on as a parameter:
http://mywebserver/senseitoolbox.nsf/webupdateviews?openAgent&database=apps/hr/webleave.nsf
The agent renders a page with a link to each view in the database (I don't check for the "hide from web" property) and an Ajax call that opens ever view once through the URL and records completion. Completion doesn't imply success. I'm not monitoring for return codes or so. The agent is a good interim helper until the view visibility to the indexing task has been restored.
As usual YMMV
%REM
Agent (webUpdateViews)
Created Nov 23, 2010 by Stephan H Wissel/Singapore/IBM
Description: Agent to refesh all views in the database using URL open
%END REM
Option Public
Option Declare
Public Const queryStringName = "QUERY_STRING_DECODED"
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim workDB As NotesDatabase
Dim doc As NotesDocument
Set db = s. Currentdatabase
Set doc = s. Documentcontext
Dim dbNameItem As NotesItem
Dim work As Variant 'For the evaluation of the database
If Not doc. Hasitem (queryStringName ) Then
Print "You need a querystring for this agent to work"
Exit sub
End If
Set dbNameItem = doc. Getfirstitem (queryStringName )
'Get the database name on the server
work = Evaluate ( |@trim(@Left(@Right("|+dbNameItem. Text+ |&";"&database=");"&"))| )
If work ( 0 ) = "" Then
Print "You need to specify the database on the server with &database="
Exit sub
End If
Set workDB = New NotesDatabase ( "",work ( 0 ) )
If Not workDB. Isopen Then
Call workDB. Open ( "", "" )
End If
If Not workDB. Isopen Then
Print "Could not open the database "+work ( 0 )
Exit sub
End If
Call RenderAjax (s, workDB )
End Sub
%REM
Sub RenderAjax
Description: Renders a HTML Page that goes nicely with Ajax
%END REM
Sub RenderAjax (s As NotesSession, db As NotesDatabase )
Dim out As NotesStream
Dim script As NotesStream
Dim url As String
Dim curVurl As String
Dim i As Integer
Dim v As NotesView
If db. Httpurl = "" Then
url = "http://localhost/__"+db. Replicaid+ ".nsf/"
Else
url = db. Httpurl+ "/"
End If
Set out = s. Createstream ( )
Set script = s. Createstream ( )
Call script. Writetext ( |<script language="JavaScript" type="text/javascript">|,EOL_PLATFORM )
Call addJSFunctions (script )
Call out. Writetext ( "<h1>Auto Refresh for "+db. Filepath + "</h1>",EOL_PLATFORM )
Call out. Writetext ( |<h2>|,EOL_PLATFORM )
Call out. Writetext (url,EOL_PLATFORM )
Call out. Writetext ( |</h2>|,EOL_PLATFORM )
Call out. Writetext ( |<div id="result">Result</div>|,EOL_PLATFORM )
Call out. Writetext ( |<ol>|,EOL_PLATFORM )
i = 0
ForAll curV In db. Views
Set v = curV
If Not v. Isfolder Then 'No point updating folders
'This is just for the Show
Call out. Writetext ( |<li><a href="| )
If IsArray (v. Aliases ) then
If v. Aliases ( 0 ) <> "" Then
curVurl = url + v. Aliases ( 0 )
Else
curVurl = url + v. Name
End If
Else
curVurl = url + v. Name
End If
Call out. Writetext (curVurl )
Call out. Writetext ( |?Open">|+v. Name+ |</a>|,EOL_PLATFORM )
Call out. Writetext ( |</li>|,EOL_PLATFORM )
'This is the real work
Call script. Writetext ( |views[|+ CStr (i )+ |] = "|+curVurl+ |";|,EOL_PLATFORM )
'Increment
i = i + 1
End If
End ForAll
Call script. Writetext ( |callAllViews(0)|,EOL_PLATFORM )
Call script. Writetext ( |</script>|,EOL_PLATFORM )
Call out. Writetext ( |</ol>|,EOL_PLATFORM )
'Now write out
out. Position = 0
Print out. Readtext ( )
script. Position = 0
Print script. Readtext ( )
End Sub
%REM
Sub addJSFunctions
Description: Adds all the JavaScript needed
%END REM
Sub addJSFunctions (out As NotesStream )
Call out. Writetext ( |
var views = [];
function callAllViews(curIndex) {
var r = createRequest();
r.open("GET",views[curIndex],false);
r.send(null);
var resultEle = document.getElementsByTagName("LI");
resultEle[curIndex].innerHTML += " - done";
curIndex++;
if (curIndex < views.length) {
window.setTimeout(callAllViews(curIndex),10000);
} else {
// Here would be a check if that thing needs to run again
}
}
function createRequest() {
var request;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request) {
alert("Error initializing XMLHttpRequest!");
}
return request;
}
|,EOL_PLATFORM )
End Sub
Agent (webUpdateViews)
Created Nov 23, 2010 by Stephan H Wissel/Singapore/IBM
Description: Agent to refesh all views in the database using URL open
%END REM
Option Public
Option Declare
Public Const queryStringName = "QUERY_STRING_DECODED"
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim workDB As NotesDatabase
Dim doc As NotesDocument
Set db = s. Currentdatabase
Set doc = s. Documentcontext
Dim dbNameItem As NotesItem
Dim work As Variant 'For the evaluation of the database
If Not doc. Hasitem (queryStringName ) Then
Print "You need a querystring for this agent to work"
Exit sub
End If
Set dbNameItem = doc. Getfirstitem (queryStringName )
'Get the database name on the server
work = Evaluate ( |@trim(@Left(@Right("|+dbNameItem. Text+ |&";"&database=");"&"))| )
If work ( 0 ) = "" Then
Print "You need to specify the database on the server with &database="
Exit sub
End If
Set workDB = New NotesDatabase ( "",work ( 0 ) )
If Not workDB. Isopen Then
Call workDB. Open ( "", "" )
End If
If Not workDB. Isopen Then
Print "Could not open the database "+work ( 0 )
Exit sub
End If
Call RenderAjax (s, workDB )
End Sub
%REM
Sub RenderAjax
Description: Renders a HTML Page that goes nicely with Ajax
%END REM
Sub RenderAjax (s As NotesSession, db As NotesDatabase )
Dim out As NotesStream
Dim script As NotesStream
Dim url As String
Dim curVurl As String
Dim i As Integer
Dim v As NotesView
If db. Httpurl = "" Then
url = "http://localhost/__"+db. Replicaid+ ".nsf/"
Else
url = db. Httpurl+ "/"
End If
Set out = s. Createstream ( )
Set script = s. Createstream ( )
Call script. Writetext ( |<script language="JavaScript" type="text/javascript">|,EOL_PLATFORM )
Call addJSFunctions (script )
Call out. Writetext ( "<h1>Auto Refresh for "+db. Filepath + "</h1>",EOL_PLATFORM )
Call out. Writetext ( |<h2>|,EOL_PLATFORM )
Call out. Writetext (url,EOL_PLATFORM )
Call out. Writetext ( |</h2>|,EOL_PLATFORM )
Call out. Writetext ( |<div id="result">Result</div>|,EOL_PLATFORM )
Call out. Writetext ( |<ol>|,EOL_PLATFORM )
i = 0
ForAll curV In db. Views
Set v = curV
If Not v. Isfolder Then 'No point updating folders
'This is just for the Show
Call out. Writetext ( |<li><a href="| )
If IsArray (v. Aliases ) then
If v. Aliases ( 0 ) <> "" Then
curVurl = url + v. Aliases ( 0 )
Else
curVurl = url + v. Name
End If
Else
curVurl = url + v. Name
End If
Call out. Writetext (curVurl )
Call out. Writetext ( |?Open">|+v. Name+ |</a>|,EOL_PLATFORM )
Call out. Writetext ( |</li>|,EOL_PLATFORM )
'This is the real work
Call script. Writetext ( |views[|+ CStr (i )+ |] = "|+curVurl+ |";|,EOL_PLATFORM )
'Increment
i = i + 1
End If
End ForAll
Call script. Writetext ( |callAllViews(0)|,EOL_PLATFORM )
Call script. Writetext ( |</script>|,EOL_PLATFORM )
Call out. Writetext ( |</ol>|,EOL_PLATFORM )
'Now write out
out. Position = 0
Print out. Readtext ( )
script. Position = 0
Print script. Readtext ( )
End Sub
%REM
Sub addJSFunctions
Description: Adds all the JavaScript needed
%END REM
Sub addJSFunctions (out As NotesStream )
Call out. Writetext ( |
var views = [];
function callAllViews(curIndex) {
var r = createRequest();
r.open("GET",views[curIndex],false);
r.send(null);
var resultEle = document.getElementsByTagName("LI");
resultEle[curIndex].innerHTML += " - done";
curIndex++;
if (curIndex < views.length) {
window.setTimeout(callAllViews(curIndex),10000);
} else {
// Here would be a check if that thing needs to run again
}
}
function createRequest() {
var request;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request) {
alert("Error initializing XMLHttpRequest!");
}
return request;
}
|,EOL_PLATFORM )
End Sub
Posted by Stephan H Wissel on 23 November 2010 | Comments (1) | categories: Show-N-Tell Thursday