cql-rb 1.2.2 → 2.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +4 -0
  3. data/README.md +139 -17
  4. data/lib/cql/client.rb +237 -8
  5. data/lib/cql/client/asynchronous_client.rb +138 -54
  6. data/lib/cql/client/asynchronous_prepared_statement.rb +41 -6
  7. data/lib/cql/client/authenticators.rb +46 -0
  8. data/lib/cql/client/batch.rb +115 -0
  9. data/lib/cql/client/connector.rb +255 -0
  10. data/lib/cql/client/execute_options_decoder.rb +25 -9
  11. data/lib/cql/client/keyspace_changer.rb +5 -5
  12. data/lib/cql/client/peer_discovery.rb +33 -0
  13. data/lib/cql/client/query_result.rb +124 -1
  14. data/lib/cql/client/request_runner.rb +4 -2
  15. data/lib/cql/client/synchronous_client.rb +14 -2
  16. data/lib/cql/client/synchronous_prepared_statement.rb +19 -1
  17. data/lib/cql/future.rb +97 -50
  18. data/lib/cql/io/connection.rb +0 -1
  19. data/lib/cql/io/io_reactor.rb +1 -1
  20. data/lib/cql/protocol.rb +8 -1
  21. data/lib/cql/protocol/cql_protocol_handler.rb +2 -2
  22. data/lib/cql/protocol/decoding.rb +10 -15
  23. data/lib/cql/protocol/frame_decoder.rb +2 -1
  24. data/lib/cql/protocol/frame_encoder.rb +5 -4
  25. data/lib/cql/protocol/requests/auth_response_request.rb +31 -0
  26. data/lib/cql/protocol/requests/batch_request.rb +59 -0
  27. data/lib/cql/protocol/requests/credentials_request.rb +1 -1
  28. data/lib/cql/protocol/requests/execute_request.rb +45 -17
  29. data/lib/cql/protocol/requests/options_request.rb +1 -1
  30. data/lib/cql/protocol/requests/prepare_request.rb +1 -1
  31. data/lib/cql/protocol/requests/query_request.rb +97 -5
  32. data/lib/cql/protocol/requests/register_request.rb +1 -1
  33. data/lib/cql/protocol/requests/startup_request.rb +4 -4
  34. data/lib/cql/protocol/response.rb +2 -2
  35. data/lib/cql/protocol/responses/auth_challenge_response.rb +25 -0
  36. data/lib/cql/protocol/responses/auth_success_response.rb +25 -0
  37. data/lib/cql/protocol/responses/authenticate_response.rb +1 -1
  38. data/lib/cql/protocol/responses/detailed_error_response.rb +1 -1
  39. data/lib/cql/protocol/responses/error_response.rb +3 -2
  40. data/lib/cql/protocol/responses/event_response.rb +3 -2
  41. data/lib/cql/protocol/responses/prepared_result_response.rb +10 -6
  42. data/lib/cql/protocol/responses/raw_rows_result_response.rb +27 -0
  43. data/lib/cql/protocol/responses/ready_response.rb +1 -1
  44. data/lib/cql/protocol/responses/result_response.rb +2 -2
  45. data/lib/cql/protocol/responses/rows_result_response.rb +43 -23
  46. data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
  47. data/lib/cql/protocol/responses/schema_change_result_response.rb +1 -1
  48. data/lib/cql/protocol/responses/set_keyspace_result_response.rb +1 -1
  49. data/lib/cql/protocol/responses/status_change_event_response.rb +1 -1
  50. data/lib/cql/protocol/responses/supported_response.rb +1 -1
  51. data/lib/cql/protocol/responses/void_result_response.rb +1 -1
  52. data/lib/cql/protocol/type_converter.rb +2 -2
  53. data/lib/cql/uuid.rb +2 -2
  54. data/lib/cql/version.rb +1 -1
  55. data/spec/cql/client/asynchronous_client_spec.rb +493 -50
  56. data/spec/cql/client/asynchronous_prepared_statement_spec.rb +193 -11
  57. data/spec/cql/client/authenticators_spec.rb +56 -0
  58. data/spec/cql/client/batch_spec.rb +277 -0
  59. data/spec/cql/client/connector_spec.rb +606 -0
  60. data/spec/cql/client/execute_options_decoder_spec.rb +95 -0
  61. data/spec/cql/client/keyspace_changer_spec.rb +8 -8
  62. data/spec/cql/client/peer_discovery_spec.rb +92 -0
  63. data/spec/cql/client/query_result_spec.rb +352 -0
  64. data/spec/cql/client/request_runner_spec.rb +31 -5
  65. data/spec/cql/client/synchronous_client_spec.rb +44 -1
  66. data/spec/cql/client/synchronous_prepared_statement_spec.rb +63 -1
  67. data/spec/cql/future_spec.rb +50 -2
  68. data/spec/cql/protocol/cql_protocol_handler_spec.rb +16 -5
  69. data/spec/cql/protocol/decoding_spec.rb +16 -6
  70. data/spec/cql/protocol/encoding_spec.rb +3 -1
  71. data/spec/cql/protocol/frame_encoder_spec.rb +99 -50
  72. data/spec/cql/protocol/requests/auth_response_request_spec.rb +62 -0
  73. data/spec/cql/protocol/requests/batch_request_spec.rb +155 -0
  74. data/spec/cql/protocol/requests/credentials_request_spec.rb +1 -1
  75. data/spec/cql/protocol/requests/execute_request_spec.rb +184 -71
  76. data/spec/cql/protocol/requests/options_request_spec.rb +1 -1
  77. data/spec/cql/protocol/requests/prepare_request_spec.rb +1 -1
  78. data/spec/cql/protocol/requests/query_request_spec.rb +255 -32
  79. data/spec/cql/protocol/requests/register_request_spec.rb +1 -1
  80. data/spec/cql/protocol/requests/startup_request_spec.rb +12 -6
  81. data/spec/cql/protocol/responses/auth_challenge_response_spec.rb +31 -0
  82. data/spec/cql/protocol/responses/auth_success_response_spec.rb +31 -0
  83. data/spec/cql/protocol/responses/authenticate_response_spec.rb +2 -1
  84. data/spec/cql/protocol/responses/detailed_error_response_spec.rb +14 -7
  85. data/spec/cql/protocol/responses/error_response_spec.rb +4 -2
  86. data/spec/cql/protocol/responses/event_response_spec.rb +7 -4
  87. data/spec/cql/protocol/responses/prepared_result_response_spec.rb +89 -34
  88. data/spec/cql/protocol/responses/raw_rows_result_response_spec.rb +66 -0
  89. data/spec/cql/protocol/responses/ready_response_spec.rb +1 -1
  90. data/spec/cql/protocol/responses/result_response_spec.rb +19 -7
  91. data/spec/cql/protocol/responses/rows_result_response_spec.rb +56 -11
  92. data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +2 -1
  93. data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +2 -1
  94. data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +1 -1
  95. data/spec/cql/protocol/responses/status_change_event_response_spec.rb +2 -1
  96. data/spec/cql/protocol/responses/supported_response_spec.rb +2 -1
  97. data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +2 -1
  98. data/spec/cql/protocol/responses/void_result_response_spec.rb +1 -1
  99. data/spec/cql/protocol/type_converter_spec.rb +21 -4
  100. data/spec/cql/uuid_spec.rb +10 -3
  101. data/spec/integration/client_spec.rb +251 -28
  102. data/spec/integration/protocol_spec.rb +213 -62
  103. data/spec/integration/regression_spec.rb +4 -1
  104. data/spec/integration/uuid_spec.rb +4 -1
  105. data/spec/support/fake_io_reactor.rb +5 -5
  106. metadata +36 -7
  107. data/lib/cql/client/connection_helper.rb +0 -181
  108. data/spec/cql/client/connection_helper_spec.rb +0 -429
