読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

CouchDBにRubyでアクセスしてみる

Ruby CouchDB

RubyCouchDBにアクセスし、データの登録や取得を行うサンプルです。

require 'rubygems'
require 'httpclient'
require 'json/lexer'

# CouchDBクライアント
module CouchDB
  class Client
    def initialize(host, proxy=ENV["http_proxy"])
      @host = host
      @client = HTTPClient.new( proxy, "http client." )
    end
    def delete(uri, value=nil)
      request( :delete, uri, value.to_json)
    end
    def get(uri)
      request( :get, uri)
    end
    def head(uri)
      begin
        request( :head, uri)
        return true
      rescue
        return false if $!.to_s =~/^404/
        raise $!
      end
    end
    def put(uri, value)
      request( :put, uri, value.to_json)
    end
    def post(uri, value)
      request( :put, uri, value.to_json)
    end
    def request(method,uri,body=nil)
      res = @client.request( method, "#{@host}/#{uri}",
        body ? {"content-type"=>"application/json"} : nil, body)
      error( res, method, uri, body ) if res.status >= 400
      JSON::Lexer.new(res.content).nextvalue if res.content rescue nil
    end
  private
    def error( res, method, uri, body )
      message = ""
      if res.content
        parsed = JSON::Lexer.new(res.content).nextvalue
        message = "#{parsed["error"]} : #{parsed["reason"]}" if parsed
      end
      raise "#{res.status} : #{method} #{uri} #{message} \n#{body}"
    end
  end
end

# データベースに接続
c = CouchDB::Client.new("<接続先ホスト 例 http://foo.com:5984>")
# バージョン情報の取得
p c.get("")

# データベース「kittens」の作成。
p c.put("/kittens/", "")

# データの登録
p c.put("/kittens/mii", {"name"=>"mii","age"=>1})
p c.put("/kittens/tora", {"name"=>"tora","age"=>0})
p c.put("/kittens/shiro", {"name"=>"shiro","age"=>2})

# データの取得
p c.get("/kittens/mii")
p c.get("/kittens/tora")
p c.get("/kittens/shiro")
p c.get("/kittens")

# データの存在確認
p c.head("/kittens/mii")
p c.head("/kittens/tora")
p c.head("/kittens/shiro")
p c.head("/kittens")
p c.head("/kittens/not_found")

# データベースの削除
p c.delete("/kittens/")

実行結果です。

{"couchdb"=>"Welcome", "version"=>"0.8.0-incubating"}
{"ok"=>true}
{"rev"=>"596249955", "id"=>"mii", "ok"=>true}
{"rev"=>"1956080563", "id"=>"tora", "ok"=>true}
{"rev"=>"628025366", "id"=>"shiro", "ok"=>true}
{"name"=>"mii", "_rev"=>"596249955", "_id"=>"mii", "age"=>1}
{"name"=>"tora", "_rev"=>"1956080563", "_id"=>"tora", "age"=>0}
{"name"=>"shiro", "_rev"=>"628025366", "_id"=>"shiro", "age"=>2}
{"update_seq"=>3, "doc_count"=>3, "disk_size"=>14772, "compact_running"=>false, "db_name"=>"kittens", "doc_del_count"=>0}
true
true
true
true
false
{"ok"=>true}

さくっと使えますねー。かっちょいい。