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 +4 -4
- data/lib/fbe/middleware/sqlite_store.rb +9 -2
- data/lib/fbe.rb +1 -1
- data/test/fbe/middleware/test_sqlite_store.rb +43 -6
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce6c8e11155234d3e42b7b78fc60f9dc8584a173d0d248b604bd61b39d26180f
|
4
|
+
data.tar.gz: 8a642207f5d847c3bbc795f0c48f3410f49e8c9641a3108d14ac6802b398e91e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
@@ -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',
|
145
|
-
store.write('d',
|
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', &)
|