@@ -0,0 +1,31 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe AuthSuccessResponse do
9
+ describe '.decode!' do
10
+ it 'decodes the token' do
11
+ buffer = ByteBuffer.new("\x00\x00\x00\x0cbingbongpong")
12
+ response = described_class.decode!(1, buffer, buffer.length)
13
+ response.token.should == 'bingbongpong'
14
+ end
15
+
16
+ it 'decodes a nil token' do
17
+ buffer = ByteBuffer.new("\xff\xff\xff\xff")
18
+ response = described_class.decode!(1, buffer, buffer.length)
19
+ response.token.should be_nil
20
+ end
21
+ end
22
+
23
+ describe '#to_s' do
24
+ it 'returns a string with number of bytes in the token' do
25
+ response = described_class.new('bingbongpong')
26
+ response.to_s.should == 'AUTH_SUCCESS 12'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,7 +8,8 @@ module Cql
8
8
  describe AuthenticateResponse do
9
9
  describe '.decode!' do
10
10
  let :response do
11
- described_class.decode!(ByteBuffer.new("\x00\x2forg.apache.cassandra.auth.PasswordAuthenticator"))
11
+ buffer = ByteBuffer.new("\x00\x2forg.apache.cassandra.auth.PasswordAuthenticator")
12
+ described_class.decode!(1, buffer, buffer.length)
12
13
  end
