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,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Cql
|
4
|
+
module Protocol
|
5
|
+
class AuthResponseRequest < Request
|
6
|
+
attr_reader :token
|
7
|
+
|
8
|
+
def initialize(token)
|
9
|
+
super(0x0f)
|
10
|
+
@token = token
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(protocol_version, io)
|
14
|
+
write_bytes(io, @token)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
%(AUTH_RESPONSE #{@token.bytesize})
|
19
|
+
end
|
20
|
+
|
21
|
+
def eql?(other)
|
22
|
+
self.token == other.token
|
23
|
+
end
|
24
|
+
alias_method :==, :eql?
|
25
|
+
|
26
|
+
def hash
|
27
|
+
@token.hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Cql
|
4
|
+
module Protocol
|
5
|
+
class BatchRequest < Request
|
6
|
+
LOGGED_TYPE = 0
|
7
|
+
UNLOGGED_TYPE = 1
|
8
|
+
COUNTER_TYPE = 2
|
9
|
+
|
10
|
+
attr_reader :type, :consistency, :part_count
|
11
|
+
|
12
|
+
def initialize(type, consistency, trace=false)
|
13
|
+
super(0x0D, trace)
|
14
|
+
@type = type
|
15
|
+
@part_count = 0
|
16
|
+
@encoded_queries = ByteBuffer.new
|
17
|
+
@consistency = consistency
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_query(cql, values=nil, type_hints=nil)
|
21
|
+
@encoded_queries << QUERY_KIND
|
22
|
+
write_long_string(@encoded_queries, cql)
|
23
|
+
QueryRequest.encode_values(@encoded_queries, values, type_hints)
|
24
|
+
@part_count += 1
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_prepared(id, metadata, values)
|
29
|
+
@encoded_queries << PREPARED_KIND
|
30
|
+
write_short_bytes(@encoded_queries, id)
|
31
|
+
ExecuteRequest.encode_values(@encoded_queries, metadata, values)
|
32
|
+
@part_count += 1
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def write(protocol_version, io)
|
37
|
+
io << @type.chr
|
38
|
+
write_short(io, @part_count)
|
39
|
+
io << @encoded_queries
|
40
|
+
write_consistency(io, @consistency)
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
type_str = case @type
|
45
|
+
when LOGGED_TYPE then 'LOGGED'
|
46
|
+
when UNLOGGED_TYPE then 'UNLOGGED'
|
47
|
+
when COUNTER_TYPE then 'COUNTER'
|
48
|
+
end
|
49
|
+
%(BATCH #{type_str} #{@part_count} #{@consistency.to_s.upcase})
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
TYPE_CONVERTER = TypeConverter.new
|
55
|
+
QUERY_KIND = "\x00".freeze
|
56
|
+
PREPARED_KIND = "\x01".freeze
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -3,20 +3,47 @@
|
|
3
3
|
module Cql
|
4
4
|
module Protocol
|
5
5
|
class ExecuteRequest < Request
|
6
|
-
attr_reader :id, :metadata, :values, :consistency
|
6
|
+
attr_reader :id, :metadata, :values, :request_metadata, :consistency, :serial_consistency, :page_size, :paging_state
|
7
7
|
|
8
|
-
def initialize(id, metadata, values, consistency, trace=false)
|
8
|
+
def initialize(id, metadata, values, request_metadata, consistency, serial_consistency=nil, page_size=nil, paging_state=nil, trace=false)
|
9
9
|
raise ArgumentError, "Metadata for #{metadata.size} columns, but #{values.size} values given" if metadata.size != values.size
|
10
|
+
raise ArgumentError, %(No such consistency: #{consistency.inspect}) if consistency.nil? || !CONSISTENCIES.include?(consistency)
|
11
|
+
raise ArgumentError, %(No such consistency: #{serial_consistency.inspect}) unless serial_consistency.nil? || CONSISTENCIES.include?(serial_consistency)
|
12
|
+
raise ArgumentError, %(Paging state given but no page size) if paging_state && !page_size
|
10
13
|
super(10, trace)
|
11
14
|
@id = id
|
12
15
|
@metadata = metadata
|
13
16
|
@values = values
|
17
|
+
@request_metadata = request_metadata
|
14
18
|
@consistency = consistency
|
15
|
-
@
|
19
|
+
@serial_consistency = serial_consistency
|
20
|
+
@page_size = page_size
|
21
|
+
@paging_state = paging_state
|
22
|
+
@encoded_values = self.class.encode_values('', @metadata, @values)
|
16
23
|
end
|
17
24
|
|
18
|
-
def write(io)
|
19
|
-
io
|
25
|
+
def write(protocol_version, io)
|
26
|
+
write_short_bytes(io, @id)
|
27
|
+
if protocol_version > 1
|
28
|
+
write_consistency(io, @consistency)
|
29
|
+
flags = 0
|
30
|
+
flags |= 0x01 if @values.size > 0
|
31
|
+
flags |= 0x02 unless @request_metadata
|
32
|
+
flags |= 0x04 if @page_size
|
33
|
+
flags |= 0x08 if @paging_state
|
34
|
+
flags |= 0x10 if @serial_consistency
|
35
|
+
io << flags.chr
|
36
|
+
if @values.size > 0
|
37
|
+
io << @encoded_values
|
38
|
+
end
|
39
|
+
write_int(io, @page_size) if @page_size
|
40
|
+
write_bytes(io, @paging_state) if @paging_state
|
41
|
+
write_consistency(io, @serial_consistency) if @serial_consistency
|
42
|
+
io
|
43
|
+
else
|
44
|
+
io << @encoded_values
|
45
|
+
write_consistency(io, @consistency)
|
46
|
+
end
|
20
47
|
end
|
21
48
|
|
22
49
|
def to_s
|
@@ -25,7 +52,7 @@ module Cql
|
|
25
52
|
end
|
26
53
|
|
27
54
|
def eql?(rq)
|
28
|
-
self.class === rq && rq.id == self.id && rq.metadata == self.metadata && rq.values == self.values && rq.consistency == self.consistency
|
55
|
+
self.class === rq && rq.id == self.id && rq.metadata == self.metadata && rq.values == self.values && rq.consistency == self.consistency && rq.serial_consistency == self.serial_consistency && rq.page_size == self.page_size && rq.paging_state == self.paging_state
|
29
56
|
end
|
30
57
|
alias_method :==, :eql?
|
31
58
|
|
@@ -36,23 +63,24 @@ module Cql
|
|
36
63
|
h = ((h & 33554431) * 31) ^ @metadata.hash
|
37
64
|
h = ((h & 33554431) * 31) ^ @values.hash
|
38
65
|
h = ((h & 33554431) * 31) ^ @consistency.hash
|
66
|
+
h = ((h & 33554431) * 31) ^ @serial_consistency.hash
|
67
|
+
h = ((h & 33554431) * 31) ^ @page_size.hash
|
68
|
+
h = ((h & 33554431) * 31) ^ @paging_state.hash
|
39
69
|
h
|
40
70
|
end
|
41
71
|
end
|
42
72
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
type_converter = TypeConverter.new
|
48
|
-
write_short_bytes(buffer, @id)
|
49
|
-
write_short(buffer, @metadata.size)
|
50
|
-
@metadata.each_with_index do |(_, _, _, type), index|
|
51
|
-
type_converter.to_bytes(buffer, type, @values[index])
|
73
|
+
def self.encode_values(buffer, metadata, values)
|
74
|
+
Encoding.write_short(buffer, metadata.size)
|
75
|
+
metadata.each_with_index do |(_, _, _, type), index|
|
76
|
+
TYPE_CONVERTER.to_bytes(buffer, type, values[index])
|
52
77
|
end
|
53
|
-
|
54
|
-
buffer.to_s
|
78
|
+
buffer
|
55
79
|
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
TYPE_CONVERTER = TypeConverter.new
|
56
84
|
end
|
57
85
|
end
|
58
86
|
end
|
@@ -3,19 +3,45 @@
|
|
3
3
|
module Cql
|
4
4
|
module Protocol
|
5
5
|
class QueryRequest < Request
|
6
|
-
attr_reader :cql, :consistency
|
6
|
+
attr_reader :cql, :values, :type_hints, :consistency, :serial_consistency, :page_size, :paging_state
|
7
7
|
|
8
|
-
def initialize(cql, consistency, trace=false)
|
8
|
+
def initialize(cql, values, type_hints, consistency, serial_consistency=nil, page_size=nil, paging_state=nil, trace=false)
|
9
9
|
raise ArgumentError, %(No CQL given!) unless cql
|
10
10
|
raise ArgumentError, %(No such consistency: #{consistency.inspect}) if consistency.nil? || !CONSISTENCIES.include?(consistency)
|
11
|
+
raise ArgumentError, %(No such consistency: #{serial_consistency.inspect}) unless serial_consistency.nil? || CONSISTENCIES.include?(serial_consistency)
|
12
|
+
raise ArgumentError, %(Bound values and type hints must have the same number of elements (got #{values.size} values and #{type_hints.size} hints)) if values && type_hints && values.size != type_hints.size
|
13
|
+
raise ArgumentError, %(Paging state given but no page size) if paging_state && !page_size
|
11
14
|
super(7, trace)
|
12
15
|
@cql = cql
|
16
|
+
@values = values || EMPTY_LIST
|
17
|
+
@type_hints = type_hints || EMPTY_LIST
|
18
|
+
@encoded_values = self.class.encode_values('', @values, @type_hints)
|
13
19
|
@consistency = consistency
|
20
|
+
@serial_consistency = serial_consistency
|
21
|
+
@page_size = page_size
|
22
|
+
@paging_state = paging_state
|
14
23
|
end
|
15
24
|
|
16
|
-
def write(io)
|
25
|
+
def write(protocol_version, io)
|
17
26
|
write_long_string(io, @cql)
|
18
27
|
write_consistency(io, @consistency)
|
28
|
+
if protocol_version > 1
|
29
|
+
flags = 0
|
30
|
+
flags |= 0x04 if @page_size
|
31
|
+
flags |= 0x08 if @paging_state
|
32
|
+
flags |= 0x10 if @serial_consistency
|
33
|
+
if @values && @values.size > 0
|
34
|
+
flags |= 0x01
|
35
|
+
io << flags.chr
|
36
|
+
io << @encoded_values
|
37
|
+
else
|
38
|
+
io << flags.chr
|
39
|
+
end
|
40
|
+
write_int(io, @page_size) if @page_size
|
41
|
+
write_bytes(io, @paging_state) if @paging_state
|
42
|
+
write_consistency(io, @serial_consistency) if @serial_consistency
|
43
|
+
end
|
44
|
+
io
|
19
45
|
end
|
20
46
|
|
21
47
|
def to_s
|
@@ -23,13 +49,79 @@ module Cql
|
|
23
49
|
end
|
24
50
|
|
25
51
|
def eql?(rq)
|
26
|
-
self.class === rq &&
|
52
|
+
self.class === rq &&
|
53
|
+
rq.cql == self.cql &&
|
54
|
+
rq.values == self.values &&
|
55
|
+
rq.type_hints == self.type_hints &&
|
56
|
+
rq.consistency == self.consistency &&
|
57
|
+
rq.serial_consistency == self.serial_consistency &&
|
58
|
+
rq.page_size == self.page_size &&
|
59
|
+
rq.paging_state == self.paging_state
|
27
60
|
end
|
28
61
|
alias_method :==, :eql?
|
29
62
|
|
30
63
|
def hash
|
31
|
-
|
64
|
+
h = 0xcbf29ce484222325
|
65
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @cql.hash))
|
66
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @values.hash))
|
67
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @type_hints.hash))
|
68
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @consistency.hash))
|
69
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @serial_consistency.hash))
|
70
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @page_size.hash))
|
71
|
+
h = 0xffffffffffffffff & (0x100000001b3 * (h ^ @paging_state.hash))
|
72
|
+
h
|
32
73
|
end
|
74
|
+
|
75
|
+
def self.encode_values(buffer, values, hints)
|
76
|
+
if values && values.size > 0
|
77
|
+
Encoding.write_short(buffer, values.size)
|
78
|
+
values.each_with_index do |value, index|
|
79
|
+
type = (hints && hints[index]) || guess_type(value)
|
80
|
+
raise EncodingError, "Could not guess a suitable type for #{value.inspect}" unless type
|
81
|
+
TYPE_CONVERTER.to_bytes(buffer, type, value)
|
82
|
+
end
|
83
|
+
buffer
|
84
|
+
else
|
85
|
+
Encoding.write_short(buffer, 0)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def self.guess_type(value)
|
92
|
+
type = TYPE_GUESSES[value.class]
|
93
|
+
if type == :map
|
94
|
+
pair = value.first
|
95
|
+
[type, guess_type(pair[0]), guess_type(pair[1])]
|
96
|
+
elsif type == :list
|
97
|
+
[type, guess_type(value.first)]
|
98
|
+
elsif type == :set
|
99
|
+
[type, guess_type(value.first)]
|
100
|
+
else
|
101
|
+
type
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
TYPE_GUESSES = {
|
106
|
+
String => :varchar,
|
107
|
+
Fixnum => :bigint,
|
108
|
+
Float => :double,
|
109
|
+
Bignum => :varint,
|
110
|
+
BigDecimal => :decimal,
|
111
|
+
TrueClass => :boolean,
|
112
|
+
FalseClass => :boolean,
|
113
|
+
NilClass => :bigint,
|
114
|
+
Uuid => :uuid,
|
115
|
+
TimeUuid => :uuid,
|
116
|
+
IPAddr => :inet,
|
117
|
+
Time => :timestamp,
|
118
|
+
Hash => :map,
|
119
|
+
Array => :list,
|
120
|
+
Set => :set,
|
121
|
+
}.freeze
|
122
|
+
TYPE_CONVERTER = TypeConverter.new
|
123
|
+
EMPTY_LIST = [].freeze
|
124
|
+
NO_FLAGS = "\x00".freeze
|
33
125
|
end
|
34
126
|
end
|
35
127
|
end
|
@@ -5,9 +5,10 @@ module Cql
|
|
5
5
|
class StartupRequest < Request
|
6
6
|
attr_reader :options
|
7
7
|
|
8
|
-
def initialize(cql_version
|
8
|
+
def initialize(cql_version, compression=nil)
|
9
9
|
super(1)
|
10
|
-
|
10
|
+
raise ArgumentError, "Invalid CQL version: #{cql_version.inspect}" unless cql_version
|
11
|
+
@options = {CQL_VERSION => cql_version}
|
11
12
|
@options[COMPRESSION] = compression if compression
|
12
13
|
end
|
13
14
|
|
@@ -15,7 +16,7 @@ module Cql
|
|
15
16
|
false
|
16
17
|
end
|
17
18
|
|
18
|
-
def write(io)
|
19
|
+
def write(protocol_version, io)
|
19
20
|
write_string_map(io, @options)
|
20
21
|
end
|
21
22
|
|
@@ -25,7 +26,6 @@ module Cql
|
|
25
26
|
|
26
27
|
private
|
27
28
|
|
28
|
-
DEFAULT_CQL_VERSION = '3.0.0'.freeze
|
29
29
|
CQL_VERSION = 'CQL_VERSION'.freeze
|
30
30
|
COMPRESSION = 'COMPRESSION'.freeze
|
31
31
|
end
|
@@ -5,10 +5,10 @@ module Cql
|
|
5
5
|
class Response
|
6
6
|
extend Decoding
|
7
7
|
|
8
|
-
def self.decode!(opcode, buffer, trace_id)
|
8
|
+
def self.decode!(opcode, protocol_version, buffer, length, trace_id)
|
9
9
|
response_class = RESPONSE_TYPES[opcode]
|
10
10
|
if response_class
|
11
|
-
response_class.decode!(buffer, trace_id)
|
11
|
+
response_class.decode!(protocol_version, buffer, length, trace_id)
|
12
12
|
else
|
13
13
|
raise UnsupportedOperationError, "The operation #{opcode} is not supported"
|
14
14
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Cql
|
4
|
+
module Protocol
|
5
|
+
class AuthChallengeResponse < Response
|
6
|
+
attr_reader :token
|
7
|
+
|
8
|
+
def self.decode!(protocol_version, buffer, length, trace_id=nil)
|
9
|
+
new(read_bytes!(buffer))
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(token)
|
13
|
+
@token = token
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
%(AUTH_CHALLENGE #{@token.bytesize})
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
RESPONSE_TYPES[0x0e] = self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Cql
|
4
|
+
module Protocol
|
5
|
+
class AuthSuccessResponse < Response
|
6
|
+
attr_reader :token
|
7
|
+
|
8
|
+
def self.decode!(protocol_version, buffer, length, trace_id=nil)
|
9
|
+
new(read_bytes!(buffer))
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(token)
|
13
|
+
@token = token
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
%(AUTH_SUCCESS #{@token.bytesize})
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
RESPONSE_TYPES[0x10] = self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|