cassandra-driver 2.1.7-java → 3.0.0.beta.1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -53
- data/lib/cassandra.rb +22 -3
- data/lib/cassandra/aggregate.rb +109 -0
- data/lib/cassandra/argument.rb +51 -0
- data/lib/cassandra/auth/providers/password.rb +7 -4
- data/lib/cassandra/cluster.rb +14 -3
- data/lib/cassandra/cluster/client.rb +56 -34
- data/lib/cassandra/cluster/connector.rb +6 -6
- data/lib/cassandra/cluster/control_connection.rb +204 -251
- data/lib/cassandra/cluster/metadata.rb +2 -0
- data/lib/cassandra/cluster/schema.rb +131 -209
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +104 -0
- data/lib/cassandra/cluster/schema/fetchers.rb +1174 -0
- data/lib/cassandra/cluster/schema/{type_parser.rb → fqcn_type_parser.rb} +7 -3
- data/lib/cassandra/column.rb +2 -2
- data/lib/cassandra/driver.rb +27 -9
- data/lib/cassandra/errors.rb +179 -25
- data/lib/cassandra/execution/info.rb +8 -1
- data/lib/cassandra/execution/options.rb +34 -0
- data/lib/cassandra/execution/trace.rb +42 -10
- data/lib/cassandra/function.rb +150 -0
- data/lib/cassandra/future.rb +66 -35
- data/lib/cassandra/host.rb +7 -4
- data/lib/cassandra/keyspace.rb +112 -13
- data/lib/cassandra/load_balancing.rb +1 -1
- data/lib/cassandra/protocol.rb +9 -3
- data/lib/cassandra/protocol/coder.rb +434 -155
- data/lib/cassandra/protocol/cql_byte_buffer.rb +43 -0
- data/lib/cassandra/protocol/cql_protocol_handler.rb +4 -1
- data/lib/cassandra/protocol/request.rb +4 -0
- data/lib/cassandra/protocol/requests/auth_response_request.rb +5 -1
- data/lib/cassandra/protocol/requests/batch_request.rb +7 -2
- data/lib/cassandra/protocol/requests/credentials_request.rb +5 -1
- data/lib/cassandra/protocol/requests/execute_request.rb +16 -10
- data/lib/cassandra/protocol/requests/prepare_request.rb +12 -3
- data/lib/cassandra/protocol/requests/query_request.rb +20 -11
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +4 -4
- data/lib/cassandra/protocol/responses/error_response.rb +14 -14
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +41 -0
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +12 -9
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +5 -3
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +43 -0
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +4 -4
- data/lib/cassandra/protocol/responses/ready_response.rb +5 -1
- data/lib/cassandra/protocol/responses/result_response.rb +3 -3
- data/lib/cassandra/protocol/responses/rows_result_response.rb +2 -2
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +25 -24
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +20 -23
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +2 -2
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +4 -4
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +4 -4
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +45 -0
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +4 -4
- data/lib/cassandra/protocol/v1.rb +38 -13
- data/lib/cassandra/protocol/v3.rb +34 -29
- data/lib/cassandra/protocol/v4.rb +334 -0
- data/lib/cassandra/result.rb +10 -9
- data/lib/cassandra/retry.rb +17 -3
- data/lib/cassandra/retry/policies/default.rb +9 -3
- data/lib/cassandra/session.rb +15 -7
- data/lib/cassandra/statement.rb +5 -0
- data/lib/cassandra/statements/batch.rb +36 -12
- data/lib/cassandra/statements/bound.rb +2 -1
- data/lib/cassandra/statements/prepared.rb +106 -35
- data/lib/cassandra/statements/simple.rb +4 -2
- data/lib/cassandra/table.rb +70 -105
- data/lib/cassandra/time.rb +98 -0
- data/lib/cassandra/time_uuid.rb +1 -1
- data/lib/cassandra/tuple.rb +7 -0
- data/lib/cassandra/types.rb +472 -272
- data/lib/cassandra/udt.rb +10 -0
- data/lib/cassandra/util.rb +32 -1
- data/lib/cassandra/uuid.rb +6 -1
- data/lib/cassandra/uuid/generator.rb +7 -7
- data/lib/cassandra/version.rb +1 -1
- data/lib/cassandra_murmur3.jar +0 -0
- data/lib/datastax/cassandra.rb +5 -2
- metadata +27 -17
data/lib/cassandra/host.rb
CHANGED
@@ -61,17 +61,20 @@ module Cassandra
|
|
61
61
|
|
62
62
|
# @private
|
63
63
|
def hash
|
64
|
-
@hash ||=
|
64
|
+
@hash ||= begin
|
65
|
+
h = 17
|
66
|
+
h = 31 * h + @ip.hash
|
67
|
+
h
|
68
|
+
end
|
65
69
|
end
|
66
70
|
|
67
|
-
# @
|
68
|
-
# @return [Boolean] whether this host has the same ip as the other
|
71
|
+
# @private
|
69
72
|
def eql?(other)
|
70
73
|
other.eql?(@ip)
|
71
74
|
end
|
72
75
|
alias :== :eql?
|
73
76
|
|
74
|
-
# @
|
77
|
+
# @private
|
75
78
|
def inspect
|
76
79
|
"#<#{self.class.name}:0x#{self.object_id.to_s(16)} @ip=#{@ip}>"
|
77
80
|
end
|
data/lib/cassandra/keyspace.rb
CHANGED
@@ -51,12 +51,14 @@ module Cassandra
|
|
51
51
|
attr_reader :replication
|
52
52
|
|
53
53
|
# @private
|
54
|
-
def initialize(name, durable_writes, replication, tables, types)
|
54
|
+
def initialize(name, durable_writes, replication, tables, types, functions, aggregates)
|
55
55
|
@name = name
|
56
56
|
@durable_writes = durable_writes
|
57
57
|
@replication = replication
|
58
58
|
@tables = tables
|
59
59
|
@types = types
|
60
|
+
@functions = functions
|
61
|
+
@aggregates = aggregates
|
60
62
|
end
|
61
63
|
|
62
64
|
# @return [Boolean] whether durables writes are enabled for this keyspace
|
@@ -121,23 +123,88 @@ module Cassandra
|
|
121
123
|
end
|
122
124
|
alias :types :each_type
|
123
125
|
|
124
|
-
# @return [
|
126
|
+
# @return [Boolean] whether this keyspace has a function with the given name and arguments
|
127
|
+
# @param name [String] function name
|
128
|
+
# @param args [Array<String>] (var-args style) function argument types
|
129
|
+
def has_function?(name, *args)
|
130
|
+
@functions.has_key?([name.downcase, args])
|
131
|
+
end
|
132
|
+
|
133
|
+
# @return [Cassandra::Function, nil] a function or nil
|
134
|
+
# @param name [String] function name
|
135
|
+
# @param args [Array<String>] (var-args style) function argument types
|
136
|
+
def function(name, *args)
|
137
|
+
# The functions_hash datastructure is a hash <[func-name, args], Function>.
|
138
|
+
# So construct the array-key we're looking for.
|
139
|
+
@functions[[name.downcase, args]]
|
140
|
+
end
|
141
|
+
|
142
|
+
# Yield or enumerate each function defined in this keyspace
|
143
|
+
# @overload each_function
|
144
|
+
# @yieldparam function [Cassandra::Function] current function
|
145
|
+
# @return [Cassandra::Keyspace] self
|
146
|
+
# @overload each_function
|
147
|
+
# @return [Array<Cassandra::Function>] a list of functions
|
148
|
+
def each_function(&block)
|
149
|
+
if block_given?
|
150
|
+
@functions.each_value(&block)
|
151
|
+
self
|
152
|
+
else
|
153
|
+
@functions.values
|
154
|
+
end
|
155
|
+
end
|
156
|
+
alias :functions :each_function
|
157
|
+
|
158
|
+
# @return [Boolean] whether this keyspace has an aggregate with the given
|
159
|
+
# name and arguments
|
160
|
+
# @param name [String] aggregate name
|
161
|
+
# @param args [Array<String>] (var-args style) aggregate function argument types
|
162
|
+
def has_aggregate?(name, *args)
|
163
|
+
@aggregates.has_key?([name.downcase, args])
|
164
|
+
end
|
165
|
+
|
166
|
+
# @return [Cassandra::Aggregate, nil] an aggregate or nil
|
167
|
+
# @param name [String] aggregate name
|
168
|
+
# @param args [Array<String>] (var-args style) aggregate function argument types
|
169
|
+
def aggregate(name, *args)
|
170
|
+
@aggregates[[name.downcase, args]]
|
171
|
+
end
|
172
|
+
|
173
|
+
# Yield or enumerate each aggregate defined in this keyspace
|
174
|
+
# @overload each_aggregate
|
175
|
+
# @yieldparam aggregate [Cassandra::Aggregate] current aggregate
|
176
|
+
# @return [Cassandra::Keyspace] self
|
177
|
+
# @overload each_aggregate
|
178
|
+
# @return [Array<Cassandra::Aggregate>] a list of aggregates
|
179
|
+
def each_aggregate(&block)
|
180
|
+
if block_given?
|
181
|
+
@aggregates.each_value(&block)
|
182
|
+
self
|
183
|
+
else
|
184
|
+
@aggregates.values
|
185
|
+
end
|
186
|
+
end
|
187
|
+
alias :aggregates :each_aggregate
|
188
|
+
|
189
|
+
# @return [String] a cql representation of this keyspace
|
125
190
|
def to_cql
|
126
|
-
"CREATE KEYSPACE #{Util.escape_name(@name)} WITH
|
191
|
+
"CREATE KEYSPACE #{Util.escape_name(@name)} WITH replication = #{@replication.to_cql} AND durable_writes = #{@durable_writes};"
|
127
192
|
end
|
128
193
|
|
129
|
-
# @
|
194
|
+
# @private
|
130
195
|
def eql?(other)
|
131
196
|
other.is_a?(Keyspace) &&
|
132
197
|
@name == other.name &&
|
133
198
|
@durable_writes == other.durable_writes &&
|
134
199
|
@replication == other.replication &&
|
135
200
|
@tables == other.raw_tables &&
|
136
|
-
@types == other.raw_types
|
201
|
+
@types == other.raw_types &&
|
202
|
+
@functions == other.raw_functions &&
|
203
|
+
@aggregates == other.raw_aggregates
|
137
204
|
end
|
138
205
|
alias :== :eql?
|
139
206
|
|
140
|
-
# @
|
207
|
+
# @private
|
141
208
|
def inspect
|
142
209
|
"#<#{self.class.name}:0x#{self.object_id.to_s(16)} @name=#{@name}>"
|
143
210
|
end
|
@@ -146,34 +213,56 @@ module Cassandra
|
|
146
213
|
def update_table(table)
|
147
214
|
tables = @tables.dup
|
148
215
|
tables[table.name] = table
|
149
|
-
Keyspace.new(@name, @durable_writes, @replication, tables, @types)
|
216
|
+
Keyspace.new(@name, @durable_writes, @replication, tables, @types, @functions, @aggregates)
|
150
217
|
end
|
151
218
|
|
152
219
|
# @private
|
153
220
|
def delete_table(table_name)
|
154
221
|
tables = @tables.dup
|
155
222
|
tables.delete(table_name)
|
156
|
-
Keyspace.new(@name, @durable_writes, @replication, tables, @types)
|
223
|
+
Keyspace.new(@name, @durable_writes, @replication, tables, @types, @functions, @aggregates)
|
157
224
|
end
|
158
225
|
|
159
226
|
# @private
|
160
227
|
def update_type(type)
|
161
228
|
types = @types.dup
|
162
229
|
types[type.name] = type
|
163
|
-
Keyspace.new(@name, @durable_writes, @replication, @tables, types)
|
230
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, types, @functions, @aggregates)
|
164
231
|
end
|
165
232
|
|
166
233
|
# @private
|
167
234
|
def delete_type(type_name)
|
168
235
|
types = @types.dup
|
169
236
|
types.delete(type_name)
|
170
|
-
Keyspace.new(@name, @durable_writes, @replication, @tables, types)
|
237
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, types, @functions, @aggregates)
|
238
|
+
end
|
239
|
+
|
240
|
+
# @private
|
241
|
+
def update_function(function)
|
242
|
+
functions = @functions.dup
|
243
|
+
functions[[function.name, function.argument_types]] = function
|
244
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, @types, functions, @aggregates)
|
245
|
+
end
|
246
|
+
|
247
|
+
# @private
|
248
|
+
def delete_function(function_name, function_args)
|
249
|
+
functions = @functions.dup
|
250
|
+
functions.delete([function_name, function_args])
|
251
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, @types, functions, @aggregates)
|
171
252
|
end
|
172
253
|
|
173
254
|
# @private
|
174
|
-
def
|
175
|
-
|
176
|
-
|
255
|
+
def update_aggregate(aggregate)
|
256
|
+
aggregates = @aggregates.dup
|
257
|
+
aggregates[[aggregate.name, aggregate.argument_types]] = aggregate
|
258
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, @types, @functions, aggregates)
|
259
|
+
end
|
260
|
+
|
261
|
+
# @private
|
262
|
+
def delete_aggregate(aggregate_name, aggregate_args)
|
263
|
+
aggregates = @aggregates.dup
|
264
|
+
aggregates.delete([aggregate_name, aggregate_args])
|
265
|
+
Keyspace.new(@name, @durable_writes, @replication, @tables, @types, @functions, aggregates)
|
177
266
|
end
|
178
267
|
|
179
268
|
# @private
|
@@ -191,5 +280,15 @@ module Cassandra
|
|
191
280
|
def raw_types
|
192
281
|
@types
|
193
282
|
end
|
283
|
+
|
284
|
+
# @private
|
285
|
+
def raw_functions
|
286
|
+
@functions
|
287
|
+
end
|
288
|
+
|
289
|
+
# @private
|
290
|
+
def raw_aggregates
|
291
|
+
@aggregates
|
292
|
+
end
|
194
293
|
end
|
195
294
|
end
|
data/lib/cassandra/protocol.rb
CHANGED
@@ -36,9 +36,11 @@ module Cassandra
|
|
36
36
|
PROTOCOL_VERSION = "\x01".freeze
|
37
37
|
COMPRESSION_OFF = "\x00".freeze
|
38
38
|
|
39
|
-
SCHEMA_CHANGE_TARGET_KEYSPACE
|
40
|
-
SCHEMA_CHANGE_TARGET_TABLE
|
41
|
-
SCHEMA_CHANGE_TARGET_UDT
|
39
|
+
SCHEMA_CHANGE_TARGET_KEYSPACE = 'KEYSPACE'.freeze
|
40
|
+
SCHEMA_CHANGE_TARGET_TABLE = 'TABLE'.freeze
|
41
|
+
SCHEMA_CHANGE_TARGET_UDT = 'TYPE'.freeze
|
42
|
+
SCHEMA_CHANGE_TARGET_FUNCTION = 'FUNCTION'.freeze
|
43
|
+
SCHEMA_CHANGE_TARGET_AGGREGATE = 'AGGREGATE'.freeze
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
@@ -67,6 +69,9 @@ require 'cassandra/protocol/responses/event_response'
|
|
67
69
|
require 'cassandra/protocol/responses/schema_change_event_response'
|
68
70
|
require 'cassandra/protocol/responses/status_change_event_response'
|
69
71
|
require 'cassandra/protocol/responses/topology_change_event_response'
|
72
|
+
require 'cassandra/protocol/responses/read_failure_error_response'
|
73
|
+
require 'cassandra/protocol/responses/write_failure_error_response'
|
74
|
+
require 'cassandra/protocol/responses/function_failure_error_response'
|
70
75
|
require 'cassandra/protocol/request'
|
71
76
|
require 'cassandra/protocol/requests/auth_response_request'
|
72
77
|
require 'cassandra/protocol/requests/batch_request'
|
@@ -81,4 +86,5 @@ require 'cassandra/protocol/requests/execute_request'
|
|
81
86
|
require 'cassandra/protocol/cql_protocol_handler'
|
82
87
|
require 'cassandra/protocol/v1'
|
83
88
|
require 'cassandra/protocol/v3'
|
89
|
+
require 'cassandra/protocol/v4'
|
84
90
|
require 'cassandra/protocol/coder'
|
@@ -23,12 +23,12 @@ module Cassandra
|
|
23
23
|
HAS_MORE_PAGES_FLAG = 0x02
|
24
24
|
NO_METADATA_FLAG = 0x04
|
25
25
|
|
26
|
-
def
|
26
|
+
def write_values_v4(buffer, values, types, names = EMPTY_LIST)
|
27
27
|
if values && values.size > 0
|
28
28
|
buffer.append_short(values.size)
|
29
29
|
values.zip(types, names) do |(value, type, name)|
|
30
30
|
buffer.append_string(name) if name
|
31
|
-
|
31
|
+
write_value_v4(buffer, value, type)
|
32
32
|
end
|
33
33
|
buffer
|
34
34
|
else
|
@@ -36,7 +36,60 @@ module Cassandra
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def write_list_v4(buffer, list, type)
|
40
|
+
raw = CqlByteBuffer.new
|
41
|
+
|
42
|
+
raw.append_int(list.size)
|
43
|
+
list.each do |element|
|
44
|
+
write_value_v4(raw, element, type)
|
45
|
+
end
|
46
|
+
|
47
|
+
buffer.append_bytes(raw)
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_map_v4(buffer, map, key_type, value_type)
|
51
|
+
raw = CqlByteBuffer.new
|
52
|
+
|
53
|
+
raw.append_int(map.size)
|
54
|
+
map.each do |key, value|
|
55
|
+
write_value_v4(raw, key, key_type)
|
56
|
+
write_value_v4(raw, value, value_type)
|
57
|
+
end
|
58
|
+
|
59
|
+
buffer.append_bytes(raw)
|
60
|
+
end
|
61
|
+
|
62
|
+
def write_udt_v4(buffer, value, fields)
|
63
|
+
raw = CqlByteBuffer.new
|
64
|
+
|
65
|
+
fields.each do |field|
|
66
|
+
write_value_v4(raw, value[field.name], field.type)
|
67
|
+
end
|
68
|
+
|
69
|
+
buffer.append_bytes(raw)
|
70
|
+
end
|
71
|
+
|
72
|
+
def write_tuple_v4(buffer, value, members)
|
73
|
+
raw = CqlByteBuffer.new
|
74
|
+
|
75
|
+
members.each_with_index do |type, i|
|
76
|
+
write_value_v4(raw, value[i], type)
|
77
|
+
end
|
78
|
+
|
79
|
+
buffer.append_bytes(raw)
|
80
|
+
end
|
81
|
+
|
82
|
+
def write_value_v4(buffer, value, type)
|
83
|
+
if value.nil?
|
84
|
+
buffer.append_int(-1)
|
85
|
+
return
|
86
|
+
end
|
87
|
+
|
88
|
+
if NOT_SET.eql?(value)
|
89
|
+
buffer.append_int(-2)
|
90
|
+
return
|
91
|
+
end
|
92
|
+
|
40
93
|
case type.kind
|
41
94
|
when :ascii then write_ascii(buffer, value)
|
42
95
|
when :bigint, :counter then write_bigint(buffer, value)
|
@@ -49,64 +102,285 @@ module Cassandra
|
|
49
102
|
when :inet then write_inet(buffer, value)
|
50
103
|
when :timestamp then write_timestamp(buffer, value)
|
51
104
|
when :uuid, :timeuuid then write_uuid(buffer, value)
|
52
|
-
when :
|
105
|
+
when :text then write_text(buffer, value)
|
53
106
|
when :varint then write_varint(buffer, value)
|
54
|
-
when :
|
55
|
-
|
56
|
-
|
57
|
-
|
107
|
+
when :tinyint then write_tinyint(buffer, value)
|
108
|
+
when :smallint then write_smallint(buffer, value)
|
109
|
+
when :time then write_time(buffer, value)
|
110
|
+
when :date then write_date(buffer, value)
|
111
|
+
when :list, :set then write_list_v4(buffer, value, type.value_type)
|
112
|
+
when :map then write_map_v4(buffer, value, type.key_type, type.value_type)
|
113
|
+
when :udt then write_udt_v4(buffer, value, type.fields)
|
114
|
+
when :tuple then write_tuple_v4(buffer, value, type.members)
|
115
|
+
else
|
116
|
+
raise Errors::EncodingError, %(Unsupported value type: #{type})
|
117
|
+
end
|
118
|
+
end
|
58
119
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
120
|
+
def read_prepared_metadata_v4(buffer)
|
121
|
+
flags = buffer.read_int
|
122
|
+
columns_count = buffer.read_int
|
123
|
+
pk_count = buffer.read_int
|
124
|
+
pk_specs = ::Array.new(pk_count) {|i| buffer.read_short}
|
125
|
+
|
126
|
+
if flags & GLOBAL_TABLES_SPEC_FLAG == GLOBAL_TABLES_SPEC_FLAG
|
127
|
+
keyspace_name = buffer.read_string
|
128
|
+
table_name = buffer.read_string
|
129
|
+
|
130
|
+
column_specs = ::Array.new(columns_count) do |i|
|
131
|
+
[keyspace_name, table_name, buffer.read_string, read_type_v4(buffer)]
|
132
|
+
end
|
133
|
+
else
|
134
|
+
column_specs = ::Array.new(columns_count) do |i|
|
135
|
+
[buffer.read_string, buffer.read_string, buffer.read_string, read_type_v4(buffer)]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
[pk_specs, column_specs]
|
140
|
+
end
|
141
|
+
|
142
|
+
def read_metadata_v4(buffer)
|
143
|
+
flags = buffer.read_int
|
144
|
+
count = buffer.read_int
|
145
|
+
|
146
|
+
paging_state = nil
|
147
|
+
paging_state = buffer.read_bytes if flags & HAS_MORE_PAGES_FLAG != 0
|
148
|
+
column_specs = nil
|
149
|
+
|
150
|
+
if flags & NO_METADATA_FLAG == 0
|
151
|
+
if flags & GLOBAL_TABLES_SPEC_FLAG != 0
|
152
|
+
keyspace_name = buffer.read_string
|
153
|
+
table_name = buffer.read_string
|
63
154
|
|
64
|
-
|
155
|
+
column_specs = ::Array.new(count) do |i|
|
156
|
+
[keyspace_name, table_name, buffer.read_string, read_type_v4(buffer)]
|
157
|
+
end
|
65
158
|
else
|
66
|
-
|
159
|
+
column_specs = ::Array.new(count) do |i|
|
160
|
+
[buffer.read_string, buffer.read_string, buffer.read_string, read_type_v4(buffer)]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
[column_specs, paging_state]
|
166
|
+
end
|
167
|
+
|
168
|
+
def read_type_v4(buffer)
|
169
|
+
id = buffer.read_unsigned_short
|
170
|
+
case id
|
171
|
+
when 0x0000 then Types.custom(buffer.read_string)
|
172
|
+
when 0x0001 then Types.ascii
|
173
|
+
when 0x0002 then Types.bigint
|
174
|
+
when 0x0003 then Types.blob
|
175
|
+
when 0x0004 then Types.boolean
|
176
|
+
when 0x0005 then Types.counter
|
177
|
+
when 0x0006 then Types.decimal
|
178
|
+
when 0x0007 then Types.double
|
179
|
+
when 0x0008 then Types.float
|
180
|
+
when 0x0009 then Types.int
|
181
|
+
when 0x000B then Types.timestamp
|
182
|
+
when 0x000C then Types.uuid
|
183
|
+
when 0x000D then Types.text
|
184
|
+
when 0x000E then Types.varint
|
185
|
+
when 0x000F then Types.timeuuid
|
186
|
+
when 0x0010 then Types.inet
|
187
|
+
when 0x0011 then Types.date
|
188
|
+
when 0x0012 then Types.time
|
189
|
+
when 0x0013 then Types.smallint
|
190
|
+
when 0x0014 then Types.tinyint
|
191
|
+
when 0x0020 then Types.list(read_type_v4(buffer))
|
192
|
+
when 0x0021 then Types.map(read_type_v4(buffer), read_type_v4(buffer))
|
193
|
+
when 0x0022 then Types.set(read_type_v4(buffer))
|
194
|
+
when 0x0030
|
195
|
+
keyspace = buffer.read_string
|
196
|
+
name = buffer.read_string
|
197
|
+
fields = ::Array.new(buffer.read_short) { [buffer.read_string, read_type_v4(buffer)] }
|
198
|
+
|
199
|
+
Types.udt(keyspace, name, fields)
|
200
|
+
when 0x0031 then Types.tuple(*::Array.new(buffer.read_short) { read_type_v4(buffer) })
|
201
|
+
else
|
202
|
+
raise Errors::DecodingError, %(Unsupported column type: #{id})
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def read_values_v4(buffer, column_metadata)
|
207
|
+
::Array.new(buffer.read_int) do |i|
|
208
|
+
row = ::Hash.new
|
209
|
+
|
210
|
+
column_metadata.each do |(_, _, column, type)|
|
211
|
+
row[column] = read_value_v4(buffer, type)
|
67
212
|
end
|
213
|
+
|
214
|
+
row
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def read_value_v4(buffer, type)
|
219
|
+
case type.kind
|
220
|
+
when :ascii then read_ascii(buffer)
|
221
|
+
when :bigint, :counter then read_bigint(buffer)
|
222
|
+
when :blob then buffer.read_bytes
|
223
|
+
when :boolean then read_boolean(buffer)
|
224
|
+
when :decimal then read_decimal(buffer)
|
225
|
+
when :double then read_double(buffer)
|
226
|
+
when :float then read_float(buffer)
|
227
|
+
when :int then read_int(buffer)
|
228
|
+
when :timestamp then read_timestamp(buffer)
|
229
|
+
when :uuid then read_uuid(buffer)
|
230
|
+
when :timeuuid then read_uuid(buffer, TimeUuid)
|
231
|
+
when :text then read_text(buffer)
|
232
|
+
when :varint then read_varint(buffer)
|
233
|
+
when :inet then read_inet(buffer)
|
234
|
+
when :tinyint then read_tinyint(buffer)
|
235
|
+
when :smallint then read_smallint(buffer)
|
236
|
+
when :time then read_time(buffer)
|
237
|
+
when :date then read_date(buffer)
|
238
|
+
when :list
|
239
|
+
return nil unless read_size(buffer)
|
240
|
+
|
241
|
+
value_type = type.value_type
|
242
|
+
::Array.new(buffer.read_signed_int) { read_value_v4(buffer, value_type) }
|
68
243
|
when :map
|
69
|
-
|
70
|
-
raw = CqlByteBuffer.new
|
71
|
-
key_type = type.key_type
|
72
|
-
value_type = type.value_type
|
73
|
-
|
74
|
-
raw.append_int(value.size)
|
75
|
-
value.each do |key, value|
|
76
|
-
write_value_v3(raw, key, key_type)
|
77
|
-
write_value_v3(raw, value, value_type)
|
78
|
-
end
|
244
|
+
return nil unless read_size(buffer)
|
79
245
|
|
80
|
-
|
81
|
-
|
82
|
-
|
246
|
+
key_type = type.key_type
|
247
|
+
value_type = type.value_type
|
248
|
+
value = ::Hash.new
|
249
|
+
|
250
|
+
buffer.read_signed_int.times do
|
251
|
+
value[read_value_v4(buffer, key_type)] = read_value_v4(buffer, value_type)
|
252
|
+
end
|
253
|
+
|
254
|
+
value
|
255
|
+
when :set
|
256
|
+
return nil unless read_size(buffer)
|
257
|
+
|
258
|
+
value_type = type.value_type
|
259
|
+
value = ::Set.new
|
260
|
+
|
261
|
+
buffer.read_signed_int.times do
|
262
|
+
value << read_value_v4(buffer, value_type)
|
83
263
|
end
|
264
|
+
|
265
|
+
value
|
84
266
|
when :udt
|
85
|
-
|
86
|
-
|
87
|
-
fields = type.fields
|
267
|
+
size = read_size(buffer)
|
268
|
+
return nil unless size
|
88
269
|
|
89
|
-
|
90
|
-
|
91
|
-
|
270
|
+
length = buffer.length
|
271
|
+
keyspace = type.keyspace
|
272
|
+
name = type.name
|
273
|
+
fields = type.fields
|
274
|
+
values = ::Hash.new
|
92
275
|
|
93
|
-
|
94
|
-
|
95
|
-
|
276
|
+
fields.each do |field|
|
277
|
+
if length - buffer.length >= size
|
278
|
+
values[field.name] = nil
|
279
|
+
else
|
280
|
+
values[field.name] = read_value_v4(buffer, field.type)
|
281
|
+
end
|
96
282
|
end
|
283
|
+
|
284
|
+
Cassandra::UDT::Strict.new(keyspace, name, fields, values)
|
97
285
|
when :tuple
|
98
|
-
|
99
|
-
raw = CqlByteBuffer.new
|
100
|
-
members = type.members
|
286
|
+
return nil unless read_size(buffer)
|
101
287
|
|
102
|
-
|
103
|
-
|
104
|
-
end
|
288
|
+
members = type.members
|
289
|
+
values = ::Array.new
|
105
290
|
|
106
|
-
|
107
|
-
|
108
|
-
buffer
|
291
|
+
members.each do |member_type|
|
292
|
+
break if buffer.empty?
|
293
|
+
values << read_value_v4(buffer, member_type)
|
294
|
+
end
|
295
|
+
|
296
|
+
values.fill(nil, values.length, (members.length - values.length))
|
297
|
+
|
298
|
+
Cassandra::Tuple::Strict.new(members, values)
|
299
|
+
else
|
300
|
+
raise Errors::DecodingError, %(Unsupported value type: #{type})
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
def write_values_v3(buffer, values, types, names = EMPTY_LIST)
|
305
|
+
if values && values.size > 0
|
306
|
+
buffer.append_short(values.size)
|
307
|
+
values.zip(types, names) do |(value, type, name)|
|
308
|
+
buffer.append_string(name) if name
|
309
|
+
write_value_v3(buffer, value, type)
|
109
310
|
end
|
311
|
+
buffer
|
312
|
+
else
|
313
|
+
buffer.append_short(0)
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
def write_list_v3(buffer, list, type)
|
318
|
+
raw = CqlByteBuffer.new
|
319
|
+
|
320
|
+
raw.append_int(list.size)
|
321
|
+
list.each do |element|
|
322
|
+
write_value_v3(raw, element, type)
|
323
|
+
end
|
324
|
+
|
325
|
+
buffer.append_bytes(raw)
|
326
|
+
end
|
327
|
+
|
328
|
+
def write_map_v3(buffer, map, key_type, value_type)
|
329
|
+
raw = CqlByteBuffer.new
|
330
|
+
|
331
|
+
raw.append_int(map.size)
|
332
|
+
map.each do |key, value|
|
333
|
+
write_value_v3(raw, key, key_type)
|
334
|
+
write_value_v3(raw, value, value_type)
|
335
|
+
end
|
336
|
+
|
337
|
+
buffer.append_bytes(raw)
|
338
|
+
end
|
339
|
+
|
340
|
+
def write_udt_v3(buffer, value, fields)
|
341
|
+
raw = CqlByteBuffer.new
|
342
|
+
|
343
|
+
fields.each do |field|
|
344
|
+
write_value_v3(raw, value[field.name], field.type)
|
345
|
+
end
|
346
|
+
|
347
|
+
buffer.append_bytes(raw)
|
348
|
+
end
|
349
|
+
|
350
|
+
def write_tuple_v3(buffer, value, members)
|
351
|
+
raw = CqlByteBuffer.new
|
352
|
+
|
353
|
+
members.each_with_index do |type, i|
|
354
|
+
write_value_v3(raw, value[i], type)
|
355
|
+
end
|
356
|
+
|
357
|
+
buffer.append_bytes(raw)
|
358
|
+
end
|
359
|
+
|
360
|
+
def write_value_v3(buffer, value, type)
|
361
|
+
if value.nil?
|
362
|
+
buffer.append_int(-1)
|
363
|
+
return
|
364
|
+
end
|
365
|
+
|
366
|
+
case type.kind
|
367
|
+
when :ascii then write_ascii(buffer, value)
|
368
|
+
when :bigint, :counter then write_bigint(buffer, value)
|
369
|
+
when :blob then write_blob(buffer, value)
|
370
|
+
when :boolean then write_boolean(buffer, value)
|
371
|
+
when :decimal then write_decimal(buffer, value)
|
372
|
+
when :double then write_double(buffer, value)
|
373
|
+
when :float then write_float(buffer, value)
|
374
|
+
when :int then write_int(buffer, value)
|
375
|
+
when :inet then write_inet(buffer, value)
|
376
|
+
when :timestamp then write_timestamp(buffer, value)
|
377
|
+
when :uuid, :timeuuid then write_uuid(buffer, value)
|
378
|
+
when :text then write_text(buffer, value)
|
379
|
+
when :varint then write_varint(buffer, value)
|
380
|
+
when :list, :set then write_list_v3(buffer, value, type.value_type)
|
381
|
+
when :map then write_map_v3(buffer, value, type.key_type, type.value_type)
|
382
|
+
when :udt then write_udt_v3(buffer, value, type.fields)
|
383
|
+
when :tuple then write_tuple_v3(buffer, value, type.members)
|
110
384
|
else
|
111
385
|
raise Errors::EncodingError, %(Unsupported value type: #{type})
|
112
386
|
end
|
@@ -137,7 +411,7 @@ module Cassandra
|
|
137
411
|
when :timestamp then read_timestamp(buffer)
|
138
412
|
when :uuid then read_uuid(buffer)
|
139
413
|
when :timeuuid then read_uuid(buffer, TimeUuid)
|
140
|
-
when :
|
414
|
+
when :text then read_text(buffer)
|
141
415
|
when :varint then read_varint(buffer)
|
142
416
|
when :inet then read_inet(buffer)
|
143
417
|
when :list
|
@@ -169,15 +443,17 @@ module Cassandra
|
|
169
443
|
|
170
444
|
value
|
171
445
|
when :udt
|
172
|
-
|
446
|
+
size = read_size(buffer)
|
447
|
+
return nil unless size
|
173
448
|
|
449
|
+
length = buffer.length
|
174
450
|
keyspace = type.keyspace
|
175
451
|
name = type.name
|
176
452
|
fields = type.fields
|
177
453
|
values = ::Hash.new
|
178
454
|
|
179
455
|
fields.each do |field|
|
180
|
-
if buffer.
|
456
|
+
if length - buffer.length >= size
|
181
457
|
values[field.name] = nil
|
182
458
|
else
|
183
459
|
values[field.name] = read_value_v3(buffer, field.type)
|
@@ -231,7 +507,8 @@ module Cassandra
|
|
231
507
|
end
|
232
508
|
|
233
509
|
def read_type_v3(buffer)
|
234
|
-
|
510
|
+
id = buffer.read_unsigned_short
|
511
|
+
case id
|
235
512
|
when 0x0000 then Types.custom(buffer.read_string)
|
236
513
|
when 0x0001 then Types.ascii
|
237
514
|
when 0x0002 then Types.bigint
|
@@ -244,15 +521,20 @@ module Cassandra
|
|
244
521
|
when 0x0009 then Types.int
|
245
522
|
when 0x000B then Types.timestamp
|
246
523
|
when 0x000C then Types.uuid
|
247
|
-
when 0x000D then Types.
|
524
|
+
when 0x000D then Types.text
|
248
525
|
when 0x000E then Types.varint
|
249
526
|
when 0x000F then Types.timeuuid
|
250
527
|
when 0x0010 then Types.inet
|
251
528
|
when 0x0020 then Types.list(read_type_v3(buffer))
|
252
529
|
when 0x0021 then Types.map(read_type_v3(buffer), read_type_v3(buffer))
|
253
530
|
when 0x0022 then Types.set(read_type_v3(buffer))
|
254
|
-
when 0x0030
|
255
|
-
|
531
|
+
when 0x0030
|
532
|
+
keyspace = buffer.read_string
|
533
|
+
name = buffer.read_string
|
534
|
+
fields = ::Array.new(buffer.read_short) { [buffer.read_string, read_type_v3(buffer)] }
|
535
|
+
|
536
|
+
Types.udt(keyspace, name, fields)
|
537
|
+
when 0x0031 then Types.tuple(*::Array.new(buffer.read_short) { read_type_v3(buffer) })
|
256
538
|
else
|
257
539
|
raise Errors::DecodingError, %(Unsupported column type: #{id})
|
258
540
|
end
|
@@ -270,7 +552,35 @@ module Cassandra
|
|
270
552
|
end
|
271
553
|
end
|
272
554
|
|
555
|
+
def write_list_v1(buffer, list, type)
|
556
|
+
raw = CqlByteBuffer.new
|
557
|
+
|
558
|
+
raw.append_short(list.size)
|
559
|
+
list.each do |element|
|
560
|
+
write_short_value(raw, element, type)
|
561
|
+
end
|
562
|
+
|
563
|
+
buffer.append_bytes(raw)
|
564
|
+
end
|
565
|
+
|
566
|
+
def write_map_v1(buffer, map, key_type, value_type)
|
567
|
+
raw = CqlByteBuffer.new
|
568
|
+
|
569
|
+
raw.append_short(map.size)
|
570
|
+
map.each do |key, value|
|
571
|
+
write_short_value(raw, key, key_type)
|
572
|
+
write_short_value(raw, value, value_type)
|
573
|
+
end
|
574
|
+
|
575
|
+
buffer.append_bytes(raw)
|
576
|
+
end
|
577
|
+
|
273
578
|
def write_value_v1(buffer, value, type)
|
579
|
+
if value.nil?
|
580
|
+
buffer.append_int(-1)
|
581
|
+
return
|
582
|
+
end
|
583
|
+
|
274
584
|
case type.kind
|
275
585
|
when :ascii then write_ascii(buffer, value)
|
276
586
|
when :bigint, :counter then write_bigint(buffer, value)
|
@@ -281,40 +591,12 @@ module Cassandra
|
|
281
591
|
when :float then write_float(buffer, value)
|
282
592
|
when :int then write_int(buffer, value)
|
283
593
|
when :inet then write_inet(buffer, value)
|
284
|
-
when :
|
594
|
+
when :text then write_text(buffer, value)
|
285
595
|
when :timestamp then write_timestamp(buffer, value)
|
286
596
|
when :timeuuid, :uuid then write_uuid(buffer, value)
|
287
597
|
when :varint then write_varint(buffer, value)
|
288
|
-
when :list, :set
|
289
|
-
|
290
|
-
raw = CqlByteBuffer.new
|
291
|
-
value_type = type.value_type
|
292
|
-
|
293
|
-
raw.append_short(value.size)
|
294
|
-
value.each do |element|
|
295
|
-
write_short_value(raw, element, value_type)
|
296
|
-
end
|
297
|
-
|
298
|
-
buffer.append_bytes(raw)
|
299
|
-
else
|
300
|
-
buffer.append_int(-1)
|
301
|
-
end
|
302
|
-
when :map
|
303
|
-
if value
|
304
|
-
raw = CqlByteBuffer.new
|
305
|
-
key_type = type.key_type
|
306
|
-
value_type = type.value_type
|
307
|
-
|
308
|
-
raw.append_short(value.size)
|
309
|
-
value.each do |key, value|
|
310
|
-
write_short_value(raw, key, key_type)
|
311
|
-
write_short_value(raw, value, value_type)
|
312
|
-
end
|
313
|
-
|
314
|
-
buffer.append_bytes(raw)
|
315
|
-
else
|
316
|
-
buffer.append_int(-1)
|
317
|
-
end
|
598
|
+
when :list, :set then write_list_v1(buffer, value, type.value_type)
|
599
|
+
when :map then write_map_v1(buffer, value, type.key_type, type.value_type)
|
318
600
|
else
|
319
601
|
raise Errors::EncodingError, %(Unsupported value type: #{type})
|
320
602
|
end
|
@@ -343,7 +625,7 @@ module Cassandra
|
|
343
625
|
when :float then read_float(buffer)
|
344
626
|
when :int then read_int(buffer)
|
345
627
|
when :timestamp then read_timestamp(buffer)
|
346
|
-
when :
|
628
|
+
when :text then read_text(buffer)
|
347
629
|
when :varint then read_varint(buffer)
|
348
630
|
when :uuid then read_uuid(buffer)
|
349
631
|
when :timeuuid then read_uuid(buffer, TimeUuid)
|
@@ -426,7 +708,7 @@ module Cassandra
|
|
426
708
|
when 0x000A then Types.text
|
427
709
|
when 0x000B then Types.timestamp
|
428
710
|
when 0x000C then Types.uuid
|
429
|
-
when 0x000D then Types.
|
711
|
+
when 0x000D then Types.text
|
430
712
|
when 0x000E then Types.varint
|
431
713
|
when 0x000F then Types.timeuuid
|
432
714
|
when 0x0010 then Types.inet
|
@@ -484,7 +766,7 @@ module Cassandra
|
|
484
766
|
read_size(buffer) && buffer.read_uuid(klass)
|
485
767
|
end
|
486
768
|
|
487
|
-
def
|
769
|
+
def read_text(buffer)
|
488
770
|
value = buffer.read_bytes
|
489
771
|
value && value.force_encoding(::Encoding::UTF_8)
|
490
772
|
end
|
@@ -499,99 +781,108 @@ module Cassandra
|
|
499
781
|
size && ::IPAddr.new_ntoh(buffer.read(size))
|
500
782
|
end
|
501
783
|
|
784
|
+
def read_tinyint(buffer)
|
785
|
+
read_size(buffer) && buffer.read_tinyint
|
786
|
+
end
|
787
|
+
|
788
|
+
def read_smallint(buffer)
|
789
|
+
read_size(buffer) && buffer.read_smallint
|
790
|
+
end
|
791
|
+
|
792
|
+
def read_time(buffer)
|
793
|
+
return nil unless read_size(buffer)
|
794
|
+
|
795
|
+
Time.new(buffer.read_long)
|
796
|
+
end
|
797
|
+
|
798
|
+
def read_date(buffer)
|
799
|
+
return nil unless read_size(buffer)
|
800
|
+
|
801
|
+
::Date.jd(DATE_OFFSET + buffer.read_int, ::Date::GREGORIAN)
|
802
|
+
end
|
803
|
+
|
502
804
|
def write_ascii(buffer, value)
|
503
|
-
buffer.append_bytes(value
|
805
|
+
buffer.append_bytes(value.encode(::Encoding::ASCII))
|
504
806
|
end
|
505
807
|
|
506
808
|
def write_bigint(buffer, value)
|
507
|
-
|
508
|
-
|
509
|
-
buffer.append_long(value)
|
510
|
-
else
|
511
|
-
buffer.append_int(-1)
|
512
|
-
end
|
809
|
+
buffer.append_int(8)
|
810
|
+
buffer.append_long(value)
|
513
811
|
end
|
514
812
|
|
515
813
|
alias :write_counter :write_bigint
|
516
814
|
|
517
815
|
def write_blob(buffer, value)
|
518
|
-
buffer.append_bytes(value
|
816
|
+
buffer.append_bytes(value.encode(::Encoding::BINARY))
|
519
817
|
end
|
520
818
|
|
521
819
|
def write_boolean(buffer, value)
|
522
|
-
|
523
|
-
|
524
|
-
buffer.append(value ? Constants::TRUE_BYTE : Constants::FALSE_BYTE)
|
525
|
-
else
|
526
|
-
buffer.append_int(-1)
|
527
|
-
end
|
820
|
+
buffer.append_int(1)
|
821
|
+
buffer.append(value ? Constants::TRUE_BYTE : Constants::FALSE_BYTE)
|
528
822
|
end
|
529
823
|
|
530
824
|
def write_decimal(buffer, value)
|
531
|
-
buffer.append_bytes(
|
825
|
+
buffer.append_bytes(CqlByteBuffer.new.append_decimal(value))
|
532
826
|
end
|
533
827
|
|
534
828
|
def write_double(buffer, value)
|
535
|
-
|
536
|
-
|
537
|
-
buffer.append_double(value)
|
538
|
-
else
|
539
|
-
buffer.append_int(-1)
|
540
|
-
end
|
829
|
+
buffer.append_int(8)
|
830
|
+
buffer.append_double(value)
|
541
831
|
end
|
542
832
|
|
543
833
|
def write_float(buffer, value)
|
544
|
-
|
545
|
-
|
546
|
-
buffer.append_float(value)
|
547
|
-
else
|
548
|
-
buffer.append_int(-1)
|
549
|
-
end
|
834
|
+
buffer.append_int(4)
|
835
|
+
buffer.append_float(value)
|
550
836
|
end
|
551
837
|
|
552
838
|
def write_int(buffer, value)
|
553
|
-
|
554
|
-
|
555
|
-
buffer.append_int(value)
|
556
|
-
else
|
557
|
-
buffer.append_int(-1)
|
558
|
-
end
|
839
|
+
buffer.append_int(4)
|
840
|
+
buffer.append_int(value)
|
559
841
|
end
|
560
842
|
|
561
843
|
def write_inet(buffer, value)
|
562
|
-
|
563
|
-
|
564
|
-
buffer.append(value.hton)
|
565
|
-
else
|
566
|
-
buffer.append_int(-1)
|
567
|
-
end
|
844
|
+
buffer.append_int(value.ipv6? ? 16 : 4)
|
845
|
+
buffer.append(value.hton)
|
568
846
|
end
|
569
847
|
|
570
848
|
def write_timestamp(buffer, value)
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
buffer.append_long(ms)
|
575
|
-
else
|
576
|
-
buffer.append_int(-1)
|
577
|
-
end
|
849
|
+
ms = (value.to_r.to_f * 1000).to_i
|
850
|
+
buffer.append_int(8)
|
851
|
+
buffer.append_long(ms)
|
578
852
|
end
|
579
853
|
|
580
|
-
def
|
581
|
-
buffer.append_bytes(value
|
854
|
+
def write_text(buffer, value)
|
855
|
+
buffer.append_bytes(value.encode(::Encoding::UTF_8))
|
582
856
|
end
|
583
857
|
|
584
858
|
def write_uuid(buffer, value)
|
585
|
-
|
586
|
-
|
587
|
-
buffer.append_uuid(value)
|
588
|
-
else
|
589
|
-
buffer.append_int(-1)
|
590
|
-
end
|
859
|
+
buffer.append_int(16)
|
860
|
+
buffer.append_uuid(value)
|
591
861
|
end
|
592
862
|
|
593
863
|
def write_varint(buffer, value)
|
594
|
-
buffer.append_bytes(
|
864
|
+
buffer.append_bytes(CqlByteBuffer.new.append_varint(value))
|
865
|
+
end
|
866
|
+
|
867
|
+
def write_tinyint(buffer, value)
|
868
|
+
buffer.append_int(1)
|
869
|
+
buffer.append_tinyint(value)
|
870
|
+
end
|
871
|
+
|
872
|
+
def write_smallint(buffer, value)
|
873
|
+
buffer.append_int(2)
|
874
|
+
buffer.append_smallint(value)
|
875
|
+
end
|
876
|
+
|
877
|
+
def write_time(buffer, value)
|
878
|
+
ns = value.to_nanoseconds
|
879
|
+
buffer.append_int(8)
|
880
|
+
buffer.append_long(ns)
|
881
|
+
end
|
882
|
+
|
883
|
+
def write_date(buffer, value)
|
884
|
+
buffer.append_int(4)
|
885
|
+
buffer.append_int(value.gregorian.jd - DATE_OFFSET)
|
595
886
|
end
|
596
887
|
|
597
888
|
def read_short_size(buffer)
|
@@ -626,7 +917,7 @@ module Cassandra
|
|
626
917
|
when :inet
|
627
918
|
size = read_short_size(buffer)
|
628
919
|
size && ::IPAddr.new_ntoh(buffer.read(size))
|
629
|
-
when :
|
920
|
+
when :text
|
630
921
|
value = buffer.read_short_bytes
|
631
922
|
value && value.force_encoding(::Encoding::UTF_8)
|
632
923
|
when :timestamp
|
@@ -699,7 +990,7 @@ module Cassandra
|
|
699
990
|
else
|
700
991
|
buffer.append_short(-1)
|
701
992
|
end
|
702
|
-
when :
|
993
|
+
when :text
|
703
994
|
buffer.append_short_bytes(value && value.encode(::Encoding::UTF_8))
|
704
995
|
when :timestamp
|
705
996
|
if value
|
@@ -729,18 +1020,6 @@ module Cassandra
|
|
729
1020
|
|
730
1021
|
size
|
731
1022
|
end
|
732
|
-
|
733
|
-
def read_tuple(buffer)
|
734
|
-
::Array.new(buffer.read_short) { read_type_v3(buffer) }
|
735
|
-
end
|
736
|
-
|
737
|
-
def read_user_defined_type(buffer)
|
738
|
-
keyspace = buffer.read_string
|
739
|
-
name = buffer.read_string
|
740
|
-
fields = ::Array.new(buffer.read_short) { [buffer.read_string, read_type_v3(buffer)] }
|
741
|
-
|
742
|
-
[keyspace, name, fields]
|
743
|
-
end
|
744
1023
|
end
|
745
1024
|
end
|
746
1025
|
end
|