cql-rb 1.2.2 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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