isomorfeus-hamster 0.6.0

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