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