zoukankan      html  css  js  c++  java
  • Get DAOS ObjectCount and Size with LotusScript

    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
  • 相关阅读:
    C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)
    Linux/Centos下安装部署phantomjs
    SQLEXPR_x64_CHS、SQLEXPRADV_x64_CHS、SQLEXPRWT_x64_CHS、SqlLocalDB、SQLManagementStudio_x64_CHS各版本说明
    linux安装phantomjs,-bash: /usr/local/bin/phantomjs: is a directory解决方案
    [转]EAS BOS MsgBox使用大全
    SQL 2005用Windows身份验证登陆18456错误
    [原]EAS动态扩展平台(DEP)服务端调用oracle存储过程
    Uuid, BOSObjectType, BosUUid 区别
    [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
    [转]如何拷贝一个 SQL Server 的表
  • 原文地址:https://www.cnblogs.com/hannover/p/2467136.html
Copyright © 2011-2022 走看看