rdf-lmdb 0.2.1 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 44a37cfc92db953f40ab6973acdacd645d652f1b5cc0c4e2524727eadaddbe3a
4
- data.tar.gz: 25fffce08cbe02ca7baeacd485bd1bf8124cd735344a6203b51c79bbcba7f33d
3
+ metadata.gz: ea35cfcc72e22d7a71f047728b412575ce712691c2815a3693d23f94909a78b2
4
+ data.tar.gz: ab6e65528c0b9bc70bf4d18a7f47b2f47206dbfd1d09aa99c4551a799694b3a0
5
5
  SHA512:
6
- metadata.gz: 5efc6ee2af73f21d4e1810f176b4652b78517d396f7a13ff70680ad5042a4b43549f923845abf39e0b79193806d3ae10452e3f2aa090f577c796824d4a0ae2de
7
- data.tar.gz: '08f9e412178177a143b513a9379606a4290f1fa89de0f74afed6dd9d6068d63813bc3ea8c032f373866f0b9d9a1b066b4366b50e39b549b0569716ed1356b666'
6
+ metadata.gz: 483d8b372297ee978595110432dd21170cd34fafde285b7f0f1269fea9d5d06428066b19e8e9b6cf294c6e71dbf378e1b30e37215e36810fae19dd6ebbeda5fc
7
+ data.tar.gz: 20fac6ce5e493fa10ef923bd12e0e549e33b83a46f859b623f5fe5838ab42348ec1ef67884bfbe7baaa396ae1937a6bb3256897f86e8fd0343b0705ac2ed423d
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # RDF::LMDB - Lightweight, persistent, transactional RDF store
2
2
 
3
- This library implements `RDF::Repository` using the Symax Lightning
3
+ This library implements `RDF::Repository` using the Symas Lightning
4
4
  MDB key-value database. It is intended to be a basic, durable,
5
5
  locally-attached quad store, that avails itself of the properties of
6
6
  LMDB.
@@ -1,5 +1,5 @@
1
1
  module RDF
2
2
  module LMDB
3
- VERSION = "0.2.1"
3
+ VERSION = "0.3.2"
4
4
  end
5
5
  end
data/lib/rdf/lmdb.rb CHANGED
@@ -65,13 +65,13 @@ module RDF
65
65
  def initialize repository,
66
66
  graph_name: nil, mutable: false, **options, &block
67
67
  @repository = repository
68
- @snapshot =
68
+ @snapshot =
69
69
  repository.supports?(:snapshots) ? repository.snapshot : repository
70
70
  @options = options.dup
71
71
  @mutable = mutable
72
72
  @graph_name = graph_name
73
73
 
74
- raise TransactionError,
74
+ raise TransactionError,
75
75
  'Tried to open a mutable transaction on an immutable repository' if
76
76
  @mutable && !@repository.mutable?
77
77
 
@@ -110,11 +110,20 @@ module RDF
110
110
 
111
111
  #
112
112
  # RDF::LMDB::Repository implements a lightweight, transactional,
113
- # locally-attached data store using Symax LMDB.
113
+ # locally-attached data store using Symas LMDB.
114
114
  #
115
115
  class Repository < ::RDF::Repository
116
116
  private
117
117
 
118
+ # for the mapsize parameter
119
+ UNITS = { nil => 1 }
120
+ 'kmgtpe'.split('').each_with_index do |x, i|
121
+ j = i + 1
122
+ UNITS[x] = 1000 ** j
123
+ UNITS[x.upcase] = 1024 ** j
124
+ end
125
+ UNITS.freeze
126
+
118
127
  DEFAULT_TX_CLASS = RDF::LMDB::Transaction
119
128
 
120
129
  SUPPORTS = %i[
@@ -126,10 +135,20 @@ module RDF
126
135
  'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
127
136
  ].pack('H*').freeze
128
137
 