13
14
 
14
15
  it 'decodes the authentication class' do
@@ -8,7 +8,8 @@ module Cql
8
8
  describe DetailedErrorResponse do
9
9
  describe '.decode!' do
10
10
  it 'decodes an unavailable error' do
11
- response = described_class.decode!(0x1000, '', ByteBuffer.new("\x00\x05\x00\x00\x00\x03\x00\x00\x00\x02"))
11
+ buffer = ByteBuffer.new("\x00\x05\x00\x00\x00\x03\x00\x00\x00\x02")
12
+ response = described_class.decode!(0x1000, '', 1, buffer, buffer.length)
12
13
  response.details.should == {
13
14
  :cl => :all,
14
15
  :required => 3,
@@ -17,7 +18,8 @@ module Cql
17
18
  end
18
19
 
19
20
  it 'decodes a write_timeout error' do
20
- response = described_class.decode!(0x1100, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG"))
21
+ buffer = ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG")
22
+ response = described_class.decode!(0x1100, '', 1, buffer, buffer.length)
21
23
  response.details.should == {
22
24
  :cl => :one,
23
25
  :received => 0,
@@ -27,14 +29,16 @@ module Cql
27
29
  end
28
30
 
29
31
  it 'decodes a read_timeout error' do
30
- response = described_class.decode!(0x1200, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01"))
32
+ buffer = ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01")
33
+ response = described_class.decode!(0x1200, '', 1, buffer, buffer.length)
31
34
  response.details.should == {
32
35
  :cl => :one,
33
36
  :received => 0,
34
37
  :blockfor => 1,
35
38
  :data_present => true
36
39
  }
37
- response = described_class.decode!(0x1200, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00"))
40
+ buffer = ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00")
41
+ response = described_class.decode!(0x1200, '', 1, buffer, buffer.length)
38
42
  response.details.should == {
39
43
  :cl => :one,
40
44
  :received => 0,
@@ -44,7 +48,8 @@ module Cql
44
48
  end
45
49
 
46
50
  it 'decodes an already_exists error with a keyspace' do
47
- response = described_class.decode!(0x2400, '', ByteBuffer.new("\x00\x05stuff\x00\x00"))
51
+ buffer = ByteBuffer.new("\x00\x05stuff\x00\x00")
52
+ response = described_class.decode!(0x2400, '', 1, buffer, buffer.length)
48
53
  response.details.should == {
49
54
  :ks => 'stuff',
50
55
  :table => '',
@@ -52,7 +57,8 @@ module Cql
52
57
  end
53
58
 
54
59
  it 'decodes an already_exists error with a keyspace and table' do
55
- response = described_class.decode!(0x2400, '', ByteBuffer.new("\x00\x05stuff\x00\x06things"))
60
+ buffer = ByteBuffer.new("\x00\x05stuff\x00\x06things")
61
+ response = described_class.decode!(0x2400, '', 1, buffer, buffer.length)
56
62
  response.details.should == {
57
63
  :ks => 'stuff',
58
64
  :table => 'things',
@@ -60,7 +66,8 @@ module Cql
60
66
  end
61
67
 
62
68
  it 'decodes unprepared error' do
63
- response = described_class.decode!(0x2500, '', ByteBuffer.new("\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"))
69
+ buffer = ByteBuffer.new("\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/")
70
+ response = described_class.decode!(0x2500, '', 1, buffer, buffer.length)
64
71
  response.details.should == {
65
72
  :id => "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
66
73
  }
@@ -8,7 +8,8 @@ module Cql
8
8
  describe ErrorResponse do
9
9
  describe '.decode!' do
10
10
  let :response do
11
- described_class.decode!(ByteBuffer.new("\x00\x00\x00\n\x00PProvided version 4.0.0 is not supported by this server (supported: 2.0.0, 3.0.0)"))
11
+ buffer = ByteBuffer.new("\x00\x00\x00\n\x00PProvided version 4.0.0 is not supported by this server (supported: 2.0.0, 3.0.0)")
12
+ described_class.decode!(1, buffer, buffer.length)
12
13
  end
13
14
 
14
15
  it 'decodes the error code' do
@@ -20,7 +21,8 @@ module Cql
20
21
  end
21
22
 
22
23
  it 'decodes error frames with details' do
23
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x11\x00\x000Operation timed out - received only 0 responses.\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG"))
24
+ buffer = ByteBuffer.new("\x00\x00\x11\x00\x000Operation timed out - received only 0 responses.\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG")
25
+ response = described_class.decode!(1, buffer, buffer.length)
24
26
  response.details.should_not be_nil
25
27
  end
26
28
  end
@@ -8,7 +8,8 @@ module Cql
8
8
  describe EventResponse do
9
9
  describe '.decode!' do
10
10
  it 'decodes a SCHEMA_CHANGE event' do
11
- response = described_class.decode!(ByteBuffer.new("\x00\rSCHEMA_CHANGE\x00\aDROPPED\x00\ncql_rb_609\x00\x05users"))
11
+ buffer = ByteBuffer.new("\x00\rSCHEMA_CHANGE\x00\aDROPPED\x00\ncql_rb_609\x00\x05users")
12
+ response = described_class.decode!(1, buffer, buffer.length)
12
13
  response.type.should == 'SCHEMA_CHANGE'
13
14
  response.change.should == 'DROPPED'
14
15
  response.keyspace.should == 'cql_rb_609'
@@ -16,7 +17,8 @@ module Cql
16
17
  end
17
18
 
18
19
  it 'decodes a STATUS_CHANGE event' do
19
- response = described_class.decode!(ByteBuffer.new("\x00\rSTATUS_CHANGE\x00\x04DOWN\x04\x00\x00\x00\x00\x00\x00#R"))
20
+ buffer = ByteBuffer.new("\x00\rSTATUS_CHANGE\x00\x04DOWN\x04\x00\x00\x00\x00\x00\x00#R")
21
+ response = described_class.decode!(1, buffer, buffer.length)
20
22
  response.type.should == 'STATUS_CHANGE'
21
23
  response.change.should == 'DOWN'
22
24
  response.address.should == IPAddr.new('0.0.0.0')
@@ -24,7 +26,8 @@ module Cql
24
26
  end
25
27
 
26
28
  it 'decodes a TOPOLOGY_CHANGE event' do
27
- response = described_class.decode!(ByteBuffer.new("\x00\x0FTOPOLOGY_CHANGE\x00\fREMOVED_NODE\x04\x00\x00\x00\x00\x00\x00#R"))
29
+ buffer = ByteBuffer.new("\x00\x0FTOPOLOGY_CHANGE\x00\fREMOVED_NODE\x04\x00\x00\x00\x00\x00\x00#R")
30
+ response = described_class.decode!(1, buffer, buffer.length)
28
31
  response.type.should == 'TOPOLOGY_CHANGE'
29
32
  response.change.should == 'REMOVED_NODE'
30
33
  response.address.should == IPAddr.new('0.0.0.0')
@@ -32,7 +35,7 @@ module Cql
32
35
  end
33
36
 
34
37
  it 'complains when asked to decode an unknown event type' do
35
- expect { described_class.decode!(ByteBuffer.new("\x00\x04PING")) }.to raise_error(UnsupportedEventTypeError, /PING/)
38
+ expect { described_class.decode!(1, ByteBuffer.new("\x00\x04PING"), 6) }.to raise_error(UnsupportedEventTypeError, /PING/)
36
39
  end
37
40
  end
38
41
  end
@@ -7,99 +7,154 @@ module Cql
7
7
  module Protocol
8
8
  describe PreparedResultResponse do
9
9
  describe '.decode!' do
10
- let :response do
11
- described_class.decode!(ByteBuffer.new("\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r"))
12
- end
13
-
14
- it 'decodes the ID' do
15
- response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
16
- end
17
-
18
- it 'decodes the column metadata' do
19
- response.metadata.should == [['cql_rb_911', 'users', 'user_name', :varchar]]
10
+ context 'with a protocol v1 frame' do
11
+ let :response do
12
+ buffer = ByteBuffer.new
13
+ buffer << "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/" # statement ID
14
+ buffer << "\x00\x00\x00\x01" # flags (global_tables_spec)
15
+ buffer << "\x00\x00\x00\x01" # column count
16
+ buffer << "\x00\ncql_rb_911\x00\x05users" # global_tables_spec
17
+ buffer << "\x00\tuser_name\x00\r" # col_spec (name + type)
18
+ described_class.decode!(1, buffer, buffer.length)
19
+ end
20
+
21
+ it 'decodes the ID' do
22
+ response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
23
+ end
24
+
25
+ it 'decodes the column metadata' do
26
+ response.metadata.should == [['cql_rb_911', 'users', 'user_name', :varchar]]
27
+ end
28
+ end
29
+
30
+ context 'with a protocol v2 frame' do
31
+ let :response do
32
+ buffer = ByteBuffer.new
33
+ buffer << "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/" # statement ID
34
+ buffer << "\x00\x00\x00\x01" # flags (global_tables_spec)
35
+ buffer << "\x00\x00\x00\x01" # column count
36
+ buffer << "\x00\ncql_rb_911\x00\x05users" # global_tables_spec
37
+ buffer << "\x00\tuser_name\x00\r" # col_spec (name + type)
38
+ buffer << "\x00\x00\x00\x01" # flags (global_tables_spec)
39
+ buffer << "\x00\x00\x00\x02" # column count
40
+ buffer << "\x00\ncql_rb_911\x00\x05users" # global_tables_spec
41
+ buffer << "\x00\tuser_name\x00\r" # col_spec (name + type)
42
+ buffer << "\x00\x05email\x00\r" # col_spec (name + type)
43
+ described_class.decode!(2, buffer, buffer.length)
44
+ end
45
+
46
+ it 'decodes the ID' do
47
+ response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
48
+ end
49
+
50
+ it 'decodes the column metadata' do
51
+ response.metadata.should == [
52
+ ['cql_rb_911', 'users', 'user_name', :varchar]
53
+ ]
54
+ end
55
+
56
+ it 'decodes the result metadata' do
57
+ response.result_metadata.should == [
58
+ ['cql_rb_911', 'users', 'user_name', :varchar],
59
+ ['cql_rb_911', 'users', 'email', :varchar]
60
+ ]
61
+ end
62
+
63
+ it 'decodes the absence of result metadata' do
64
+ buffer = ByteBuffer.new
65
+ buffer << "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/" # statement ID
66
+ buffer << "\x00\x00\x00\x01" # flags (global_tables_spec)
67
+ buffer << "\x00\x00\x00\x01" # column count
68
+ buffer << "\x00\ncql_rb_911\x00\x05users" # global_tables_spec
69
+ buffer << "\x00\tuser_name\x00\r" # col_spec (name + type)
70
+ buffer << "\x00\x00\x00\x04" # flags (no_metadata)
71
+ buffer << "\x00\x00\x00\x00" # column count
72
+ response = described_class.decode!(2, buffer, buffer.length)
73
+ response.result_metadata.should be_nil
74
+ end
20
75
  end
21
76
  end
22
77
 
23
78
  describe '#void?' do
24
79
  it 'is not void' do
25
- response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
80
+ response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
26
81
  response.should_not be_void
27
82
  end
28
83
  end
29
84
 
30
85
  describe '#to_s' do
31
86
  it 'returns a string with the ID and metadata' do
32
- response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\x00/", [['ks', 'tbl', 'col', :varchar]], nil)
87
+ response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\x00/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
33
88
  response.to_s.should match(/^RESULT PREPARED [0-9a-f]{32} \[\["ks", "tbl", "col", :varchar\]\]$/)
34
89
  end
35
90
  end
36
91
 
37
92
  describe '#eql?' do
38
93
  it 'is equal to an identical response' do
39
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
40
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
94
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
95
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
41
96
  r1.should eql(r2)
42
97
  end
43
98
 
44
99
  it 'is not equal when the IDs differ' do
45
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
46
- r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil)
100
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
101
+ r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil, nil)
47
102
  r1.should_not eql(r2)
48
103
  end
49
104
 
50
105
  it 'is not equal when the metadata differ' do
51
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
52
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil)
106
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
107
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil, nil)
53
108
  r1.should_not eql(r2)
54
109
  end
55
110
 
56
111
  it 'is not equal when one has a trace ID' do
57
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
58
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
112
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
113
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
59
114
  r1.should_not eql(r2)
60
115
  end
61
116
 
62
117
  it 'is not equal when the trace IDs differ' do
63
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
64
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
118
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
119
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
65
120
  r1.should_not eql(r2)
66
121
  end
67
122
 
68
123
  it 'is aliased as ==' do
69
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
70
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
124
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
125
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
71
126
  r1.should == r2
72
127
  end
73
128
  end
74
129
 
75
130
  describe '#hash' do
76
131
  it 'is the same for an identical response' do
77
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
78
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
132
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
133
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
79
134
  r1.hash.should == r2.hash
80
135
  end
81
136
 
82
137
  it 'is not the same when the IDs differ' do
83
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
84
- r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil)
138
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
139
+ r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil, nil)
85
140
  r1.hash.should_not == r2.hash
86
141
  end
87
142
 
88
143
  it 'is not the same when the metadata differ' do
89
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
90
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil)
144
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
145
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil, nil)
91
146
  r1.hash.should_not == r2.hash
