litestack 0.4.3 → 0.4.4

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +3 -1
  3. data/BENCHMARKS.md +3 -3
  4. data/CAVEATS.md +20 -0
  5. data/CHANGELOG.md +19 -4
  6. data/FILESYSTEMS.md +55 -0
  7. data/Gemfile +2 -0
  8. data/README.md +2 -2
  9. data/ROADMAP.md +6 -6
  10. data/assets/litestack_advantage.png +0 -0
  11. data/bench/bench.rb +2 -0
  12. data/bench/bench_cache_rails.rb +14 -17
  13. data/bench/bench_cache_raw.rb +18 -15
  14. data/bench/bench_jobs_rails.rb +3 -3
  15. data/bench/bench_jobs_raw.rb +3 -3
  16. data/bin/liteboard +16 -14
  17. data/gemfiles/rails70.gemfile +5 -0
  18. data/gemfiles/rails71.gemfile +5 -0
  19. data/gemfiles/rails71.gemfile.lock +264 -0
  20. data/lib/active_job/queue_adapters/litejob_adapter.rb +11 -3
  21. data/lib/active_record/connection_adapters/litedb_adapter.rb +17 -7
  22. data/lib/active_support/cache/litecache.rb +25 -15
  23. data/lib/generators/litestack/install/install_generator.rb +2 -2
  24. data/lib/litestack/liteboard/liteboard.rb +15 -19
  25. data/lib/litestack/liteboard/views/litecable.erb +1 -1
  26. data/lib/litestack/litecable.rb +1 -1
  27. data/lib/litestack/litecache.rb +23 -25
  28. data/lib/litestack/litedb.rb +5 -1
  29. data/lib/litestack/litejob.rb +1 -1
  30. data/lib/litestack/litejobqueue.rb +24 -14
  31. data/lib/litestack/litemetric.rb +7 -6
  32. data/lib/litestack/litequeue.rb +17 -2
  33. data/lib/litestack/litequeue.sql.yml +38 -5
  34. data/lib/litestack/litescheduler.rb +1 -2
  35. data/lib/litestack/litesearch/index.rb +11 -10
  36. data/lib/litestack/litesearch/model.rb +61 -3
  37. data/lib/litestack/litesearch/schema.rb +7 -2
  38. data/lib/litestack/litesearch/schema_adapters/backed_adapter.rb +69 -25
  39. data/lib/litestack/litesearch/schema_adapters.rb +4 -4
  40. data/lib/litestack/litesearch.rb +2 -2
  41. data/lib/litestack/litesupport.rb +7 -6
  42. data/lib/litestack/railtie.rb +4 -2
  43. data/lib/litestack/version.rb +1 -1
  44. data/lib/litestack.rb +15 -15
  45. data/lib/sequel/adapters/litedb.rb +9 -1
  46. data/lib/sequel/adapters/shared/litedb.rb +2 -2
  47. data/scripts/build_metrics.rb +2 -2
  48. data/scripts/test_cable.rb +1 -1
  49. metadata +95 -59
@@ -0,0 +1,264 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ litestack (0.4.4)
5
+ erubi
6
+ oj
7
+ rack
8
+ rackup
9
+ sqlite3
10
+ tilt
11
+
12
+ GEM
13
+ remote: https://rubygems.org/
14
+ specs:
15
+ actioncable (7.1.3.2)
16
+ actionpack (= 7.1.3.2)
17
+ activesupport (= 7.1.3.2)
18
+ nio4r (~> 2.0)
19
+ websocket-driver (>= 0.6.1)
20
+ zeitwerk (~> 2.6)
21
+ actionmailbox (7.1.3.2)
22
+ actionpack (= 7.1.3.2)
23
+ activejob (= 7.1.3.2)
24
+ activerecord (= 7.1.3.2)
25
+ activestorage (= 7.1.3.2)
26
+ activesupport (= 7.1.3.2)
27
+ mail (>= 2.7.1)
28
+ net-imap
29
+ net-pop
30
+ net-smtp
31
+ actionmailer (7.1.3.2)
32
+ actionpack (= 7.1.3.2)
33
+ actionview (= 7.1.3.2)
34
+ activejob (= 7.1.3.2)
35
+ activesupport (= 7.1.3.2)
36
+ mail (~> 2.5, >= 2.5.4)
37
+ net-imap
38
+ net-pop
39
+ net-smtp
40
+ rails-dom-testing (~> 2.2)
41
+ actionpack (7.1.3.2)
42
+ actionview (= 7.1.3.2)
43
+ activesupport (= 7.1.3.2)
44
+ nokogiri (>= 1.8.5)
45
+ racc
46
+ rack (>= 2.2.4)
47
+ rack-session (>= 1.0.1)
48
+ rack-test (>= 0.6.3)
49
+ rails-dom-testing (~> 2.2)
50
+ rails-html-sanitizer (~> 1.6)
51
+ actiontext (7.1.3.2)
52
+ actionpack (= 7.1.3.2)
53
+ activerecord (= 7.1.3.2)
54
+ activestorage (= 7.1.3.2)
55
+ activesupport (= 7.1.3.2)
56
+ globalid (>= 0.6.0)
57
+ nokogiri (>= 1.8.5)
58
+ actionview (7.1.3.2)
59
+ activesupport (= 7.1.3.2)
60
+ builder (~> 3.1)
61
+ erubi (~> 1.11)
62
+ rails-dom-testing (~> 2.2)
63
+ rails-html-sanitizer (~> 1.6)
64
+ activejob (7.1.3.2)
65
+ activesupport (= 7.1.3.2)
66
+ globalid (>= 0.3.6)
67
+ activemodel (7.1.3.2)
68
+ activesupport (= 7.1.3.2)
69
+ activerecord (7.1.3.2)
70
+ activemodel (= 7.1.3.2)
71
+ activesupport (= 7.1.3.2)
72
+ timeout (>= 0.4.0)
73
+ activestorage (7.1.3.2)
74
+ actionpack (= 7.1.3.2)
75
+ activejob (= 7.1.3.2)
76
+ activerecord (= 7.1.3.2)
77
+ activesupport (= 7.1.3.2)
78
+ marcel (~> 1.0)
79
+ activesupport (7.1.3.2)
80
+ base64
81
+ bigdecimal
82
+ concurrent-ruby (~> 1.0, >= 1.0.2)
83
+ connection_pool (>= 2.2.5)
84
+ drb
85
+ i18n (>= 1.6, < 2)
86
+ minitest (>= 5.1)
87
+ mutex_m
88
+ tzinfo (~> 2.0)
89
+ ast (2.4.2)
90
+ base64 (0.2.0)
91
+ bigdecimal (3.1.6)
92
+ builder (3.2.4)
93
+ concurrent-ruby (1.2.3)
94
+ connection_pool (2.4.1)
95
+ crass (1.0.6)
96
+ date (3.3.4)
97
+ docile (1.4.0)
98
+ drb (2.2.1)
99
+ erubi (1.12.0)
100
+ globalid (1.2.1)
101
+ activesupport (>= 6.1)
102
+ hanami-router (0.6.2)
103
+ hanami-utils (~> 0.7)
104
+ http_router (~> 0.11)
105
+ hanami-utils (0.9.2)
106
+ http_router (0.11.2)
107
+ rack (>= 1.0.0)
108
+ url_mount (~> 0.2.1)
109
+ i18n (1.14.1)
110
+ concurrent-ruby (~> 1.0)
111
+ io-console (0.7.2)
112
+ irb (1.11.2)
113
+ rdoc
114
+ reline (>= 0.4.2)
115
+ json (2.7.1)
116
+ language_server-protocol (3.17.0.3)
117
+ lint_roller (1.1.0)
118
+ loofah (2.22.0)
119
+ crass (~> 1.0.2)
120
+ nokogiri (>= 1.12.0)
121
+ mail (2.8.1)
122
+ mini_mime (>= 0.1.1)
123
+ net-imap
124
+ net-pop
125
+ net-smtp
126
+ marcel (1.0.4)
127
+ mini_mime (1.1.5)
128
+ minitest (5.22.2)
129
+ mutex_m (0.2.0)
130
+ net-imap (0.4.10)
131
+ date
132
+ net-protocol
133
+ net-pop (0.1.2)
134
+ net-protocol
135
+ net-protocol (0.2.2)
136
+ timeout
137
+ net-smtp (0.4.0.1)
138
+ net-protocol
139
+ nio4r (2.7.0)
140
+ nokogiri (1.16.2-arm64-darwin)
141
+ racc (~> 1.4)
142
+ oj (3.16.3)
143
+ bigdecimal (>= 3.0)
144
+ parallel (1.24.0)
145
+ parser (3.3.0.5)
146
+ ast (~> 2.4.1)
147
+ racc
148
+ psych (5.1.2)
149
+ stringio
150
+ racc (1.7.3)
151
+ rack (3.0.9.1)
152
+ rack-session (2.0.0)
153
+ rack (>= 3.0.0)
154
+ rack-test (2.1.0)
155
+ rack (>= 1.3)
156
+ rackup (2.1.0)
157
+ rack (>= 3)
158
+ webrick (~> 1.8)
159
+ rails (7.1.3.2)
160
+ actioncable (= 7.1.3.2)
161
+ actionmailbox (= 7.1.3.2)
162
+ actionmailer (= 7.1.3.2)
163
+ actionpack (= 7.1.3.2)
164
+ actiontext (= 7.1.3.2)
165
+ actionview (= 7.1.3.2)
166
+ activejob (= 7.1.3.2)
167
+ activemodel (= 7.1.3.2)
168
+ activerecord (= 7.1.3.2)
169
+ activestorage (= 7.1.3.2)
170
+ activesupport (= 7.1.3.2)
171
+ bundler (>= 1.15.0)
172
+ railties (= 7.1.3.2)
173
+ rails-dom-testing (2.2.0)
174
+ activesupport (>= 5.0.0)
175
+ minitest
176
+ nokogiri (>= 1.6)
177
+ rails-html-sanitizer (1.6.0)
178
+ loofah (~> 2.21)
179
+ nokogiri (~> 1.14)
180
+ railties (7.1.3.2)
181
+ actionpack (= 7.1.3.2)
182
+ activesupport (= 7.1.3.2)
183
+ irb
184
+ rackup (>= 1.0.0)
185
+ rake (>= 12.2)
186
+ thor (~> 1.0, >= 1.2.2)
187
+ zeitwerk (~> 2.6)
188
+ rainbow (3.1.1)
189
+ rake (13.1.0)
190
+ rdoc (6.6.2)
191
+ psych (>= 4.0.0)
192
+ regexp_parser (2.9.0)
193
+ reline (0.4.3)
194
+ io-console (~> 0.5)
195
+ rexml (3.2.6)
196
+ rubocop (1.61.0)
197
+ json (~> 2.3)
198
+ language_server-protocol (>= 3.17.0)
199
+ parallel (~> 1.10)
200
+ parser (>= 3.3.0.2)
201
+ rainbow (>= 2.2.2, < 4.0)
202
+ regexp_parser (>= 1.8, < 3.0)
203
+ rexml (>= 3.2.5, < 4.0)
204
+ rubocop-ast (>= 1.30.0, < 2.0)
205
+ ruby-progressbar (~> 1.7)
206
+ unicode-display_width (>= 2.4.0, < 3.0)
207
+ rubocop-ast (1.31.1)
208
+ parser (>= 3.3.0.4)
209
+ rubocop-performance (1.20.2)
210
+ rubocop (>= 1.48.1, < 2.0)
211
+ rubocop-ast (>= 1.30.0, < 2.0)
212
+ ruby-progressbar (1.13.0)
213
+ sequel (5.78.0)
214
+ bigdecimal
215
+ simplecov (0.22.0)
216
+ docile (~> 1.1)
217
+ simplecov-html (~> 0.11)
218
+ simplecov_json_formatter (~> 0.1)
219
+ simplecov-html (0.12.3)
220
+ simplecov_json_formatter (0.1.4)
221
+ sqlite3 (1.7.2-arm64-darwin)
222
+ standard (1.34.0)
223
+ language_server-protocol (~> 3.17.0.2)
224
+ lint_roller (~> 1.0)
225
+ rubocop (~> 1.60)
226
+ standard-custom (~> 1.0.0)
227
+ standard-performance (~> 1.3)
228
+ standard-custom (1.0.2)
229
+ lint_roller (~> 1.0)
230
+ rubocop (~> 1.50)
231
+ standard-performance (1.3.1)
232
+ lint_roller (~> 1.1)
233
+ rubocop-performance (~> 1.20.2)
234
+ stringio (3.1.0)
235
+ thor (1.3.1)
236
+ tilt (2.3.0)
237
+ timeout (0.4.1)
238
+ tzinfo (2.0.6)
239
+ concurrent-ruby (~> 1.0)
240
+ unicode-display_width (2.5.0)
241
+ url_mount (0.2.1)
242
+ rack
243
+ webrick (1.8.1)
244
+ websocket-driver (0.7.6)
245
+ websocket-extensions (>= 0.1.0)
246
+ websocket-extensions (0.1.5)
247
+ zeitwerk (2.6.13)
248
+
249
+ PLATFORMS
250
+ arm64-darwin
251
+
252
+ DEPENDENCIES
253
+ litestack!
254
+ minitest
255
+ rack (~> 3.0)
256
+ rails (~> 7.1)
257
+ railties
258
+ rake
259
+ sequel
260
+ simplecov
261
+ standard
262
+
263
+ BUNDLED WITH
264
+ 2.5.3
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../litestack/litejob"
4
+ require "active_support"
4
5
  require "active_support/core_ext/enumerable"
