large_object_store 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a72748e1b76afaf0bf1f32ffddba01354405a7fd0d41ee5bdf5a29180259c5d8
4
- data.tar.gz: e16591860fd1542d994d49ace89c3f759f00c641c1566d780e6d3fc93afcb258
3
+ metadata.gz: e72d3b11da68461fa95e282ad1f8727c0c397f87602a01557754a438c111f88d
4
+ data.tar.gz: a79ab553fd00bb63b89c584dda277c4faba58ce82d4095a7a73a16407d4995ca
5
5
  SHA512:
6
- metadata.gz: 0c0878955ba7c92f6fdbdfa9c25c2f8c4b6ef441863940732c804076d423f53a8d1a40aae7f06544a15779b81a7225ec367b65caa3e16a4c49c07952a5363c24
7
- data.tar.gz: 3d7c5fdc351ae6c0170ce41cf58696d08d2c1493e35324252ccd49511d977f1880ea00acfddfef741e4977feb201ac052a1270a743c5037befb57ba44edbbcaf
6
+ metadata.gz: b2eab6d7bf39128dda4096fc96dc583128e08d0b08acbce8ea879611be48c03024aacc2f0cb55d27827988ee024c1d291495f8c85bdeb12ba55becd34a634407
7
+ data.tar.gz: b991e5e5337333eeb39daade26edad8957819f8de768f2632df09f77873d9f351f5913d7dac19d5595115d3624369c88a8ddc9fd90a6967028db522221cadd96
@@ -1,3 +1,3 @@
1
1
  module LargeObjectStore
2
- VERSION = "1.6.1"
2
+ VERSION = "1.7.0"
3
3
  end
@@ -27,21 +27,18 @@ module LargeObjectStore
27
27
  class RailsWrapper
28
28
  attr_reader :store
29
29
 
30
- def initialize(store, serializer: Marshal)
30
+ def initialize(store, serializer: Marshal, max_slice_size: MAX_OBJECT_SIZE)
31
31
  @store = store
32
32
  @serializer = serializer
33
+ @max_slice_size = [max_slice_size, MAX_OBJECT_SIZE].min
34
+ @namespace = (store.respond_to?(:options) && store.options[:namespace]) || ""
33
35
  end
34
36
 
35
37
  def write(key, value, **options)
36
38
  options = options.dup
37
39
  value = serialize(value, options)
38
40
 
39
- # calculate slice size; note that key length is a factor because
40
- # the key is stored on the same slab page as the value
41
- namespace = (store.respond_to?(:options) && store.options[:namespace]) || ""
42
- namespace_length = namespace.empty? ? 0 : namespace.size + 1
43
- slice_size = MAX_OBJECT_SIZE - ITEM_HEADER_SIZE - UUID_SIZE - key.bytesize - namespace_length
44
-
41
+ slice_size = safe_slice_size(key)
45
42
  # store number of pages
46
43
  pages = (value.size / slice_size.to_f).ceil
47
44
 
@@ -110,6 +107,19 @@ module LargeObjectStore
110
107
 
111
108
  private
112
109
 
110
+ # calculate slice size; note that key length is a factor because
111
+ # the key is stored on the same slab page as the value
112
+ def safe_slice_size(key)
113
+ namespace_length = @namespace.empty? ? 0 : @namespace.size + 1
114
+ overhead = ITEM_HEADER_SIZE + UUID_SIZE + key.bytesize + namespace_length
115
+ slice_size = @max_slice_size - overhead
116
+ if slice_size <= 0
117
+ MAX_OBJECT_SIZE - overhead
118
+ else
119
+ slice_size
120
+ end
121
+ end
122
+
113
123
  # convert a object to a string
114
124
  # modifies options
115
125
  def serialize(value, options)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: large_object_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ana Martinez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-25 00:00:00.000000000 Z
11
+ date: 2024-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zstd-ruby