138
+ def int_bytes bytes
139
+ m = /\A\s*(\d+)([kmgtpeKMGTPE])?\s*\Z/s.match bytes.to_s
140
+ raise ArgumentError, "#{bytes} not a viable byte size" unless m
141
+
142
+ factor, unit = m.captures
143
+ factor.to_i * UNITS[unit]
144
+ end
145
+
129
146
  def init_lmdb dir, **options
130
147
  dir = Pathname(dir).expand_path
131
148
  dir.mkdir unless dir.exist?
132
149
 
150
+ options[:mapsize] = int_bytes options[:mapsize] if options[:mapsize]
151
+
133
152
  # fire up the environment
134
153
  @lmdb = ::LMDB.new dir, **options
135
154
 
@@ -198,7 +217,7 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
198
217
 
199
218
  def int_for term
200
219
  case term
201
- when nil then 0
220
+ when nil, RDF::Query::Variable then 0
202
221
  when RDF::Statement
203
222
  terms = term.to_a.map { |t| int_for t }
204
223
  return if terms.include? nil # the statement implicitly not here
@@ -420,7 +439,7 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
420
439
  seq = []
421
440
  out = string.unpack('J*').map do |i|
422
441
  seq << i
423
- j = resolve_term(i, cache: cache, write: write)
442
+ j = resolve_term(i, cache: cache, write: write)
424
443
  [i, j]
425
444
  end.to_h
426
445
 
@@ -518,7 +537,7 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
518
537
 
519
538
  # warn thash.inspect, ihash.inspect
520
539
 
521
- # note
540
+ # note
522
541
  if gint = ihash[:graph_name]
523
542
  gpack = [gint].pack ?J
524
543
  return unless @dbs[:stmt2g].has? spack, gpack
@@ -669,8 +688,18 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
669
688
  end
670
689
 
671
690
  def delete_statement statement
691
+ # note that this does not get called by `delete_statements`,
692
+ # because we want the transaction on the outside.
672
693
  complete! statement
673
- @lmdb.transaction { |t| rm_one statement; t.commit }
694
+ # warn "WTF LOL #{statement.inspect}"
695
+ @lmdb.transaction do |t|
696
+ if statement.variable?
697
+ query(statement).each { |stmt| rm_one stmt }
698
+ else
699
+ rm_one statement
700
+ end
701
+ t.commit
702
+ end
674
703
  nil
675
704
  end
676
705
 
@@ -688,12 +717,25 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
688
717
  def delete_statements statements
689
718
  @lmdb.transaction do |t|
690
719
  hashes = []
691
- statements.each do |statement|
692
- complete! statement
693
- hashes += rm_one statement, scan: false
720
+
721
+ # we don't know what's in here but it may contain statements
722
+ # with variables, in which case we have to handle them
723
+ enums = [statements]
724
+ # also note that RDF::Util::Coercions#coerce_statements
725
+ # which is called in advance of this is supposed to take
726
+ # care of this situation but doesn't for some reason.
727
+ until enums.empty?
728
+ statements = enums.shift
729
+ statements.each do |statement|
730
+ if statement.variable?
731
+ enums << query(statement)
732
+ else
733
+ hashes += rm_one statement, scan: false
734
+ end
735
+ end
694
736
  end
695
737
 
696
- clean_terms hashes
738
+ clean_terms hashes.uniq
697
739
  t.commit
698
740
  end
699
741
 
@@ -792,7 +834,8 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
792
834
  # end
793
835
 
794
836
  def delete_insert deletes, inserts
795
- ret = super(deletes, inserts)
837
+ ret = nil
838
+ @lmdb.transaction { ret = super(deletes, inserts) }
796
839
  commit_transaction # this is to satiate the test suite
797
840
  ret
798
841
  end
@@ -835,7 +878,7 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
835
878
  pack = [int].pack ?J
836
879
  @dbs[:s2stmt].has? pack
837
880
  end
838
-
881
+
839
882
  def has_predicate? predicate
840
883
  raise ArgumentError, 'predicate must be an RDF::Term' unless
841
884
  predicate.is_a? RDF::Term
