September 27, 2010 – 10:49 am



At AdminCamp last week, I talked about how to get the count of all files in the DAOS repository and it’s overall size using some batch programming in Windows and LINUX.

As an alternative I proposed to use the console command “show dir -xml” to return an xml representation of the properties of all applications in the Domino data directory.


I found some code by Julian Robichaux that does the parsing of the XML structure. I’ve stripped out the relevant code snippets and put together a script lib to get the DAOS Object count and the overall size of all DAOS Objects.

The code writes a summary of these values to a database. You can use this data to create nice looking charts and graphs.

Here is the code:

%REM
Library DAOS.Objects
Created Sep 27, 2010 by Ulrich Krause/singultus
Description: Comments for Library
%END REM
Option Public
Option Declare

Class DbInfoHolder
Public PropertyList List As String
Private xh As XmlHelper
Private tNode As NotesDOMNode

Public Sub New ()
Set xh = New XmlHelper()
End Sub

Public Sub GetDbInfo (node As NotesDOMNode)
Erase PropertyList
On Error Resume Next
PropertyList("Title") = xh.getNodeText(xh.findFirstChildNode(node, "title"))
Set tNode = xh.findFirstChildNode(node, "daos")
PropertyList("DAOSEnabled") = xh.getAttributeText(tNode, "enabled")
PropertyList("DAOSObjects") = xh.getAttributeText(tNode, "objects")
PropertyList("DAOSBytes") = xh.getAttributeText(tNode, "bytes")
End Sub

End Class

Class XmlHelper
Function getNodeText (node As NotesDOMNode) As String
'** get the text of the given node
Dim child As NotesDOMNode
Dim childText As String

If (node Is Nothing) Then
Exit Function
Elseif (node.IsNull) Then
Exit Function
End If

Set child = node.FirstChild
Do Until (child.IsNull)
If (child.NodeType = DOMNODETYPE_TEXT_NODE) Then
childText = childText + child.NodeValue
Elseif (child.NodeType = DOMNODETYPE_CDATASECTION_NODE) Then
childText = childText + child.NodeValue
End If
Set child = child.NextSibling
Loop

getNodeText = childText
End Function

Function getAttributeText (node As NotesDOMNode, attrName As String) As String
'** get the text of a given attribute
Dim attrList As NotesDOMNamedNodeMap
Dim attr As NotesDOMNode
Dim attrValue As String
Dim i As Integer

If (node Is Nothing) Then
Exit Function
Elseif (node.IsNull) Then
Exit Function
End If

Set attrList = node.Attributes

For i = 1 To attrList.NumberOfEntries
Set attr = attrList.GetItem(i)
If (attr.NodeName = attrName) Then
attrValue = attr.NodeValue
End If
Next

getAttributeText = attrValue
End Function

Function findFirstChildNode (node As NotesDOMNode, childName As String) As NotesDOMNode
'** get the first child node with the given name
Set findFirstChildNode = findChildNode(node, childName, 1)
End Function

Function findChildNode (node As NotesDOMNode, childName As String, count As Integer) As NotesDOMNode
'** get the child node with the given name at the given position
Dim child As NotesDOMNode
Dim i As Integer

If (node Is Nothing) Then
Exit Function
Elseif (node.IsNull) Then
Exit Function
End If

Set child = node.FirstChild
Do Until (child.IsNull)
If (child.NodeName = childName) Then
i = i + 1
If (i >= count) Then
Exit Do
End If
End If
Set child = child.NextSibling
Loop

Set findChildNode = child
End Function

End Class

%REM
NOTE: You MUST have rights to run remote console commands
on the server you want to get a list of files from.

Parts of the code by Julian Robichaux
http://www.nsftools.com,14 Aug 2008
%END REM

Class DAOSObjects

Public Sub New ()

End Sub

Public Sub ObjectCount

Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = s.CurrentDatabase

Dim session As New NotesSession
Dim commandString As String
Dim server As String
Dim returnString As String
Dim dbInfo As New DbInfoHolder
server = session.UserName
commandString = "!show dir -xml"
returnString = s.SendConsoleCommand(server,commandstring)

'** if we got some output, try to process it as XML
Dim xHelper As New XmlHelper()
Dim inputStream As NotesStream
Dim outputStream As NotesStream
Dim domParser As NotesDOMParser
Dim docNode As NotesDOMDocumentNode
Dim fileNode As NotesDOMNode
Dim dbNode As NotesDOMNode

'** load it up into a DOM parser
Set inputStream = session.CreateStream
Call inputStream.WriteText(returnString)
inputStream.Position = 0
Set outputStream = session.CreateStream
Set domParser=session.CreateDOMParser(inputStream, outputStream)
domParser.Process

'** all of the tasks should be contained within a single
'** node, as separate entries.
Set docNode = domParser.Document

'** find the node
Set fileNode = xHelper.findFirstChildNode(docNode, "files")

'** if we didn't find anything, exit
If (fileNode.IsNull) Then
Exit Sub
End If

Dim sumObj As Currency
Dim sumSize As Currency
sumObj = 0
sumSize = 0

Set dbNode = fileNode.FirstChild

Do Until (dbNode.IsNull)
If (dbNode.NodeType = DOMNODETYPE_ELEMENT_NODE) And _
(dbNode.NodeName = "filedata") Then
Call dbInfo.GetDbInfo(dbNode)
If dbInfo.PropertyList("DAOSEnabled")= "readwrite" Then
sumObj = sumObj + Ccur(dbInfo.PropertyList("DAOSObjects"))
sumSize = sumSize + Ccur(dbInfo.PropertyList("DAOSBytes"))
End If
End If
Set dbNode = dbNode.NextSibling
Loop

Set doc = db.CreateDocument
doc.form = "DAOS.Objects"
doc.servername = server
doc.sumObjects = Cstr(sumObj)
doc.sumSize = Cstr(sumSize)
Call doc.save (False, False )
End Sub

End Class