tokyo_cabinet4r icon indicating copy to clipboard operation
tokyo_cabinet4r copied to clipboard

Rails plugin to allow easy use of tokyo cabinet within rails.

UPDATE: PLANNED REWORK plans: to totally gut and start again looking at

  • Miyazaki-resistance
  • making the interfacing with rufus-tokyo much more transparent (using factory-like approach)
  • looking at implementing ActionModel for Rails 3 (needs work, anyway)

Tokyo-cabinet4r

Tokyo cabinet hash plugin for Rails. Subclassing TokyoCabinet4r allows the easy creation and usage of some Tokyo Cabinet functionalities.

  • Tokyo Cabinet B+ tree (http://en.wikipedia.org/wiki/B%2B_tree)
  • Tokyo Cabinet table database API (freely structured documents, like other key-value stores) (see http://tokyocabinet.sourceforge.net/index.html for more, but not implemented yet)

Install

Prerequisites: Install Tokyo Cabinet (source available at http://tokyocabinet.sourceforge.net/index.html). UPDATE: this seems to be available as a gem on github: sudo gem install tokyocabinet-ruby

Install rufus-tokyo (github http://github.com/jmettraux/rufus-tokyo/tree/master) sudo gem install rufus-tokyo

install as a plugin for Rails. Tested with Rails 2.3.2 tested with Ruby 1.8.6 en 1.9.1p129

Example

Btree:

use generator script/generate tc_bdb phone_number

Usage: new key-value janes = PhoneNumber.new("jane","+32444888333")

retrieve janes = PhoneNumber.get("jane")

on the instance, to update: janes.update("+223222333444")

delete janes.delete PhoneNumber.delete("jane")

delete the whole table PhoneNumber.drop

Table in these examples is stored in RAILS_ROOT/db/tokyo/RAILS_ENV/phone_number.tcb

Table:

use generator script/generate tc_tdb shortest_path

Usage: john = Description.new({"hair" => "black", "size" => "tall"})

retrieve john = Description.get("john")

on the instance, to update the whole record: john.update({"hair" => "red", "eyes" => "squinty"})

add or update one value: john.add_data("eyes","blue") # record now {"hair" => "red", "eyes" => "blue"} john.add_data("shoe_size","42") # record now {"hair" => "red","eyes" => "blue", "shoe_size" => "42"}

delete the record john.delete Description.delete("john")

delete table Description.drop

Table in these examples is stored in RAILS_ROOT/db/tokyo/RAILS_ENV/description.tct

Todo

  • more elegant handling of opening and closing of file, without resorting to too much metaprogramming.
  • add get_by_* name for the tables, similarly to find_by - use queries
  • getters and setters for attributes of tables ?
  • investigate use of Tokyo Tyrant.
  • transactions
  • cursors
  • implement other tokyo database structures (if demand)
  • explore and add extra features of the Tokyo Cabinet tables and hashes

Changes:

now using rufus-tokyo (http://github.com/jmettraux/rufus-tokyo/tree/master) to allow compatibility with several Ruby implementations (thanks jmettraux !)

Copyright (c) 2009 [Elise Huard], released under the MIT license Made in Belgium ;)