92
147
  end
93
148
 
94
149
  it 'is not the same when one has a trace ID' do
95
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
96
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
150
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
151
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, nil)
97
152
  r1.hash.should_not == r2.hash
98
153
  end
99
154
 
100
155
  it 'is not equal when the trace IDs differ' do
101
- r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
102
- r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
156
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
157
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil, Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
103
158
  r1.hash.should_not == r2.hash
104
159
  end
105
160
  end
@@ -0,0 +1,66 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe RawRowsResultResponse do
9
+ let :response do
10
+ described_class.new(2, raw_rows, nil, nil)
11
+ end
12
+
13
+ let :raw_rows do
14
+ ByteBuffer.new("\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\x0dphil@heck.com\xff\xff\xff\xff\x00\x00\x00\x03sue\x00\x00\x00\x0dsue@inter.net\xff\xff\xff\xff")
15
+ end
16
+
17
+ let :metadata do
18
+ [
19
+ ['ks', 'users', 'user_name', :varchar],
20
+ ['ks', 'users', 'email', :varchar],
21
+ ['ks', 'users', 'password', :varchar],
22
+ ]
23
+ end
24
+
25
+ describe '#materialize' do
26
+ it 'decodes the rows using the given metadata' do
27
+ response.materialize(metadata)
28
+ response.rows.should == [
29
+ {'user_name' => 'phil', 'email' => 'phil@heck.com', 'password' => nil},
30
+ {'user_name' => 'sue', 'email' => 'sue@inter.net', 'password' => nil},
31
+ ]
32
+ end
33
+
34
+ it 'returns the rows' do
35
+ rows = response.materialize(metadata)
36
+ rows.should == [
37
+ {'user_name' => 'phil', 'email' => 'phil@heck.com', 'password' => nil},
38
+ {'user_name' => 'sue', 'email' => 'sue@inter.net', 'password' => nil},
39
+ ]
40
+ end
41
+ end
42
+
43
+ describe '#rows' do
44
+ it 'raises an error before #materialize has been called' do
45
+ expect { response.rows }.to raise_error(UnmaterializedRowsError)
46
+ response.materialize(metadata)
47
+ response.rows
48
+ end
49
+ end
50
+
51
+ describe '#metadata' do
52
+ it 'returns nil before #materialize has been called' do
53
+ response.metadata.should be_nil
54
+ response.materialize(metadata)
55
+ response.metadata.should == metadata
56
+ end
57
+ end
58
+
59
+ describe '#to_s' do
60
+ it 'returns a static string' do
61
+ response.to_s.should == 'RESULT ROWS (raw)'
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -9,7 +9,7 @@ module Cql
9
9
  describe '.decode!' do
