leveldb-jruby 1.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []