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.
@@ -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
@@ -0,0 +1,5 @@
1
+ module Isomorfeus
2
+ module Hamster
3
+ VERSION = '0.6.0'
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ require 'isomorfeus_hamster_ext'
2
+ require 'isomorfeus/hamster/version'
3
+ require 'isomorfeus/hamster/database'
4
+ require 'isomorfeus/hamster/marshal'
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: []