aerospike 2.8.0 → 2.9.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 604462bd062c1fea97323684cfe3512a962e52c69b651e6ee86251a22769fcf0
4
- data.tar.gz: 6d62d86f30470b07daaa46cfef8188addd558d60be17c0e5398e6fef772ef37f
3
+ metadata.gz: b4a6204e2eedbfcbd9a755abdc89da26d978ec5cddbc401b9085863e953c9a5a
4
+ data.tar.gz: 9ef1ad5e358a98a30da46cf6aded8bc8958f62e16f239523f313a7c2ddd169b2
5
5
  SHA512:
6
- metadata.gz: 631961c7e7d06bdaeeb8aeb456fe02c52b000f28ae4f0293ace79842dc9d1ccf83c478b06826b11d939b60663cc844183e32b1d5b3b41b925035e007d9fdec5f
7
- data.tar.gz: c5f5e285521e445d35c2723a1849d2072dcbd72223998b3f5559d0bc7eac563917be43d8c1ec9dbc81e04a65fd537502bede46df7808e10bd8d63f3a5ce93d78
6
+ metadata.gz: 6ca26471e04a8999b081699e2b68f51eaa00e28cc1e8e8fc4d7e0f1fa2830de9dbb5725b888420cab85dbd5f34af2dae675b81963a9b7c88320e3393e2b0c1a1
7
+ data.tar.gz: c854595481004116f1c0fd90600dcf0ba94dfe9b371a8a310a21afae601dd491ecd960658cfe7fe3f08859259af421b19453aeec2cfda68484af328f7c98657c
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.9.0] - 2018-11-09
8
+
9
+ * **New Features**
10
+ * Add INFINITY and WILDCARD values for use in CDT map/list comparators. [AER-5945]
11
+
12
+ * **Bug Fixes**
13
+ * Default policies set on Client instance do not get applied [[#74](https://github.com/aerospike/aerospike-client-ruby/issue/74)]
14
+
15
+ * **Updates**
16
+ * *BREAKING CHANGE*: Change default for send_key write policy to false [[#73](https://github.com/aerospike/aerospike-client-ruby/issue/73)]
17
+ * Support truncate info command argument "lut=now" for servers that require it. [AER-5955]
18
+
7
19
  ## [2.8.0] - 2018-08-06
8
20
 
9
21
  * **New Features**
@@ -26,6 +26,7 @@ require 'bcrypt'
26
26
  require 'aerospike/atomic/atomic'
27
27
 
28
28
  require 'aerospike/client'
29
+ require 'aerospike/features'
29
30
  require 'aerospike/utils/pool'
30
31
  require 'aerospike/utils/connection_pool'
31
32
  require 'aerospike/utils/packer'
@@ -37,18 +37,19 @@ module Aerospike
37
37
 
38
38
  class Client
39
39
 
40
- attr_accessor :default_policy, :default_write_policy,
41
- :default_scan_policy, :default_query_policy, :default_admin_policy
40
+ attr_accessor :default_admin_policy
41
+ attr_accessor :default_batch_policy
42
+ attr_accessor :default_info_policy
43
+ attr_accessor :default_query_policy
44
+ attr_accessor :default_read_policy
45
+ attr_accessor :default_scan_policy
46
+ attr_accessor :default_write_policy
42
47
 
43
48
  def initialize(hosts = nil, policy: ClientPolicy.new, connect: true)
44
- @default_policy = Policy.new
45
- @default_write_policy = WritePolicy.new
46
- @default_scan_policy = ScanPolicy.new
47
- @default_query_policy = QueryPolicy.new
48
- @default_admin_policy = QueryPolicy.new
49
49
 
50
50
  hosts = ::Aerospike::Host::Parse.(hosts || ENV['AEROSPIKE_HOSTS'] || 'localhost')
51
51
  policy = create_policy(policy, ClientPolicy)
52
+ set_default_policies(policy.policies)
52
53
  @cluster = Cluster.new(policy, hosts)
53
54
  @cluster.add_cluster_config_change_listener(self)
54
55
 
@@ -112,7 +113,7 @@ module Aerospike
112
113
  # client.put key, {'bin', 'value string'}, :timeout => 0.001
113
114
 
114
115
  def put(key, bins, options = nil)
115
- policy = create_policy(options, WritePolicy)
116
+ policy = create_policy(options, WritePolicy, default_write_policy)
116
117
  command = WriteCommand.new(@cluster, policy, key, hash_to_bins(bins), Aerospike::Operation::WRITE)
117
118
  execute_command(command)
118
119
  end
@@ -135,7 +136,7 @@ module Aerospike
135
136
  # client.append key, {'bin', 'value to append'}, :timeout => 0.001
136
137
 
137
138
  def append(key, bins, options = nil)
138
- policy = create_policy(options, WritePolicy)
139
+ policy = create_policy(options, WritePolicy, default_write_policy)
139
140
  command = WriteCommand.new(@cluster, policy, key, hash_to_bins(bins), Aerospike::Operation::APPEND)
140
141
  execute_command(command)
141
142
  end
@@ -154,7 +155,7 @@ module Aerospike
154
155
  # client.prepend key, {'bin', 'value to prepend'}, :timeout => 0.001
155
156
 
156
157
  def prepend(key, bins, options = nil)
157
- policy = create_policy(options, WritePolicy)
158
+ policy = create_policy(options, WritePolicy, default_write_policy)
158
159
  command = WriteCommand.new(@cluster, policy, key, hash_to_bins(bins), Aerospike::Operation::PREPEND)
159
160
  execute_command(command)
160
161
  end
@@ -177,7 +178,7 @@ module Aerospike
177
178
  # client.add key, {'bin', -1}, :timeout => 0.001
178
179
 
179
180
  def add(key, bins, options = nil)
180
- policy = create_policy(options, WritePolicy)
181
+ policy = create_policy(options, WritePolicy, default_write_policy)
181
182
  command = WriteCommand.new(@cluster, policy, key, hash_to_bins(bins), Aerospike::Operation::ADD)
182
183
  execute_command(command)
183
184
  end
@@ -199,7 +200,7 @@ module Aerospike
199
200
  # existed = client.delete key, :timeout => 0.001
200
201
 
201
202
  def delete(key, options = nil)
202
- policy = create_policy(options, WritePolicy)
203
+ policy = create_policy(options, WritePolicy, default_write_policy)
203
204
  command = DeleteCommand.new(@cluster, policy, key)
204
205
  execute_command(command)
205
206
  command.existed
@@ -221,10 +222,18 @@ module Aerospike
221
222
  # If no policy options are provided, +@default_info_policy+ will be used.
222
223
 
223
224
  def truncate(namespace, set_name = nil, before_last_update = nil, options = {})
224
- policy = create_policy(options, WritePolicy)
225
+ policy = create_policy(options, Policy, default_info_policy)
226
+
225
227
  str_cmd = "truncate:namespace=#{namespace}"
226
228
  str_cmd << ";set=#{set_name}" unless set_name.to_s.strip.empty?
227
- str_cmd << ";lut=#{(before_last_update.to_f * 1_000_000_000.0).round}" if before_last_update
229
+
230
+ if before_last_update
231
+ lut_nanos = (before_last_update.to_f * 1_000_000_000.0).round
232
+ str_cmd << ";lut=#{lut_nanos}"
233
+ elsif supports_feature?(Aerospike::Features::LUT_NOW)
234
+ # Servers >= 4.3.1.4 require lut argument
235
+ str_cmd << ";lut=now"
236
+ end
228
237
 
229
238
  # Send index command to one node. That node will distribute the command to other nodes.
230
239
  response = send_info_command(policy, str_cmd).upcase
@@ -247,7 +256,7 @@ module Aerospike
247
256
  # client.touch key, :timeout => 0.001
248
257
 
249
258
  def touch(key, options = nil)
250
- policy = create_policy(options, WritePolicy)
259
+ policy = create_policy(options, WritePolicy, default_write_policy)
251
260
  command = TouchCommand.new(@cluster, policy, key)
252
261
  execute_command(command)
253
262
  end
@@ -260,7 +269,7 @@ module Aerospike
260
269
  # Determines if a record key exists.
261
270
  # The policy can be used to specify timeouts.
262
271
  def exists(key, options = nil)
263
- policy = create_policy(options, Policy)
272
+ policy = create_policy(options, Policy, default_read_policy)
264
273
  command = ExistsCommand.new(@cluster, policy, key)
265
274
  execute_command(command)
266
275
  command.exists
@@ -273,7 +282,7 @@ module Aerospike
273
282
  # Read record header and bins for specified key.
274
283
  # The policy can be used to specify timeouts.
275
284
  def get(key, bin_names = nil, options = nil)
276
- policy = create_policy(options, Policy)
285
+ policy = create_policy(options, Policy, default_read_policy)
277
286
 
278
287
  command = ReadCommand.new(@cluster, policy, key, bin_names)
279
288
  execute_command(command)
@@ -283,7 +292,7 @@ module Aerospike
283
292
  # Read record generation and expiration only for specified key. Bins are not read.
284
293
  # The policy can be used to specify timeouts.
285
294
  def get_header(key, options = nil)
286
- policy = create_policy(options, Policy)
295
+ policy = create_policy(options, Policy, default_read_policy)
287
296
  command = ReadHeaderCommand.new(@cluster, policy, key)
288
297
  execute_command(command)
289
298
  command.record
@@ -298,7 +307,7 @@ module Aerospike
298
307
  # If a key is not found, the positional record will be nil.
299
308
  # The policy can be used to specify timeouts and protocol type.
300
309
  def batch_get(keys, bin_names = nil, options = nil)
301
- policy = create_policy(options, BatchPolicy)
310
+ policy = create_policy(options, BatchPolicy, default_batch_policy)
302
311
  results = Array.new(keys.length)
303
312
  info_flags = INFO1_READ
304
313
 
@@ -337,7 +346,7 @@ module Aerospike
337
346
  # The returned boolean array is in positional order with the original key array order.
338
347
  # The policy can be used to specify timeouts and protocol type.
339
348
  def batch_exists(keys, options = nil)
340
- policy = create_policy(options, BatchPolicy)
349
+ policy = create_policy(options, BatchPolicy, default_batch_policy)
341
350
  results = Array.new(keys.length)
342
351
 
343
352
  if policy.use_batch_direct
@@ -363,7 +372,7 @@ module Aerospike
363
372
  # read the result, all in one database call. Operations are executed in
364
373
  # the order they are specified.
365
374
  def operate(key, operations, options = nil)
366
- policy = create_policy(options, WritePolicy)
375
+ policy = create_policy(options, WritePolicy, default_write_policy)
367
376
 
368
377
  command = OperateCommand.new(@cluster, policy, key, operations)
369
378
  execute_command(command)
@@ -392,12 +401,14 @@ module Aerospike
392
401
  #
393
402
  # This method is only supported by Aerospike 3 servers.
394
403
  def register_udf(udf_body, server_path, language, options = nil)
395
- content = Base64.strict_encode64(udf_body).force_encoding('binary')
404
+ policy = create_policy(options, Policy, default_info_policy)
396
405
 
406
+ content = Base64.strict_encode64(udf_body).force_encoding('binary')
397
407
  str_cmd = "udf-put:filename=#{server_path};content=#{content};"
398
408
  str_cmd << "content-len=#{content.length};udf-type=#{language};"
409
+
399
410
  # Send UDF to one node. That node will distribute the UDF to other nodes.
400
- response_map = @cluster.request_info(@default_policy, str_cmd)
411
+ response_map = @cluster.request_info(policy, str_cmd)
401
412
 
402
413
  res = {}
403
414
  response_map.each do |k, response|
@@ -422,11 +433,13 @@ module Aerospike
422
433
  #
423
434
  # This method is only supported by Aerospike 3 servers.
424
435
  def remove_udf(udf_name, options = nil)
436
+ policy = create_policy(options, Policy, default_info_policy)
437
+
425
438
  str_cmd = "udf-remove:filename=#{udf_name};"
426
439
 
427
440
  # Send command to one node. That node will distribute it to other nodes.
428
441
  # Send UDF to one node. That node will distribute the UDF to other nodes.
429
- response_map = @cluster.request_info(@default_policy, str_cmd)
442
+ response_map = @cluster.request_info(policy, str_cmd)
430
443
  _, response = response_map.first
431
444
 
432
445
  if response == 'ok'
@@ -439,10 +452,12 @@ module Aerospike
439
452
  # ListUDF lists all packages containing user defined functions in the server.
440
453
  # This method is only supported by Aerospike 3 servers.
441
454
  def list_udf(options = nil)
455
+ policy = create_policy(options, Policy, default_info_policy)
456
+
442
457
  str_cmd = 'udf-list'
443
458
 
444
459
  # Send command to one node. That node will distribute it to other nodes.
445
- response_map = @cluster.request_info(@default_policy, str_cmd)
460
+ response_map = @cluster.request_info(policy, str_cmd)
446
461
  _, response = response_map.first
447
462
 
448
463
  vals = response.split(';')
@@ -475,7 +490,7 @@ module Aerospike
475
490
  #
476
491
  # This method is only supported by Aerospike 3 servers.
477
492
  def execute_udf(key, package_name, function_name, args=[], options = nil)
478
- policy = create_policy(options, WritePolicy)
493
+ policy = create_policy(options, WritePolicy, default_write_policy)
479
494
 
480
495
  command = ExecuteCommand.new(@cluster, policy, key, package_name, function_name, args)
481
496
  execute_command(command)
@@ -504,7 +519,7 @@ module Aerospike
504
519
  # This method is only supported by Aerospike 3 servers.
505
520
  # If the policy is nil, the default relevant policy will be used.
506
521
  def execute_udf_on_query(statement, package_name, function_name, function_args=[], options = nil)
507
- policy = create_policy(options, QueryPolicy)
522
+ policy = create_policy(options, QueryPolicy, default_query_policy)
508
523
 
509
524
  nodes = @cluster.nodes
510
525
  if nodes.empty?
@@ -540,11 +555,12 @@ module Aerospike
540
555
  # This method is only supported by Aerospike 3 servers.
541
556
  # index_type should be :string, :numeric or :geo2dsphere (requires server version 3.7 or later)
542
557
  # collection_type should be :list, :mapkeys or :mapvalues
543
- def create_index(namespace, set_name, index_name, bin_name, index_type, collection_type=nil, options = nil)
558
+ def create_index(namespace, set_name, index_name, bin_name, index_type, collection_type = nil, options = nil)
544
559
  if options.nil? && collection_type.is_a?(Hash)
545
560
  options, collection_type = collection_type, nil
546
561
  end
547
- policy = create_policy(options, WritePolicy)
562
+ policy = create_policy(options, Policy, default_info_policy)
563
+
548
564
  str_cmd = "sindex-create:ns=#{namespace}"
549
565
  str_cmd << ";set=#{set_name}" unless set_name.to_s.strip.empty?
550
566
  str_cmd << ";indexname=#{index_name};numbins=1"
@@ -570,7 +586,8 @@ module Aerospike
570
586
  # Delete secondary index.
571
587
  # This method is only supported by Aerospike 3 servers.
572
588
  def drop_index(namespace, set_name, index_name, options = nil)
573
- policy = create_policy(options, WritePolicy)
589
+ policy = create_policy(options, Policy, default_info_policy)
590
+
574
591
  str_cmd = "sindex-delete:ns=#{namespace}"
575
592
  str_cmd << ";set=#{set_name}" unless set_name.to_s.strip.empty?
576
593
  str_cmd << ";indexname=#{index_name}"
@@ -585,8 +602,9 @@ module Aerospike
585
602
  raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::INDEX_GENERIC, "Drop index failed: #{response}")
586
603
  end
587
604
 
588
- def request_info(*commands)
589
- @cluster.request_info(@default_policy, *commands)
605
+ def request_info(*commands, policy: nil)
606
+ policy = create_policy(policy, Policy, default_info_policy)
607
+ @cluster.request_info(policy, *commands)
590
608
  end
591
609
 
592
610
  #-------------------------------------------------------
@@ -594,7 +612,7 @@ module Aerospike
594
612
  #-------------------------------------------------------
595
613
 
596
614
  def scan_all(namespace, set_name, bin_names = nil, options = nil)
597
- policy = create_policy(options, ScanPolicy)
615
+ policy = create_policy(options, ScanPolicy, default_scan_policy)
598
616
 
599
617
  # wait until all migrations are finished
600
618
  # TODO: implement
@@ -650,7 +668,7 @@ module Aerospike
650
668
  # ScanNode reads all records in specified namespace and set, from one node only.
651
669
  # The policy can be used to specify timeouts.
652
670
  def scan_node(node, namespace, set_name, bin_names = nil, options = nil)
653
- policy = create_policy(options, ScanPolicy)
671
+ policy = create_policy(options, ScanPolicy, default_scan_policy)
654
672
  # wait until all migrations are finished
655
673
  # TODO: implement
656
674
  # @cluster.WaitUntillMigrationIsFinished(policy.timeout)
@@ -692,7 +710,7 @@ module Aerospike
692
710
  # This method is only supported by Aerospike 3 servers.
693
711
  # If the policy is nil, a default policy will be generated.
694
712
  def query(statement, options = nil)
695
- policy = create_policy(options, QueryPolicy)
713
+ policy = create_policy(options, QueryPolicy, default_query_policy)
696
714
  new_policy = policy.clone
697
715
 
698
716
  nodes = @cluster.nodes
@@ -728,7 +746,7 @@ module Aerospike
728
746
  # Create user with password and roles. Clear-text password will be hashed using bcrypt
729
747
  # before sending to server.
730
748
  def create_user(user, password, roles, options = nil)
731
- policy = create_policy(options, AdminPolicy)
749
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
732
750
  hash = AdminCommand.hash_password(password)
733
751
  command = AdminCommand.new
734
752
  command.create_user(@cluster, policy, user, hash, roles)
@@ -736,7 +754,7 @@ module Aerospike
736
754
 
737
755
  # Remove user from cluster.
738
756
  def drop_user(user, options = nil)
739
- policy = create_policy(options, AdminPolicy)
757
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
740
758
  command = AdminCommand.new
741
759
  command.drop_user(@cluster, policy, user)
742
760
  end
@@ -744,7 +762,7 @@ module Aerospike
744
762
  # Change user's password. Clear-text password will be hashed using bcrypt before sending to server.
745
763
  def change_password(user, password, options = nil)
746
764
  raise Aerospike::Exceptions::Aerospike.new(INVALID_USER) unless @cluster.user && @cluster.user != ""
747
- policy = create_policy(options, AdminPolicy)
765
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
748
766
 
749
767
  hash = AdminCommand.hash_password(password)
750
768
  command = AdminCommand.new
@@ -762,36 +780,45 @@ module Aerospike
762
780
 
763
781
  # Add roles to user's list of roles.
764
782
  def grant_roles(user, roles, options = nil)
765
- policy = create_policy(options, AdminPolicy)
783
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
766
784
  command = AdminCommand.new
767
785
  command.grant_roles(@cluster, policy, user, roles)
768
786
  end
769
787
 
770
788
  # Remove roles from user's list of roles.
771
789
  def revoke_roles(user, roles, options = nil)
772
- policy = create_policy(options, AdminPolicy)
790
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
773
791
  command = AdminCommand.new
774
792
  command.revoke_roles(@cluster, policy, user, roles)
775
793
  end
776
794
 
777
795
  # Retrieve roles for a given user.
778
796
  def query_user(user, options = nil)
779
- policy = create_policy(options, AdminPolicy)
797
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
780
798
  command = AdminCommand.new
781
799
  command.query_user(@cluster, policy, user)
782
800
  end
783
801
 
784
802
  # Retrieve all users and their roles.
785
803
  def query_users(options = nil)
786
- policy = create_policy(options, AdminPolicy)
804
+ policy = create_policy(options, AdminPolicy, default_admin_policy)
787
805
  command = AdminCommand.new
788
806
  command.query_users(@cluster, policy)
789
807
  end
790
808
 
791
809
  private
792
810
 
811
+ def set_default_policies(policies)
812
+ self.default_info_policy = create_policy(policies[:info], Policy)
813
+ self.default_read_policy = create_policy(policies[:read], Policy)
814
+ self.default_admin_policy = create_policy(policies[:admin], AdminPolicy)
815
+ self.default_batch_policy = create_policy(policies[:batch], BatchPolicy)
816
+ self.default_query_policy = create_policy(policies[:query], QueryPolicy)
817
+ self.default_scan_policy = create_policy(policies[:scan], ScanPolicy)
818
+ self.default_write_policy = create_policy(policies[:write], WritePolicy)
819
+ end
820
+
793
821
  def send_info_command(policy, command)
794
- policy ||= default_policy
795
822
  Aerospike.logger.debug { "Sending info command: #{command}" }
796
823
  _, response = @cluster.request_info(policy, command).first
797
824
  response.to_s
@@ -810,10 +837,10 @@ module Aerospike
810
837
  end
811
838
  end
812
839
 
813
- def create_policy(policy, policy_klass)
840
+ def create_policy(policy, policy_klass, default_policy = nil)
814
841
  case policy
815
842
  when nil
816
- policy_klass.new
843
+ default_policy || policy_klass.new
817
844
  when policy_klass
818
845
  policy
819
846
  when Hash
@@ -838,8 +865,8 @@ module Aerospike
838
865
 
839
866
  # guard against unsupported particle types
840
867
  unsupported_particle_types = []
841
- unsupported_particle_types << Aerospike::ParticleType::DOUBLE unless @cluster.supports_feature?("float")
842
- unsupported_particle_types << Aerospike::ParticleType::GEOJSON unless @cluster.supports_feature?("geo")
868
+ unsupported_particle_types << Aerospike::ParticleType::DOUBLE unless supports_feature?(Aerospike::Features::FLOAT)
869
+ unsupported_particle_types << Aerospike::ParticleType::GEOJSON unless supports_feature?(Aerospike::Features::GEO)
843
870
  validators << UnsupportedParticleTypeValidator.new(*unsupported_particle_types) unless unsupported_particle_types.empty?
844
871
 
845
872
  @command_validators = validators
@@ -188,7 +188,7 @@ module Aerospike
188
188
  end
189
189
 
190
190
  def supports_peers_protocol?
191
- nodes.all? { |node| node.supports_feature?('peers') }
191
+ nodes.all? { |node| node.supports_feature?(Aerospike::Features::PEERS) }
192
192
  end
193
193
 
194
194
  def change_password(user, password)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2014-2017 Aerospike, Inc.
4
+ #
5
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
+ # license agreements.
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License") you may not
9
+ # use this file except in compliance with the License. You may obtain a copy of
10
+ # the License at http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations under
16
+ # the License.
17
+
18
+ module Aerospike
19
+
20
+ # Feature flags describing capabilities of the Aerospike server cluster the
21
+ # client is connected to. The list of supported server features can be
22
+ # retrieved by issuing the "features" info command.
23
+ module Features
24
+
25
+ # Server supports List Complex Data Type (CDT)
26
+ CDT_LIST = :"cdt-list"
27
+
28
+ # Server supports Map Complex Data Type (CDT)
29
+ CDT_MAP = :"cdt-map"
30
+
31
+ # Server supports Float data type
32
+ FLOAT = :float
33
+
34
+ # Server supports geo-spatial data type and indexing
35
+ GEO = :geo
36
+
37
+ # Server requires "lut=now" in truncate command (AER-5955)
38
+ LUT_NOW = :"lut-now"
39
+
40
+ # Server supports the new "peers" protocol for automatic node discovery
41
+ PEERS = :peers
42
+
43
+ end
44
+ end
@@ -26,6 +26,7 @@ module Aerospike
26
26
  attr_accessor :timeout, :connection_queue_size, :fail_if_not_connected, :tend_interval
27
27
  attr_accessor :cluster_name
28
28
  attr_accessor :tls
29
+ attr_accessor :policies
29
30
 
30
31
  def initialize(opt={})
31
32
  # Initial host connection timeout in seconds. The timeout when opening a connection
@@ -52,6 +53,9 @@ module Aerospike
52
53
  @cluster_name = opt[:cluster_name]
53
54
 
54
55
  @tls = opt[:tls] || opt[:ssl_options]
56
+
57
+ # Default Policies
58
+ @policies = opt.fetch(:policies) { Hash.new }
55
59
  end
56
60
 
57
61
  def requires_authentication
@@ -65,8 +65,8 @@ module Aerospike
65
65
  @ttl = opt[:ttl] || opt[:expiration] || 0
66
66
 
67
67
  # Send user defined key in addition to hash digest on a record put.
68
- # The default is to send the user defined key.
69
- @send_key = opt[:send_key].nil? ? true : opt[:send_key]
68
+ # The default is to _not_ send the user defined key.
69
+ @send_key = opt.fetch(:send_key, false)
70
70
 
71
71
  # If the transaction results in a record deletion, leave a tombstone for
72
72
  # the record. This prevents deleted records from reappearing after node
@@ -107,7 +107,7 @@ module Aerospike
107
107
  # Invalid namespace.
108
108
  INVALID_NAMESPACE = 20
109
109
 
110
- # Sent too-long bin name (>14, should be impossible in this client) or exceeded
110
+ # Sent too-long bin name (>15, should be impossible in this client) or exceeded
111
111
  # namespace's bin name quota.
112
112
  BIN_NAME_TOO_LONG = 21
113
113
 
@@ -19,12 +19,17 @@ require 'aerospike/utils/pool'
19
19
 
20
20
  module Aerospike
21
21
 
22
- private
23
-
24
22
  class Packer < MessagePack::Packer #:nodoc:
25
23
 
24
+ AS_EXT_TYPE = -1
25
+
26
26
  @@pool = Pool.new
27
- @@pool.create_proc = Proc.new { Packer.new }
27
+ @@pool.create_proc = lambda do
28
+ Packer.new.tap do |p|
29
+ p.register_type(AS_EXT_TYPE, Aerospike::WildcardValue, :to_msgpack_ext)
30
+ p.register_type(AS_EXT_TYPE, Aerospike::InfinityValue, :to_msgpack_ext)
31
+ end
32
+ end
28
33
 
29
34
  def self.use
30
35
  packer = @@pool.poll
@@ -27,7 +27,7 @@ module Aerospike
27
27
  def self.of(value)
28
28
  case value
29
29
  when nil
30
- res = NullValue.new
30
+ res = NULL
31
31
  when Integer
32
32
  if INTEGER_RANGE.cover?(value)
33
33
  res = IntegerValue.new(value)
@@ -59,7 +59,6 @@ module Aerospike
59
59
 
60
60
  end # Value
61
61
 
62
-
63
62
  # Empty value.
64
63
  class NullValue < Value #:nodoc:
65
64
 
@@ -79,7 +78,6 @@ module Aerospike
79
78
  ''
80
79
  end
81
80
 
82
-
83
81
  def estimate_size
84
82
  0
85
83
  end
@@ -97,6 +95,91 @@ module Aerospike
97
95
  end
98
96
  end
99
97
 
98
+ NULL = NullValue.new.freeze
99
+
100
+
101
+ # Infinity value.
102
+ class InfinityValue < Value #:nodoc:
103
+ def initialize
104
+ self
105
+ end
106
+
107
+ def type
108
+ raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::PARAMETER_ERROR, "Invalid particle type: INF")
109
+ end
110
+
111
+ def get
112
+ nil
113
+ end
114
+
115
+ def to_s
116
+ "INF"
117
+ end
118
+
119
+ def estimate_size
120
+ 0
121
+ end
122
+
123
+ def write(buffer, offset)
124
+ 0
125
+ end
126
+
127
+ def pack(packer)
128
+ packer.pack(self)
129
+ end
130
+
131
+ def to_bytes
132
+ ''
133
+ end
134
+
135
+ def to_msgpack_ext
136
+ 1.chr
137
+ end
138
+ end
139
+
140
+ INFINITY = InfinityValue.new.freeze
141
+
142
+ # Wildcard value.
143
+ class WildcardValue < Value #:nodoc:
144
+ def initialize
145
+ self
146
+ end
147
+
148
+ def type
149
+ raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::PARAMETER_ERROR, "Invalid particle type: wildcard")
150
+ end
151
+
152
+ def get
153
+ nil
154
+ end
155
+
156
+ def to_s
157
+ "*"
158
+ end
159
+
160
+ def estimate_size
161
+ 0
162
+ end
163
+
164
+ def write(buffer, offset)
165
+ 0
166
+ end
167
+
168
+ def pack(packer)
169
+ packer.pack(self)
170
+ end
171
+
172
+ def to_bytes
173
+ ''
174
+ end
175
+
176
+ def to_msgpack_ext
177
+ 0.chr
178
+ end
179
+ end
180
+
181
+ WILDCARD = WildcardValue.new.freeze
182
+
100
183
  # Byte array value.
101
184
  class BytesValue < Value #:nodoc:
102
185
 
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Aerospike
3
- VERSION = "2.8.0"
3
+ VERSION = "2.9.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aerospike
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Khosrow Afroozeh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-06 00:00:00.000000000 Z
12
+ date: 2018-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
@@ -99,6 +99,7 @@ files:
99
99
  - lib/aerospike/command/write_command.rb
100
100
  - lib/aerospike/connection/authenticate.rb
101
101
  - lib/aerospike/connection/create.rb
102
+ - lib/aerospike/features.rb
102
103
  - lib/aerospike/geo_json.rb
103
104
  - lib/aerospike/host.rb
104
105
  - lib/aerospike/host/parse.rb