@@ -843,7 +886,7 @@ Currently you have to dump from the old layout and reload the new one. Sorry!
843
886
  pack = [int].pack ?J
844
887
  @dbs[:p2stmt].has? pack
845
888
  end
846
-
889
+
847
890
  def has_object? object
848
891
  raise ArgumentError, 'object must be an RDF::Term' unless
849
892
  object.is_a? RDF::Term
data/rdf-lmdb.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['code@doriantaylor.com']
11
11
  spec.license = 'Apache-2.0'
12
12
  spec.homepage = 'https://github.com/doriantaylor/rb-rdf-lmdb'
13
- spec.summary = 'Symax LMDB back-end for RDF::Repository'
13
+ spec.summary = 'Symas LMDB back-end for RDF::Repository'
14
14
  spec.description = <<-DESC
15
15
  This module implements RDF::Repository on top of LMDB, a fast and
16
16
  robust key-value store.
@@ -25,16 +25,16 @@ robust key-value store.
25
25
  spec.require_paths = ["lib"]
26
26
 
27
27
  # ruby
28
- spec.required_ruby_version = '~> 2.0'
28
+ spec.required_ruby_version = '>= 2.0'
29
29
 
30
30
  # dev/test dependencies
31
- spec.add_development_dependency 'bundler', '~> 2.0'
32
- spec.add_development_dependency 'rake', '~> 13.0'
33
- spec.add_development_dependency 'rspec', '~> 3.0'
34
- spec.add_development_dependency 'rdf-spec', '~> 3.0'
31
+ spec.add_development_dependency 'bundler', '~> 2'
32
+ spec.add_development_dependency 'rake', '~> 13'
33
+ spec.add_development_dependency 'rspec', '~> 3'
34
+ spec.add_development_dependency 'rdf-spec', '~> 3'
35
35
 
36
36
  # stuff we use
37
- spec.add_runtime_dependency 'unf', '~> 0.1.3'
38
- spec.add_runtime_dependency 'rdf', '~> 3.1.3'
39
- spec.add_runtime_dependency 'lmdb', '~> 0.5.3'
37
+ spec.add_runtime_dependency 'unf', '~> 0.1'
38
+ spec.add_runtime_dependency 'rdf', '~> 3'
39
+ spec.add_runtime_dependency 'lmdb', '~> 0.6.1'
40
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-lmdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Taylor
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-10 00:00:00.000000000 Z
11
+ date: 2024-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,98 +16,98 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2'
20
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: '2.0'
26
+ version: '2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '13.0'
33
+ version: '13'
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: '13.0'
40
+ version: '13'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rdf-spec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.0'
61
+ version: '3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.0'
68
+ version: '3'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: unf
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.1.3
75
+ version: '0.1'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.1.3
82
+ version: '0.1'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rdf
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 3.1.3
89
+ version: '3'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 3.1.3
96
+ version: '3'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: lmdb
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.5.3
103
+ version: 0.6.1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.5.3
110
+ version: 0.6.1
111
111
  description: |
112
112
  This module implements RDF::Repository on top of LMDB, a fast and
113
113
  robust key-value store.
@@ -134,13 +134,13 @@ homepage: https://github.com/doriantaylor/rb-rdf-lmdb
134
134
  licenses:
135
135
  - Apache-2.0
136
136
  metadata: {}
137
- post_install_message:
137
+ post_install_message:
138
138
  rdoc_options: []
139
139
  require_paths:
140
140
  - lib
141
141
  required_ruby_version: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - "~>"
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '2.0'
146
146
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -149,8 +149,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  - !ruby/object:Gem::Version
150
150
  version: '0'
151
151
  requirements: []
152
- rubygems_version: 3.1.2
153
- signing_key:
152
+ rubygems_version: 3.3.15
153
+ signing_key:
154
154
  specification_version: 4
155
- summary: Symax LMDB back-end for RDF::Repository
155
+ summary: Symas LMDB back-end for RDF::Repository
156
156
  test_files: []