10
10
  it 'returns a new instance' do
11
11
  unused_byte_buffer = nil
12
- described_class.decode!(unused_byte_buffer).should be_a(described_class)
12
+ described_class.decode!(1, unused_byte_buffer, 0).should be_a(described_class)
13
13
  end
14
14
  end
15
15
 
@@ -8,13 +8,15 @@ module Cql
8
8
  describe ResultResponse do
9
9
  describe '.decode!' do
10
10
  it 'decodes a set_keyspace result' do
11
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x03\x00\x06system"))
11
+ buffer = ByteBuffer.new("\x00\x00\x00\x03\x00\x06system")
12
+ response = described_class.decode!(1, buffer, buffer.length)
12
13
  response.should_not be_void
13
14
  response.keyspace.should == 'system'
14
15
  end
15
16
 
16
17
  it 'decodes a schema_change CREATED result' do
17
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x05\x00\aCREATED\x00\ncql_rb_477\x00\x00"))
18
+ buffer = ByteBuffer.new("\x00\x00\x00\x05\x00\aCREATED\x00\ncql_rb_477\x00\x00")
19
+ response = described_class.decode!(1, buffer, buffer.length)
18
20
  response.should_not be_void
19
21
  response.change.should == 'CREATED'
20
22
  response.keyspace.should == 'cql_rb_477'
