Sha256: d5a64e29c8e5c7433cf1b293db1e0375a6393c459c7d52f40f09c14fcf00efb1

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

module CouchRest
  class Streamer

    attr_accessor :default_curl_opts

    def initialize
      self.default_curl_opts = "--silent --no-buffer --tcp-nodelay -H \"Content-Type: application/json\""
    end

    def view(*args)
      raise "CouchRest::Streamer#view is depricated. Please use Database#view with block."
    end

    def get(url, &block)
      open_pipe("curl #{default_curl_opts} \"#{url}\"", &block)
    end

    def post(url, params = {}, &block)
      open_pipe("curl #{default_curl_opts} -d \"#{escape_quotes(MultiJson.encode(params))}\" \"#{url}\"", &block)
    end

    protected

    def escape_quotes(data)
      data.gsub(/"/, '\"')
    end

    def open_pipe(cmd, &block)
      first = nil
      prev = nil
      IO.popen(cmd) do |f|
        first = f.gets # discard header
        while line = f.gets 
          row = parse_line(line)
          block.call row unless row.nil? # last line "}]" discarded
          prev = line
        end
      end

      raise RestClient::ServerBrokeConnection if $? && $?.exitstatus != 0

      parse_first(first, prev)
    end

    def parse_line line
      return nil unless line
      if /(\{.*\}),?/.match(line.chomp)
        MultiJson.decode($1)
      end
    end

    def parse_first first, last
      return nil unless first
      header = MultiJson.decode(last ? first + last : first)
      header.delete("rows")
      header
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
couchrest-1.1.3 lib/couchrest/helper/streamer.rb