diff --git a/lib/couchrest.rb b/lib/couchrest.rb index 899e117..b827441 100644 --- a/lib/couchrest.rb +++ b/lib/couchrest.rb @@ -6,5 +6,6 @@ require File.dirname(__FILE__) + '/couch_rest' require File.dirname(__FILE__) + '/database' require File.dirname(__FILE__) + '/pager' require File.dirname(__FILE__) + '/file_manager' +require File.dirname(__FILE__) + '/streamer' diff --git a/lib/database.rb b/lib/database.rb index bb7bfbc..73397f6 100644 --- a/lib/database.rb +++ b/lib/database.rb @@ -3,7 +3,8 @@ require "base64" class CouchRest class Database - attr_accessor :server, :host, :name + attr_reader :server, :host, :name, :root + def initialize server, name @name = name @server = server diff --git a/lib/streamer.rb b/lib/streamer.rb new file mode 100644 index 0000000..c9133ee --- /dev/null +++ b/lib/streamer.rb @@ -0,0 +1,29 @@ +class CouchRest + class Streamer + attr_accessor :db + def initialize db + @db = db + end + + def view name, params = nil + urlst = /^_/.match(name) ? "#{@db.root}/#{name}" : "#{@db.root}/_view/#{name}" + url = CouchRest.paramify_url urlst, params + IO.popen("curl --silent #{url}") do |view| + view.gets # discard header + while row = parse_line(view.gets) + yield row + end + end + end + + private + + def parse_line line + return nil unless line + if /(\{.*\}),?/.match(line.chomp) + JSON.parse($1) + end + end + + end +end \ No newline at end of file diff --git a/spec/streamer_spec.rb b/spec/streamer_spec.rb new file mode 100644 index 0000000..da0b5f0 --- /dev/null +++ b/spec/streamer_spec.rb @@ -0,0 +1,23 @@ +require File.dirname(__FILE__) + '/spec_helper' + +describe CouchRest::Streamer do + before(:all) do + @cr = CouchRest.new(COUCHHOST) + @db = @cr.database(TESTDB) + @db.delete! rescue nil + @db = @cr.create_db(TESTDB) rescue nil + @streamer = CouchRest::Streamer.new(@db) + @docs = (1..1000).collect{|i| {:integer => i, :string => i.to_s}} + @db.bulk_save(@docs) + end + + it "should yield each row in a view" do + count = 0 + sum = 0 + @streamer.view("_all_docs") do |row| + count += 1 + end + count.should == 1000 + end + +end \ No newline at end of file