Ruby Object Database
The Ruby Object Database is not really to be database per se, but rather a set
of components that work with each other to allow data to be stored, retrieved,
and modified in a way that makes sense for each datatype. I'm writing this to
allow rich datatypes (weblogs, diaries, contact lists, etc.) to be dealt with
within the framework of a persistent, permission-validated community structure.
Once the strucure is in place (along with its setting and getting calls), the
datatypes that are added to it can be accessed and dealt with in a predictable
and safe way.
The goals of the Ruby Object Database project currently are:
- Provide an object datastore accessible over a network
- Make sure that database maintains the state of its objects
- Make sure the data store does not use too much RAM.
- Make access control hierarchies a core part of the datastore.
- Make the datastore available from any language using existing standards.
The datastore mentioned in item 1 is a ruby version of Object Prevalence, which
is an object system in-memory whose state is preserved by journalling changes
to the object set to file. When the datastore is shut down then restarted its
state is brought up-to-date by processing the log file (item 2). The goal of
the in-memory datastore is to maintain state, not to try to put all data in
memory (item 3). Therefore, a mechanism for using disk-based storage will be
set up, probably using the Berkeley database, which is fast and small. This will
allow for data important for an object but not vital to the interconnection between
objects to be sent to disk storeage. Item 4 will be adhered to by setting up
each object to be associated with node objects, each of which has its own set
of access controls. The fifth goal will be done using an XML-RPC gateway (Soap
is easy enough as well). The trick to the remote procedure calling protocols
is that they're just stubs allowing the data to be accessed in a safe way. A
sample XML-RPC call in Ruby might look like this:
require 'xmlrpc/client'
server, mount, port = 'localhost', '/RPC2', 80
username, pword = "imarsman", "secret"
args = ["person","get_name", username, password]
begin
s = XMLRPC::Client.new(server, mount, port)
res = s.call("call",*args)
puts "fname: #{res['fname']} lname: #{res['lname']}"
rescue XMLRPC::FaultException
puts "Error"
rescue TimeoutError
puts "Timeout Error"
end
Here's the hierarchy for the system:
----------------
| XML-RPC Client | - From any language (PHP, Java, .Net, Perl...)
----------------
|
---------------- _
| XML-RPC Server | |
---------------- |
| |- running from Apache using mod_ruby
-------------- |
| dRuby Client | |
-------------- -
|
-------------- -------------- _
| dRuby Server |--| in-memory db | |
-------------- -------------- |
| |- In separate process
------------- |
| Berkeley DB | |
------------- -
Status
I have assembled a list of
Components
Ruby
workflow classes (Torrent)
mod_ruby
xml parser (nqxml)
xml-rpc server/client
Distributed Ruby (dRuby) classes
Object Prevalence classes (mnemonic)
Todo
- todo
- [X] assemble components
- [X] Ruby
- [X] workflow classes (Torrent)
- http://www.jhorman.org/Torrent/
- [X] mod_ruby
- [X] xml parser
- http://nqxml.sourceforge.net/
- [X] xml-rpc server/client
- http://www.fantasy-coders.de/ruby/xmlrpc4r/
- [X] Distributed Ruby (dRuby) classes
- http://www2a.biglobe.ne.jp/~seki/ruby/druby.html
- [X] Object Prevalence classes (mnemonic)
- http://www.papermountain.org/twiki/bin/view/Stuff/MnemonicHome
- [X] install components
- [ ] get component toolchain working
- [ ] XML-RPC client
- [ ] mod_ruby with Apache
- [ ] dRuby server with Object Prevalence