Class: RocksDB

Inherits:
Object
  • Object
show all
Defined in:
lib/rocksdb.rb,
lib/rocksdb/version.rb

Defined Under Namespace

Modules: Lib Classes: ClosedError, ClosedState, Error

Constant Summary collapse

ENCODING =
"UTF-8"
VERSION =
"0.2.1"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ RocksDB

Returns a new instance of RocksDB.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/rocksdb.rb', line 57

def initialize(path)
  # For performance reasons, we create and re-use these options

  @create_options = FFI::AutoPointer.new(Lib.rocksdb_options_create, Lib.method(:rocksdb_options_destroy))
  Lib.rocksdb_options_set_create_if_missing(@create_options, 1)

  @read_options = FFI::AutoPointer.new(Lib.rocksdb_readoptions_create, Lib.method(:rocksdb_readoptions_destroy))
  @write_options = FFI::AutoPointer.new(Lib.rocksdb_writeoptions_create, Lib.method(:rocksdb_writeoptions_destroy))
  @flush_options = FFI::AutoPointer.new(Lib.rocksdb_flushoptions_create, Lib.method(:rocksdb_flushoptions_destroy))

  # To automatically close the database during cleanup we need an object, but
  # for fast checking we use the literal

  @closed_state = ClosedState.new(true)
  @closed = true

  open(path) # rubocop:disable Security/Open
end

Class Method Details

.open(path) ⇒ Object



76
77
78
# File 'lib/rocksdb.rb', line 76

def self.open(path)
  new(path)
end

Instance Method Details

#closeObject



132
133
134
135
136
137
138
139
# File 'lib/rocksdb.rb', line 132

def close
  return if @closed

  Lib.rocksdb_close(@db)

  @closed_state.value = true
  @closed = true
end

#delete(key) ⇒ Object

Raises:



124
125
126
127
128
129
130
# File 'lib/rocksdb.rb', line 124

def delete(key)
  raise(ClosedError, "Database is closed") if @closed

  error = FFI::MemoryPointer.new(:pointer, 1)
  Lib.rocksdb_delete(@db, @write_options, key, key.bytesize, error)
  check_error(error)
end

#eachObject Also known as: each_pair

Raises:



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/rocksdb.rb', line 141

def each
  raise(ClosedError, "Database is closed") if @closed

  return enum_for(__method__) unless block_given?

  iterate do |iterator|
    key_length = FFI::MemoryPointer.new(:size_t, 1)
    key = read_string(Lib.rocksdb_iter_key(iterator, key_length), key_length)

    value_length = FFI::MemoryPointer.new(:size_t, 1)
    value = read_string(Lib.rocksdb_iter_value(iterator, value_length), value_length)

    yield(key, value)
  end
end

#each_keyObject

Raises:



159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/rocksdb.rb', line 159

def each_key
  raise(ClosedError, "Database is closed") if @closed

  return enum_for(__method__) unless block_given?

  iterate do |iterator|
    key_length = FFI::MemoryPointer.new(:size_t, 1)
    key = read_string(Lib.rocksdb_iter_key(iterator, key_length), key_length)

    yield(key)
  end
end

#each_prefix(prefix) ⇒ Object

Raises:



172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/rocksdb.rb', line 172

def each_prefix(prefix)
  raise(ClosedError, "Database is closed") if @closed

  return enum_for(__method__, prefix) unless block_given?

  iterate_prefix(prefix) do |key, iterator|
    value_length = FFI::MemoryPointer.new(:size_t, 1)
    value = read_string(Lib.rocksdb_iter_value(iterator, value_length), value_length)

    yield(key, value)
  end
end

#flushObject

Raises:



91
92
93
94
95
96
97
# File 'lib/rocksdb.rb', line 91

def flush
  raise(ClosedError, "Database is closed") if @closed

  error = FFI::MemoryPointer.new(:pointer, 1)
  Lib.rocksdb_flush(@db, @flush_options, error)
  check_error(error)
end

#get(key) ⇒ Object

Raises:



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/rocksdb.rb', line 107

def get(key)
  raise(ClosedError, "Database is closed") if @closed

  length = FFI::MemoryPointer.new(:size_t, 1)
  error = FFI::MemoryPointer.new(:pointer, 1)
  res = Lib.rocksdb_get(@db, @read_options, key, key.bytesize, length, error)
  check_error(error)

  return if res.null?

  value = read_string(res, length)

  Lib.rocksdb_free(res)

  value
end

#open(path) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/rocksdb.rb', line 80

def open(path)
  close

  error = FFI::MemoryPointer.new(:pointer, 1)
  @db = FFI::AutoPointer.new(Lib.rocksdb_open(@create_options, path, error), Lib.auto_close(@closed_state))
  check_error(error)

  @closed_state.value = false
  @closed = false
end

#put(key, value) ⇒ Object

Raises:



99
100
101
102
103
104
105
# File 'lib/rocksdb.rb', line 99

def put(key, value)
  raise(ClosedError, "Database is closed") if @closed

  error = FFI::MemoryPointer.new(:pointer, 1)
  Lib.rocksdb_put(@db, @write_options, key, key.bytesize, value, value.bytesize, error)
  check_error(error)
end