lib/sparkey/log_iterator.rb in sparkey-1.0.0 vs lib/sparkey/log_iterator.rb in sparkey-1.1.0

- old
+ new

@@ -1,77 +1,129 @@ class Sparkey::LogIterator include Sparkey::Errors - def initialize(log_reader, hash_reader = nil) + def initialize(log_reader) @log_reader = log_reader - @hash_reader = hash_reader ptr = FFI::MemoryPointer.new(:pointer) handle_status Sparkey::Native.logiter_create(ptr, @log_reader.ptr) - @log_iter_ptr = ptr.get_pointer(0) + @log_iter_ptr = ptr.read_pointer end def next handle_status Sparkey::Native.logiter_next(@log_iter_ptr, @log_reader.ptr) end - def hash_next - handle_status Sparkey::Native.logiter_hashnext(@log_iter_ptr, @hash_reader.ptr) + def skip(count) + handle_status Sparkey::Native.logiter_skip(@log_iter_ptr, @log_reader.ptr, count) end + def reset + handle_status Sparkey::Native.logiter_reset(@log_iter_ptr, @log_reader.ptr) + end + def state Sparkey::Native.logiter_state(@log_iter_ptr) end def type Sparkey::Native.logiter_type(@log_iter_ptr) end def <=>(iterator) - ptr = FFI::MemoryPointer.new(:int, 1) + ptr = FFI::MemoryPointer.new(:int) - handle_status Sparkey::Native.logiter_keycmp(@log_iter_ptr, interator.ptr, @log_reader.ptr, ptr) + handle_status Sparkey::Native.logiter_keycmp(@log_iter_ptr, iterator.ptr, @log_reader.ptr, ptr) ptr.read_int end + def new? + state == :iter_new + end + def active? state == :iter_active end + def invalid? + state == :iter_invalid + end + + def closed? + state == :iter_closed + end + + def entry_put? + type == :entry_put + end + + def entry_delete? + type == :entry_delete + end + def key_length Sparkey::Native.logiter_keylen(@log_iter_ptr) end def value_length Sparkey::Native.logiter_valuelen(@log_iter_ptr) end def get_key - wanted_key_length = key_length - key_ptr = FFI::MemoryPointer.new(:uint8, wanted_key_length) - actual_key_length_ptr = FFI::MemoryPointer.new(:uint64, 1) + max_key_length = @log_reader.max_key_length + buffer_ptr = FFI::MemoryPointer.new(:uint8, max_key_length) + buffer_length_ptr = FFI::MemoryPointer.new(:uint64) - handle_status Sparkey::Native.logiter_fill_key(@log_iter_ptr, @log_reader.ptr, wanted_key_length, key_ptr, actual_key_length_ptr) + handle_status Sparkey::Native.logiter_fill_key(@log_iter_ptr, @log_reader.ptr, max_key_length, buffer_ptr, buffer_length_ptr) - key_ptr.read_bytes(actual_key_length_ptr.read_uint64) + buffer_ptr.read_bytes(buffer_length_ptr.read_uint64) end + def get_key_chunk(chunk_size = 1024) + buffer = FFI::Buffer.alloc_out(:uint8, chunk_size) + buffer_length_ptr = FFI::MemoryPointer.new(:uint64) + + loop do + handle_status Sparkey::Native.logiter_keychunk(@log_iter_ptr, @log_reader.ptr, chunk_size, buffer, buffer_length_ptr) + + buffer_length = buffer_length_ptr.read_uint64 + + break if buffer_length.zero? + + yield buffer.read_pointer.read_bytes(buffer_length) + end + end + def get_value - wanted_value_length = value_length - value_ptr = FFI::MemoryPointer.new(:uint8, wanted_value_length) - actual_value_length_ptr = FFI::MemoryPointer.new(:uint64, 1) + max_value_length = @log_reader.max_value_length + buffer_ptr = FFI::MemoryPointer.new(:uint8, max_value_length) + buffer_length_ptr = FFI::MemoryPointer.new(:uint64) - handle_status Sparkey::Native.logiter_fill_value(@log_iter_ptr, @log_reader.ptr, wanted_value_length, value_ptr, actual_value_length_ptr) + handle_status Sparkey::Native.logiter_fill_value(@log_iter_ptr, @log_reader.ptr, max_value_length, buffer_ptr, buffer_length_ptr) - value_ptr.read_bytes(actual_value_length_ptr.read_uint64) + buffer_ptr.read_bytes(buffer_length_ptr.read_uint64) end + def get_value_chunk(chunk_size = 1024) + buffer = FFI::Buffer.alloc_out(:uint8, chunk_size) + buffer_length_ptr = FFI::MemoryPointer.new(:uint64) + + loop do + handle_status Sparkey::Native.logiter_valuechunk(@log_iter_ptr, @log_reader.ptr, chunk_size, buffer, buffer_length_ptr) + + buffer_length = buffer_length_ptr.read_uint64 + + break if buffer_length.zero? + + yield buffer.read_pointer.read_bytes(buffer_length) + end + end + def close - ptr = FFI::MemoryPointer.new(:pointer) - ptr.put_pointer(0, @log_iter_ptr) + ptr = FFI::MemoryPointer.new(:pointer).write_pointer(@log_iter_ptr) Sparkey::Native.logiter_close(ptr) end def ptr