sparkey 0.0.1 → 1.0.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.
- checksums.yaml +7 -0
- data/Rakefile +7 -0
- data/lib/sparkey.rb +17 -2
- data/lib/sparkey/errors.rb +11 -0
- data/lib/sparkey/hash_reader.rb +49 -0
- data/lib/sparkey/hash_writer.rb +10 -0
- data/lib/sparkey/log_iterator.rb +81 -0
- data/lib/sparkey/log_reader.rb +35 -0
- data/lib/sparkey/log_writer.rb +51 -0
- data/lib/sparkey/native.rb +98 -0
- data/lib/sparkey/store.rb +108 -0
- data/lib/sparkey/testing.rb +15 -0
- data/sparkey.gemspec +7 -7
- data/spec/sparkey_spec.rb +38 -0
- metadata +37 -26
- data/LICENSE.txt +0 -22
- data/lib/sparkey/version.rb +0 -3
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1d02b7853fe52790fde3dd206f8af7febc4c01f8
|
4
|
+
data.tar.gz: 34f41f81cbf31b608fa6faed0ba9b252c1e4b1b8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2719e8fd06e6f6d108f5eab7a856a37fafddfafa712b8daff293315293d458c56709a26e6891b68ffdbefd122affad22b8d6e8a79b498e4bbcece8222591c965
|
7
|
+
data.tar.gz: 81397ce7bf58162b23ad076d2334a1acb63d8064f9cf6bc12da2e71eaa4b3d5ab8fda1c10b84d237437904557c54bd3fee7d529f769694bcb486a647ec0e06a0
|
data/Rakefile
CHANGED
data/lib/sparkey.rb
CHANGED
@@ -1,5 +1,20 @@
|
|
1
|
-
require "
|
1
|
+
require "ffi"
|
2
2
|
|
3
3
|
module Sparkey
|
4
|
-
|
4
|
+
def self.create(filename)
|
5
|
+
Store.create(filename)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.open(filename)
|
9
|
+
Store.open(filename)
|
10
|
+
end
|
5
11
|
end
|
12
|
+
|
13
|
+
require "sparkey/native"
|
14
|
+
require "sparkey/errors"
|
15
|
+
require "sparkey/store"
|
16
|
+
require "sparkey/log_writer"
|
17
|
+
require "sparkey/log_reader"
|
18
|
+
require "sparkey/log_iterator"
|
19
|
+
require "sparkey/hash_writer"
|
20
|
+
require "sparkey/hash_reader"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Sparkey::HashReader
|
2
|
+
include Sparkey::Errors
|
3
|
+
|
4
|
+
def open(filename)
|
5
|
+
hash_filename = "#{filename}.spi"
|
6
|
+
log_filename = "#{filename}.spl"
|
7
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
8
|
+
|
9
|
+
handle_status Sparkey::Native.hash_open(ptr, hash_filename, log_filename)
|
10
|
+
|
11
|
+
@hash_reader_ptr = ptr.get_pointer(0)
|
12
|
+
end
|
13
|
+
|
14
|
+
def close
|
15
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
16
|
+
ptr.put_pointer(0, @hash_reader_ptr)
|
17
|
+
|
18
|
+
Sparkey::Native.hash_close(ptr)
|
19
|
+
end
|
20
|
+
|
21
|
+
def seek(key)
|
22
|
+
iterator = Sparkey::LogIterator.new(log_reader)
|
23
|
+
|
24
|
+
key_length = key.size
|
25
|
+
key_ptr = FFI::MemoryPointer.new(:uint8, key_length)
|
26
|
+
key_ptr.put_bytes(0, key)
|
27
|
+
|
28
|
+
handle_status Sparkey::Native.hash_get(@hash_reader_ptr, key_ptr, key_length, iterator.ptr)
|
29
|
+
|
30
|
+
iterator
|
31
|
+
end
|
32
|
+
|
33
|
+
def size
|
34
|
+
Sparkey::Native.hash_numentries(@hash_reader_ptr)
|
35
|
+
end
|
36
|
+
|
37
|
+
def log_reader
|
38
|
+
reader_ptr = Sparkey::Native.hash_getreader(@hash_reader_ptr)
|
39
|
+
|
40
|
+
log_reader = Sparkey::LogReader.new
|
41
|
+
log_reader.ptr = reader_ptr
|
42
|
+
|
43
|
+
log_reader
|
44
|
+
end
|
45
|
+
|
46
|
+
def ptr
|
47
|
+
@hash_reader_ptr
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class Sparkey::LogIterator
|
2
|
+
include Sparkey::Errors
|
3
|
+
|
4
|
+
def initialize(log_reader, hash_reader = nil)
|
5
|
+
@log_reader = log_reader
|
6
|
+
@hash_reader = hash_reader
|
7
|
+
|
8
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
9
|
+
|
10
|
+
handle_status Sparkey::Native.logiter_create(ptr, @log_reader.ptr)
|
11
|
+
|
12
|
+
@log_iter_ptr = ptr.get_pointer(0)
|
13
|
+
end
|
14
|
+
|
15
|
+
def next
|
16
|
+
handle_status Sparkey::Native.logiter_next(@log_iter_ptr, @log_reader.ptr)
|
17
|
+
end
|
18
|
+
|
19
|
+
def hash_next
|
20
|
+
handle_status Sparkey::Native.logiter_hashnext(@log_iter_ptr, @hash_reader.ptr)
|
21
|
+
end
|
22
|
+
|
23
|
+
def state
|
24
|
+
Sparkey::Native.logiter_state(@log_iter_ptr)
|
25
|
+
end
|
26
|
+
|
27
|
+
def type
|
28
|
+
Sparkey::Native.logiter_type(@log_iter_ptr)
|
29
|
+
end
|
30
|
+
|
31
|
+
def <=>(iterator)
|
32
|
+
ptr = FFI::MemoryPointer.new(:int, 1)
|
33
|
+
|
34
|
+
handle_status Sparkey::Native.logiter_keycmp(@log_iter_ptr, interator.ptr, @log_reader.ptr, ptr)
|
35
|
+
|
36
|
+
ptr.read_int
|
37
|
+
end
|
38
|
+
|
39
|
+
def active?
|
40
|
+
state == :iter_active
|
41
|
+
end
|
42
|
+
|
43
|
+
def key_length
|
44
|
+
Sparkey::Native.logiter_keylen(@log_iter_ptr)
|
45
|
+
end
|
46
|
+
|
47
|
+
def value_length
|
48
|
+
Sparkey::Native.logiter_valuelen(@log_iter_ptr)
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_key
|
52
|
+
wanted_key_length = key_length
|
53
|
+
key_ptr = FFI::MemoryPointer.new(:uint8, wanted_key_length)
|
54
|
+
actual_key_length_ptr = FFI::MemoryPointer.new(:uint64, 1)
|
55
|
+
|
56
|
+
handle_status Sparkey::Native.logiter_fill_key(@log_iter_ptr, @log_reader.ptr, wanted_key_length, key_ptr, actual_key_length_ptr)
|
57
|
+
|
58
|
+
key_ptr.read_bytes(actual_key_length_ptr.read_uint64)
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_value
|
62
|
+
wanted_value_length = value_length
|
63
|
+
value_ptr = FFI::MemoryPointer.new(:uint8, wanted_value_length)
|
64
|
+
actual_value_length_ptr = FFI::MemoryPointer.new(:uint64, 1)
|
65
|
+
|
66
|
+
handle_status Sparkey::Native.logiter_fill_value(@log_iter_ptr, @log_reader.ptr, wanted_value_length, value_ptr, actual_value_length_ptr)
|
67
|
+
|
68
|
+
value_ptr.read_bytes(actual_value_length_ptr.read_uint64)
|
69
|
+
end
|
70
|
+
|
71
|
+
def close
|
72
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
73
|
+
ptr.put_pointer(0, @log_iter_ptr)
|
74
|
+
|
75
|
+
Sparkey::Native.logiter_close(ptr)
|
76
|
+
end
|
77
|
+
|
78
|
+
def ptr
|
79
|
+
@log_iter_ptr
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Sparkey::LogReader
|
2
|
+
include Sparkey::Errors
|
3
|
+
|
4
|
+
def open(filename)
|
5
|
+
log_filename = "#{filename}.spl"
|
6
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
7
|
+
|
8
|
+
handle_status Sparkey::Native.logreader_open(ptr, log_filename)
|
9
|
+
|
10
|
+
@log_reader_ptr = ptr.get_pointer(0)
|
11
|
+
end
|
12
|
+
|
13
|
+
def close
|
14
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
15
|
+
ptr.put_pointer(0, @log_reader_ptr)
|
16
|
+
|
17
|
+
Sparkey::Native.logreader_close(ptr)
|
18
|
+
end
|
19
|
+
|
20
|
+
def max_key_length
|
21
|
+
Sparkey::Native.logreader_maxkeylen(@log_reader_ptr)
|
22
|
+
end
|
23
|
+
|
24
|
+
def max_value_length
|
25
|
+
Sparkey::Native.logreader_maxvaluelen(@log_reader_ptr)
|
26
|
+
end
|
27
|
+
|
28
|
+
def ptr=(ptr)
|
29
|
+
@log_reader_ptr = ptr
|
30
|
+
end
|
31
|
+
|
32
|
+
def ptr
|
33
|
+
@log_reader_ptr
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Sparkey::LogWriter
|
2
|
+
include Sparkey::Errors
|
3
|
+
|
4
|
+
def create(filename, compression, block_size)
|
5
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
6
|
+
log_filename = "#{filename}.spl"
|
7
|
+
|
8
|
+
handle_status Sparkey::Native.logwriter_create(ptr, log_filename, compression, block_size)
|
9
|
+
|
10
|
+
@log_writer_ptr = ptr.get_pointer(0)
|
11
|
+
end
|
12
|
+
|
13
|
+
def open(filename)
|
14
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
15
|
+
log_filename = "#{filename}.spl"
|
16
|
+
|
17
|
+
handle_status Sparkey::Native.logwriter_append(ptr, log_filename)
|
18
|
+
@log_writer_ptr = ptr.get_pointer(0)
|
19
|
+
end
|
20
|
+
|
21
|
+
def put(key, value)
|
22
|
+
key_length = key.bytesize
|
23
|
+
key_ptr = FFI::MemoryPointer.new(:uint8, key_length)
|
24
|
+
key_ptr.put_bytes(0, key)
|
25
|
+
|
26
|
+
value_length = value.bytesize
|
27
|
+
value_ptr = FFI::MemoryPointer.new(:uint8, value_length)
|
28
|
+
value_ptr.put_bytes(0, value)
|
29
|
+
|
30
|
+
handle_status Sparkey::Native.logwriter_put(@log_writer_ptr, key_length, key_ptr, value_length, value_ptr)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(key)
|
34
|
+
key_length = key.bytesize
|
35
|
+
key_ptr = FFI::MemoryPointer.new(:uint8, key_length)
|
36
|
+
key_ptr.put_bytes(0, key)
|
37
|
+
|
38
|
+
handle_status Sparkey::Native.logwriter_delete(@log_writer_ptr, key_length, key_ptr)
|
39
|
+
end
|
40
|
+
|
41
|
+
def flush
|
42
|
+
handle_status Sparkey::Native.logwriter_flush(@log_writer_ptr)
|
43
|
+
end
|
44
|
+
|
45
|
+
def close
|
46
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
47
|
+
ptr.put_pointer(0, @log_writer_ptr)
|
48
|
+
|
49
|
+
Sparkey::Native.logwriter_close(ptr)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Sparkey::Native
|
2
|
+
extend FFI::Library
|
3
|
+
|
4
|
+
ffi_lib ["libsparkey"]
|
5
|
+
|
6
|
+
RETURN_CODE = enum :success, 0,
|
7
|
+
:internal_error, -1,
|
8
|
+
|
9
|
+
:file_not_found, -100,
|
10
|
+
:permission_denied, -101,
|
11
|
+
:too_many_open_files, -102,
|
12
|
+
:file_too_large, -103,
|
13
|
+
:file_already_exists, -104,
|
14
|
+
:file_busy, -105,
|
15
|
+
:file_is_directory, -106,
|
16
|
+
:file_size_exceeded, -107,
|
17
|
+
:file_closed, -108,
|
18
|
+
:out_of_disk, -109,
|
19
|
+
:unexpected_eof, -110,
|
20
|
+
:mmap_failed, -111,
|
21
|
+
|
22
|
+
:wrong_log_magic_number, -200,
|
23
|
+
:wrong_log_major_version, -201,
|
24
|
+
:unsupported_log_minor_version, -202,
|
25
|
+
:log_too_small, -203,
|
26
|
+
:log_closed, -204,
|
27
|
+
:log_iterator_inactive, -205,
|
28
|
+
:log_iterator_mismatch, -206,
|
29
|
+
:log_iterator_closed, -207,
|
30
|
+
:log_header_corrupt, -208,
|
31
|
+
:invalid_compression_block_size, -209,
|
32
|
+
:invalid_compression_type, -210,
|
33
|
+
|
34
|
+
:wrong_hash_magic_number, -300,
|
35
|
+
:wrong_hash_major_version, -301,
|
36
|
+
:unsupported_hash_minor_version, -302,
|
37
|
+
:hash_too_small, -303,
|
38
|
+
:hash_closed, -304,
|
39
|
+
:file_identifier_mismatch, -305,
|
40
|
+
:hash_header_corrupt, -306,
|
41
|
+
:hash_size_invalid, -307
|
42
|
+
|
43
|
+
COMPRESSION_TYPE = enum :compression_none,
|
44
|
+
:compression_snappy
|
45
|
+
|
46
|
+
ENTRY_TYPE = enum :entry_put,
|
47
|
+
:entry_delete
|
48
|
+
|
49
|
+
ITER_STATE = enum :iter_new,
|
50
|
+
:iter_active,
|
51
|
+
:iter_closed,
|
52
|
+
:iter_invalid
|
53
|
+
|
54
|
+
|
55
|
+
attach_function :logwriter_create, :sparkey_logwriter_create, [:pointer, :string, COMPRESSION_TYPE, :int], RETURN_CODE
|
56
|
+
attach_function :logwriter_append, :sparkey_logwriter_append, [:pointer, :string], RETURN_CODE
|
57
|
+
|
58
|
+
attach_function :logwriter_put, :sparkey_logwriter_put, [:pointer, :uint64, :pointer, :uint64, :pointer], RETURN_CODE
|
59
|
+
attach_function :logwriter_delete, :sparkey_logwriter_delete, [:pointer, :uint64, :pointer], RETURN_CODE
|
60
|
+
|
61
|
+
attach_function :logwriter_flush, :sparkey_logwriter_flush, [:pointer], RETURN_CODE
|
62
|
+
attach_function :logwriter_close, :sparkey_logwriter_close, [:pointer], RETURN_CODE
|
63
|
+
|
64
|
+
attach_function :logreader_open, :sparkey_logreader_open, [:pointer, :string], RETURN_CODE
|
65
|
+
attach_function :logreader_close, :sparkey_logreader_close, [:pointer], :void
|
66
|
+
attach_function :logreader_maxkeylen, :sparkey_logreader_maxkeylen, [:pointer], :uint64
|
67
|
+
attach_function :logreader_maxvaluelen, :sparkey_logreader_maxvaluelen, [:pointer], :uint64
|
68
|
+
|
69
|
+
attach_function :logiter_create, :sparkey_logiter_create, [:pointer, :pointer], RETURN_CODE
|
70
|
+
attach_function :logiter_close, :sparkey_logiter_close, [:pointer], :void
|
71
|
+
attach_function :logiter_seek, :sparkey_logiter_seek, [:pointer, :pointer, :uint64], RETURN_CODE
|
72
|
+
attach_function :logiter_skip, :sparkey_logiter_skip, [:pointer, :pointer, :int], RETURN_CODE
|
73
|
+
attach_function :logiter_next, :sparkey_logiter_next, [:pointer, :pointer], RETURN_CODE
|
74
|
+
attach_function :logiter_reset, :sparkey_logiter_reset, [:pointer, :pointer], RETURN_CODE
|
75
|
+
attach_function :logiter_keychunk, :sparkey_logiter_keychunk, [:pointer, :pointer, :uint64, :pointer, :pointer], RETURN_CODE
|
76
|
+
attach_function :logiter_valuechunk, :sparkey_logiter_valuechunk, [:pointer, :pointer, :uint64, :pointer, :pointer], RETURN_CODE
|
77
|
+
attach_function :logiter_fill_key, :sparkey_logiter_fill_key, [:pointer, :pointer, :uint64, :pointer, :pointer], RETURN_CODE
|
78
|
+
attach_function :logiter_fill_value, :sparkey_logiter_fill_value, [:pointer, :pointer, :uint64, :pointer, :pointer], RETURN_CODE
|
79
|
+
attach_function :logiter_keycmp, :sparkey_logiter_keycmp, [:pointer, :pointer, :pointer, :pointer], RETURN_CODE
|
80
|
+
attach_function :logiter_state, :sparkey_logiter_state, [:pointer], ITER_STATE
|
81
|
+
attach_function :logiter_type, :sparkey_logiter_type, [:pointer], ENTRY_TYPE
|
82
|
+
attach_function :logiter_keylen, :sparkey_logiter_keylen, [:pointer], :uint64
|
83
|
+
attach_function :logiter_valuelen, :sparkey_logiter_valuelen, [:pointer], :uint64
|
84
|
+
attach_function :logiter_hashnext, :sparkey_logiter_hashnext, [:pointer, :pointer], RETURN_CODE
|
85
|
+
attach_function :logiter_close, :sparkey_logiter_close, [:pointer], :void
|
86
|
+
|
87
|
+
attach_function :hash_write, :sparkey_hash_write, [:pointer, :string, :int], RETURN_CODE
|
88
|
+
attach_function :hash_open, :sparkey_hash_open, [:pointer, :string, :string], RETURN_CODE
|
89
|
+
attach_function :hash_getreader, :sparkey_hash_getreader, [:pointer], :pointer
|
90
|
+
attach_function :hash_close, :sparkey_hash_close, [:pointer], :void
|
91
|
+
attach_function :hash_get, :sparkey_hash_get, [:pointer, :pointer, :uint64, :pointer], RETURN_CODE
|
92
|
+
attach_function :hash_numentries, :sparkey_hash_numentries, [:pointer], :uint64
|
93
|
+
attach_function :hash_numcollisions, :sparkey_hash_numcollisions, [:pointer], :uint64
|
94
|
+
|
95
|
+
attach_function :create_log_filename, :sparkey_create_log_filename, [:string], :string
|
96
|
+
|
97
|
+
attach_function :error_string, :sparkey_errstring, [RETURN_CODE], :string
|
98
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
class Sparkey::Store
|
2
|
+
attr_accessor :filename, :log_writer, :log_reader,
|
3
|
+
:hash_writer, :hash_reader
|
4
|
+
|
5
|
+
def self.create(filename, compression_type = :compression_none, block_size = 1000)
|
6
|
+
store = new(filename)
|
7
|
+
|
8
|
+
store.log_writer = Sparkey::LogWriter.new
|
9
|
+
store.log_writer.create(filename, compression_type, block_size)
|
10
|
+
|
11
|
+
store.log_reader = Sparkey::LogReader.new
|
12
|
+
store.log_reader.open(filename)
|
13
|
+
|
14
|
+
store.hash_writer = Sparkey::HashWriter.new
|
15
|
+
store.hash_writer.create(filename)
|
16
|
+
|
17
|
+
store.hash_reader = Sparkey::HashReader.new
|
18
|
+
store.hash_reader.open(filename)
|
19
|
+
|
20
|
+
store
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.open(filename)
|
24
|
+
store = new(filename)
|
25
|
+
|
26
|
+
store.log_writer = Sparkey::LogWriter.new
|
27
|
+
store.log_writer.open(filename)
|
28
|
+
|
29
|
+
store.log_reader = Sparkey::LogReader.new
|
30
|
+
store.log_reader.open(filename)
|
31
|
+
|
32
|
+
store.hash_writer = Sparkey::HashWriter.new
|
33
|
+
store.hash_writer.create(filename)
|
34
|
+
|
35
|
+
store.hash_reader = Sparkey::HashReader.new
|
36
|
+
store.hash_reader.open(filename)
|
37
|
+
|
38
|
+
store
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(filename)
|
42
|
+
@filename = filename
|
43
|
+
end
|
44
|
+
|
45
|
+
def close
|
46
|
+
log_writer.close
|
47
|
+
log_reader.close
|
48
|
+
hash_reader.close
|
49
|
+
end
|
50
|
+
|
51
|
+
def size
|
52
|
+
hash_reader.size
|
53
|
+
end
|
54
|
+
|
55
|
+
def get(key)
|
56
|
+
iterator = hash_reader.seek(key)
|
57
|
+
|
58
|
+
iterator.get_value
|
59
|
+
end
|
60
|
+
|
61
|
+
def each_from_hash
|
62
|
+
log_reader = hash_reader.log_reader
|
63
|
+
iterator = Sparkey::LogIterator.new(log_reader, hash_reader)
|
64
|
+
|
65
|
+
loop do
|
66
|
+
iterator.hash_next
|
67
|
+
|
68
|
+
break unless iterator.active?
|
69
|
+
|
70
|
+
yield iterator.get_key, iterator.get_value
|
71
|
+
end
|
72
|
+
|
73
|
+
iterator.close
|
74
|
+
end
|
75
|
+
alias_method :each, :each_from_hash
|
76
|
+
|
77
|
+
def each_from_log
|
78
|
+
iterator = Sparkey::LogIterator.new(log_reader)
|
79
|
+
|
80
|
+
loop do
|
81
|
+
iterator.next
|
82
|
+
|
83
|
+
break unless iterator.active?
|
84
|
+
|
85
|
+
yield iterator.get_key, iterator.get_value
|
86
|
+
end
|
87
|
+
|
88
|
+
iterator.close
|
89
|
+
end
|
90
|
+
|
91
|
+
def put(key, value)
|
92
|
+
log_writer.put(key, value)
|
93
|
+
end
|
94
|
+
|
95
|
+
def delete(key)
|
96
|
+
log_writer.delete(key)
|
97
|
+
end
|
98
|
+
|
99
|
+
def flush
|
100
|
+
yield self if block_given?
|
101
|
+
|
102
|
+
log_writer.flush
|
103
|
+
|
104
|
+
# Reset the hash headers
|
105
|
+
hash_writer.create(filename)
|
106
|
+
hash_reader.open(filename)
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
3
|
+
module Sparkey::Testing
|
4
|
+
def random_filename
|
5
|
+
"test-#{SecureRandom.hex(16)}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def delete(filename)
|
9
|
+
log_file = "#{filename}.spl"
|
10
|
+
index_file = "#{filename}.spi"
|
11
|
+
|
12
|
+
File.delete(log_file) if File.exists?(log_file)
|
13
|
+
File.delete(index_file) if File.exists?(index_file)
|
14
|
+
end
|
15
|
+
end
|
data/sparkey.gemspec
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'sparkey/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "sparkey"
|
8
|
-
spec.version =
|
7
|
+
spec.version = "1.0.0"
|
9
8
|
spec.authors = ["Adam Tanner"]
|
10
9
|
spec.email = ["adam@adamtanner.org"]
|
11
|
-
spec.description = %
|
12
|
-
spec.summary = %
|
13
|
-
spec.homepage = ""
|
10
|
+
spec.description = %{ Ruby FFI bindings for Spotify's Sparkey }
|
11
|
+
spec.summary = %{ Ruby FFI bindings for Spotify's Sparkey }
|
12
|
+
spec.homepage = "https://github.com/adamtanner/sparkey"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
16
15
|
spec.files = `git ls-files`.split($/)
|
17
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
-
spec.test_files = spec.files.grep(%r{^
|
17
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
20
|
+
spec.add_dependency "ffi"
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "sparkey"
|
3
|
+
require "sparkey/testing"
|
4
|
+
|
5
|
+
describe Sparkey do
|
6
|
+
include Sparkey::Testing
|
7
|
+
|
8
|
+
before { @filename = random_filename }
|
9
|
+
after { delete(@filename) }
|
10
|
+
|
11
|
+
it "functions as a key value store" do
|
12
|
+
sparkey = Sparkey::Store.create(@filename, :compression_snappy, 1000)
|
13
|
+
sparkey.put("first", "Michael")
|
14
|
+
sparkey.put("second", "Adam")
|
15
|
+
sparkey.put("third", "Tanner")
|
16
|
+
sparkey.close
|
17
|
+
|
18
|
+
sparkey = Sparkey::Store.open(@filename)
|
19
|
+
|
20
|
+
sparkey.size.must_equal 3
|
21
|
+
|
22
|
+
sparkey.get("first").must_equal("Michael")
|
23
|
+
sparkey.delete("second")
|
24
|
+
sparkey.flush
|
25
|
+
|
26
|
+
sparkey.size.must_equal 2
|
27
|
+
|
28
|
+
hash = Hash.new
|
29
|
+
sparkey.each do |key, value|
|
30
|
+
hash[key] = value
|
31
|
+
end
|
32
|
+
|
33
|
+
hash.must_equal(
|
34
|
+
"first" => "Michael",
|
35
|
+
"third" => "Tanner"
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sparkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Adam Tanner
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-11-17 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ffi
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: bundler
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
31
|
- - ~>
|
20
32
|
- !ruby/object:Gem::Version
|
@@ -22,7 +34,6 @@ dependencies:
|
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
38
|
- - ~>
|
28
39
|
- !ruby/object:Gem::Version
|
@@ -30,20 +41,18 @@ dependencies:
|
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: rake
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - '>='
|
36
46
|
- !ruby/object:Gem::Version
|
37
47
|
version: '0'
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - '>='
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: '0'
|
46
|
-
description: Ruby FFI bindings for Spotify's Sparkey
|
55
|
+
description: ' Ruby FFI bindings for Spotify''s Sparkey '
|
47
56
|
email:
|
48
57
|
- adam@adamtanner.org
|
49
58
|
executables: []
|
@@ -53,41 +62,43 @@ files:
|
|
53
62
|
- .gitignore
|
54
63
|
- Gemfile
|
55
64
|
- LICENSE
|
56
|
-
- LICENSE.txt
|
57
65
|
- README.md
|
58
66
|
- Rakefile
|
59
67
|
- lib/sparkey.rb
|
60
|
-
- lib/sparkey/
|
68
|
+
- lib/sparkey/errors.rb
|
69
|
+
- lib/sparkey/hash_reader.rb
|
70
|
+
- lib/sparkey/hash_writer.rb
|
71
|
+
- lib/sparkey/log_iterator.rb
|
72
|
+
- lib/sparkey/log_reader.rb
|
73
|
+
- lib/sparkey/log_writer.rb
|
74
|
+
- lib/sparkey/native.rb
|
75
|
+
- lib/sparkey/store.rb
|
76
|
+
- lib/sparkey/testing.rb
|
61
77
|
- sparkey.gemspec
|
62
|
-
|
78
|
+
- spec/sparkey_spec.rb
|
79
|
+
homepage: https://github.com/adamtanner/sparkey
|
63
80
|
licenses:
|
64
81
|
- MIT
|
82
|
+
metadata: {}
|
65
83
|
post_install_message:
|
66
84
|
rdoc_options: []
|
67
85
|
require_paths:
|
68
86
|
- lib
|
69
87
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
88
|
requirements:
|
72
|
-
- -
|
89
|
+
- - '>='
|
73
90
|
- !ruby/object:Gem::Version
|
74
91
|
version: '0'
|
75
|
-
segments:
|
76
|
-
- 0
|
77
|
-
hash: 71288456881923243
|
78
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
93
|
requirements:
|
81
|
-
- -
|
94
|
+
- - '>='
|
82
95
|
- !ruby/object:Gem::Version
|
83
96
|
version: '0'
|
84
|
-
segments:
|
85
|
-
- 0
|
86
|
-
hash: 71288456881923243
|
87
97
|
requirements: []
|
88
98
|
rubyforge_project:
|
89
|
-
rubygems_version:
|
99
|
+
rubygems_version: 2.0.3
|
90
100
|
signing_key:
|
91
|
-
specification_version:
|
101
|
+
specification_version: 4
|
92
102
|
summary: Ruby FFI bindings for Spotify's Sparkey
|
93
|
-
test_files:
|
103
|
+
test_files:
|
104
|
+
- spec/sparkey_spec.rb
|
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2013 Adam Tanner
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/sparkey/version.rb
DELETED