You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by Apache Wiki <wi...@apache.org> on 2008/11/02 00:49:17 UTC
[Couchdb Wiki] Update of "Getting started with LotusScript" by MartinCzura
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for change notification.
The following page has been changed by MartinCzura:
http://wiki.apache.org/couchdb/Getting_started_with_LotusScript
The comment on the change is:
page creation
New page:
## page was renamed from Getting Started With LotusScript
## page was renamed from GettingStartedLotusScript
Getting started with !LotusScript and the CouchDB API.
This is an example of wrapper classes that use LS2J to send requests to a CouchDB server from !LotusScript. This could be useful to move data between Domino databases and CouchDB databases. The !LotusScript code roughly tracks the structure of the Ruby code.
== Basic API ==
{{{
Option Public
Uselsx "*javacon"
}}}
{{{
Sub Initialize
%REM
LotusScript LS2J classes for CouchDb
Copyright (C) 2006 Alan Bell - Dominux Consulting
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%ENDREM
'right now this just implements the basic database operations
'feel free to fix bugs and add functionailty to it in the Wiki
'there is a total lack of releasing of objects right now so it will leak memory like a sieve
'error handling would be nice too.
Dim cserver As couchserver
Set cserver=New couchserver("http://localhost","5984","")
'create a database
Call cserver.put("/ls2couch/","")
'create a document
Call cserver.put("/ls2couch/document_id", |{"type":"comment","body":"First Post!"}|)
'retrieve the document
Print cserver.cget("/ls2couch/document_id")
'delete the database
Call cserver.del("/ls2couch/")
End Sub
}}}
{{{
Class couchserver
Private host As String
Private port As String
Private options As String
Private proxyserver As String
Private proxyport As String
Private jses As JAVASESSION
Private jclass As JAVACLASS
Private jurl As JAVAOBJECT
Private jcon As JAVAOBJECT
Sub new(host As String,port As String,options As String)
'this corresponds to the initialise method in the Ruby classes
Me.host=host
Me.port=port
Me.options=options
Set Me.jses=New JAVASESSION()
End Sub
Sub setproxy(proxyserver As String,proxyport As String)
'this should do something. At the moment it does not.
Me.proxyserver=proxyserver
Me.proxyport=proxyport
End Sub
Sub del(uri As String)
'this corresponds to the delete method in the Ruby classes
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("DELETE")
Call Me.jcon.connect()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
Function cget(uri As String) As String
'this corresponds to the get class in Ruby. "get" is a reserved word
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("GET")
Call Me.jcon.connect()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Set Me.jclass=jses.GetClass("java/io/InputStreamReader")
Set ireader=Me.jclass.CreateObject("(Ljava/io/InputStream;)V",ist)
Set Me.jclass=jses.GetClass("java/io/BufferedReader")
Set bReader=Me.jclass.CreateObject("(Ljava/io/Reader;)V",ireader)
cget=bReader.readLine()
Call ist.close()
End Function
Sub put (uri As String,xml As String)
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("PUT")
Me.jcon.setdooutput(True)
Call Me.jcon.connect()
Set ost=jcon.getOutputStream()
Set Me.jclass=jses.GetClass("java/io/OutputStreamWriter")
Set owriter=Me.jclass.CreateObject("(Ljava/io/OutputStream;)V",ost)
Call owriter.write(xml,0,Len(xml))
Call owriter.flush()
Call ost.write(32)
Call ost.flush()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
Sub post(uri As String,xml As String)
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("PUT")
Me.jcon.setdooutput(True)
Call Me.jcon.connect()
Set ost=jcon.getOutputStream()
Call ost.write(32)
Call ost.flush()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
End Class
}}}
== Advanced API ==
This !LotusScript API for couch is designed to be familiar to !LotusScript developers. It wraps up all the communication with the CouchDB server, all the JSON code and looks quite a lot like dealing with documents in a domino database. This is very much a work in progress.
To copy a Notes database to a CouchDB database you might use the following code in an agent:
{{{
Sub Initialize
Dim doc As couchdoc
Dim ses As New NotesSession
Dim db As notesdatabase
Set db=ses.currentdatabase
Dim cserver As couchserver
Set cserver=New couchserver("http://localhost","5984","") 'replace with your server location
Set cdb=New couchdb(db.name,cserver)
If Not cdb.exists Then
cdb.create
End If
Dim ndoc As NotesDocument
Dim dbdocs As notesdocumentcollection
Set dbdocs=db.alldocuments
Set ndoc=dbdocs.GetFirstDocument
While Not ndoc Is Nothing
Set doc=cdb.createdocument(ndoc.UniversalID)
Forall i In ndoc.Items
Call doc.additem(i.name,i.text)
End Forall
doc.save
Set ndoc=dbdocs.GetNextDocument(ndoc)
Wend
End Sub
}}}
Copy the code below into the declarations section of the agent:
{{{
Class couchserver
Private host As String
Private port As String
Private options As String
Private proxyserver As String
Private proxyport As String
Private jses As JAVASESSION
Private jclass As JAVACLASS
Private jurl As JAVAOBJECT
Private jcon As JAVAOBJECT
Sub new(host As String,port As String,options As String)
'this corresponds to the initialise method in the Ruby classes
'basically creates a new connection to the server
Me.host=host
Me.port=port
Me.options=options
Set Me.jses=New JAVASESSION()
End Sub
Sub setproxy(proxyserver As String,proxyport As String)
'this should do something. At the moment it does not.
Me.proxyserver=proxyserver
Me.proxyport=proxyport
End Sub
Sub del(uri As String)
'this corresponds to the delete method in the Ruby classes
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("DELETE")
Call Me.jcon.connect()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
Function cget(uri As String) As String
'this corresponds to the get class in Ruby. "get" is a reserved word
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("GET")
Call Me.jcon.connect()
On Error Resume Next
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Set Me.jclass=jses.GetClass("java/io/InputStreamReader")
Set ireader=Me.jclass.CreateObject("(Ljava/io/InputStream;)V",ist)
Set Me.jclass=jses.GetClass("java/io/BufferedReader")
Set bReader=Me.jclass.CreateObject("(Ljava/io/Reader;)V",ireader)
cget=bReader.readLine()
Call ist.close()
End Function
Sub put (uri As String,xml As String)
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMethod("PUT")
Me.jcon.setdooutput(True)
Call Me.jcon.connect()
Set ost=jcon.getOutputStream()
Set Me.jclass=jses.GetClass("java/io/OutputStreamWriter")
'Set owriter=Me.jclass.CreateObject("(Ljava/io/OutputStream;)V",ost)
Set owriter=Me.jclass.CreateObject("(Ljava/io/OutputStream;Ljava/lang/String;)V",ost,"UTF-8")
Call owriter.write(xml,0,Len(xml))
Call owriter.flush()
Call ost.write(32)
Call ost.flush()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
Sub post(uri As String,xml As String)
Set Me.jclass=jses.GetClass("java/net/URL")
Set Me.jurl=Me.jclass.CreateObject("(Ljava/lang/String;)V",host+":"+port+uri)
Set jcon=jurl.openConnection()
Me.jcon.setRequestMet7hod("PUT")
Me.jcon.setdooutput(True)
Call Me.jcon.connect()
Set ost=jcon.getOutputStream()
Call ost.write(32)
Call ost.flush()
Set ist=jcon.getInputStream()'oddly enough java doesn't do anything with a URL until you read from it.
Call ist.close()
End Sub
End Class
}}}
{{{
Class couchdb
'this represents a database on the couchdb server
Public parentserver As couchserver
Public name As String
Sub new(dbname As String,server As couchserver)
Me.name=dbname
Set Me.parentserver=server
'well this does not create a new database, just initialises the class and connects it to a database
'the database might not exist
End Sub
Function exists As Boolean
'tests to see if the parent server already contains a database with this name
exists= (""<>parentserver.cget("/"+Me.name+"/"))
End Function
Sub create
Call parentserver.put("/"+Me.name+"/","")
End Sub
Function createdocument(id As String) As couchdoc
'this does not create a document on the couchdb server until the document is saved
'it might check to see if id has already been used and return that document
'it might create an ID of some kind if one is not provided
Set createdocument=New couchdoc(Me,id)
End Function
End Class
}}}
{{{
Class couchitem
Public parentdoc As couchdoc
'represents one field on a couchdb document
Public value As Variant
'does an item know it's own name? not sure.
Sub new(value As Variant)
Me.value=value
End Sub
Function json As String
json=|"|+Replace(Me.value,|"|,|\"|)+|"|'escaping out double quotes
End Function
End Class
}}}