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.
- checksums.yaml +4 -4
- data/.yardopts +4 -0
- data/README.md +139 -17
- data/lib/cql/client.rb +237 -8
- data/lib/cql/client/asynchronous_client.rb +138 -54
- data/lib/cql/client/asynchronous_prepared_statement.rb +41 -6
- data/lib/cql/client/authenticators.rb +46 -0
- data/lib/cql/client/batch.rb +115 -0
- data/lib/cql/client/connector.rb +255 -0
- data/lib/cql/client/execute_options_decoder.rb +25 -9
- data/lib/cql/client/keyspace_changer.rb +5 -5
- data/lib/cql/client/peer_discovery.rb +33 -0
- data/lib/cql/client/query_result.rb +124 -1
- data/lib/cql/client/request_runner.rb +4 -2
- data/lib/cql/client/synchronous_client.rb +14 -2
- data/lib/cql/client/synchronous_prepared_statement.rb +19 -1
- data/lib/cql/future.rb +97 -50
- data/lib/cql/io/connection.rb +0 -1
- data/lib/cql/io/io_reactor.rb +1 -1
- data/lib/cql/protocol.rb +8 -1
- data/lib/cql/protocol/cql_protocol_handler.rb +2 -2
- data/lib/cql/protocol/decoding.rb +10 -15
- data/lib/cql/protocol/frame_decoder.rb +2 -1
- data/lib/cql/protocol/frame_encoder.rb +5 -4
- data/lib/cql/protocol/requests/auth_response_request.rb +31 -0
- data/lib/cql/protocol/requests/batch_request.rb +59 -0
- data/lib/cql/protocol/requests/credentials_request.rb +1 -1
- data/lib/cql/protocol/requests/execute_request.rb +45 -17
- data/lib/cql/protocol/requests/options_request.rb +1 -1
- data/lib/cql/protocol/requests/prepare_request.rb +1 -1
- data/lib/cql/protocol/requests/query_request.rb +97 -5
- data/lib/cql/protocol/requests/register_request.rb +1 -1
- data/lib/cql/protocol/requests/startup_request.rb +4 -4
- data/lib/cql/protocol/response.rb +2 -2
- data/lib/cql/protocol/responses/auth_challenge_response.rb +25 -0
- data/lib/cql/protocol/responses/auth_success_response.rb +25 -0
- data/lib/cql/protocol/responses/authenticate_response.rb +1 -1
- data/lib/cql/protocol/responses/detailed_error_response.rb +1 -1
- data/lib/cql/protocol/responses/error_response.rb +3 -2
- data/lib/cql/protocol/responses/event_response.rb +3 -2
- data/lib/cql/protocol/responses/prepared_result_response.rb +10 -6
- data/lib/cql/protocol/responses/raw_rows_result_response.rb +27 -0
- data/lib/cql/protocol/responses/ready_response.rb +1 -1
- data/lib/cql/protocol/responses/result_response.rb +2 -2
- data/lib/cql/protocol/responses/rows_result_response.rb +43 -23
- data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/schema_change_result_response.rb +1 -1
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +1 -1
- data/lib/cql/protocol/responses/status_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/supported_response.rb +1 -1
- data/lib/cql/protocol/responses/void_result_response.rb +1 -1
- data/lib/cql/protocol/type_converter.rb +2 -2
- data/lib/cql/uuid.rb +2 -2
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/asynchronous_client_spec.rb +493 -50
- data/spec/cql/client/asynchronous_prepared_statement_spec.rb +193 -11
- data/spec/cql/client/authenticators_spec.rb +56 -0
- data/spec/cql/client/batch_spec.rb +277 -0
- data/spec/cql/client/connector_spec.rb +606 -0
- data/spec/cql/client/execute_options_decoder_spec.rb +95 -0
- data/spec/cql/client/keyspace_changer_spec.rb +8 -8
- data/spec/cql/client/peer_discovery_spec.rb +92 -0
- data/spec/cql/client/query_result_spec.rb +352 -0
- data/spec/cql/client/request_runner_spec.rb +31 -5
- data/spec/cql/client/synchronous_client_spec.rb +44 -1
- data/spec/cql/client/synchronous_prepared_statement_spec.rb +63 -1
- data/spec/cql/future_spec.rb +50 -2
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +16 -5
- data/spec/cql/protocol/decoding_spec.rb +16 -6
- data/spec/cql/protocol/encoding_spec.rb +3 -1
- data/spec/cql/protocol/frame_encoder_spec.rb +99 -50
- data/spec/cql/protocol/requests/auth_response_request_spec.rb +62 -0
- data/spec/cql/protocol/requests/batch_request_spec.rb +155 -0
- data/spec/cql/protocol/requests/credentials_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/execute_request_spec.rb +184 -71
- data/spec/cql/protocol/requests/options_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/prepare_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/query_request_spec.rb +255 -32
- data/spec/cql/protocol/requests/register_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/startup_request_spec.rb +12 -6
- data/spec/cql/protocol/responses/auth_challenge_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/auth_success_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +14 -7
- data/spec/cql/protocol/responses/error_response_spec.rb +4 -2
- data/spec/cql/protocol/responses/event_response_spec.rb +7 -4
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +89 -34
- data/spec/cql/protocol/responses/raw_rows_result_response_spec.rb +66 -0
- data/spec/cql/protocol/responses/ready_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/result_response_spec.rb +19 -7
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +56 -11
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/supported_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/void_result_response_spec.rb +1 -1
- data/spec/cql/protocol/type_converter_spec.rb +21 -4
- data/spec/cql/uuid_spec.rb +10 -3
- data/spec/integration/client_spec.rb +251 -28
- data/spec/integration/protocol_spec.rb +213 -62
- data/spec/integration/regression_spec.rb +4 -1
- data/spec/integration/uuid_spec.rb +4 -1
- data/spec/support/fake_io_reactor.rb +5 -5
- metadata +36 -7
- data/lib/cql/client/connection_helper.rb +0 -181
- data/spec/cql/client/connection_helper_spec.rb +0 -429
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe AuthResponseRequest do
|
9
|
+
describe '#write' do
|
10
|
+
it 'encodes an AUTH_RESPONSE request frame' do
|
11
|
+
bytes = described_class.new('bingbongpong').write(2, '')
|
12
|
+
bytes.should == "\x00\x00\x00\x0cbingbongpong"
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'encodes a nil token' do
|
16
|
+
bytes = described_class.new(nil).write(2, '')
|
17
|
+
bytes.should == "\xff\xff\xff\xff"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#to_s' do
|
22
|
+
it 'returns a string representation including the number of bytes in the token' do
|
23
|
+
described_class.new('bingbongpong').to_s.should == 'AUTH_RESPONSE 12'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#eql?' do
|
28
|
+
it 'is equal to another with the same token' do
|
29
|
+
r1 = described_class.new('foo')
|
30
|
+
r2 = described_class.new('foo')
|
31
|
+
r1.should eql(r2)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'is not equal when the token is different' do
|
35
|
+
r1 = described_class.new('foo')
|
36
|
+
r2 = described_class.new('bar')
|
37
|
+
r1.should_not eql(r2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'is aliased as #==' do
|
41
|
+
r1 = described_class.new('foo')
|
42
|
+
r2 = described_class.new('foo')
|
43
|
+
r1.should == r2
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#hash' do
|
48
|
+
it 'is the same when the token is the same' do
|
49
|
+
r1 = described_class.new('foo')
|
50
|
+
r2 = described_class.new('foo')
|
51
|
+
r1.hash.should == r2.hash
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'is not the same when the token is different' do
|
55
|
+
r1 = described_class.new('foo')
|
56
|
+
r2 = described_class.new('bar')
|
57
|
+
r1.hash.should_not == r2.hash
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe BatchRequest do
|
9
|
+
let :statement_id do
|
10
|
+
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
11
|
+
end
|
12
|
+
|
13
|
+
let :metadata do
|
14
|
+
[['ks', 'tbl', 'things', :varchar], ['ks', 'tbl', 'things', :int]]
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#write' do
|
18
|
+
it 'encodes a BATCH request frame with a single prepared query' do
|
19
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
20
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
21
|
+
bytes = batch.write(2, '')
|
22
|
+
bytes.should == (
|
23
|
+
"\x00" +
|
24
|
+
"\x00\x01" +
|
25
|
+
"\x01" +
|
26
|
+
"\x00\x10" + statement_id +
|
27
|
+
"\x00\x02" + "\x00\x00\x00\x03arg" + "\x00\x00\x00\x04\x00\x00\x00\x03" +
|
28
|
+
"\x00\x02"
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'encodes a BATCH request frame with a single query' do
|
33
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :one)
|
34
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES ('foo', 3)>)
|
35
|
+
bytes = batch.write(2, '')
|
36
|
+
bytes.should == (
|
37
|
+
"\x00" +
|
38
|
+
"\x00\x01" +
|
39
|
+
"\x00" +
|
40
|
+
"\x00\x00\x00\x2bINSERT INTO things (a, b) VALUES ('foo', 3)" +
|
41
|
+
"\x00\x00" +
|
42
|
+
"\x00\x01"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'encodes a BATCH request frame with a single query with on-the-fly bound values' do
|
47
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
48
|
+
batch.add_query('INSERT INTO things (a, b) VALUES (?, ?)', ['foo', 5])
|
49
|
+
bytes = batch.write(2, '')
|
50
|
+
bytes.should == (
|
51
|
+
"\x00" +
|
52
|
+
"\x00\x01" +
|
53
|
+
"\x00" +
|
54
|
+
"\x00\x00\x00\x27INSERT INTO things (a, b) VALUES (?, ?)" +
|
55
|
+
"\x00\x02" + "\x00\x00\x00\x03foo" + "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x05" +
|
56
|
+
"\x00\x02"
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'encodes a BATCH request frame with a a mix of prepared and non-prepared queries' do
|
61
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
62
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
63
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES (?, ?)>, ['foo', 5])
|
64
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES ('foo', 3)>)
|
65
|
+
bytes = batch.write(2, '')
|
66
|
+
bytes.should == (
|
67
|
+
"\x00" +
|
68
|
+
"\x00\x03" +
|
69
|
+
"\x01" +
|
70
|
+
"\x00\x10" + statement_id +
|
71
|
+
"\x00\x02" + "\x00\x00\x00\x03arg" + "\x00\x00\x00\x04\x00\x00\x00\x03" +
|
72
|
+
"\x00" +
|
73
|
+
"\x00\x00\x00\x27INSERT INTO things (a, b) VALUES (?, ?)" +
|
74
|
+
"\x00\x02" + "\x00\x00\x00\x03foo" + "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x05" +
|
75
|
+
"\x00" +
|
76
|
+
"\x00\x00\x00\x2bINSERT INTO things (a, b) VALUES ('foo', 3)" +
|
77
|
+
"\x00\x00" +
|
78
|
+
"\x00\x02"
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'encodes the type when it is "logged"' do
|
83
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
84
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
85
|
+
bytes = batch.write(2, '')
|
86
|
+
bytes[0].should == "\x00"
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'encodes the type when it is "unlogged"' do
|
90
|
+
batch = described_class.new(described_class::UNLOGGED_TYPE, :two)
|
91
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
92
|
+
bytes = batch.write(2, '')
|
93
|
+
bytes[0].should == "\x01"
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'encodes the type when it is "counter"' do
|
97
|
+
batch = described_class.new(described_class::COUNTER_TYPE, :two)
|
98
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
99
|
+
bytes = batch.write(2, '')
|
100
|
+
bytes[0].should == "\x02"
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'encodes the number of statements in the batch' do
|
104
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
105
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
106
|
+
batch.add_prepared(statement_id, metadata, ['foo', 4])
|
107
|
+
batch.add_prepared(statement_id, metadata, ['bar', 5])
|
108
|
+
bytes = batch.write(2, '')
|
109
|
+
bytes[1, 2].should == "\x00\x03"
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'encodes the type of each statement' do
|
113
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
114
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
115
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES ('arg', 3)>)
|
116
|
+
bytes = batch.write(2, '')
|
117
|
+
bytes[3, 1].should == "\x01"
|
118
|
+
bytes[39, 1].should == "\x00"
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'uses the type hints given to #add_query' do
|
122
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :two)
|
123
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES (?, ?)>, ['foo', 3], [nil, :int])
|
124
|
+
bytes = batch.write(2, '')
|
125
|
+
bytes[56, 8].should == "\x00\x00\x00\x04\x00\x00\x00\x03"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#to_s' do
|
130
|
+
context 'when the type is LOGGED' do
|
131
|
+
it 'returns a string representation of the batch request' do
|
132
|
+
batch = described_class.new(described_class::LOGGED_TYPE, :local_quorum)
|
133
|
+
batch.add_prepared(statement_id, metadata, ['arg', 3])
|
134
|
+
batch.add_query(%<INSERT INTO things (a, b) VALUES ('arg', 3)>)
|
135
|
+
batch.to_s.should == %(BATCH LOGGED 2 LOCAL_QUORUM)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'when the type is UNLOGGED' do
|
140
|
+
it 'returns a string representation of the batch request' do
|
141
|
+
batch = described_class.new(described_class::UNLOGGED_TYPE, :one)
|
142
|
+
batch.to_s.should == %(BATCH UNLOGGED 0 ONE)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'when the type is COUNTER' do
|
147
|
+
it 'returns a string representation of the batch request' do
|
148
|
+
batch = described_class.new(described_class::COUNTER_TYPE, :two)
|
149
|
+
batch.to_s.should == %(BATCH COUNTER 0 TWO)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -8,7 +8,7 @@ module Cql
|
|
8
8
|
describe CredentialsRequest do
|
9
9
|
describe '#write' do
|
10
10
|
it 'encodes a CREDENTIALS request frame' do
|
11
|
-
bytes = CredentialsRequest.new('username' => 'cassandra', 'password' => 'ardnassac').write('')
|
11
|
+
bytes = CredentialsRequest.new('username' => 'cassandra', 'password' => 'ardnassac').write(1, '')
|
12
12
|
bytes.should == (
|
13
13
|
"\x00\x02" +
|
14
14
|
"\x00\x08username" +
|
@@ -24,152 +24,265 @@ module Cql
|
|
24
24
|
|
25
25
|
describe '#initialize' do
|
26
26
|
it 'raises an error when the metadata and values don\'t have the same size' do
|
27
|
-
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42], :each_quorum) }.to raise_error(ArgumentError)
|
27
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42], true, :each_quorum, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'raises an error when the consistency is nil' do
|
31
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, nil, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'raises an error when the consistency is invalid' do
|
35
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :hello, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'raises an error when the serial consistency is invalid' do
|
39
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :quorum, :foo, nil, nil, false) }.to raise_error(ArgumentError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'raises an error when paging state is given but no page size' do
|
43
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :quorum, nil, nil, 'foo', false) }.to raise_error(ArgumentError)
|
28
44
|
end
|
29
45
|
|
30
46
|
it 'raises an error for unsupported column types' do
|
31
47
|
column_metadata[2][3] = :imaginary
|
32
|
-
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], :each_quorum) }.to raise_error(UnsupportedColumnTypeError)
|
48
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :each_quorum, nil, nil, nil, false) }.to raise_error(UnsupportedColumnTypeError)
|
33
49
|
end
|
34
50
|
|
35
51
|
it 'raises an error for unsupported column collection types' do
|
36
52
|
column_metadata[2][3] = [:imaginary, :varchar]
|
37
|
-
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, ['foo']], :each_quorum) }.to raise_error(UnsupportedColumnTypeError)
|
53
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, ['foo']], true, :each_quorum, nil, nil, nil, false) }.to raise_error(UnsupportedColumnTypeError)
|
38
54
|
end
|
39
55
|
|
40
56
|
it 'raises an error when collection values are not enumerable' do
|
41
57
|
column_metadata[2][3] = [:set, :varchar]
|
42
|
-
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], :each_quorum) }.to raise_error(InvalidValueError)
|
58
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :each_quorum, nil, nil, nil, false) }.to raise_error(InvalidValueError)
|
43
59
|
end
|
44
60
|
|
45
61
|
it 'raises an error when it cannot encode the argument' do
|
46
|
-
expect { ExecuteRequest.new(id, column_metadata, ['hello', 'not an int', 'foo'], :each_quorum) }.to raise_error(TypeError, /cannot be encoded as INT/)
|
62
|
+
expect { ExecuteRequest.new(id, column_metadata, ['hello', 'not an int', 'foo'], true, :each_quorum, nil, nil, nil, false) }.to raise_error(TypeError, /cannot be encoded as INT/)
|
47
63
|
end
|
48
64
|
end
|
49
65
|
|
50
66
|
describe '#write' do
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
it
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
67
|
+
context 'when the protocol version is 1' do
|
68
|
+
let :frame_bytes do
|
69
|
+
ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :each_quorum, nil, nil, nil, false).write(1, '')
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'writes the statement ID' do
|
73
|
+
frame_bytes.to_s[0, 18].should == "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'writes the number of bound variables' do
|
77
|
+
frame_bytes.to_s[18, 2].should == "\x00\x03"
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'writes the bound variables' do
|
81
|
+
frame_bytes.to_s[20, 24].should == "\x00\x00\x00\x05hello\x00\x00\x00\x04\x00\x00\x00\x2a\x00\x00\x00\x03foo"
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'writes the consistency' do
|
85
|
+
frame_bytes.to_s[44, 999].should == "\x00\x07"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'when the protocol version is 2' do
|
90
|
+
let :frame_bytes do
|
91
|
+
ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :each_quorum, nil, nil, nil, false).write(2, '')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'writes the statement ID' do
|
95
|
+
frame_bytes.to_s[0, 18].should == "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'writes the consistency' do
|
99
|
+
frame_bytes.to_s[18, 2].should == "\x00\x07"
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'writes flags saying that there will be bound values values' do
|
103
|
+
frame_bytes.to_s[20, 1].should == "\x01"
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'does not write the bound values flag when there are no values, and does not write anything more' do
|
107
|
+
frame_bytes = ExecuteRequest.new(id, [], [], true, :each_quorum, nil, nil, nil, false).write(2, '')
|
108
|
+
frame_bytes.to_s[20, 999].should == "\x00"
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'writes flags saying that the result doesn\'t need to contain metadata' do
|
112
|
+
frame_bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], false, :each_quorum, nil, nil, nil, false).write(2, '')
|
113
|
+
frame_bytes.to_s[20, 1].should == "\x03"
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'writes the number of bound values' do
|
117
|
+
frame_bytes.to_s[21, 2].should == "\x00\x03"
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'writes the bound values' do
|
121
|
+
frame_bytes.to_s[23, 999].should == "\x00\x00\x00\x05hello\x00\x00\x00\x04\x00\x00\x00\x2a\x00\x00\x00\x03foo"
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'sets the serial flag and includes the serial consistency' do
|
125
|
+
frame_bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], false, :each_quorum, :local_serial, false).write(2, '')
|
126
|
+
frame_bytes.to_s[20, 1].should == "\x13"
|
127
|
+
frame_bytes.to_s[47, 2].should == "\x00\x09"
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'writes the page size flag and page size' do
|
131
|
+
frame_bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :one, nil, 10, nil, false).write(2, '')
|
132
|
+
(frame_bytes[20, 1].ord & 0x04).should == 0x04
|
133
|
+
frame_bytes[47, 4].should == "\x00\x00\x00\x0a"
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'writes the page size and paging state flag and the page size and paging state' do
|
137
|
+
frame_bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], true, :one, nil, 10, 'foobar', false).write(2, '')
|
138
|
+
(frame_bytes[20, 1].ord & 0x0c).should == 0x0c
|
139
|
+
frame_bytes[47, 4].should == "\x00\x00\x00\x0a"
|
140
|
+
frame_bytes[51, 10].should == "\x00\x00\x00\x06foobar"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'with different data types' do
|
145
|
+
specs = [
|
146
|
+
[:ascii, 'test', "test"],
|
147
|
+
[:bigint, 1012312312414123, "\x00\x03\x98\xB1S\xC8\x7F\xAB"],
|
148
|
+
[:blob, "\xab\xcd", "\xab\xcd"],
|
149
|
+
[:boolean, false, "\x00"],
|
150
|
+
[:boolean, true, "\x01"],
|
151
|
+
[:decimal, BigDecimal.new('1042342234234.123423435647768234'), "\x00\x00\x00\x12\r'\xFDI\xAD\x80f\x11g\xDCfV\xAA"],
|
152
|
+
[:double, 10000.123123123, "@\xC3\x88\x0F\xC2\x7F\x9DU"],
|
153
|
+
[:float, 12.13, "AB\x14{"],
|
154
|
+
[:inet, IPAddr.new('8.8.8.8'), "\x08\x08\x08\x08"],
|
155
|
+
[:inet, IPAddr.new('::1'), "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"],
|
156
|
+
[:int, 12348098, "\x00\xBCj\xC2"],
|
157
|
+
[:text, 'FOOBAR', 'FOOBAR'],
|
158
|
+
[:timestamp, Time.at(1358013521.123), "\x00\x00\x01</\xE9\xDC\xE3"],
|
159
|
+
[:timeuuid, Uuid.new('a4a70900-24e1-11df-8924-001ff3591711'), "\xA4\xA7\t\x00$\xE1\x11\xDF\x89$\x00\x1F\xF3Y\x17\x11"],
|
160
|
+
[:uuid, Uuid.new('cfd66ccc-d857-4e90-b1e5-df98a3d40cd6'), "\xCF\xD6l\xCC\xD8WN\x90\xB1\xE5\xDF\x98\xA3\xD4\f\xD6"],
|
161
|
+
[:varchar, 'hello', 'hello'],
|
162
|
+
[:varint, 1231312312331283012830129382342342412123, "\x03\x9EV \x15\f\x03\x9DK\x18\xCDI\\$?\a["],
|
163
|
+
[:varint, -234234234234, "\xC9v\x8D:\x86"],
|
164
|
+
[[:list, :timestamp], [Time.at(1358013521.123)], "\x00\x01" + "\x00\x08\x00\x00\x01</\xE9\xDC\xE3"],
|
165
|
+
[[:list, :boolean], [true, false, true, true], "\x00\x04" + "\x00\x01\x01" + "\x00\x01\x00" + "\x00\x01\x01" + "\x00\x01\x01"],
|
166
|
+
[[:map, :uuid, :int], {Uuid.new('cfd66ccc-d857-4e90-b1e5-df98a3d40cd6') => 45345, Uuid.new('a4a70900-24e1-11df-8924-001ff3591711') => 98765}, "\x00\x02" + "\x00\x10\xCF\xD6l\xCC\xD8WN\x90\xB1\xE5\xDF\x98\xA3\xD4\f\xD6" + "\x00\x04\x00\x00\xb1\x21" + "\x00\x10\xA4\xA7\t\x00$\xE1\x11\xDF\x89$\x00\x1F\xF3Y\x17\x11" + "\x00\x04\x00\x01\x81\xcd"],
|
167
|
+
[[:map, :ascii, :blob], {'hello' => 'world', 'one' => "\x01", 'two' => "\x02"}, "\x00\x03" + "\x00\x05hello" + "\x00\x05world" + "\x00\x03one" + "\x00\x01\x01" + "\x00\x03two" + "\x00\x01\x02"],
|
168
|
+
[[:set, :int], Set.new([13, 3453, 456456, 123, 768678]), "\x00\x05" + "\x00\x04\x00\x00\x00\x0d" + "\x00\x04\x00\x00\x0d\x7d" + "\x00\x04\x00\x06\xf7\x08" + "\x00\x04\x00\x00\x00\x7b" + "\x00\x04\x00\x0b\xba\xa6"],
|
169
|
+
[[:set, :varchar], Set.new(['foo', 'bar', 'baz']), "\x00\x03" + "\x00\x03foo" + "\x00\x03bar" + "\x00\x03baz"],
|
170
|
+
[[:set, :int], [13, 3453, 456456, 123, 768678], "\x00\x05" + "\x00\x04\x00\x00\x00\x0d" + "\x00\x04\x00\x00\x0d\x7d" + "\x00\x04\x00\x06\xf7\x08" + "\x00\x04\x00\x00\x00\x7b" + "\x00\x04\x00\x0b\xba\xa6"],
|
171
|
+
[[:set, :varchar], ['foo', 'bar', 'baz'], "\x00\x03" + "\x00\x03foo" + "\x00\x03bar" + "\x00\x03baz"]
|
172
|
+
]
|
173
|
+
specs.each do |type, value, expected_bytes|
|
174
|
+
it "encodes #{type} values" do
|
175
|
+
metadata = [['ks', 'tbl', 'id_column', type]]
|
176
|
+
buffer = ExecuteRequest.new(id, metadata, [value], true, :one, nil, nil, nil, false).write(1, ByteBuffer.new)
|
177
|
+
buffer.discard(2 + 16 + 2)
|
178
|
+
length = buffer.read_int
|
179
|
+
result_bytes = buffer.read(length)
|
180
|
+
result_bytes.should eql_bytes(expected_bytes)
|
181
|
+
end
|
93
182
|
end
|
94
183
|
end
|
95
184
|
end
|
96
185
|
|
97
186
|
describe '#to_s' do
|
98
187
|
it 'returns a pretty string' do
|
99
|
-
request = ExecuteRequest.new(id, column_metadata, values, :each_quorum)
|
188
|
+
request = ExecuteRequest.new(id, column_metadata, values, true, :each_quorum, nil, nil, nil, false)
|
100
189
|
request.to_s.should == 'EXECUTE ca487f1e7a82d23c4e8af3355171a52f ["hello", 42, "foo"] EACH_QUORUM'
|
101
190
|
end
|
102
191
|
end
|
103
192
|
|
104
193
|
describe '#eql?' do
|
105
194
|
it 'returns true when the ID, metadata, values and consistency are the same' do
|
106
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
107
|
-
e2 = ExecuteRequest.new(id, column_metadata, values, :one)
|
195
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
196
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
108
197
|
e1.should eql(e2)
|
109
198
|
end
|
110
199
|
|
111
200
|
it 'returns false when the ID is different' do
|
112
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
113
|
-
e2 = ExecuteRequest.new(id.reverse, column_metadata, values, :one)
|
201
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
202
|
+
e2 = ExecuteRequest.new(id.reverse, column_metadata, values, true, :one, nil, nil, nil, false)
|
114
203
|
e1.should_not eql(e2)
|
115
204
|
end
|
116
205
|
|
117
206
|
it 'returns false when the metadata is different' do
|
118
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
119
|
-
e2 = ExecuteRequest.new(id, column_metadata.reverse, values, :one)
|
207
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
208
|
+
e2 = ExecuteRequest.new(id, column_metadata.reverse, values, true, :one, nil, nil, nil, false)
|
120
209
|
e1.should_not eql(e2)
|
121
210
|
end
|
122
211
|
|
123
212
|
it 'returns false when the values are different' do
|
124
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
125
|
-
e2 = ExecuteRequest.new(id, column_metadata, values.reverse, :one)
|
213
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
214
|
+
e2 = ExecuteRequest.new(id, column_metadata, values.reverse, true, :one, nil, nil, nil, false)
|
126
215
|
e1.should_not eql(e2)
|
127
216
|
end
|
128
217
|
|
129
218
|
it 'returns false when the consistency is different' do
|
130
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
131
|
-
e2 = ExecuteRequest.new(id, column_metadata, values, :two)
|
219
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
220
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :two, nil, nil, nil, false)
|
221
|
+
e1.should_not eql(e2)
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'returns false when the serial consistency is different' do
|
225
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, :serial, nil, nil, false)
|
226
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, :local_serial, nil, nil, false)
|
227
|
+
e1.should_not eql(e2)
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'returns false when the page size is different' do
|
231
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, 10, nil, false)
|
232
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, 20, nil, false)
|
233
|
+
e1.should_not eql(e2)
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'returns false when the paging state is different' do
|
237
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, 10, 'foo', false)
|
238
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, 10, 'bar', false)
|
132
239
|
e1.should_not eql(e2)
|
133
240
|
end
|
134
241
|
|
135
242
|
it 'is aliased as ==' do
|
136
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
137
|
-
e2 = ExecuteRequest.new(id, column_metadata, values, :one)
|
243
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
244
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
138
245
|
e1.should == e2
|
139
246
|
end
|
140
247
|
end
|
141
248
|
|
142
249
|
describe '#hash' do
|
143
250
|
it 'has the same hash code as another identical object' do
|
144
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
145
|
-
e2 = ExecuteRequest.new(id, column_metadata, values, :one)
|
251
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
252
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
146
253
|
e1.hash.should == e2.hash
|
147
254
|
end
|
148
255
|
|
149
256
|
it 'does not have the same hash code when the ID is different' do
|
150
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
151
|
-
e2 = ExecuteRequest.new(id.reverse, column_metadata, values, :one)
|
257
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
258
|
+
e2 = ExecuteRequest.new(id.reverse, column_metadata, values, true, :one, nil, nil, nil, false)
|
152
259
|
e1.hash.should_not == e2.hash
|
153
260
|
end
|
154
261
|
|
155
262
|
it 'does not have the same hash code when the metadata is different' do
|
156
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
157
|
-
e2 = ExecuteRequest.new(id, column_metadata.reverse, values, :one)
|
263
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
264
|
+
e2 = ExecuteRequest.new(id, column_metadata.reverse, values, true, :one, nil, nil, nil, false)
|
158
265
|
e1.hash.should_not == e2.hash
|
159
266
|
end
|
160
267
|
|
161
268
|
it 'does not have the same hash code when the values are different' do
|
162
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
163
|
-
e2 = ExecuteRequest.new(id, column_metadata, values.reverse, :one)
|
269
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
270
|
+
e2 = ExecuteRequest.new(id, column_metadata, values.reverse, true, :one, nil, nil, nil, false)
|
164
271
|
e1.hash.should_not == e2.hash
|
165
272
|
end
|
166
273
|
|
167
274
|
it 'does not have the same hash code when the consistency is different' do
|
168
|
-
e1 = ExecuteRequest.new(id, column_metadata, values, :one)
|
169
|
-
e2 = ExecuteRequest.new(id, column_metadata, values, :two)
|
275
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
276
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :two, nil, nil, nil, false)
|
277
|
+
e1.hash.should_not == e2.hash
|
278
|
+
end
|
279
|
+
|
280
|
+
it 'does not have the same hash code when the serial consistency is different' do
|
281
|
+
e1 = ExecuteRequest.new(id, column_metadata, values, true, :one, nil, nil, nil, false)
|
282
|
+
e2 = ExecuteRequest.new(id, column_metadata, values, true, :one, :serial, nil, nil, false)
|
170
283
|
e1.hash.should_not == e2.hash
|
171
284
|
end
|
172
285
|
end
|
173
286
|
end
|
174
287
|
end
|
175
|
-
end
|
288
|
+
end
|