fbe 0.24.0 → 0.24.1

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: 91db19b000a04e9305e13bac13ab0084db8c31950978554f59dbf2a8cd25a795
4
- data.tar.gz: 80c536ab908b35b2d5acf3634560a14c3a352c8229a7a73f20690086d01261c5
3
+ metadata.gz: ce6c8e11155234d3e42b7b78fc60f9dc8584a173d0d248b604bd61b39d26180f
4
+ data.tar.gz: 8a642207f5d847c3bbc795f0c48f3410f49e8c9641a3108d14ac6802b398e91e
5
5
  SHA512:
6
- metadata.gz: f0722eae0723bd98a0b34a0b5ba0674776450961420a5be71fbf65d6aa7f786df453c0c48789bdef2e70c967bda7c4a90d0f707e121ebbb5fb78937ad3272ecd
7
- data.tar.gz: e991dad19e45b1cf67c514ca83e3bfcf3814e5477ce0c4cc0b6b4680f3286f239f96b337b07c5bd9b1e8148ea8f6930820743976df94463544bcecb17458345b
6
+ metadata.gz: e4440719106088a76557dffdc71fd9b91c3f1f25bb5eb7cd98cb1e5afc8f32d182bc4a0fb58ab47901b3c5394c1b8d213593b2a34419095816917c1756632667
7
+ data.tar.gz: 5b2930074b232c9be48e45addab74d7d3cb806e145445adc488e8bbec35d1c598713aed670cfc65a7238dd21a46dd9d03ed4c145714e95dafb3e5aa627f2416e
@@ -3,6 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
+ require 'zlib'
6
7
  require 'filesize'
7
8
  require 'json'
8
9
  require 'loog'
@@ -73,7 +74,13 @@ class Fbe::Middleware::SqliteStore
73
74
  t.execute('UPDATE cache SET touched_at = ?2 WHERE key = ?1;', [key, Time.now.utc.iso8601])
74
75
  t.execute('SELECT value FROM cache WHERE key = ? LIMIT 1;', [key])
75
76
  end.dig(0, 0)
76
- JSON.parse(value) if value
77
+ return unless value
78
+ begin
79
+ JSON.parse(Zlib::Inflate.inflate(value))
80
+ rescue Zlib::Error => e
81
+ @loog.info("Failed to decompress cached value for key: #{key}, error: #{e.message}, the key will be deleted")
82
+ delete(key)
83
+ end
77
84
  end
78
85
 
79
86
  # Delete a key from the cache.
@@ -95,7 +102,7 @@ class Fbe::Middleware::SqliteStore
95
102
  req = JSON.parse(vv[0])
96
103
  req['method'] != 'get'
97
104
  end
98
- value = JSON.dump(value)
105
+ value = Zlib::Deflate.deflate(JSON.dump(value))
99
106
  return if value.bytesize > @maxvsize
100
107
  perform do |t|
101
108
  t.execute(<<~SQL, [key, value, Time.now.utc.iso8601])
data/lib/fbe.rb CHANGED
@@ -10,5 +10,5 @@
10
10
  # License:: MIT
11
11
  module Fbe
12
12
  # Current version of the gem (changed by +.rultor.yml+ on every release)
13
- VERSION = '0.24.0' unless const_defined?(:VERSION)
13
+ VERSION = '0.24.1' unless const_defined?(:VERSION)
14
14
  end
@@ -3,6 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
+ require 'securerandom'
6
7
  require 'qbash'
7
8
  require_relative '../../test__helper'
8
9
  require_relative '../../../lib/fbe/middleware'
@@ -141,8 +142,8 @@ class SqliteStoreTest < Fbe::Test
141
142
  Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
142
143
  store.write('a', 'a' * 9_997)
143
144
  store.write('b', 'b' * 9_998)
144
- store.write('c', 'c' * 19_999)
145
- store.write('d', 'd' * 30_000)
145
+ store.write('c', SecureRandom.alphanumeric((19_999 * 1.4).to_i))
146
+ store.write('d', SecureRandom.alphanumeric((30_000 * 1.4).to_i))
146
147
  assert_equal('a' * 9_997, store.read('a'))
