aerospike 2.14.0 → 2.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -4
- data/lib/aerospike.rb +9 -0
- data/lib/aerospike/cdt/bit_operation.rb +376 -0
- data/lib/aerospike/cdt/bit_overflow_action.rb +46 -0
- data/lib/aerospike/cdt/bit_policy.rb +36 -0
- data/lib/aerospike/cdt/bit_resize_flags.rb +44 -0
- data/lib/aerospike/cdt/bit_write_flags.rb +51 -0
- data/lib/aerospike/cdt/context.rb +113 -0
- data/lib/aerospike/cdt/hll_operation.rb +200 -0
- data/lib/aerospike/cdt/hll_policy.rb +34 -0
- data/lib/aerospike/cdt/hll_write_flags.rb +53 -0
- data/lib/aerospike/cdt/list_operation.rb +155 -96
- data/lib/aerospike/cdt/list_order.rb +7 -0
- data/lib/aerospike/cdt/list_sort_flags.rb +10 -2
- data/lib/aerospike/cdt/map_operation.rb +179 -92
- data/lib/aerospike/cdt/map_order.rb +3 -3
- data/lib/aerospike/client.rb +4 -2
- data/lib/aerospike/cluster.rb +9 -9
- data/lib/aerospike/command/command.rb +21 -7
- data/lib/aerospike/features.rb +3 -0
- data/lib/aerospike/operation.rb +7 -2
- data/lib/aerospike/policy/replica.rb +1 -1
- data/lib/aerospike/result_code.rb +108 -0
- data/lib/aerospike/utils/unpacker.rb +2 -2
- data/lib/aerospike/value/particle_type.rb +1 -1
- data/lib/aerospike/value/value.rb +107 -5
- data/lib/aerospike/version.rb +1 -1
- metadata +11 -2
@@ -20,15 +20,15 @@ module Aerospike
|
|
20
20
|
|
21
21
|
##
|
22
22
|
# Map is not ordered. This is the default.
|
23
|
-
UNORDERED = 0
|
23
|
+
UNORDERED = {attr: 0, flag: 0x40}
|
24
24
|
|
25
25
|
##
|
26
26
|
# Order map by key.
|
27
|
-
KEY_ORDERED = 1
|
27
|
+
KEY_ORDERED = {attr: 1, flag: 0x80}
|
28
28
|
|
29
29
|
##
|
30
30
|
# Order map by key, then value.
|
31
|
-
KEY_VALUE_ORDERED = 3
|
31
|
+
KEY_VALUE_ORDERED = {attr: 3, flag: 0xc0}
|
32
32
|
|
33
33
|
##
|
34
34
|
# Default order
|
data/lib/aerospike/client.rb
CHANGED
@@ -44,6 +44,7 @@ module Aerospike
|
|
44
44
|
attr_accessor :default_read_policy
|
45
45
|
attr_accessor :default_scan_policy
|
46
46
|
attr_accessor :default_write_policy
|
47
|
+
attr_accessor :default_operate_policy
|
47
48
|
attr_accessor :cluster
|
48
49
|
|
49
50
|
def initialize(hosts = nil, policy: ClientPolicy.new, connect: true)
|
@@ -232,7 +233,7 @@ module Aerospike
|
|
232
233
|
str_cmd = "truncate:namespace=#{namespace}"
|
233
234
|
str_cmd << ";set=#{set_name}" unless set_name.to_s.strip.empty?
|
234
235
|
else
|
235
|
-
if node.supports_feature(Aerospike::Features::TRUNCATE_NAMESPACE)
|
236
|
+
if node.supports_feature?(Aerospike::Features::TRUNCATE_NAMESPACE)
|
236
237
|
str_cmd = "truncate-namespace:namespace=#{namespace}"
|
237
238
|
else
|
238
239
|
str_cmd = "truncate:namespace=#{namespace}"
|
@@ -383,7 +384,7 @@ module Aerospike
|
|
383
384
|
# read the result, all in one database call. Operations are executed in
|
384
385
|
# the order they are specified.
|
385
386
|
def operate(key, operations, options = nil)
|
386
|
-
policy = create_policy(options,
|
387
|
+
policy = create_policy(options, OperatePolicy, default_operate_policy)
|
387
388
|
|
388
389
|
command = OperateCommand.new(@cluster, policy, key, operations)
|
389
390
|
execute_command(command)
|
@@ -827,6 +828,7 @@ module Aerospike
|
|
827
828
|
self.default_query_policy = create_policy(policies[:query], QueryPolicy)
|
828
829
|
self.default_scan_policy = create_policy(policies[:scan], ScanPolicy)
|
829
830
|
self.default_write_policy = create_policy(policies[:write], WritePolicy)
|
831
|
+
self.default_operate_policy = create_policy(policies[:operate], OperatePolicy)
|
830
832
|
end
|
831
833
|
|
832
834
|
def send_info_command(policy, command, node = nil)
|
data/lib/aerospike/cluster.rb
CHANGED
@@ -18,7 +18,6 @@
|
|
18
18
|
# the License.
|
19
19
|
|
20
20
|
require 'set'
|
21
|
-
require 'timeout'
|
22
21
|
|
23
22
|
require 'aerospike/atomic/atomic'
|
24
23
|
|
@@ -428,6 +427,7 @@ module Aerospike
|
|
428
427
|
|
429
428
|
def wait_till_stablized
|
430
429
|
count = -1
|
430
|
+
done = false
|
431
431
|
|
432
432
|
# will run until the cluster is stablized
|
433
433
|
thr = Thread.new do
|
@@ -438,20 +438,20 @@ module Aerospike
|
|
438
438
|
# If not, assume cluster has stabilized and return.
|
439
439
|
break if count == nodes.length
|
440
440
|
|
441
|
-
|
441
|
+
# Break if timed out
|
442
|
+
break if done
|
443
|
+
|
444
|
+
sleep(0.001) # sleep for a milisecond
|
442
445
|
|
443
446
|
count = nodes.length
|
444
447
|
end
|
445
448
|
end
|
446
449
|
|
447
450
|
# wait for the thread to finish or timeout
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
rescue Timeout::Error
|
453
|
-
thr.kill if thr.alive?
|
454
|
-
end
|
451
|
+
thr.join(@connection_timeout)
|
452
|
+
done = true
|
453
|
+
sleep(0.001)
|
454
|
+
thr.kill if thr.alive?
|
455
455
|
|
456
456
|
@closed.value = false if @cluster_nodes.length > 0
|
457
457
|
end
|
@@ -59,6 +59,9 @@ module Aerospike
|
|
59
59
|
# Create only. Fail if record already exists.
|
60
60
|
INFO2_CREATE_ONLY = Integer(1 << 5)
|
61
61
|
|
62
|
+
# Return a result for every operation.
|
63
|
+
INFO2_RESPOND_ALL_OPS = Integer(1 << 7)
|
64
|
+
|
62
65
|
# This is the last of a multi-part message.
|
63
66
|
INFO3_LAST = Integer(1 << 0)
|
64
67
|
# Commit to master only before declaring success.
|
@@ -254,10 +257,12 @@ module Aerospike
|
|
254
257
|
read_attr = 0
|
255
258
|
write_attr = 0
|
256
259
|
read_header = false
|
260
|
+
record_bin_multiplicity = policy.record_bin_multiplicity == RecordBinMultiplicity::ARRAY
|
257
261
|
|
258
262
|
operations.each do |operation|
|
259
263
|
case operation.op_type
|
260
|
-
when Aerospike::Operation::READ
|
264
|
+
when Aerospike::Operation::READ, Aerospike::Operation::CDT_READ,
|
265
|
+
Aerospike::Operation::HLL_READ, Aerospike::Operation::BIT_READ
|
261
266
|
read_attr |= INFO1_READ
|
262
267
|
|
263
268
|
# Read all bins if no bin is specified.
|
@@ -271,17 +276,22 @@ module Aerospike
|
|
271
276
|
read_attr |= INFO1_READ
|
272
277
|
read_header = true
|
273
278
|
|
274
|
-
when Aerospike::Operation::CDT_READ
|
275
|
-
read_attr |= INFO1_READ
|
276
|
-
|
277
279
|
else
|
278
280
|
write_attr = INFO2_WRITE
|
279
281
|
end
|
280
282
|
|
283
|
+
if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ,
|
284
|
+
Aerospike::Operation::BIT_MODIFY, Aerospike::Operation::BIT_READ].include?(operation.op_type)
|
285
|
+
record_bin_multiplicity = true
|
286
|
+
end
|
287
|
+
|
281
288
|
estimate_operation_size_for_operation(operation)
|
282
289
|
end
|
283
290
|
size_buffer
|
284
291
|
|
292
|
+
|
293
|
+
write_attr |= INFO2_RESPOND_ALL_OPS if write_attr != 0 && record_bin_multiplicity
|
294
|
+
|
285
295
|
if write_attr != 0
|
286
296
|
write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
|
287
297
|
else
|
@@ -436,10 +446,14 @@ module Aerospike
|
|
436
446
|
@node = get_node
|
437
447
|
@conn = @node.get_connection(@policy.timeout)
|
438
448
|
rescue => e
|
439
|
-
|
440
|
-
|
449
|
+
if @node
|
450
|
+
# Socket connection error has occurred. Decrease health and retry.
|
451
|
+
@node.decrease_health
|
441
452
|
|
442
|
-
|
453
|
+
Aerospike.logger.error("Node #{@node.to_s}: #{e}")
|
454
|
+
else
|
455
|
+
Aerospike.logger.error("No node available for transaction: #{e}")
|
456
|
+
end
|
443
457
|
next
|
444
458
|
end
|
445
459
|
|
data/lib/aerospike/features.rb
CHANGED
data/lib/aerospike/operation.rb
CHANGED
@@ -20,7 +20,7 @@ module Aerospike
|
|
20
20
|
|
21
21
|
class Operation
|
22
22
|
|
23
|
-
attr_reader :op_type, :bin_name, :bin_value
|
23
|
+
attr_reader :op_type, :bin_name, :bin_value, :ctx
|
24
24
|
|
25
25
|
READ = 1
|
26
26
|
READ_HEADER = 1
|
@@ -31,12 +31,17 @@ module Aerospike
|
|
31
31
|
APPEND = 9
|
32
32
|
PREPEND = 10
|
33
33
|
TOUCH = 11
|
34
|
+
BIT_READ = 12
|
35
|
+
BIT_MODIFY = 13
|
34
36
|
DELETE = 14
|
37
|
+
HLL_READ = 15
|
38
|
+
HLL_MODIFY = 16
|
35
39
|
|
36
|
-
def initialize(op_type, bin_name=nil, bin_value=NullValue.new)
|
40
|
+
def initialize(op_type, bin_name=nil, bin_value=NullValue.new, ctx = nil)
|
37
41
|
@op_type = op_type
|
38
42
|
@bin_name = bin_name
|
39
43
|
@bin_value = Value.of(bin_value)
|
44
|
+
@ctx = ctx
|
40
45
|
self
|
41
46
|
end
|
42
47
|
|
@@ -31,7 +31,7 @@ module Aerospike
|
|
31
31
|
# Try node on the same rack as the client first. If there are no nodes on the
|
32
32
|
# same rack, use SEQUENCE instead.
|
33
33
|
#
|
34
|
-
# ClientPolicy#rack_aware
|
34
|
+
# ClientPolicy#rack_aware, ClientPolicy#rack_id, and server rack
|
35
35
|
# configuration must also be set to enable this functionality.
|
36
36
|
PREFER_RACK = 3
|
37
37
|
|
@@ -60,6 +60,10 @@ module Aerospike
|
|
60
60
|
# exists.
|
61
61
|
KEY_EXISTS_ERROR = 5
|
62
62
|
|
63
|
+
# Bin already exists on a create-only operation.
|
64
|
+
BIN_EXISTS_ERROR = 6
|
65
|
+
|
66
|
+
|
63
67
|
# Expected cluster ID was not received.
|
64
68
|
CLUSTER_KEY_MISMATCH = 7
|
65
69
|
|
@@ -91,6 +95,9 @@ module Aerospike
|
|
91
95
|
# Unsupported Server Feature (e.g. Scan + UDF)
|
92
96
|
UNSUPPORTED_FEATURE = 16
|
93
97
|
|
98
|
+
# Bin not found on update-only operation.
|
99
|
+
BIN_NOT_FOUND = 17
|
100
|
+
|
94
101
|
# Specified bin name does not exist in record.
|
95
102
|
DEVICE_OVERLOAD = 18
|
96
103
|
|
@@ -122,11 +129,19 @@ module Aerospike
|
|
122
129
|
# The transaction was not performed because the predexp was false.
|
123
130
|
FILTERED_OUT = 27
|
124
131
|
|
132
|
+
# Write command loses conflict to XDR.
|
133
|
+
LOST_CONFLICT = 28
|
134
|
+
|
125
135
|
# There are no more records left for query.
|
126
136
|
QUERY_END = 50
|
127
137
|
|
138
|
+
# Security functionality not supported by connected server.
|
128
139
|
SECURITY_NOT_SUPPORTED = 51
|
140
|
+
|
141
|
+
# Security functionality not enabled by connected server.
|
129
142
|
SECURITY_NOT_ENABLED = 52
|
143
|
+
|
144
|
+
# Security scheme not supported.
|
130
145
|
SECURITY_SCHEME_NOT_SUPPORTED = 53
|
131
146
|
|
132
147
|
# Administration command is invalid.
|
@@ -155,6 +170,9 @@ module Aerospike
|
|
155
170
|
# Security credential is invalid.
|
156
171
|
INVALID_CREDENTIAL = 65
|
157
172
|
|
173
|
+
# Expired session token.
|
174
|
+
EXPIRED_SESSION = 66
|
175
|
+
|
158
176
|
# Role name is invalid.
|
159
177
|
INVALID_ROLE = 70
|
160
178
|
|
@@ -164,15 +182,48 @@ module Aerospike
|
|
164
182
|
# Privilege is invalid.
|
165
183
|
INVALID_PRIVILEGE = 72
|
166
184
|
|
185
|
+
# Specified IP whitelist is invalid.
|
186
|
+
INVALID_WHITELIST = 73
|
187
|
+
|
167
188
|
# User must be authentication before performing database operations.
|
168
189
|
NOT_AUTHENTICATED = 80
|
169
190
|
|
170
191
|
# User does not posses the required role to perform the database operation.
|
171
192
|
ROLE_VIOLATION = 81
|
172
193
|
|
194
|
+
# Client IP address is not on the IP whitelist.
|
195
|
+
NOT_WHITELISTED = 82
|
196
|
+
|
197
|
+
# LDAP feature not enabled on server.
|
198
|
+
LDAP_NOT_ENABLED = 90
|
199
|
+
|
200
|
+
# Error in LDAP setup.
|
201
|
+
LDAP_SETUP = 91
|
202
|
+
|
203
|
+
# Error in LDAP TLS setup.
|
204
|
+
LDAP_TLS_SETUP = 92
|
205
|
+
|
206
|
+
# Error authenticating LDAP user.
|
207
|
+
LDAP_AUTHENTICATION = 93
|
208
|
+
|
209
|
+
# Error querying LDAP server.
|
210
|
+
LDAP_QUERY = 94
|
211
|
+
|
173
212
|
# A user defined function returned an error code.
|
174
213
|
UDF_BAD_RESPONSE = 100
|
175
214
|
|
215
|
+
# Batch functionality has been disabled by configuring the batch-index-thread=0.
|
216
|
+
BATCH_DISABLED = 150
|
217
|
+
|
218
|
+
# Batch max requests has been exceeded.
|
219
|
+
BATCH_MAX_REQUESTS = 151
|
220
|
+
|
221
|
+
# All batch queues are full.
|
222
|
+
BATCH_QUEUES_FULL = 152
|
223
|
+
|
224
|
+
# GeoJSON is malformed or not supported.
|
225
|
+
INVALID_GEOJSON = 160
|
226
|
+
|
176
227
|
# Secondary index already exists.
|
177
228
|
INDEX_FOUND = 200
|
178
229
|
|
@@ -206,6 +257,12 @@ module Aerospike
|
|
206
257
|
# Generic query error.
|
207
258
|
QUERY_GENERIC = 213
|
208
259
|
|
260
|
+
# Network error. Query is aborted.
|
261
|
+
QUERY_NET_IO = 214
|
262
|
+
|
263
|
+
# Internal error.
|
264
|
+
QUERY_DUPLICATE = 215
|
265
|
+
|
209
266
|
def self.message(code)
|
210
267
|
case code
|
211
268
|
when COMMAND_REJECTED
|
@@ -244,6 +301,9 @@ module Aerospike
|
|
244
301
|
when KEY_EXISTS_ERROR
|
245
302
|
"Key already exists"
|
246
303
|
|
304
|
+
when BIN_EXISTS_ERROR
|
305
|
+
"Bin already exists on a create-only operation"
|
306
|
+
|
247
307
|
when CLUSTER_KEY_MISMATCH
|
248
308
|
"Cluster key mismatch"
|
249
309
|
|
@@ -274,6 +334,9 @@ module Aerospike
|
|
274
334
|
when UNSUPPORTED_FEATURE
|
275
335
|
"Unsupported Server Feature"
|
276
336
|
|
337
|
+
when BIN_NOT_FOUND
|
338
|
+
"Bin not found on update-only operation"
|
339
|
+
|
277
340
|
when DEVICE_OVERLOAD
|
278
341
|
"Device overload"
|
279
342
|
|
@@ -304,6 +367,9 @@ module Aerospike
|
|
304
367
|
when FILTERED_OUT
|
305
368
|
"The transaction was not performed because the predexp was false."
|
306
369
|
|
370
|
+
when LOST_CONFLICT
|
371
|
+
"Write command loses conflict to XDR."
|
372
|
+
|
307
373
|
when QUERY_END
|
308
374
|
"Query end"
|
309
375
|
|
@@ -343,6 +409,9 @@ module Aerospike
|
|
343
409
|
when INVALID_CREDENTIAL
|
344
410
|
"Invalid credential"
|
345
411
|
|
412
|
+
when EXPIRED_SESSION
|
413
|
+
"Expired session token"
|
414
|
+
|
346
415
|
when INVALID_ROLE
|
347
416
|
"Invalid role"
|
348
417
|
|
@@ -352,15 +421,48 @@ module Aerospike
|
|
352
421
|
when INVALID_PRIVILEGE
|
353
422
|
"Invalid privilege"
|
354
423
|
|
424
|
+
when INVALID_WHITELIST
|
425
|
+
"Specified IP whitelist is invalid"
|
426
|
+
|
355
427
|
when NOT_AUTHENTICATED
|
356
428
|
"Not authenticated"
|
357
429
|
|
358
430
|
when ROLE_VIOLATION
|
359
431
|
"Role violation"
|
360
432
|
|
433
|
+
when NOT_WHITELISTED
|
434
|
+
"Client IP address is not on the IP whitelist"
|
435
|
+
|
436
|
+
when LDAP_NOT_ENABLED
|
437
|
+
"LDAP feature not enabled on server"
|
438
|
+
|
439
|
+
when LDAP_SETUP
|
440
|
+
"Error in LDAP setup"
|
441
|
+
|
442
|
+
when LDAP_TLS_SETUP
|
443
|
+
"Error in LDAP TLS setup"
|
444
|
+
|
445
|
+
when LDAP_AUTHENTICATION
|
446
|
+
"Error authenticating LDAP user"
|
447
|
+
|
448
|
+
when LDAP_QUERY
|
449
|
+
"Error querying LDAP server"
|
450
|
+
|
361
451
|
when UDF_BAD_RESPONSE
|
362
452
|
"UDF d error"
|
363
453
|
|
454
|
+
when BATCH_DISABLED
|
455
|
+
"Batch functionality has been disabled by configuring the batch-index-thread=0"
|
456
|
+
|
457
|
+
when BATCH_MAX_REQUESTS
|
458
|
+
"Batch max requests has been exceeded"
|
459
|
+
|
460
|
+
when BATCH_QUEUES_FULL
|
461
|
+
"All batch queues are full"
|
462
|
+
|
463
|
+
when INVALID_GEOJSON
|
464
|
+
"GeoJSON is malformed or not supported"
|
465
|
+
|
364
466
|
when INDEX_FOUND
|
365
467
|
"Index already exists"
|
366
468
|
|
@@ -394,6 +496,12 @@ module Aerospike
|
|
394
496
|
when QUERY_GENERIC
|
395
497
|
"Query error"
|
396
498
|
|
499
|
+
when QUERY_NET_IO
|
500
|
+
"Network error. Query is aborted"
|
501
|
+
|
502
|
+
when QUERY_DUPLICATE
|
503
|
+
"Internal query error"
|
504
|
+
|
397
505
|
else
|
398
506
|
"ResultCode #{code} unknown in the client. Please file a github issue."
|
399
507
|
end # case
|
@@ -23,14 +23,24 @@ module Aerospike
|
|
23
23
|
# Polymorphic value classes used to efficiently serialize objects into the wire protocol.
|
24
24
|
class Value #:nodoc:
|
25
25
|
|
26
|
-
def self.of(value)
|
26
|
+
def self.of(value, allow_64bits = false)
|
27
27
|
case value
|
28
28
|
when Integer
|
29
|
-
if
|
30
|
-
|
29
|
+
if !allow_64bits
|
30
|
+
if value.bit_length < 64
|
31
|
+
res = IntegerValue.new(value)
|
32
|
+
else
|
33
|
+
# big nums > 2**63 are not supported
|
34
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported with more than 64 bits.")
|
35
|
+
end
|
31
36
|
else
|
32
|
-
#
|
33
|
-
|
37
|
+
# used in bitwise operations
|
38
|
+
if value.bit_length <= 64
|
39
|
+
res = IntegerValue.new(value)
|
40
|
+
else
|
41
|
+
# nums with more than 64 bits are not supported
|
42
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported with more than 64 bits.")
|
43
|
+
end
|
34
44
|
end
|
35
45
|
when Float
|
36
46
|
res = FloatValue.new(value)
|
@@ -48,6 +58,8 @@ module Aerospike
|
|
48
58
|
res = GeoJSONValue.new(value)
|
49
59
|
when nil
|
50
60
|
res = NULL
|
61
|
+
when TrueClass, FalseClass
|
62
|
+
res = BoolValue.new(value)
|
51
63
|
else
|
52
64
|
# throw an exception for anything that is not supported.
|
53
65
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported.")
|
@@ -526,6 +538,49 @@ module Aerospike
|
|
526
538
|
|
527
539
|
end
|
528
540
|
|
541
|
+
# #######################################/
|
542
|
+
|
543
|
+
# HLLValue value. Encapsulates a HyperLogLog value.
|
544
|
+
# Supported by Aerospike server version 4.9 and later.
|
545
|
+
class HLLValue < Value #:nodoc:
|
546
|
+
|
547
|
+
def initialize(value)
|
548
|
+
@bytes = value
|
549
|
+
@bytes.force_encoding('binary')
|
550
|
+
|
551
|
+
self
|
552
|
+
end
|
553
|
+
|
554
|
+
def type
|
555
|
+
Aerospike::ParticleType::HLL
|
556
|
+
end
|
557
|
+
|
558
|
+
def get
|
559
|
+
self
|
560
|
+
end
|
561
|
+
|
562
|
+
def to_s
|
563
|
+
@bytes.to_s
|
564
|
+
end
|
565
|
+
|
566
|
+
def to_bytes
|
567
|
+
@bytes
|
568
|
+
end
|
569
|
+
|
570
|
+
def estimate_size
|
571
|
+
@bytes.bytesize
|
572
|
+
end
|
573
|
+
|
574
|
+
def write(buffer, offset)
|
575
|
+
buffer.write_binary(@bytes, offset)
|
576
|
+
end
|
577
|
+
|
578
|
+
def pack(packer)
|
579
|
+
packer.write(Aerospike::ParticleType::BLOB.chr + @bytes)
|
580
|
+
end
|
581
|
+
|
582
|
+
end
|
583
|
+
|
529
584
|
#######################################
|
530
585
|
|
531
586
|
def self.encoding
|
@@ -572,6 +627,10 @@ module Aerospike
|
|
572
627
|
hdrsz = 1 + 2 + (ncells * 8)
|
573
628
|
Aerospike::GeoJSON.new(buf.read(offset + hdrsz, length - hdrsz))
|
574
629
|
|
630
|
+
when Aerospike::ParticleType::HLL
|
631
|
+
bytes = buf.read(offset,length)
|
632
|
+
Aerospike::HLLValue.new(bytes)
|
633
|
+
|
575
634
|
else
|
576
635
|
nil
|
577
636
|
end
|
@@ -593,4 +652,47 @@ module Aerospike
|
|
593
652
|
nil
|
594
653
|
end
|
595
654
|
end
|
655
|
+
|
656
|
+
private
|
657
|
+
|
658
|
+
#######################################
|
659
|
+
|
660
|
+
# Boolean value.
|
661
|
+
# This is private, and only used internally for bitwise CDTs
|
662
|
+
class BoolValue < Value #:nodoc:
|
663
|
+
|
664
|
+
def initialize(val)
|
665
|
+
@value = val || false
|
666
|
+
self
|
667
|
+
end
|
668
|
+
|
669
|
+
def estimate_size
|
670
|
+
1
|
671
|
+
end
|
672
|
+
|
673
|
+
def write(buffer, offset)
|
674
|
+
raise Exception.new("Unreachable")
|
675
|
+
end
|
676
|
+
|
677
|
+
def pack(packer)
|
678
|
+
packer.write(@value)
|
679
|
+
end
|
680
|
+
|
681
|
+
def type
|
682
|
+
raise Exception.new("Unreachable")
|
683
|
+
end
|
684
|
+
|
685
|
+
def get
|
686
|
+
@value
|
687
|
+
end
|
688
|
+
|
689
|
+
def to_bytes
|
690
|
+
raise Exception.new("Unreachable")
|
691
|
+
end
|
692
|
+
|
693
|
+
def to_s
|
694
|
+
@value.to_s
|
695
|
+
end
|
696
|
+
|
697
|
+
end # BoolValue
|
596
698
|
end # module
|