@@ -22,7 +24,8 @@ module Cql
22
24
  end
23
25
 
24
26
  it 'decodes a schema_change UPDATED result' do
25
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x05\x00\aUPDATED\x00\ncql_rb_973\x00\x05users"))
27
+ buffer = ByteBuffer.new("\x00\x00\x00\x05\x00\aUPDATED\x00\ncql_rb_973\x00\x05users")
28
+ response = described_class.decode!(1, buffer, buffer.length)
26
29
  response.should_not be_void
27
30
  response.change.should == 'UPDATED'
28
31
  response.keyspace.should == 'cql_rb_973'
@@ -30,26 +33,35 @@ module Cql
30
33
  end
31
34
 
32
35
  it 'decodes a void result' do
33
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01"))
36
+ buffer = ByteBuffer.new("\x00\x00\x00\x01")
37
+ response = described_class.decode!(1, buffer, buffer.length)
34
38
  response.should be_void
35
39
  end
36
40
 
37
41
  it 'decodes a rows result' do
38
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\ncql_rb_126\x00\x05users\x00\tuser_name\x00\r\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF"))
42
+ buffer = ByteBuffer.new("\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\ncql_rb_126\x00\x05users\x00\tuser_name\x00\r\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF")
43
+ response = described_class.decode!(1, buffer, buffer.length)
39
44
  response.should_not be_void
40
45
  response.rows.size.should == 2
41
46
  response.metadata.size.should == 3
42
47
  end
43
48
 
49
+ it 'decodes a rows result' do
50
+ buffer = ByteBuffer.new("\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x03\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF")
51
+ response = described_class.decode!(1, buffer, buffer.length)
52
+ response.should_not be_void
53
+ end
54
+
44
55
  it 'decodes a prepared result' do
45
- response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x04\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r"))
56
+ buffer = ByteBuffer.new("\x00\x00\x00\x04\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r")
57
+ response = described_class.decode!(1, buffer, buffer.length)
46
58
  response.should_not be_void
47
59
  response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
48
60
  response.metadata.size.should == 1
49
61
  end
50
62
 
51
63
  it 'complains when asked to decode an unknown result type' do
52
- expect { described_class.decode!(ByteBuffer.new("\x00\x00\x00\xffhello")) }.to raise_error(UnsupportedResultKindError)
64
+ expect { described_class.decode!(1, ByteBuffer.new("\x00\x00\x00\xffhello"), 9) }.to raise_error(UnsupportedResultKindError)
53
65
  end
54
66
  end
55
67
  end