6
+ require "active_support/core_ext/numeric/time"
5
7
  require "active_support/core_ext/array/access"
6
8
  require "active_job"
7
9
 
@@ -18,20 +20,26 @@ module ActiveJob
18
20
  # Job.options = DEFAULT_OPTIONS.merge(options)
19
21
  end
20
22
 
23
+ def enqueue_after_transaction_commit?
24
+ Job.options[:enqueue_after_transaction_commit]
25
+ end
26
+
21
27
  def enqueue(job) # :nodoc:
22
28
  Job.queue = job.queue_name
23
29
  Job.perform_async(job.serialize)
24
30
  end
25
31
 
26
- def enqueue_at(job, timestamp) # :nodoc:
32
+ def enqueue_at(job, time) # :nodoc:
33
+ time = time.from_now if time.respond_to?(:from_now) #is_a?(ActiveSupport::Duration)
27
34
  Job.queue = job.queue_name
28
- Job.perform_at(timestamp, job.serialize)
35
+ Job.perform_at(time, job.serialize)
29
36
  end
30
37
 
31
38
  class Job # :nodoc:
32
39
  DEFAULT_OPTIONS = {
33
40
  config_path: "./config/litejob.yml",
34
- logger: nil # Rails performs its logging already
41
+ logger: nil, # Rails performs its logging already
42
+ enqueue_after_transaction_commit: true
35
43
  }
