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.
- 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
@@ -4,11 +4,13 @@ module Cql
|
|
4
4
|
module Client
|
5
5
|
# @private
|
6
6
|
class RequestRunner
|
7
|
-
def execute(connection, request, timeout=nil)
|
7
|
+
def execute(connection, request, timeout=nil, raw_metadata=nil)
|
8
8
|
connection.send_request(request, timeout).map do |response|
|
9
9
|
case response
|
10
|
+
when Protocol::RawRowsResultResponse
|
11
|
+
LazyQueryResult.new(raw_metadata, response, response.trace_id, response.paging_state)
|
10
12
|
when Protocol::RowsResultResponse
|
11
|
-
QueryResult.new(response.metadata, response.rows, response.trace_id)
|
13
|
+
QueryResult.new(response.metadata, response.rows, response.trace_id, response.paging_state)
|
12
14
|
when Protocol::VoidResultResponse
|
13
15
|
response.trace_id ? VoidResult.new(response.trace_id) : VoidResult::INSTANCE
|
14
16
|
when Protocol::ErrorResponse
|
@@ -50,8 +50,12 @@ module Cql
|
|
50
50
|
synchronous_backtrace { @async_client.use(keyspace).value }
|
51
51
|
end
|
52
52
|
|
53
|
-
def execute(cql,
|
54
|
-
synchronous_backtrace
|
53
|
+
def execute(cql, *args)
|
54
|
+
synchronous_backtrace do
|
55
|
+
result = @async_client.execute(cql, *args).value
|
56
|
+
result = SynchronousPagedQueryResult.new(result) if result.is_a?(PagedQueryResult)
|
57
|
+
result
|
58
|
+
end
|
55
59
|
end
|
56
60
|
|
57
61
|
def prepare(cql)
|
@@ -59,6 +63,14 @@ module Cql
|
|
59
63
|
SynchronousPreparedStatement.new(async_statement)
|
60
64
|
end
|
61
65
|
|
66
|
+
def batch(type=:logged, options={}, &block)
|
67
|
+
if block_given?
|
68
|
+
synchronous_backtrace { @async_client.batch(type, options, &block).value }
|
69
|
+
else
|
70
|
+
SynchronousBatch.new(@async_client.batch(type, options))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
62
74
|
def async
|
63
75
|
@async_client
|
64
76
|
end
|
@@ -9,10 +9,23 @@ module Cql
|
|
9
9
|
def initialize(async_statement)
|
10
10
|
@async_statement = async_statement
|
11
11
|
@metadata = async_statement.metadata
|
12
|
+
@result_metadata = async_statement.result_metadata
|
12
13
|
end
|
13
14
|
|
14
15
|
def execute(*args)
|
15
|
-
synchronous_backtrace
|
16
|
+
synchronous_backtrace do
|
17
|
+
result = @async_statement.execute(*args).value
|
18
|
+
result = SynchronousPagedQueryResult.new(result) if result.is_a?(PagedQueryResult)
|
19
|
+
result
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def batch(type=:logged, options=nil, &block)
|
24
|
+
if block_given?
|
25
|
+
synchronous_backtrace { @async_statement.batch(type, options, &block).value }
|
26
|
+
else
|
27
|
+
SynchronousPreparedStatementBatch.new(@async_statement.batch(type, options))
|
28
|
+
end
|
16
29
|
end
|
17
30
|
|
18
31
|
def pipeline
|
@@ -24,6 +37,11 @@ module Cql
|
|
24
37
|
def async
|
25
38
|
@async_statement
|
26
39
|
end
|
40
|
+
|
41
|
+
# @private
|
42
|
+
def add_to_batch(batch, connection, bound_arguments)
|
43
|
+
@async_statement.add_to_batch(batch, connection, bound_arguments)
|
44
|
+
end
|
27
45
|
end
|
28
46
|
|
29
47
|
# @private
|
data/lib/cql/future.rb
CHANGED
@@ -88,11 +88,8 @@ module Cql
|
|
88
88
|
# @return [Cql::Future<Array>] an array of the values of the constituent
|
89
89
|
# futures
|
90
90
|
def all(*futures)
|
91
|
-
if futures.
|
92
|
-
|
93
|
-
else
|
94
|
-
resolved([])
|
95
|
-
end
|
91
|
+
return resolved([]) if futures.empty?
|
92
|
+
CombinedFuture.new(futures)
|
96
93
|
end
|
97
94
|
|
98
95
|
# Returns a future which will be resolved with the value of the first
|
@@ -102,11 +99,8 @@ module Cql
|
|
102
99
|
# @param [Array<Cql::Future>] futures the futures to monitor
|
103
100
|
# @return [Cql::Future] a future which represents the first completing future
|
104
101
|
def first(*futures)
|
105
|
-
if futures.
|
106
|
-
|
107
|
-
else
|
108
|
-
resolved
|
109
|
-
end
|
102
|
+
return resolved if futures.empty?
|
103
|
+
FirstFuture.new(futures)
|
110
104
|
end
|
111
105
|
|
112
106
|
# Creates a new pre-resolved future.
|
@@ -133,16 +127,15 @@ module Cql
|
|
133
127
|
# @example
|
134
128
|
# future2 = future1.map { |value| value * 2 }
|
135
129
|
#
|
130
|
+
# @param [Object] value the value of this future (when no block is given)
|
136
131
|
# @yieldparam [Object] value the value of this future
|
137
132
|
# @yieldreturn [Object] the transformed value
|
138
133
|
# @return [Cql::Future] a new future representing the transformed value
|
139
|
-
def map(&block)
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
p.try(v, &block)
|
134
|
+
def map(value=nil, &block)
|
135
|
+
CompletableFuture.new.tap do |f|
|
136
|
+
on_failure { |e| f.fail(e) }
|
137
|
+
on_value { |v| run(f, value, block, v) }
|
144
138
|
end
|
145
|
-
p.future
|
146
139
|
end
|
147
140
|
|
148
141
|
# Returns a new future representing a transformation of this future's value,
|
@@ -157,17 +150,10 @@ module Cql
|
|
157
150
|
# @yieldreturn [Cql::Future] a future representing the transformed value
|
158
151
|
# @return [Cql::Future] a new future representing the transformed value
|
159
152
|
def flat_map(&block)
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
begin
|
164
|
-
f = block.call(v)
|
165
|
-
p.observe(f)
|
166
|
-
rescue => e
|
167
|
-
p.fail(e)
|
168
|
-
end
|
153
|
+
CompletableFuture.new.tap do |f|
|
154
|
+
on_failure { |e| f.fail(e) }
|
155
|
+
on_value { |v| chain(f, block, v) }
|
169
156
|
end
|
170
|
-
p.future
|
171
157
|
end
|
172
158
|
|
173
159
|
# Returns a new future which represents either the value of the original
|
@@ -185,18 +171,15 @@ module Cql
|
|
185
171
|
# future1.fail(error)
|
186
172
|
# future2.value # => 'foo'
|
187
173
|
#
|
174
|
+
# @param [Object] value the value when no block is given
|
188
175
|
# @yieldparam [Object] error the error from the original future
|
189
176
|
# @yieldreturn [Object] the value of the new future
|
190
177
|
# @return [Cql::Future] a new future representing a value recovered from the error
|
191
|
-
def recover(&block)
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
end
|
196
|
-
on_value do |v|
|
197
|
-
p.fulfill(v)
|
178
|
+
def recover(value=nil, &block)
|
179
|
+
CompletableFuture.new.tap do |f|
|
180
|
+
on_failure { |e| run(f, value, block, e) }
|
181
|
+
on_value { |v| f.resolve(v) }
|
198
182
|
end
|
199
|
-
p.future
|
200
183
|
end
|
201
184
|
|
202
185
|
# Returns a new future which represents either the value of the original
|
@@ -222,19 +205,27 @@ module Cql
|
|
222
205
|
# @return [Cql::Future] a new future representing a value recovered from the
|
223
206
|
# error
|
224
207
|
def fallback(&block)
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
f = block.call(e)
|
229
|
-
p.observe(f)
|
230
|
-
rescue => e
|
231
|
-
p.fail(e)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
on_value do |v|
|
235
|
-
p.fulfill(v)
|
208
|
+
CompletableFuture.new.tap do |f|
|
209
|
+
on_failure { |e| chain(f, block, e) }
|
210
|
+
on_value { |v| f.resolve(v) }
|
236
211
|
end
|
237
|
-
|
212
|
+
end
|
213
|
+
|
214
|
+
private
|
215
|
+
|
216
|
+
def run(f, value, producer, arg)
|
217
|
+
value = producer ? producer.call(arg) : value
|
218
|
+
f.resolve(value)
|
219
|
+
rescue => e
|
220
|
+
f.fail(e)
|
221
|
+
end
|
222
|
+
|
223
|
+
def chain(f, constructor, arg)
|
224
|
+
ff = constructor.call(arg)
|
225
|
+
ff.on_failure { |e| f.fail(e) }
|
226
|
+
ff.on_value { |v| f.resolve(v) }
|
227
|
+
rescue => e
|
228
|
+
f.fail(e)
|
238
229
|
end
|
239
230
|
end
|
240
231
|
|
@@ -451,18 +442,74 @@ module Cql
|
|
451
442
|
# @private
|
452
443
|
class ResolvedFuture < Future
|
453
444
|
def initialize(value=nil)
|
454
|
-
super()
|
455
|
-
@value = value
|
456
445
|
@resolved = true
|
446
|
+
@failed = false
|
447
|
+
@value = value
|
448
|
+
@error = nil
|
449
|
+
end
|
450
|
+
|
451
|
+
def value
|
452
|
+
@value
|
453
|
+
end
|
454
|
+
|
455
|
+
def completed?
|
456
|
+
true
|
457
|
+
end
|
458
|
+
|
459
|
+
def resolved?
|
460
|
+
true
|
461
|
+
end
|
462
|
+
|
463
|
+
def failed?
|
464
|
+
false
|
465
|
+
end
|
466
|
+
|
467
|
+
def on_complete(&listener)
|
468
|
+
listener.call(self) rescue nil
|
469
|
+
end
|
470
|
+
|
471
|
+
def on_value(&listener)
|
472
|
+
listener.call(value) rescue nil
|
473
|
+
end
|
474
|
+
|
475
|
+
def on_failure
|
457
476
|
end
|
458
477
|
end
|
459
478
|
|
460
479
|
# @private
|
461
480
|
class FailedFuture < Future
|
462
481
|
def initialize(error)
|
463
|
-
|
464
|
-
@error = error
|
482
|
+
@resolved = false
|
465
483
|
@failed = true
|
484
|
+
@value = nil
|
485
|
+
@error = error
|
486
|
+
end
|
487
|
+
|
488
|
+
def value
|
489
|
+
raise @error
|
490
|
+
end
|
491
|
+
|
492
|
+
def completed?
|
493
|
+
true
|
494
|
+
end
|
495
|
+
|
496
|
+
def resolved?
|
497
|
+
false
|
498
|
+
end
|
499
|
+
|
500
|
+
def failed?
|
501
|
+
true
|
502
|
+
end
|
503
|
+
|
504
|
+
def on_complete(&listener)
|
505
|
+
listener.call(self) rescue nil
|
506
|
+
end
|
507
|
+
|
508
|
+
def on_value
|
509
|
+
end
|
510
|
+
|
511
|
+
def on_failure(&listener)
|
512
|
+
listener.call(@error) rescue nil
|
466
513
|
end
|
467
514
|
end
|
468
515
|
end
|
data/lib/cql/io/connection.rb
CHANGED
data/lib/cql/io/io_reactor.rb
CHANGED
@@ -192,7 +192,7 @@ module Cql
|
|
192
192
|
protocol_handler = @protocol_handler_factory.call(connection, self)
|
193
193
|
@io_loop.add_socket(connection)
|
194
194
|
@unblocker.unblock!
|
195
|
-
f.map
|
195
|
+
f.map(protocol_handler)
|
196
196
|
end
|
197
197
|
|
198
198
|
# Returns a future that completes after the specified number of seconds.
|
data/lib/cql/protocol.rb
CHANGED
@@ -14,9 +14,11 @@ module Cql
|
|
14
14
|
UnsupportedResultKindError = Class.new(ProtocolError)
|
15
15
|
UnsupportedColumnTypeError = Class.new(ProtocolError)
|
16
16
|
UnsupportedEventTypeError = Class.new(ProtocolError)
|
17
|
+
UnsupportedFeatureError = Class.new(ProtocolError)
|
17
18
|
UnexpectedCompressionError = Class.new(ProtocolError)
|
19
|
+
UnmaterializedRowsError = Class.new(ProtocolError)
|
18
20
|
|
19
|
-
CONSISTENCIES = [:any, :one, :two, :three, :quorum, :all, :local_quorum, :each_quorum,
|
21
|
+
CONSISTENCIES = [:any, :one, :two, :three, :quorum, :all, :local_quorum, :each_quorum, :serial, :local_serial, :local_one].freeze
|
20
22
|
|
21
23
|
module Formats
|
22
24
|
CHAR_FORMAT = 'c'.freeze
|
@@ -43,6 +45,8 @@ require 'cql/protocol/encoding'
|
|
43
45
|
require 'cql/protocol/decoding'
|
44
46
|
require 'cql/protocol/type_converter'
|
45
47
|
require 'cql/protocol/response'
|
48
|
+
require 'cql/protocol/responses/auth_challenge_response'
|
49
|
+
require 'cql/protocol/responses/auth_success_response'
|
46
50
|
require 'cql/protocol/responses/error_response'
|
47
51
|
require 'cql/protocol/responses/detailed_error_response'
|
48
52
|
require 'cql/protocol/responses/ready_response'
|
@@ -51,6 +55,7 @@ require 'cql/protocol/responses/supported_response'
|
|
51
55
|
require 'cql/protocol/responses/result_response'
|
52
56
|
require 'cql/protocol/responses/void_result_response'
|
53
57
|
require 'cql/protocol/responses/rows_result_response'
|
58
|
+
require 'cql/protocol/responses/raw_rows_result_response'
|
54
59
|
require 'cql/protocol/responses/set_keyspace_result_response'
|
55
60
|
require 'cql/protocol/responses/prepared_result_response'
|
56
61
|
require 'cql/protocol/responses/schema_change_result_response'
|
@@ -59,6 +64,8 @@ require 'cql/protocol/responses/schema_change_event_response'
|
|
59
64
|
require 'cql/protocol/responses/status_change_event_response'
|
60
65
|
require 'cql/protocol/responses/topology_change_event_response'
|
61
66
|
require 'cql/protocol/request'
|
67
|
+
require 'cql/protocol/requests/auth_response_request'
|
68
|
+
require 'cql/protocol/requests/batch_request'
|
62
69
|
require 'cql/protocol/requests/startup_request'
|
63
70
|
require 'cql/protocol/requests/credentials_request'
|
64
71
|
require 'cql/protocol/requests/options_request'
|
@@ -19,7 +19,7 @@ module Cql
|
|
19
19
|
# @return [String] the current keyspace for the underlying connection
|
20
20
|
attr_reader :keyspace
|
21
21
|
|
22
|
-
def initialize(connection, scheduler, compressor=nil)
|
22
|
+
def initialize(connection, scheduler, protocol_version, compressor=nil)
|
23
23
|
@connection = connection
|
24
24
|
@scheduler = scheduler
|
25
25
|
@compressor = compressor
|
@@ -27,7 +27,7 @@ module Cql
|
|
27
27
|
@connection.on_closed(&method(:socket_closed))
|
28
28
|
@promises = Array.new(128) { nil }
|
29
29
|
@read_buffer = ByteBuffer.new
|
30
|
-
@frame_encoder = FrameEncoder.new(@compressor)
|
30
|
+
@frame_encoder = FrameEncoder.new(protocol_version, @compressor)
|
31
31
|
@frame_decoder = FrameDecoder.new(@compressor)
|
32
32
|
@current_frame = FrameDecoder::NULL_FRAME
|
33
33
|
@request_queue_in = []
|
@@ -46,19 +46,16 @@ module Cql
|
|
46
46
|
fraction_string << number_string[number_string.length - size, number_string.length]
|
47
47
|
end
|
48
48
|
BigDecimal.new(fraction_string)
|
49
|
-
rescue
|
49
|
+
rescue DecodingError => e
|
50
50
|
raise DecodingError, e.message, e.backtrace
|
51
51
|
end
|
52
52
|
|
53
53
|
def read_long!(buffer)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
else
|
60
|
-
(hi << 32) + lo
|
61
|
-
end
|
54
|
+
top, bottom = buffer.read(8).unpack(Formats::TWO_INTS_FORMAT)
|
55
|
+
return (top << 32) | bottom if top <= 0x7fffffff
|
56
|
+
top ^= 0xffffffff
|
57
|
+
bottom ^= 0xffffffff
|
58
|
+
-((top << 32) | bottom) - 1
|
62
59
|
rescue RangeError => e
|
63
60
|
raise DecodingError, e.message, e.backtrace
|
64
61
|
end
|
@@ -76,11 +73,9 @@ module Cql
|
|
76
73
|
end
|
77
74
|
|
78
75
|
def read_int!(buffer)
|
79
|
-
|
80
|
-
if
|
81
|
-
|
82
|
-
end
|
83
|
-
val
|
76
|
+
n = buffer.read_int
|
77
|
+
return n if n <= 0x7fffffff
|
78
|
+
n - 0xffffffff - 1
|
84
79
|
rescue RangeError => e
|
85
80
|
raise DecodingError, "Not enough bytes available to decode an int: #{e.message}", e.backtrace
|
86
81
|
end
|
@@ -111,7 +106,7 @@ module Cql
|
|
111
106
|
|
112
107
|
def read_uuid!(buffer, impl=Uuid)
|
113
108
|
impl.new(read_varint!(buffer, 16, false))
|
114
|
-
rescue
|
109
|
+
rescue DecodingError => e
|
115
110
|
raise DecodingError, "Not enough bytes available to decode a UUID: #{e.message}", e.backtrace
|
116
111
|
end
|
117
112
|
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cql
|
4
4
|
module Protocol
|
5
|
+
# @private
|
5
6
|
class FrameDecoder
|
6
7
|
def initialize(compressor=nil)
|
7
8
|
@compressor = compressor
|
@@ -44,7 +45,7 @@ module Cql
|
|
44
45
|
end
|
45
46
|
extra_length = buffer.length - size
|
46
47
|
trace_id = tracing == 2 ? Decoding.read_uuid!(buffer) : nil
|
47
|
-
response = Response.decode!(opcode, buffer, trace_id)
|
48
|
+
response = Response.decode!(opcode, protocol_version, buffer, size, trace_id)
|
48
49
|
if buffer.length > extra_length
|
49
50
|
buffer.discard(buffer.length - extra_length)
|
50
51
|
end
|
@@ -2,22 +2,23 @@
|
|
2
2
|
|
3
3
|
module Cql
|
4
4
|
module Protocol
|
5
|
+
# @private
|
5
6
|
class FrameEncoder
|
6
|
-
def initialize(compressor=nil)
|
7
|
+
def initialize(protocol_version=1, compressor=nil)
|
8
|
+
@protocol_version = protocol_version
|
7
9
|
@compressor = compressor
|
8
10
|
end
|
9
11
|
|
10
12
|
def encode_frame(request, stream_id=0, buffer=nil)
|
11
13
|
raise InvalidStreamIdError, 'The stream ID must be between 0 and 127' unless 0 <= stream_id && stream_id < 128
|
12
14
|
buffer ||= ByteBuffer.new
|
13
|
-
offset = buffer.bytesize
|
14
15
|
flags = request.trace? ? 2 : 0
|
15
|
-
body = request.write(ByteBuffer.new)
|
16
|
+
body = request.write(@protocol_version, ByteBuffer.new)
|
16
17
|
if @compressor && request.compressable? && @compressor.compress?(body)
|
17
18
|
flags |= 1
|
18
19
|
body = @compressor.compress(body)
|
19
20
|
end
|
20
|
-
header = [
|
21
|
+
header = [@protocol_version, flags, stream_id, request.opcode, body.bytesize]
|
21
22
|
buffer << header.pack(Formats::HEADER_FORMAT)
|
22
23
|
buffer << body
|
23
24
|
buffer
|