Class: FDB::TransactionRead
- Inherits:
-
Object
- Object
- FDB::TransactionRead
- Defined in:
- lib/fdbimpl.rb
Direct Known Subclasses
Constant Summary collapse
- @@RangeEnum =
Class.new do include Enumerable def initialize(get_range, bsel, esel, limit, reverse, streaming_mode) @get_range = get_range @bsel = bsel @esel = esel @limit = limit @reverse = reverse @mode = streaming_mode @future = @get_range.call(@bsel, @esel, @limit, @mode, 1, @reverse) end def to_a o = self.dup o.instance_eval do if @mode == @@StreamingMode["ITERATOR"][0] if @limit.zero? @mode = @@StreamingMode["WANT_ALL"][0] else @mode = @@StreamingMode["EXACT"][0] end end end Enumerable.instance_method(:to_a).bind(o).call end def each bsel = @bsel esel = @esel limit = @limit iteration = 1 # the first read was fired off when the RangeEnum was initialized future = @future done = false while !done if future kvs, count, more = future.wait index = 0 future = nil return if count.zero? end result = kvs[index] index += 1 if index == count if more.zero? || limit == count done = true else iteration += 1 if limit.nonzero? limit -= count end if @reverse.nonzero? esel = KeySelector.first_greater_or_equal(kvs.last.key) else bsel = KeySelector.first_greater_than(kvs.last.key) end future = @get_range.call(bsel, esel, limit, @mode, iteration, @reverse) end end yield result end end end
Instance Attribute Summary collapse
-
#db ⇒ Object
readonly
Returns the value of attribute db.
-
#tpointer ⇒ Object
readonly
Returns the value of attribute tpointer.
Class Method Summary collapse
Instance Method Summary collapse
- #get(key) ⇒ Object (also: #[])
- #get_estimated_range_size_bytes(begin_key, end_key) ⇒ Object
- #get_key(keysel) ⇒ Object
- #get_range(bkeysel, ekeysel, options = {}, &block) ⇒ Object
- #get_range_split_points(begin_key, end_key, chunk_size) ⇒ Object
- #get_range_start_with(prefix, options = {}, &block) ⇒ Object
- #get_read_version ⇒ Object
-
#initialize(tpointer, db, is_snapshot) ⇒ TransactionRead
constructor
A new instance of TransactionRead.
- #transact {|_self| ... } ⇒ Object
Constructor Details
#initialize(tpointer, db, is_snapshot) ⇒ TransactionRead
Returns a new instance of TransactionRead.
702 703 704 705 706 707 708 |
# File 'lib/fdbimpl.rb', line 702 def initialize(tpointer, db, is_snapshot) @tpointer = tpointer @db = db @is_snapshot = is_snapshot ObjectSpace.define_finalizer(self, self.class.finalize(@tpointer)) end |
Instance Attribute Details
#db ⇒ Object (readonly)
Returns the value of attribute db.
692 693 694 |
# File 'lib/fdbimpl.rb', line 692 def db @db end |
#tpointer ⇒ Object (readonly)
Returns the value of attribute tpointer.
693 694 695 |
# File 'lib/fdbimpl.rb', line 693 def tpointer @tpointer end |
Class Method Details
.finalize(ptr) ⇒ Object
695 696 697 698 699 700 |
# File 'lib/fdbimpl.rb', line 695 def self.finalize(ptr) proc do #puts "Destroying transaction #{ptr}" FDBC.fdb_transaction_destroy(ptr) end end |
Instance Method Details
#get(key) ⇒ Object Also known as: []
718 719 720 721 |
# File 'lib/fdbimpl.rb', line 718 def get(key) key = FDB.key_to_bytes(key) Value.new(FDBC.fdb_transaction_get(@tpointer, key, key.bytesize, @is_snapshot)) end |
#get_estimated_range_size_bytes(begin_key, end_key) ⇒ Object
845 846 847 848 849 |
# File 'lib/fdbimpl.rb', line 845 def get_estimated_range_size_bytes(begin_key, end_key) bkey = FDB.key_to_bytes(begin_key) ekey = FDB.key_to_bytes(end_key) Int64Future.new(FDBC.fdb_transaction_get_estimated_range_size_bytes(@tpointer, bkey, bkey.bytesize, ekey, ekey.bytesize)) end |
#get_key(keysel) ⇒ Object
724 725 726 727 |
# File 'lib/fdbimpl.rb', line 724 def get_key(keysel) key = FDB.key_to_bytes(keysel.key) Key.new(FDBC.fdb_transaction_get_key(@tpointer, key, key.bytesize, keysel.or_equal, keysel.offset, @is_snapshot)) end |
#get_range(bkeysel, ekeysel, options = {}, &block) ⇒ Object
812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 |
# File 'lib/fdbimpl.rb', line 812 def get_range(bkeysel, ekeysel, ={}, &block) defaults = { :limit => 0, :reverse => false, :streaming_mode => :iterator } = defaults.merge bsel = to_selector bkeysel esel = to_selector ekeysel if [:streaming_mode].kind_of? Symbol streaming_mode = @@StreamingMode[[:streaming_mode].to_s.upcase] raise ArgumentError, "#{[:streaming_mode]} is not a valid streaming mode" if !streaming_mode streaming_mode = streaming_mode[0] else streaming_mode = [:streaming_mode] end r = @@RangeEnum.new(lambda {|bsel, esel, limit, streaming_mode, iteration, reverse| begin_key = FDB.key_to_bytes(bsel.key) end_key = FDB.key_to_bytes(esel.key) FDB::FutureKeyValueArray.new(FDBC.fdb_transaction_get_range(@tpointer, begin_key, begin_key.bytesize, bsel.or_equal, bsel.offset, end_key, end_key.bytesize, esel.or_equal, esel.offset, limit, 0, streaming_mode, iteration, @is_snapshot, reverse)) }, bsel, esel, [:limit], [:reverse] ? 1 : 0, streaming_mode) if !block_given? r else r.each &block end end |
#get_range_split_points(begin_key, end_key, chunk_size) ⇒ Object
851 852 853 854 855 856 857 858 |
# File 'lib/fdbimpl.rb', line 851 def get_range_split_points(begin_key, end_key, chunk_size) if chunk_size <=0 raise ArgumentError, "Invalid chunk size" end bkey = FDB.key_to_bytes(begin_key) ekey = FDB.key_to_bytes(end_key) FutureKeyArray.new(FDBC.fdb_transaction_get_range_split_points(@tpointer, bkey, bkey.bytesize, ekey, ekey.bytesize, chunk_size)) end |
#get_range_start_with(prefix, options = {}, &block) ⇒ Object
839 840 841 842 843 |
# File 'lib/fdbimpl.rb', line 839 def get_range_start_with(prefix, ={}, &block) prefix = FDB.key_to_bytes(prefix) prefix = prefix.dup.force_encoding "BINARY" get_range(prefix, FDB.strinc(prefix), , &block) end |
#get_read_version ⇒ Object
714 715 716 |
# File 'lib/fdbimpl.rb', line 714 def get_read_version Int64Future.new(FDBC.fdb_transaction_get_read_version @tpointer) end |
#transact {|_self| ... } ⇒ Object
710 711 712 |
# File 'lib/fdbimpl.rb', line 710 def transact yield self end |