A Mini-Vacation With Ruby and the Domino Data Service
Sat Mar 02 17:52:16 EST 2013
Since I've been neck-deep in LotusScript and Java for the past couple weeks, I decided to take a bit of a sanity break today and play around with Ruby. Specifically, I wrote a skeletal wrapper for the Domino Data Service in the ExtLib and the first steps of a Rails app using it a bit. I don't expect this to actually be useful down the line, or even necessarily to get any more work put into it, but it was a fun diversion.
The API takes the same general shape as the normal Domino API, except you start with a database, which can take connection and credential parameters (though the credentials don't actually work for some reason). So to access the testing database I created, I do this:
db = DHTTP::Database.new( :server => "api.frostillic.us", :path => "tests/http.nsf" )
In the Database class, I implemented a way to get all views or to get a view by name, while views let you get entries, which in turn contain their values and a way to get documents, which provide the usual item access. For example:
db.views.each do |view| puts "Found view: #{view.title}" end view = db.get_view("TestView") view.entries.each do |entry| puts "Column values: #{entry.column_values}" puts "Doc body: #{entry.document.Body}" end
It's not particularly amazing, nor is it particularly efficient, but it does the job: it supports the service's paging for view entries and converts Date/Times to Ruby Times for document fields, so it could be used for light read-only use.
Then I set up an extremely bare-bones Rails app that uses the objects in the most direct and ugly way possible, but, again, it works:
class TesterController < ApplicationController def index db = DHTTP::Database.new( :server => "api.frostillic.us", :path => "tests/http.nsf" ) @views = db.views end def view @title = params[:title] db = DHTTP::Database.new(:server => "api.frostillic.us", :path => "tests/http.nsf") @view = db.get_view(@title) end end
The two pages just spit out lists of either the views or the view entries:
<ul> <% @views.each do |view| %> <li><%= link_to(view.title, :action => 'view', :title => view.title) %></li> <% end %> </ul>
...and...
<ul> <% @view.entries.each do |entry| %> <li><%= entry.column_values.inspect %></li> <% end %> </ul>
I think the Domino REST API could be really useful. When I looked into it a while ago, I ran into trouble wherein the view entry counts didn't reflect entries hidden via reader fields, which is probably still the case, but other than that I imagine it could be put to real use. It brings it more in line with the other modern NoSQL databases, which generally use HTTP/JSON-based APIs as well. Combine that with Apache for load balancing and failover and suddenly you have a really compelling modern database back-end for other platforms.
If you're interested in looking at the code, I tossed the API up on GitHub: https://github.com/jesse-gallagher/Domino-HTTP-API-for-Ruby