147
148
  assert_equal('b' * 9_998, store.read('b'))
148
149
  assert_nil(store.read('c'))
@@ -155,7 +156,6 @@ class SqliteStoreTest < Fbe::Test
155
156
  with_tmpfile('large.db') do |f|
156
157
  Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
157
158
  key = 'aaa'
158
- alpha = ('a'..'z').to_a
159
159
  store.write('a', 'aa')
160
160
  Time.stub(:now, (Time.now - (5 * 60 * 60)).round) do
161
161
  store.write('b', 'bb')
@@ -163,8 +163,8 @@ class SqliteStoreTest < Fbe::Test
163
163
  end
164
164
  assert_equal('cc', store.read('c'))
165
165
  Time.stub(:now, rand((Time.now - (5 * 60 * 60))..Time.now).round) do
166
+ value = SecureRandom.alphanumeric(2048)
166
167
  10_240.times do
167
- value = alpha.sample * rand(1024..2048)
168
168
  store.write(key, value)
169
169
  key = key.next
170
170
  end
@@ -185,8 +185,8 @@ class SqliteStoreTest < Fbe::Test
185
185
  SQLite3::Database.new(f).tap do |d|
186
186
  d.execute 'CREATE TABLE IF NOT EXISTS cache(key TEXT UNIQUE NOT NULL, value TEXT);'
187
187
  [
188
- ['key1', JSON.dump('value1')],
189
- ['key2', JSON.dump('value2')]
188
+ ['key1', Zlib::Deflate.deflate(JSON.dump('value1'))],
189
+ ['key2', Zlib::Deflate.deflate(JSON.dump('value2'))]
190
190
  ].each { d.execute 'INSERT INTO cache(key, value) VALUES(?1, ?2);', _1 }
191
191
  d.execute 'CREATE TABLE IF NOT EXISTS meta(key TEXT UNIQUE NOT NULL, value TEXT);'
192
192
  d.execute "INSERT INTO meta(key, value) VALUES('version', ?);", ['0.0.1']
@@ -200,6 +200,43 @@ class SqliteStoreTest < Fbe::Test
200
200
  end
201
201
  end
202
202
 
203
+ def test_use_compress_for_stored_data
204
+ with_tmpfile('c.db') do |f|
205
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
206
+ a = SecureRandom.alphanumeric(200)
207
+ store.write('a', a)
208
+ store.write('b', 'b' * 100_000)
209
+ assert_equal(a, store.read('a'))
210
+ assert_equal('b' * 100_000, store.read('b'))
211
+ store.all.each do |k, v|
212
+ case k
213
+ when 'a'
214
+ assert_operator(v.size, :<, a.size)
215
+ when 'b'
216
+ assert_operator(v.size, :<, 100_000)
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
222
+
223
+ def test_corrupted_compression_stored_data
224
+ with_tmpfile('c.db') do |f|
225
+ SQLite3::Database.new(f).tap do |d|
226
+ d.execute 'CREATE TABLE IF NOT EXISTS cache(key TEXT UNIQUE NOT NULL, value TEXT);'
227
+ [
228
+ ['my_key', JSON.dump('value1')]
229
+ ].each { d.execute 'INSERT INTO cache(key, value) VALUES(?1, ?2);', _1 }
230
+ d.execute 'CREATE TABLE IF NOT EXISTS meta(key TEXT UNIQUE NOT NULL, value TEXT);'
231
+ d.execute "INSERT INTO meta(key, value) VALUES('version', ?);", ['0.0.1']
232
+ end
233
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
234
+ assert_nil(store.read('my_key'))
235
+ assert_predicate(store.all.count, :zero?)
236
+ end
237
+ end
238
+ end
239
+
203
240
  private
204
241
 
205
242
  def with_tmpfile(name = 'test.db', &)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fbe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.0
4
+ version: 0.24.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko