Search code examples
ruby-on-railsdatabase-connectionreportinglotus-noteslotus-domino

Extracting (live) data out of IBM Domino database into rails application


I have some Lotus Domino databases (the ones behind IBM Notes) where my data is stored. In my rails application I want to analyze the data to make live reports.

My first thought was to export the data with the help of an agent in Notes, but it seems so inefficient and won't help if I want to make reports live.

Does anyone have any experience with reporting out of Domino databases and/or has any idea on how i could get (in the near of) what i need?


Solution

  • You could use the Domino Access Services as Pe Henrik says. Youl could also write your own API/function that will return the requested data as JSON (or JSONP if on different servers). I have blooged about it here: http://blog.texasswede.com/calling-a-notes-web-agent-from-another-server-using-jsonp/ I also have two presentations that covers this subject: http://blog.texasswede.com/mwlug-2015/ and http://blog.texasswede.com/my-connect-2016-presentation-demo-database/ There is also sample code at those links.

    But it is not hard to create a Lotusscript agent that serve up data to external web application like that.

    Here is my Lotusscript class that will help you return JSON:

    %REM
        Library Class.JSON by Karl-Henry Martinsson
        Created Oct 9, 2014 - Initial version
        Updated Nov 6, 2015 - Added JSONP support
        Description: Class to generate simple JSON from values
    %END REM
    
    Option Public
    Option Declare
    
    Class JSONdata
        Private p_json List As String
    
        Public Sub New()
            '*** Set default value(s)
            me.p_json("ajaxstatus") = ""
        End Sub
    
        %REM
            Property Set success
            Description: Set success to true or false
        %END REM
        Public Property Set success As Boolean
            If me.success Then 
                Call me.SetValue("ajaxstatus","success")
            Else
                Call me.SetValue("ajaxstatus","error")
            End If
        End Property
    
        %REM
            Property Get success
            Description: Not really used...
        %END REM
        Public Property Get success As Boolean
            If me.p_json("ajaxstatus") = |"success"| Then
                me.success = True
            Else
                me.success = False
            End If
        End Property
    
        %REM
            Sub SetMsg
            Description: Set msg item
        %END REM
        Public Sub SetMsg(message As String)
            Call me.SetValue("msg",message)
        End Sub
    
        Public Sub SetErrorMsg(message As String)
            Call me.SetValue("errormsg",message)
            me.success = False
        End Sub
    
        Public Sub SetValue(itemname As String, value As String)
            Dim tmp As String
            Dim delimiter As String
            '*** Check for quote (double and single) and fix value if needed
            tmp = Replace(value,Chr$(13),"<br>")
            tmp = FullTrim(Replace(tmp,Chr$(10),""))
            If InStr(tmp,|"|)>0 Then
                If InStr(tmp,|'|)>0 Then
                    tmp = Replace(tmp,|"|,|"|)
                    delimiter = |"|
                Else
                    delimiter = |'|
                End If
            Else
                delimiter = |"|
            End If
            '*** Store value with delimiter in list
            me.p_json(itemname) = delimiter & tmp & delimiter
        End Sub
    
        Public Sub SetData(itemname As String, value As String)
            '*** Store value in list
            me.p_json(itemname) = value
        End Sub
    
        %REM
            Function GetJSON
            Description: Return a JSON object as text
        %END REM
        Function GetJSON As String
            Dim json As String
            '*** Opening curly braces + CR
            json = "{" + Chr$(13)
            '*** Loop through all list elements and build JSON
            ForAll j In me.p_json
                json = json + |"| + ListTag(j) + |":| + j + "," + Chr$(13)
            End ForAll
            '*** Remove the comma after the last item
            json = Left$(json,Len(json)-2) + Chr$(13)
            '*** Add closing curly bracket and return JSON
            json = json + "}"
            GetJSON = json 
        End Function
    
        %REM
            Sub SendToBrowser
            Description: Print JSON to browser, with correct MIME type
        %END REM
        Public Sub SendToBrowser()
            '*** MIME Header to tell browser what kind of data we will return (JSON).
            '*** See http://www.ietf.org/rfc/rfc4627.txt
            Print "content-type: application/json"
            Print me.GetJSON
        End Sub
    
        %REM
            Sub SendJSONPToBrowser
            Description: Print JSONP to browser, with correct MIME type
        %END REM
        Public Sub SendJSONPToBrowser(callbackFunction As String)
            '*** MIME Header to tell browser what kind of data we will return (Javascript).
            '*** See http://www.rfc-editor.org/rfc/rfc4329.txt
            Print "content-type: application/javascript"
            Print callbackFunction + "(" + me.GetJSON + ")"
        End Sub
    
    End Class