hbase-ruby 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,6 @@
1
+ v1.1.2 Nov 8, 2009
2
+ * A bug with the timestamps in create_row() was fixed. Also updated specs.
3
+
1
4
  v1.1.1 Nov 7, 2009
2
5
  * Improved the scanner functionality. Decided it was worth a version bump and release.
3
6
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2
data/lib/hbase/client.rb CHANGED
@@ -24,35 +24,36 @@ module HBase
24
24
  @connection.read_timeout = opts[:timeout] if opts[:timeout]
25
25
  end
26
26
 
27
- def get(path)
28
- safe_request { @connection.get(@url.path + path, {"Accept" => "application/json"}) }
27
+ def get(path, options = {})
28
+ safe_request { @connection.get(@url.path + path, {"Accept" => "application/json"}.merge(options)) }
29
29
  end
30
30
 
31
- # Needed for scanner functionality
32
- def get_response(path)
33
- safe_response { @connection.get(@url.path + path, {"Accept" => "application/json"}) }
31
+ def get_response(path, options = {})
32
+ safe_response { @connection.get(@url.path + path, {"Accept" => "application/json"}.merge(options)) }
34
33
  end
35
34
 
36
- def post(path, data = nil)
37
- safe_request { @connection.post(@url.path + path, data, {'Content-Type' => 'text/xml'}) }
35
+ def post(path, data = nil, options = {})
36
+ safe_request { @connection.post(@url.path + path, data, {'Content-Type' => 'text/xml'}.merge(options)) }
38
37
  end
39
38
 
40
- # Needed for scanner functionality
41
- def post_response(path, data = nil)
42
- safe_response { @connection.post(@url.path + path, data, {'Content-Type' => 'text/xml'}) }
39
+ def post_response(path, data = nil, options = {})
40
+ safe_response { @connection.post(@url.path + path, data, {'Content-Type' => 'text/xml'}.merge(options)) }
43
41
  end
44
42
 
45
- def delete(path)
46
- safe_request { @connection.delete(@url.path + path) }
43
+ def delete(path, options = {})
44
+ safe_request { @connection.delete(@url.path + path, options) }
47
45
  end
48
46
 
49
- # Needed for scanner functionality
50
- def delete_response(path)
51
- safe_response { @connection.delete(@url.path + path) }
47
+ def delete_response(path, options = {})
48
+ safe_response { @connection.delete(@url.path + path, options) }
52
49
  end
53
50
 
54
- def put(path, data = nil)
55
- safe_request { @connection.put(@url.path + path, data, {'Content-Type' => 'text/xml'}) }
51
+ def put(path, data = nil, options = {})
52
+ safe_request { @connection.put(@url.path + path, data, {'Content-Type' => 'text/xml'}.merge(options)) }
53
+ end
54
+
55
+ def put_response(path, data = nil, options = {})
56
+ safe_response { @connection.put(@url.path + path, data, {'Content-Type' => 'text/xml'}.merge(options)) }
56
57
  end
57
58
 
58
59
  private
@@ -3,7 +3,17 @@ module HBase
3
3
  module MetaOperation
4
4
  def list_tables
5
5
  request = Request::MetaRequest.new
6
- tables = Response::MetaResponse.new(get(request.list_tables), :list_tables).parse
6
+ Response::MetaResponse.new(get(request.list_tables), :list_tables).parse
7
+ end
8
+
9
+ def version
10
+ request = Request::MetaRequest.new
11
+ get(request.version, {"Accept" => "text/plain"}).strip
12
+ end
13
+
14
+ def cluster_version
15
+ request = Request::MetaRequest.new
16
+ get(request.cluster_version, {"Accept" => "text/plain"}).strip
7
17
  end
8
18
  end
9
19
  end
@@ -16,15 +16,17 @@ module HBase
16
16
  def show_row(table_name, name, timestamp = nil, columns = nil, options = { })
17
17
  begin
18
18
  options[:version] ||= 1
19
+
19
20
  request = Request::RowRequest.new(table_name, name, timestamp)
