leveldb 0.0.1 → 0.1.0

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.
data/lib/native.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'fiddler'
2
+
3
+ module LevelDB
4
+ module Native
5
+ include Fiddler
6
+
7
+ prefix 'leveldb_'
8
+ dlload 'libleveldb'
9
+
10
+ cdef :open, VOIDP, options: VOIDP, name: VOIDP, errptr: VOIDP
11
+ cdef :put, VOID, db: VOIDP, options: VOIDP, key: VOIDP, keylen: ULONG, val: VOIDP, vallen: ULONG, errptr: VOIDP
12
+ cdef :get, VOIDP, db: VOIDP, options: VOIDP, key: VOIDP, keylen: ULONG, vallen: VOIDP, errptr: VOIDP
13
+ cdef :delete, VOID, db: VOIDP, options: VOIDP, key: VOIDP, keylen: ULONG, errptr: VOIDP
14
+ cdef :destroy_db, VOID, options: VOIDP, name: VOIDP, errptr: VOIDP
15
+ cdef :repair_db, VOID, options: VOIDP, name: VOIDP, errptr: VOIDP
16
+ cdef :release_snapshot, VOID, db: VOIDP, snapshot: VOIDP
17
+ cdef :create_snapshot, VOIDP, db: VOIDP
18
+ cdef :approximate_sizes, VOID, db: VOIDP, num_ranges: INT, range_start_key: VOIDP, range_start_key_len: VOIDP, range_limit_key: VOIDP, range_limit_key_len: VOIDP, sizes: VOIDP
19
+ cdef :close, VOID, db: VOIDP
20
+ cdef :property_value, VOIDP, db: VOIDP, propname: VOIDP
21
+ cdef :compact_range, VOID, db: VOIDP, start_key: VOIDP, start_key_len: ULONG, limit_key: VOIDP, limit_key_len: ULONG
22
+ cdef :free, VOID, ptr: VOIDP
23
+
24
+ cdef :create_iterator, VOIDP, db: VOIDP, options: VOIDP
25
+ cdef :iter_destroy, VOID, iterator: VOIDP
26
+ cdef :iter_seek_to_first, VOID, iterator: VOIDP
27
+ cdef :iter_seek, VOID, iterator: VOIDP, k: VOIDP, klen: ULONG
28
+ cdef :iter_prev, VOID, iterator: VOIDP
29
+ cdef :iter_key, VOIDP, iterator: VOIDP, klen: VOIDP
30
+ cdef :iter_value, VOIDP, iterator: VOIDP, vlen: VOIDP
31
+ cdef :iter_get_error, VOID, iterator: VOIDP, errptr: VOIDP
32
+ cdef :iter_valid, UCHAR, iterator: VOIDP
33
+ cdef :iter_next, VOID, iterator: VOIDP
34
+ cdef :iter_seek_to_last, VOID, iterator: VOIDP
35
+
36
+ cdef :writebatch_create, VOIDP
37
+ cdef :writebatch_clear, VOID, writebatch: VOIDP
38
+ cdef :writebatch_put, VOID, writebatch: VOIDP, key: VOIDP, klen: ULONG, val: VOIDP, vlen: ULONG
39
+ cdef :writebatch_delete, VOID, writebatch: VOIDP, key: VOIDP, klen: ULONG
40
+ cdef :writebatch_destroy, VOID, writebatch: VOIDP
41
+ cdef :writebatch_iterate, VOID, writebatch: VOIDP, state: VOIDP, put: VOIDP, deleted: VOIDP
42
+ cdef :write, VOID, db: VOIDP, options: VOIDP, batch: VOIDP, errptr: VOIDP
43
+
44
+ cdef :options_create, VOIDP
45
+ cdef :options_set_comparator, VOID, options: VOIDP, comparator: VOIDP
46
+ cdef :options_set_create_if_missing, VOID, options: VOIDP, u_char: UCHAR
47
+ cdef :options_set_paranoid_checks, VOID, options: VOIDP, u_char: UCHAR
48
+ cdef :options_set_info_log, VOID, options: VOIDP, logger: VOIDP
49
+ cdef :options_set_max_open_files, VOID, options: VOIDP, int: INT
50
+ cdef :options_set_block_size, VOID, options: VOIDP, u_long: ULONG
51
+ cdef :options_set_compression, VOID, options: VOIDP, int: INT
52
+ cdef :options_set_filter_policy, VOID, options: VOIDP, filterpolicy: VOIDP
53
+ cdef :options_set_env, VOID, options: VOIDP, env: VOIDP
54
+ cdef :options_set_cache, VOID, options: VOIDP, cache: VOIDP
55
+ cdef :options_set_error_if_exists, VOID, options: VOIDP, u_char: UCHAR
56
+ cdef :options_set_block_restart_interval, VOID, options: VOIDP, int: INT
57
+ cdef :options_set_write_buffer_size, VOID, options: VOIDP, u_long: ULONG
58
+ cdef :options_destroy, VOID, options: VOIDP
59
+
60
+ cdef :readoptions_create, VOIDP
61
+ cdef :readoptions_destroy, VOID, readoptions: VOIDP
62
+ cdef :readoptions_set_verify_checksums, VOID, readoptions: VOIDP, u_char: UCHAR
63
+ cdef :readoptions_set_snapshot, VOID, readoptions: VOIDP, snapshot: VOIDP
64
+ cdef :readoptions_set_fill_cache, VOID, readoptions: VOIDP, u_char: UCHAR
65
+
66
+ cdef :cache_create_lru, VOIDP, capacity: ULONG
67
+ cdef :cache_destroy, VOID, cache: VOIDP
68
+
69
+ cdef :create_default_env, VOIDP
70
+ cdef :env_destroy, VOID, env: VOIDP
71
+
72
+ cdef :comparator_create, VOIDP, state: VOIDP, destructor: VOIDP, compare: VOIDP, name: VOIDP
73
+ cdef :comparator_destroy, VOID, comparator: VOIDP
74
+
75
+ cdef :writeoptions_destroy, VOID, writeoptions: VOIDP
76
+ cdef :writeoptions_set_sync, VOID, writeoptions: VOIDP, u_char: UCHAR
77
+ cdef :writeoptions_create, VOIDP
78
+
79
+ cdef :filterpolicy_create_bloom, VOIDP, bits_per_key: INT
80
+ cdef :filterpolicy_create, VOIDP, state: VOIDP, destructor: VOIDP, create_filter: VOIDP, key_may_match: VOIDP, name: VOIDP
81
+ cdef :filterpolicy_destroy, VOID, filterpolicy: VOIDP
82
+
83
+ cdef :minor_version, INT
84
+ cdef :major_version, INT
85
+ end
86
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'leveldb'
3
+ require 'minitest/autorun'
4
+
5
+ # Create a temp directory
6
+ File.mkdir './tmp' unless File.exist?('./tmp')
@@ -0,0 +1,43 @@
1
+ require_relative './helper'
2
+
3
+ class TestBatch < Minitest::Test
4
+ attr_reader :db
5
+
6
+ def setup
7
+ @db ||= LevelDB::DB.new './tmp/test-batch'
8
+ end
9
+
10
+ def teardown
11
+ db.close
12
+ db.destroy
13
+ end
14
+
15
+ def test_batch
16
+ batch = db.batch
17
+ ('a'..'z').each do |l|
18
+ refute db[l]
19
+ batch.put l, l.upcase
20
+ end
21
+
22
+ batch.write!
23
+
24
+ ('a'..'z').each do |l|
25
+ assert batch.delete l
26
+ assert_equal l.upcase, db[l]
27
+ end
28
+
29
+ batch.write!
30
+
31
+ ('a'..'z').each { |l| refute db[l] }
32
+ end
33
+
34
+ def test_batch_block
35
+ ('a'..'z').each { |l| refute db[l] }
36
+
37
+ db.batch do |batch|
38
+ ('a'..'z').each { |l| batch.put l, l.upcase }
39
+ end
40
+
41
+ ('a'..'z').each { |l| assert_equal l.upcase, db[l] }
42
+ end
43
+ end
data/test/test_db.rb ADDED
@@ -0,0 +1,58 @@
1
+ require_relative './helper'
2
+
3
+ class TestBasic < Minitest::Test
4
+
5
+ def db
6
+ Thread.current[:__db__] ||= LevelDB::DB.new './tmp/test'
7
+ end
8
+
9
+ def test_open
10
+ assert_raises(LevelDB::DB::Error) do
11
+ LevelDB::DB.new './doesnt-exist/foo'
12
+ end
13
+ assert db
14
+ end
15
+
16
+ def test_put
17
+ foo = db.put(:foo, :bar)
18
+ assert_equal 'bar', foo
19
+
20
+ foo = db[:foo] = 'bax'
21
+ assert_equal 'bax', foo
22
+ end
23
+
24
+ def test_read
25
+ db.put(:foo, :bar)
26
+ assert_equal 'bar', db.get(:foo)
27
+
28
+ db[:foo] = 'bax'
29
+ assert_equal 'bax', db[:foo]
30
+ end
31
+
32
+ def test_delete
33
+ db[:foo] = 'bar'
34
+
35
+ res = db.delete(:foo)
36
+ assert_equal 'bar', res
37
+
38
+ res = db.delete(:foo)
39
+ assert_nil res
40
+ end
41
+
42
+ def test_close
43
+ d = LevelDB::DB.new './tmp/test-close'
44
+ assert d.close
45
+ assert_raises(LevelDB::DB::ClosedError){ d[:foo] }
46
+ end
47
+
48
+ def test_destroy
49
+ d = LevelDB::DB.new './tmp/test-close'
50
+ assert_raises(LevelDB::DB::Error){ d.destroy }
51
+ assert d.close
52
+ assert d.destroy
53
+ end
54
+
55
+ def test_stats
56
+ assert_match /Level/, db.stats
57
+ end
58
+ end
@@ -0,0 +1,120 @@
1
+ require_relative './helper'
2
+
3
+ class TestIterator < Minitest::Test
4
+ attr_reader :db
5
+
6
+ def setup
7
+ @db ||= LevelDB::DB.new './tmp/test-iterator'
8
+ end
9
+
10
+ def teardown
11
+ db.close
12
+ db.destroy
13
+ end
14
+
15
+ def test_next
16
+ db[:a] = :sten
17
+ db[:b] = :roger
18
+
19
+ iterator = db.each
20
+
21
+ assert_equal %w[a sten], iterator.next
22
+ assert_equal %w[b roger], iterator.next
23
+
24
+ assert db.each.next
25
+ refute iterator.next
26
+ end
27
+
28
+ def test_reverse_next
29
+ db[:a] = :sten
30
+ db[:b] = :roger
31
+
32
+ iterator = db.reverse_each
33
+
34
+ assert_equal %w[b roger], iterator.next
35
+ assert_equal %w[a sten], iterator.next
36
+
37
+ assert db.each.next
38
+ refute iterator.next
39
+ end
40
+
41
+ def test_range_next
42
+ ('a'..'z').each { |l| db[l] = l.upcase }
43
+
44
+ range = db.range('b', 'd')
45
+
46
+ assert_equal %w[b B], range.next
47
+ assert_equal %w[c C], range.next
48
+ assert_equal %w[d D], range.next
49
+
50
+ refute range.next
51
+ end
52
+
53
+ def test_range_reverse_next
54
+ ('a'..'z').each { |l| db[l] = l.upcase }
55
+
56
+ range = db.reverse_range('b', 'd')
57
+
58
+ assert_equal %w[d D], range.next
59
+ assert_equal %w[c C], range.next
60
+ assert_equal %w[b B], range.next
61
+
62
+ refute range.next
63
+ end
64
+
65
+ def test_keys
66
+ db[:a] = :sten
67
+ db[:b] = :roger
68
+
69
+ assert_equal %w[a b], db.keys
70
+ end
71
+
72
+ def test_values
73
+ db[:a] = :sten
74
+ db[:b] = :roger
75
+
76
+ assert_equal %w[sten roger], db.values
77
+ end
78
+
79
+ def test_block
80
+ db[:a] = :sten
81
+ db[:b] = :roger
82
+
83
+ keys, values = [], []
84
+ db.each { |k,v| keys.push(k); values.push(v) }
85
+
86
+ assert_equal %w[a b], keys
87
+ assert_equal %w[sten roger], values
88
+ end
89
+
90
+ def test_reverse_block
91
+ db[:a] = :sten
92
+ db[:b] = :roger
93
+
94
+ keys, values = [], []
95
+ db.reverse_each { |k,v| keys.push(k); values.push(v) }
96
+
97
+ assert_equal %w[b a], keys
98
+ assert_equal %w[roger sten], values
99
+ end
100
+
101
+ def test_range_block
102
+ ('a'..'z').each { |l| db[l] = l.upcase }
103
+
104
+ keys, values = [], []
105
+ db.range('b', 'd') { |k,v| keys.push(k); values.push(v) }
106
+
107
+ assert_equal %w[b c d], keys
108
+ assert_equal %w[B C D], values
109
+ end
110
+
111
+ def test_range_reverse_block
112
+ ('a'..'z').each { |l| db[l] = l.upcase }
113
+
114
+ keys, values = [], []
115
+ db.reverse_range('b', 'd') { |k,v| keys.push(k); values.push(v) }
116
+
117
+ assert_equal %w[d c b], keys
118
+ assert_equal %w[D C B], values
119
+ end
120
+ end
@@ -0,0 +1,37 @@
1
+ require_relative './helper'
2
+
3
+ class TestSnapshot < Minitest::Test
4
+ attr_reader :db
5
+
6
+ def setup
7
+ @db ||= LevelDB::DB.new './tmp/test-snapshot'
8
+ end
9
+
10
+ def teardown
11
+ db.close
12
+ db.destroy
13
+ end
14
+
15
+ def test_snap
16
+ db.put 'a', 1
17
+ db.put 'b', 2
18
+ db.put 'c', 3
19
+
20
+ snap = db.snapshot
21
+
22
+ db.delete 'a'
23
+ refute db.get 'a'
24
+
25
+ snap.set!
26
+
27
+ assert_equal '1', db.get('a')
28
+
29
+ snap.reset!
30
+
31
+ refute db.get('a')
32
+
33
+ snap.set!
34
+
35
+ assert_equal '1', db.get('a')
36
+ end
37
+ end
metadata CHANGED
@@ -1,45 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leveldb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DAddYE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-19 00:00:00.000000000 Z
11
+ date: 2013-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ffi
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 1.9.0
20
- type: :runtime
19
+ version: '1.3'
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 1.9.0
26
+ version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bundler
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '>='
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest
56
+ name: ffi
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '>='
@@ -196,10 +196,21 @@ files:
196
196
  - ext/leveldb/build_config.mk
197
197
  - ext/leveldb/LICENSE
198
198
  - ext/leveldb/Makefile
199
+ - lib/fiddler.rb
200
+ - lib/leveldb/batch.rb
201
+ - lib/leveldb/db.rb
202
+ - lib/leveldb/iterator.rb
203
+ - lib/leveldb/snapshot.rb
199
204
  - lib/leveldb/version.rb
200
205
  - lib/leveldb.rb
206
+ - lib/native.rb
201
207
  - README.md
202
208
  - LICENSE.txt
209
+ - test/helper.rb
210
+ - test/test_batch.rb
211
+ - test/test_db.rb
212
+ - test/test_iterator.rb
213
+ - test/test_snapshot.rb
203
214
  homepage: https://github.com/DAddYE/leveldb
204
215
  licenses:
205
216
  - MIT
@@ -224,5 +235,10 @@ rubygems_version: 2.0.3
224
235
  signing_key:
225
236
  specification_version: 4
226
237
  summary: LevelDB for Ruby
227
- test_files: []
238
+ test_files:
239
+ - test/helper.rb
240
+ - test/test_batch.rb
241
+ - test/test_db.rb
242
+ - test/test_iterator.rb
243
+ - test/test_snapshot.rb
228
244
  has_rdoc: