isomorfeus-hamster 0.6.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/LICENSE +98 -0
- data/README.md +7 -0
- data/ext/isomorfeus_hamster_ext/cursor_delete_flags.h +1 -0
- data/ext/isomorfeus_hamster_ext/cursor_put_flags.h +2 -0
- data/ext/isomorfeus_hamster_ext/dbi_flags.h +7 -0
- data/ext/isomorfeus_hamster_ext/env_flags.h +11 -0
- data/ext/isomorfeus_hamster_ext/errors.h +21 -0
- data/ext/isomorfeus_hamster_ext/extconf.rb +22 -0
- data/ext/isomorfeus_hamster_ext/flag_parser.h +14 -0
- data/ext/isomorfeus_hamster_ext/isomorfeus_hamster.c +1598 -0
- data/ext/isomorfeus_hamster_ext/isomorfeus_hamster.h +164 -0
- data/ext/isomorfeus_hamster_ext/lmdb/.gitignore +16 -0
- data/ext/isomorfeus_hamster_ext/lmdb/COPYRIGHT +20 -0
- data/ext/isomorfeus_hamster_ext/lmdb/LICENSE +47 -0
- data/ext/isomorfeus_hamster_ext/lmdb/lmdb.h +1653 -0
- data/ext/isomorfeus_hamster_ext/lmdb/mdb.c +11349 -0
- data/ext/isomorfeus_hamster_ext/lmdb/midl.c +421 -0
- data/ext/isomorfeus_hamster_ext/lmdb/midl.h +200 -0
- data/ext/isomorfeus_hamster_ext/prototypes.sh +4 -0
- data/ext/isomorfeus_hamster_ext/put_flags.h +5 -0
- data/lib/isomorfeus/hamster/database.rb +137 -0
- data/lib/isomorfeus/hamster/marshal.rb +63 -0
- data/lib/isomorfeus/hamster/version.rb +5 -0
- data/lib/isomorfeus-hamster.rb +4 -0
- metadata +125 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Hamster
|
3
|
+
class Database
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
# Iterate through the records in a database
|
7
|
+
# @yield [i] Gives a record [key, value] to the block
|
8
|
+
# @yieldparam [Array] i The key, value pair for each record
|
9
|
+
# @example
|
10
|
+
# db.each do |record|
|
11
|
+
# key, value = record
|
12
|
+
# puts "at #{key}: #{value}"
|
13
|
+
# end
|
14
|
+
def each
|
15
|
+
env.transaction true do
|
16
|
+
cursor do |c|
|
17
|
+
while i = c.next
|
18
|
+
yield(i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Retrieve the value of a record from a database
|
25
|
+
# @param key the record key to retrieve
|
26
|
+
# @return value of the record for that key, or nil if there is
|
27
|
+
# no record with that key
|
28
|
+
# @see #get(key)
|
29
|
+
def [](key)
|
30
|
+
get(key)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Set (write or update) a record in a database.
|
34
|
+
# @param key key for the record
|
35
|
+
# @param value the value of the record
|
36
|
+
# @return returns the value of the record
|
37
|
+
# @see #put(key, value)
|
38
|
+
# @example
|
39
|
+
# db['a'] = 'b' #=> 'b'
|
40
|
+
# db['b'] = 1234 #=> 1234
|
41
|
+
# db['a'] #=> 'b'
|
42
|
+
def []=(key, value)
|
43
|
+
put(key, value)
|
44
|
+
value
|
45
|
+
end
|
46
|
+
|
47
|
+
# Get the keys as an array.
|
48
|
+
# @return [Array] of keys.
|
49
|
+
def keys
|
50
|
+
each_key.to_a
|
51
|
+
end
|
52
|
+
|
53
|
+
# Iterate over each key in the database, skipping over duplicate records.
|
54
|
+
#
|
55
|
+
# @yield key [String] the next key in the database.
|
56
|
+
# @return [Enumerator] in lieu of a block.
|
57
|
+
def each_key(&block)
|
58
|
+
return enum_for :each_key unless block_given?
|
59
|
+
env.transaction true do
|
60
|
+
cursor do |c|
|
61
|
+
while (rec = c.next true)
|
62
|
+
yield rec.first
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Iterate over the duplicate values of a given key, using an
|
69
|
+
# implicit cursor. Works whether +:dupsort+ is set or not.
|
70
|
+
#
|
71
|
+
# @param key [#to_s] The key in question.
|
72
|
+
# @yield value [String] the next value associated with the key.
|
73
|
+
# @return [Enumerator] in lieu of a block.
|
74
|
+
def each_value(key, &block)
|
75
|
+
return enum_for :each_value, key unless block_given?
|
76
|
+
|
77
|
+
value = get(key) or return
|
78
|
+
unless dupsort?
|
79
|
+
yield value
|
80
|
+
return
|
81
|
+
end
|
82
|
+
|
83
|
+
env.transaction true do
|
84
|
+
cursor do |c|
|
85
|
+
method = :set
|
86
|
+
while rec = c.send(method, key)
|
87
|
+
method = :next_range
|
88
|
+
yield rec[1]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Return the cardinality (number of duplicates) of a given
|
95
|
+
# key. Works whether +:dupsort+ is set or not.
|
96
|
+
# @param key [#to_s] The key in question.
|
97
|
+
# @return [Integer] The number of entries under the key.
|
98
|
+
def cardinality(key)
|
99
|
+
env.transaction true do
|
100
|
+
return 0 unless get key
|
101
|
+
return 1 unless dupsort?
|
102
|
+
cursor do |c|
|
103
|
+
c.set key
|
104
|
+
return c.count
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Test if the database has a given key (or, if opened in
|
110
|
+
# +:dupsort+, value)
|
111
|
+
def has? key, value = nil
|
112
|
+
v = get(key) or return false
|
113
|
+
return true if value.nil? or value.to_s == v
|
114
|
+
return false unless dupsort?
|
115
|
+
|
116
|
+
env.transaction true do
|
117
|
+
cursor do |c|
|
118
|
+
return !!c.set(key, value)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Delete the key (and optional value pair) if it exists; do not
|
124
|
+
# complain about missing keys.
|
125
|
+
# @param key [#to_s] The key.
|
126
|
+
# @param value [#to_s] The optional value.
|
127
|
+
def delete?(key, value = nil)
|
128
|
+
delete key, value if has? key, value
|
129
|
+
end
|
130
|
+
|
131
|
+
# @return the number of records in this database
|
132
|
+
def size
|
133
|
+
stat[:entries]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Hamster
|
3
|
+
module Marshal
|
4
|
+
class << self
|
5
|
+
def dump(db, key, obj)
|
6
|
+
db.env.transaction { db.put(key, Oj.dump(obj)) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def load(db, key)
|
10
|
+
obj_j = db.get(key)
|
11
|
+
return nil unless obj_j
|
12
|
+
Oj.load(obj_j)
|
13
|
+
end
|
14
|
+
|
15
|
+
def structured_dump(db, obj)
|
16
|
+
kv = []
|
17
|
+
oc = obj.class.to_s
|
18
|
+
ky = obj.key
|
19
|
+
as = obj.attributes
|
20
|
+
kv << [ats_key(oc, ky), Oj.dump(as)]
|
21
|
+
as.each do |at|
|
22
|
+
kv << [at_key(oc, ky, at), Oj.dump(obj.send(at))]
|
23
|
+
end
|
24
|
+
db.env.transaction do
|
25
|
+
kv.each do |k, v|
|
26
|
+
db.put(k, v)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def structured_load(db, oc, ky)
|
32
|
+
if oc.class = String
|
33
|
+
oC = const_get(oc)
|
34
|
+
else
|
35
|
+
oC = oc
|
36
|
+
oc = oc.to_s
|
37
|
+
end
|
38
|
+
ak = ats_key(oc, ky)
|
39
|
+
oh = {}
|
40
|
+
db.env.transaction do
|
41
|
+
as_j = db.get(ak)
|
42
|
+
as = Oj.load(as_j)
|
43
|
+
as.each do |at|
|
44
|
+
v_j = db.get(at_key(oc, ky, at))
|
45
|
+
oh[at] = Oj.load(v_j)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
oC.instance_from_hash(oh)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def ats_key(oc, ky)
|
54
|
+
"#{oc}|#{ky}|attributes"
|
55
|
+
end
|
56
|
+
|
57
|
+
def at_key(oc, ky, at)
|
58
|
+
"#{oc}|#{ky}|:|#{at}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: isomorfeus-hamster
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jan Biedermann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-11-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oj
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.13.9
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.13.9
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake-compiler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: KV store and ObjectDB for Isomorfeus.
|
70
|
+
email:
|
71
|
+
- jan@kursator.com
|
72
|
+
executables: []
|
73
|
+
extensions:
|
74
|
+
- ext/isomorfeus_hamster_ext/extconf.rb
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- LICENSE
|
78
|
+
- README.md
|
79
|
+
- ext/isomorfeus_hamster_ext/cursor_delete_flags.h
|
80
|
+
- ext/isomorfeus_hamster_ext/cursor_put_flags.h
|
81
|
+
- ext/isomorfeus_hamster_ext/dbi_flags.h
|
82
|
+
- ext/isomorfeus_hamster_ext/env_flags.h
|
83
|
+
- ext/isomorfeus_hamster_ext/errors.h
|
84
|
+
- ext/isomorfeus_hamster_ext/extconf.rb
|
85
|
+
- ext/isomorfeus_hamster_ext/flag_parser.h
|
86
|
+
- ext/isomorfeus_hamster_ext/isomorfeus_hamster.c
|
87
|
+
- ext/isomorfeus_hamster_ext/isomorfeus_hamster.h
|
88
|
+
- ext/isomorfeus_hamster_ext/lmdb/.gitignore
|
89
|
+
- ext/isomorfeus_hamster_ext/lmdb/COPYRIGHT
|
90
|
+
- ext/isomorfeus_hamster_ext/lmdb/LICENSE
|
91
|
+
- ext/isomorfeus_hamster_ext/lmdb/lmdb.h
|
92
|
+
- ext/isomorfeus_hamster_ext/lmdb/mdb.c
|
93
|
+
- ext/isomorfeus_hamster_ext/lmdb/midl.c
|
94
|
+
- ext/isomorfeus_hamster_ext/lmdb/midl.h
|
95
|
+
- ext/isomorfeus_hamster_ext/prototypes.sh
|
96
|
+
- ext/isomorfeus_hamster_ext/put_flags.h
|
97
|
+
- lib/isomorfeus-hamster.rb
|
98
|
+
- lib/isomorfeus/hamster/database.rb
|
99
|
+
- lib/isomorfeus/hamster/marshal.rb
|
100
|
+
- lib/isomorfeus/hamster/version.rb
|
101
|
+
homepage: http://isomorfeus.com
|
102
|
+
licenses:
|
103
|
+
- MIT
|
104
|
+
metadata:
|
105
|
+
github_repo: ssh://github.com/isomorfeus/gems
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 3.0.0
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubygems_version: 3.2.15
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: KV store and ObjectDB for Isomorfeus.
|
125
|
+
test_files: []
|