36
44
 
37
45
  include ::Litejob
@@ -1,4 +1,5 @@
1
1
  require_relative "../../litestack/litedb"
2
+
2
3
  require "active_record"
3
4
  require "active_record/connection_adapters/sqlite3_adapter"
4
5
  require "active_record/tasks/sqlite_database_tasks"
@@ -41,16 +42,18 @@ module ActiveRecord
41
42
  class LitedbAdapter < SQLite3Adapter
42
43
  ADAPTER_NAME = "litedb"
43
44
 
44
- def self.dbconsole(config, options = {})
45
- args = []
45
+ class << self
46
+ def dbconsole(config, options = {})
47
+ args = []
46
48
 
47
- args << "-#{options[:mode]}" if options[:mode]
48
- args << "-header" if options[:header]
49
- args << File.expand_path(config.database, Rails.respond_to?(:root) ? Rails.root : nil)
49
+ args << "-#{options[:mode]}" if options[:mode]
50
+ args << "-header" if options[:header]
51
+ args << File.expand_path(config.database, Rails.respond_to?(:root) ? Rails.root : nil)
50
52
 
51
- self.find_cmd_and_exec("sqlite3", *args)
53
+ find_cmd_and_exec("sqlite3", *args)
54
+ end
52
55
  end
53
-
56
+
54
57
  NATIVE_DATABASE_TYPES = {
55
58
  primary_key: "integer PRIMARY KEY NOT NULL",
56
59
  string: {name: "text"},
@@ -88,3 +91,10 @@ module ActiveRecord
88
91
  end
89
92
  end
90
93
  end
94
+
95
+ ActiveRecord::ConnectionAdapters.register(
96
+ "litedb", "ActiveRecord::ConnectionAdapters::LitedbAdapter",
97
+ "active_record/connection_adapters/litedb_adapter"
98
+ ) if ActiveRecord::ConnectionAdapters.respond_to?(:register)
99
+
100
+
@@ -1,14 +1,16 @@
1
- require "delegate"
2
- require "active_support/core_ext/enumerable"
3
- require "active_support/core_ext/array/extract_options"
1
+ require "active_support"
4
2
  require "active_support/core_ext/numeric/time"
5
3
  require "active_support/cache"
4
+
6
5
  require_relative "../../litestack/litecache"
7
6
 
8
7
  module ActiveSupport
9
8
  module Cache
9
+
10
+ self.format_version = 7.0
11
+
10
12
  class Litecache < Store
11
- #prepend Strategy::LocalCache
13
+ # prepend Strategy::LocalCache
12
14
 
13
15
  def self.supports_cache_versioning?
14
16
  true
@@ -26,9 +28,9 @@ module ActiveSupport
26
28
  # todo: fix me
27
29
  # this is currently a hack to avoid dealing with Rails cache encoding and decoding
28
30
  # and it can result in a race condition as it stands
29
- # @cache.transaction(:immediate) do
30
- # currently transactions are not compatible with acquiring connections
31
- # this needs fixing by storing the connection to the context once acquired
31
+ # @cache.transaction(:immediate) do
32
+ # currently transactions are not compatible with acquiring connections
33
+ # this needs fixing by storing the connection to the context once acquired
32
34
  if (value = read(key, options))
33
35
  value = value.to_i + amount
34
36
  write(key, value, options)
@@ -51,7 +53,7 @@ module ActiveSupport
51
53
  @cache.prune(limit)
52
54
  end
53
55
 
54
- def clear(options=nil)
56
+ def clear(options = nil)
55
57
  @cache.clear
56
58
  end
57
59
 
@@ -73,6 +75,14 @@ module ActiveSupport
73
75
 
74
76
  private
75
77
 
78
+ def serialize_entries(entry, **options)
79
+ Marshal.dump(entry)
80
+ end
81
+
82
+ def deserialize_entries(entry)
83
+ Marshal.load(entry.to_s)
84
+ end
85
+
76
86
  # Read an entry from the cache.
77
87
  def read_entry(key, **options)
78
88
  deserialize_entry(@cache.get(key))
@@ -82,27 +92,27 @@ module ActiveSupport
82
92
  results = {}
83
93
  return results if names == []
84
94
  rs = @cache.get_multi(*names.flatten)
85
- rs.each_pair{|k, v| results[k] = deserialize_entry(v).value }
95
+ rs.each_pair { |k, v| results[k] = deserialize_entry(v).value }
86
96
  results
87
97
  end
88
-
98
+
89
99
  # Write an entry to the cache.
90
100
  def write_entry(key, entry, **options)
91
101
  write_serialized_entry(key, serialize_entry(entry, **options), **options)
92
102
  end
93
-
103
+
94
104
  def write_multi_entries(entries, **options)
95
105
  return if entries.empty?
96
- entries.each_pair {|k,v| entries[k] = serialize_entry(v, **options)}
97
- expires_in = options[:expires_in].to_i
106
+ entries.each_pair { |k, v| entries[k] = serialize_entry(v, **options) }
107
+ expires_in = options[:expires_in].to_i if options[:expires_in]
98
108
  if options[:race_condition_ttl] && expires_in > 0 && !options[:raw]
99
109
  expires_in += 5.minutes
100
110
  end
101
- @cache.set_multi(entries, expires_in)
111
+ @cache.set_multi(entries, expires_in)
102
112
  end
103
113
 
104
114
  def write_serialized_entry(key, payload, **options)
105
- expires_in = options[:expires_in].to_i
115
+ expires_in = options[:expires_in].to_i if options[:expires_in]
106
116
  if options[:race_condition_ttl] && expires_in > 0 && !options[:raw]
107
117
  expires_in += 5.minutes
108
118
  end
@@ -1,10 +1,10 @@
1
1
  class Litestack::InstallGenerator < Rails::Generators::Base
2
2
  source_root File.expand_path("templates", __dir__)
3
3
 
4
- # Force copy configuratioon files so Rails installs don't ask questions
4
+ # Force copy configuration files so Rails installs don't ask questions
5
5
  # that less experienced people might not understand. The more Sr folks.
6
6
  # will know to check git to look at what changed.
7
- def modify_database_adapater
7
+ def modify_database_adapter
8
8
  copy_file "database.yml", "config/database.yml", force: true
9
9
  end
10
10
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "hanami/router"
3
+ require "rack"
4
4
  require "tilt"
5
5
  require "erubi"
6
6
 
@@ -11,37 +11,32 @@ class Liteboard
11
11
  @@resolutions = {"minute" => [300, 12], "hour" => [3600, 24], "day" => [3600 * 24, 7], "week" => [3600 * 24 * 7, 53], "year" => [3600 * 24 * 365, 100]}
12
12
  @@res_mapping = {"hour" => "minute", "day" => "hour", "week" => "day", "year" => "week"}
13
13
  @@templates = {}
14
- @@app = Hanami::Router.new do
15
- get "/", to: ->(env) do
14
+ @@app = proc do |env|
15
+ case path = env["PATH_INFO"]
16
+ when "/"
16
17
  Liteboard.new(env).call(:index)
17
- end
18
-
19
- get "/topics/Litejob", to: ->(env) do
18
+ when "/topics/Litejob"
20
19
  Liteboard.new(env).call(:litejob)
21
- end
22
-
23
- get "/topics/Litecache", to: ->(env) do
20
+ when "/topics/Litecache"
24
21
  Liteboard.new(env).call(:litecache)
25
- end
26
-
27
- get "/topics/Litedb", to: ->(env) do
22
+ when "/topics/Litedb"
28
23
  Liteboard.new(env).call(:litedb)
29
- end
30
-
31
- get "/topics/Litecable", to: ->(env) do
24
+ when "/topics/Litecable"
32
25
  Liteboard.new(env).call(:litecable)
33
26
  end
27
+
34
28
  end
35
29
 
36
30
  def initialize(env)
37
31
  @env = env
38
- @params = @env["router.params"]
32
+ @req = Rack::Request.new(@env)
33
+ @params = @req.params
39
34
  @running = true
40
35
  @lm = Litemetric.instance
41
36
  end
42
37
 
43
38
  def params(key)
44
- URI.decode_uri_component(@params[key].to_s)
39
+ URI.decode_uri_component(@params[key.to_s].to_s)
45
40
  end
46
41
 
47
42
  def call(method)
@@ -227,9 +222,9 @@ class Liteboard
227
222
  @topic = "Litejob"
228
223
  @events = @lm.events_summaries(@topic, @resolution, @order, @dir, @search, @step * @count)
229
224
  @events.each do |event|
230
- data_points = @lm.event_data_points(@step, @count, @resolution, @topic, event["name"])
225
+ data_points = @lm.event_data_points(@step, @count, @resolution, @topic, event[:name])
231
226
  event["counts"] = data_points.collect { |r| [r["rtime"], r["rcount"] || 0] }
232
- event["values"] = data_points.collect { |r| [r["rtime"], r["rtotal"] || 0] }
227
+ event["values"] = data_points.collect { |r| [r["rtime"], (r["rtotal"] || 0.0)] }
233
228
  end
234
229
  @snapshot = read_snapshot(@topic)
235
230
  @size = begin
@@ -391,6 +386,7 @@ class Liteboard
391
386
  end
392
387
 
393
388
  def format(float)
389
+ float = float.round(3)
394
390
  string = float.to_s
395
391
  whole, decimal = string.split(".")
396
392
  whole = whole.chars.reverse.each_slice(3).map(&:join).join(",").reverse
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  <div class="card-body">
63
63
  <span class="hidden inlinestackedcolumn">
64
- <%=[["Time", "Recieved Count", "Delivered Count"]] + @messages_over_time.to_a%>
64
+ <%=[["Time", "Received Count", "Delivered Count"]] + @messages_over_time.to_a%>
65
65
  </span>
66
66
  </div>
67
67
  </div>
@@ -113,7 +113,7 @@ class Litecable
113
113
  def create_listener
114
114
  Litescheduler.spawn do
115
115
  while @running
116
- @last_fetched_id ||= (run_stmt(:last_id)[0][0] || 0)
116
+ @last_fetched_id ||= run_stmt(:last_id)[0][0] || 0
117
117
  run_stmt(:fetch, @last_fetched_id, @pid).to_a.each do |msg|
118
118
  @logger.info "RECEIVED #{msg}"
119
119
  @last_fetched_id = msg[0]
@@ -20,7 +20,7 @@ class Litecache
20
20
  include Litemetric::Measurable
21
21
 
22
22
  # the default options for the cache
23
- # can be overriden by passing new options in a hash
23
+ # can be overridden by passing new options in a hash
24
24
  # to Litecache.new
25
25
  # path: "./cache.db"
26
26
  # expiry: 60 * 60 * 24 * 30 -> one month default expiry if none is provided
@@ -71,7 +71,7 @@ class Litecache
71
71
  # add a key, value pair to the cache, with an optional expiry value (number of seconds)
72
72
  def set(key, value, expires_in = nil)
73
73
  key = key.to_s
74
- expires_in ||= @expires_in
74
+ expires_in ||= @expires_in
75
75
  @conn.acquire do |cache|
76
76
  cache.stmts[:setter].execute!(key, value, expires_in)
77
77
  capture(:set, key)
@@ -82,30 +82,28 @@ class Litecache
82
82
  end
83
83
  true
84
84
  end
85
-
85
+
86
86
  # set multiple keys and values in one shot set_multi({k1: v1, k2: v2, ... })
87
87
  def set_multi(keys_and_values, expires_in = nil)
88
- expires_in ||= @expires_in
88
+ expires_in ||= @expires_in
89
89
  transaction do |conn|
90
90
  keys_and_values.each_pair do |k, v|
91
- begin
92
- key = k.to_s
93
- conn.stmts[:setter].execute!(key, v, expires_in)
94
- capture(:set, key)
95
- rescue SQLite3::FullException
96
- conn.stmts[:extra_pruner].execute!(0.2)
97
- conn.execute("vacuum")
98
- retry
99
- end
91
+ key = k.to_s
92
+ conn.stmts[:setter].execute!(key, v, expires_in)
93
+ capture(:set, key)
94
+ rescue SQLite3::FullException
95
+ conn.stmts[:extra_pruner].execute!(0.2)
96
+ conn.execute("vacuum")
97
+ retry
100
98
  end
101
99
  end
102
- true
103
- end
100
+ true
101
+ end
104
102
 
105
103
  # add a key, value pair to the cache, but only if the key doesn't exist, with an optional expiry value (number of seconds)
106
104
  def set_unless_exists(key, value, expires_in = nil)
107
105
  key = key.to_s
108
- expires_in ||= @expires_in
106
+ expires_in ||= @expires_in
109
107
  changes = 0
110
108
  @conn.acquire do |cache|
111
109
  cache.transaction(:immediate) do
@@ -132,7 +130,7 @@ class Litecache
132
130
  capture(:get, key, 0)
133
131
  nil
134
132
  end
135
-
133
+
136
134
  # get multiple values by their keys, a hash with values corresponding to the keys
137
135
  # is returned,
138
136
  def get_multi(*keys)
@@ -140,11 +138,11 @@ class Litecache
140
138
  transaction(:deferred) do |conn|
141
139
  keys.length.times do |i|
142
140
  key = keys[i].to_s
143
- if (record = conn.stmts[:getter].execute!(key)[0])
141
+ if (record = conn.stmts[:getter].execute!(key)[0])
144
142
  results[keys[i]] = record[1] # use the original key format
145
143
  capture(:get, key, 1)
146
144
  else
147
- capture(:get, key, 0)
145
+ capture(:get, key, 0)
148
146
  end
149
147
  end
150
148
  end
@@ -162,13 +160,13 @@ class Litecache
162
160
  end
163
161
 
164
162
  # increment an integer value by amount, optionally add an expiry value (in seconds)
165
- def increment(key, amount, expires_in = nil)
166
- expires_in ||= @expires_in
163
+ def increment(key, amount = 1, expires_in = nil)
164
+ expires_in ||= @expires_in
167
165
  @conn.acquire { |cache| cache.stmts[:incrementer].execute!(key.to_s, amount, expires_in) }
168
166
  end
169
167
 
170
168
  # decrement an integer value by amount, optionally add an expiry value (in seconds)
171
- def decrement(key, amount, expires_in = nil)
169
+ def decrement(key, amount = 1, expires_in = nil)
172
170
  increment(key, -amount, expires_in)
173
171
  end
174
172
 
@@ -225,7 +223,7 @@ class Litecache
225
223
  end
226
224
 
227
225
  # low level access to SQLite transactions, use with caution
228
- def transaction(mode=:immediate)
226
+ def transaction(mode = :immediate)
229
227
  @conn.acquire do |cache|
230
228
  if cache.transaction_active?
231
229
  yield
@@ -241,7 +239,7 @@ class Litecache
241
239
 
242
240
  def setup
243
241
  super # create connection
244
- @bgthread = spawn_worker # create backgroud pruner thread
242
+ @bgthread = spawn_worker # create background pruner thread
245
243
  end
246
244
 
247
245
  def spawn_worker
@@ -253,7 +251,7 @@ class Litecache
253
251
  retry
254
252
  rescue SQLite3::FullException
255
253
  cache.stmts[:extra_pruner].execute!(0.2)
256
- rescue Exception => e # standard:disable Lint/RescueException
254
+ rescue Exception # standard:disable Lint/RescueException
257
255
  # database is closed
258
256
  end
259
257
  sleep @options[:sleep_interval]
@@ -15,7 +15,7 @@ class Litedb < ::SQLite3::Database
15
15
  # add litesearch support
16
16
  include Litesearch
17
17
 
18
- # overrride the original initilaizer to allow for connection configuration
18
+ # override the original initilaizer to allow for connection configuration
19
19
  def initialize(file, options = {}, zfs = nil)
20
20
  if block_given?
21
21
  super(file, options, zfs) do |db|
@@ -31,6 +31,10 @@ class Litedb < ::SQLite3::Database
31
31
  collect_metrics if @collecting_metrics
32
32
  end
33
33
 
34
+ def sqlite_version
35
+ SQLite3::SQLITE_VERSION_NUMBER
36
+ end
37
+
34
38
  def collecting_metrics?
35
39
  @collecting_metrics
36
40
  end