20
- row = Response::RowResponse.new(get(request.show(columns, options))).parse.first
21
+ row = Response::RowResponse.new(get(request.show(columns, options)), :show_row).parse.first
21
22
  row.table_name = table_name
22
23
  row.timestamp = timestamp
23
24
  row
24
25
  rescue Net::ProtocolError => e
26
+ # TODO: Use better handling instead of this.
25
27
  if e.to_s.include?("Table")
26
28
  raise TableNotFoundError, "Table '#{table_name}' Not Found"
27
- elsif e.to_s.include?("Row")
29
+ elsif e.to_s.include?("404")
28
30
  raise RowNotFoundError, "Row '#{name}' Not Found"
29
31
  end
30
32
  end
@@ -49,19 +51,21 @@ module HBase
49
51
  data.each do |d|
50
52
  escape_name = d[:name].gsub(/[&<>'"]/) { |match| Converter[match] }
51
53
  xml_data << "<Cell "
52
- xml_data << "timestamp='#{timestamp}'" if timestamp
54
+ xml_data << "timestamp='#{timestamp}' " if timestamp
53
55
  xml_data << "column='#{[escape_name].pack('m') rescue ''}'>"
54
56
  xml_data << "#{[d[:value]].pack("m") rescue ''}"
55
57
  xml_data << "</Cell>"
56
58
  end
57
59
  xml_data << "</Row></CellSet>"
58
60
 
59
- post(request.create(data.map{|col| col[:name]}), xml_data)
61
+ Response::RowResponse.new(post_response(request.create(data.map{|col| col[:name]}), xml_data), :create_row).parse
60
62
  rescue Net::ProtocolError => e
61
63
  if e.to_s.include?("Table")
62
64
  raise TableNotFoundError, "Table '#{table_name}' Not Found"
63
65
  elsif e.to_s.include?("Row")
64
66
  raise RowNotFoundError, "Row '#{name}' Not Found"
67
+ else
68
+ raise StandardError, "Error encountered while trying to create row: #{e.message}"
65
69
  end
66
70
  end
67
71
  end
@@ -69,7 +73,7 @@ module HBase
69
73
  def delete_row(table_name, name, timestamp = nil, columns = nil)
70
74
  begin
71
75
  request = Request::RowRequest.new(table_name, name, timestamp)
72
- Response::RowResponse.new(delete(request.delete(columns)))
76
+ Response::RowResponse.new(delete_response(request.delete(columns)), :delete_row).parse
73
77
  rescue Net::ProtocolError => e
74
78
  if e.to_s.include?("Table")
75
79
  raise TableNotFoundError, "Table '#{table_name}' Not Found"
@@ -12,6 +12,14 @@ module HBase
12
12
  def create_table
13
13
  @path << "/tables"
14
14
  end
15
+
16
+ def version
17
+ @path << "/version"
18
+ end
19
+
20
+ def cluster_version
21
+ @path << "/version/cluster"
22
+ end
15
23
  end
16
24
  end
17
25
  end
@@ -11,6 +11,15 @@ module HBase
11
11
  def parse
12
12
  parse_content @raw_data
13
13
  end
14
+
15
+ def verify_success(response)
16
+ case response
17
+ when Net::HTTPSuccess
18
+ true
19
+ else
20
+ false
21
+ end
22
+ end
14
23
  end
15
24
  end
16
25
  end
@@ -1,30 +1,46 @@
1
1
  module HBase
2
2
  module Response
3
3
  class RowResponse < BasicResponse
4
+ attr_reader :method
5
+
6
+ def initialize(raw_data, method)
7
+ @method = method
8
+ super(raw_data)
9
+ end
10
+
4
11
  def parse_content(raw_data)
5
- doc = JSON.parse(raw_data)
6
- rows = doc["Row"]
12
+ case @method
13
+ when :show_row
14
+ doc = JSON.parse(raw_data)
15
+ rows = doc["Row"]
7
16
 
8
- model_rows = []
9
- rows.each do |row|
10
- rname = row["key"].strip.unpack("m").first
11
- count = row["Cell"].size
12
- columns = []
17
+ model_rows = []
18
+ rows.each do |row|
19
+ rname = row["key"].strip.unpack("m").first
20
+ count = row["Cell"].size
21
+ columns = []
13
22
 
14
- row["Cell"].each do |col|
15
- name = col["column"].strip.unpack('m').first
16
- value = col["$"].strip.unpack('m').first rescue nil
17
- timestamp = col["timestamp"].to_i
23
+ row["Cell"].each do |col|
24
+ name = col["column"].strip.unpack('m').first
25
+ value = col["$"].strip.unpack('m').first rescue nil
26
+ timestamp = col["timestamp"].to_i
18
27
 
19
- columns << HBase::Model::Column.new( :name => name,
20
- :value => value,
21
- :timestamp => timestamp)
28
+ columns << HBase::Model::Column.new( :name => name,
29
+ :value => value,
30
+ :timestamp => timestamp)
31
+ end
32
+
33
+ model_rows << HBase::Model::Row.new(:name => rname, :total_count => count, :columns => columns)
22
34
  end
23
35
 
24
- model_rows << HBase::Model::Row.new(:name => rname, :total_count => count, :columns => columns)
36
+ model_rows
37
+ when :create_row
38
+ verify_success(raw_data)
39
+ when :delete_row
40
+ verify_success(raw_data)
41
+ else
42
+ puts "method '#{@method}' not supported yet"
25
43
  end
26
-
27
- model_rows
28
44
  end
29
45
  end
30
46
  end
@@ -24,7 +24,7 @@ module HBase
24
24
  when :get_rows
25
25
  # Dispatch it to RowResponse, since that method is made
26
26
  # to deal with rows already.
27
- RowResponse.new(raw_data).parse
27
+ RowResponse.new(raw_data, :show_row).parse
28
28
  when :close_scanner
29
29
  case raw_data
30
30
  when Net::HTTPOK
@@ -8,12 +8,29 @@ describe HBase::Operation::RowOperation do
8
8
  table = @client.create_table("test-hbase-ruby", "col1")
9
9
  end
10
10
 
11
- it "should create two rows called 'row1'" do
11
+ it "should create a row called 'row1'" do
12
12
  lambda {
13
- row2 = @client.create_row("test-hbase-ruby", "row1", nil, { :name => "col1:", :value => "row1-col1" })
13
+ @client.create_row("test-hbase-ruby", "row1", nil, { :name => "col1:", :value => "row1-col1" }).should be_true
14
14
  }.should_not raise_error
15
15
  end
16
16
 
17
+ it "should create a row named 'row2' with timestamp value" do
18
+ timestamp = (Time.now - (5*60)).to_i
19
+ lambda {
20
+ @client.create_row("test-hbase-ruby", "row2", timestamp, { :name => "col1:cell1", :value => "row2-col1-cell1" }).should be_true
21
+ }.should_not raise_error
22
+
23
+ row = @client.show_row("test-hbase-ruby", "row2")
24
+ row.should be_a_kind_of(HBase::Model::Row)
25
+ row.name.should == "row2"
26
+
27
+ columns = row.columns
28
+ columns.size.should == 1
29
+ columns.first.name.should == "col1:cell1"
30
+ columns.first.value.should == "row2-col1-cell1"
31
+ columns.first.timestamp.should == timestamp
32
+ end
33
+
17
34
  it "should show the rows 'row1'" do
18
35
  row = @client.show_row("test-hbase-ruby", "row1")
19
36
  row.should.is_a? HBase::Model::Row
@@ -29,8 +46,12 @@ describe HBase::Operation::RowOperation do
29
46
 
30
47
  it "should delete the rows 'row1'" do
31
48
  lambda {
32
- row1 = @client.delete_row('test-hbase-ruby', 'row1')
49
+ row1 = @client.delete_row('test-hbase-ruby', 'row1').should be_true
33
50
  }.should_not raise_error
51
+
52
+ lambda {
53
+ row_verify = @client.show_row('test-hbase-ruby', 'row1')
54
+ }.should raise_error
34
55
  end
35
56
 
36
57
  after :all do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hbase-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ye Dingding
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-11-07 00:00:00 -05:00
13
+ date: 2009-11-08 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency