leveldb-jruby 1.0.0-java

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 762997e6da547e45865379880266e7332bb00937
4
+ data.tar.gz: 02b22ff12bb76f80507c8ffcde25fbfd5cf0dc79
5
+ SHA512:
6
+ metadata.gz: 9cb03e1463d9e69f547d1463169efae0034fea7cfd4ee1f058dafa0ed919a882feae7000ff920e10135c484df9ef9f5a30180f197b8c3f17d5c240a1cf1aacc9
7
+ data.tar.gz: cadeda50ae412916a5a0c78099a76ad83f5e1967b0e53ca9160cb037527d4c9642a9f481c41e471f7d4e14cc3fff4d7760396009785cb0bf8a32e5d163be40e1
@@ -0,0 +1,49 @@
1
+ # LevelDB for JRuby
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ gem 'leveldb-jruby', require: 'leveldb'
8
+
9
+ ## Usage
10
+
11
+ ```ruby
12
+ db = LevelDb.open('path/to/database')
13
+
14
+ # basic key operations
15
+ db.put('foo', 'bar')
16
+ puts db.get('foo') # => 'bar'
17
+ db.delete('foo')
18
+
19
+ # iterating over a range of keys
20
+ 10.times { |i| db.put("foo#{i.to_s.rjust(2, '0')}", i.to_s) }
21
+ db.each(from: 'foo', to: 'foo08') do |key, value|
22
+ puts "#{key} => #{value}"
23
+ end
24
+
25
+ # batch mutations
26
+ db.batch do |batch|
27
+ batch.put('foo', 'bar')
28
+ batch.delete('bar')
29
+ end
30
+
31
+ # read from a snapshot
32
+ db.put('foo', 'bar')
33
+ snapshot = db.snapshot
34
+ db.put('foo', 'baz')
35
+ puts snapshot.get('foo') # => 'bar'
36
+ puts db.get('foo') # => 'baz'
37
+ ```
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create new Pull Request
46
+
47
+ ## License
48
+
49
+ http://opensource.org/licenses/BSD-3-Clause
@@ -0,0 +1,291 @@
1
+ # encoding: utf-8
2
+
3
+ require 'leveldbjni-jars'
4
+
5
+
6
+ module LevelDb
7
+ module Library
8
+ include_package 'org.iq80.leveldb'
9
+ include_package 'org.fusesource.leveldbjni'
10
+
11
+ module Internal
12
+ include_package 'org.fusesource.leveldbjni.internal'
13
+ end
14
+ end
15
+
16
+ def self.open(path, options={})
17
+ Db.new(Library::JniDBFactory.factory.open(java.io.File.new(path), create_db_options(options)))
18
+ rescue Library::Internal::NativeDB::DBException => e
19
+ raise self::Error, e.message, e.backtrace
20
+ end
21
+
22
+ def self.repair(path, options={})
23
+ Library::JniDBFactory.factory.repair(java.io.File.new(path), create_db_options(options))
24
+ true
25
+ end
26
+
27
+ def self.destroy(path, options={})
28
+ Library::JniDBFactory.factory.destroy(java.io.File.new(path), create_db_options(options))
29
+ true
30
+ end
31
+
32
+ def self.create_db_options(options)
33
+ options.each_with_object(Library::Options.new) do |(key, value), db_options|
34
+ if OPEN_OPTIONS.include?(key)
35
+ method_name, java_type = OPEN_OPTIONS[key]
36
+ db_options.java_send(method_name, [java_type], value)
37
+ end
38
+ end
39
+ end
40
+
41
+ Error = Class.new(StandardError)
42
+
43
+ module Encoding
44
+ def encode_key(str)
45
+ return str unless str
46
+ str.to_java_bytes
47
+ end
48
+
49
+ def encode_value(str)
50
+ return str unless str
51
+ str.to_java_bytes
52
+ end
53
+
54
+ def decode_key(str)
55
+ String.from_java_bytes(str)
56
+ end
57
+
58
+ def decode_value(str)
59
+ String.from_java_bytes(str)
60
+ end
61
+ end
62
+
63
+ module Crud
64
+ include Encoding
65
+
66
+ def get(key)
67
+ value = @db.get(encode_key(key))
68
+ value && decode_value(value)
69
+ rescue java.lang.IllegalArgumentException => e
70
+ raise ArgumentError, e.message, e.backtrace
71
+ end
72
+
73
+ def put(key, value)
74
+ @db.put(encode_key(key), encode_value(value))
75
+ rescue java.lang.IllegalArgumentException => e
76
+ raise ArgumentError, e.message, e.backtrace
77
+ end
78
+
79
+ def delete(key)
80
+ @db.delete(encode_key(key))
81
+ rescue java.lang.IllegalArgumentException => e
82
+ raise ArgumentError, e.message, e.backtrace
83
+ end
84
+ end
85
+
86
+ class Db
87
+ include Crud
88
+
89
+ def initialize(db)
90
+ @db = db
91
+ end
92
+
93
+ def close
94
+ @db.close
95
+ end
96
+
97
+ def batch(&block)
98
+ batch = @db.create_write_batch
99
+ begin
100
+ yield Batch.new(batch)
101
+ @db.write(batch)
102
+ ensure
103
+ batch.close
104
+ end
105
+ end
106
+
107
+ def each(options={}, &block)
108
+ cursor = Cursor.new(@db.iterator, options)
109
+ cursor.each(&block) if block_given?
110
+ cursor
111
+ end
112
+
113
+ def snapshot
114
+ Snapshot.new(@db)
115
+ end
116
+ end
117
+
118
+ module LazyEnumerable
119
+ include Enumerable
120
+
121
+ def map(&transform)
122
+ LazyMap.new(self, &transform)
123
+ end
124
+
125
+ def select(&filter)
126
+ LazySelect.new(self, &filter)
127
+ end
128
+ end
129
+
130
+ class LazyMap
131
+ include LazyEnumerable
132
+
133
+ def initialize(enum, &transform)
134
+ @enum = enum
135
+ @transform = transform
136
+ end
137
+
138
+ def each(&block)
139
+ if block
140
+ @enum.each do |element|
141
+ block.call(@transform.call(element))
142
+ end
143
+ end
144
+ self
145
+ end
146
+ end
147
+
148
+ class LazySelect
149
+ include LazyEnumerable
150
+
151
+ def initialize(enum, &filter)
152
+ @enum = enum
153
+ @filter = filter
154
+ end
155
+
156
+ def each(&block)
157
+ if block
158
+ @enum.each do |element|
159
+ block.call(element) if @filter.call(element)
160
+ end
161
+ end
162
+ self
163
+ end
164
+ end
165
+
166
+ class Cursor
167
+ include Encoding
168
+ include LazyEnumerable
169
+
170
+ def initialize(iterator, options={})
171
+ @iterator = iterator
172
+ @from = options[:from]
173
+ @to = options[:to]
174
+ @reverse = options[:reverse]
175
+ @limit = options[:limit]
176
+ rewind
177
+ end
178
+
179
+ def close
180
+ @iterator.close
181
+ end
182
+
183
+ def next
184
+ raise StopIteration unless next?
185
+ v, @next = @next, nil
186
+ v
187
+ end
188
+
189
+ def next?
190
+ @next = internal_next unless @next
191
+ !!@next
192
+ end
193
+
194
+ def each
195
+ return self unless block_given?
196
+ rewind
197
+ yield self.next while next?
198
+ close
199
+ self
200
+ end
201
+
202
+ def rewind
203
+ @next = nil
204
+ @started = false
205
+ @exhausted = false
206
+ @count = 0
207
+ end
208
+
209
+ private
210
+
211
+ def init
212
+ return if @started
213
+ @started = true
214
+ @count = 0
215
+ if @from
216
+ @iterator.seek(encode_key(@from))
217
+ unless @iterator.has_next
218
+ @iterator.seek_to_last
219
+ end
220
+ if @reverse && @iterator.has_prev && (entry = @iterator.peek_next) && decode_key(entry.key) > @from
221
+ @iterator.prev
222
+ end
223
+ elsif @reverse
224
+ @iterator.seek_to_last
225
+ else
226
+ @iterator.seek_to_first
227
+ end
228
+ end
229
+
230
+ def internal_next
231
+ init
232
+ return nil if @exhausted || (@limit && @count >= @limit)
233
+ if (entry = @iterator.has_next && @iterator.peek_next)
234
+ key = decode_key(entry.key)
235
+ if @reverse
236
+ return nil if (@to && key < @to) || (@from && @from < key)
237
+ @exhausted = !@iterator.has_prev
238
+ @exhausted || @iterator.prev
239
+ else
240
+ return nil if (@to && key > @to) || (@from && @from > key)
241
+ @exhausted = !@iterator.has_next
242
+ @exhausted || @iterator.next
243
+ end
244
+ @count += 1
245
+ return key, decode_value(entry.value)
246
+ end
247
+ rescue NativeException
248
+ raise
249
+ end
250
+ end
251
+
252
+ class Snapshot
253
+ include Encoding
254
+
255
+ def initialize(db)
256
+ @db = db
257
+ @snapshot = @db.snapshot
258
+ @read_options = Library::ReadOptions.new
259
+ @read_options.snapshot(@snapshot)
260
+ end
261
+
262
+ def get(key)
263
+ value = @db.get(encode_key(key), @read_options)
264
+ value && decode_value(value)
265
+ end
266
+
267
+ def close
268
+ @snapshot.close
269
+ end
270
+ end
271
+
272
+ class Batch
273
+ include Crud
274
+
275
+ def initialize(batch)
276
+ @db = batch
277
+ end
278
+ end
279
+
280
+ private
281
+
282
+ OPEN_OPTIONS = {
283
+ :create_if_missing => [:createIfMissing, Java::boolean],
284
+ :error_if_exists => [:errorIfExists, Java::boolean],
285
+ :paranoid_checks => [:paranoidChecks, Java::boolean],
286
+ :write_buffer_size => [:writeBufferSize, Java::int],
287
+ :max_open_files => [:maxOpenFiles, Java::int],
288
+ :block_restart_interval => [:blockRestartInterval, Java::int],
289
+ :block_size => [:blockSize, Java::int],
290
+ }.freeze
291
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module LevelDb
4
+ VERSION = '1.0.0'.freeze
5
+ end
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+
3
+ require 'level_db'
4
+
5
+
6
+ LevelDB = LevelDb
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: leveldb-jruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: java
6
+ authors:
7
+ - Theo Hultberg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ~>
17
+ - !ruby/object:Gem::Version
18
+ version: 1.8.0
19
+ name: leveldbjni-jars
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.8.0
27
+ description: LevelDB for JRuby over JNI
28
+ email:
29
+ - theo@iconara.net
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - lib/level_db.rb
36
+ - lib/level_db/version.rb
37
+ - lib/leveldb.rb
38
+ homepage: http://github.com/iconara/leveldb-jruby
39
+ licenses:
40
+ - BSD 3-Clause License
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: LevelDB for JRuby
62
+ test_files: []