litestack 0.2.6 → 0.3.0
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/CHANGELOG.md +9 -0
- data/README.md +1 -1
- data/assets/event_page.png +0 -0
- data/assets/index_page.png +0 -0
- data/assets/topic_page.png +0 -0
- data/lib/action_cable/subscription_adapter/litecable.rb +1 -11
- data/lib/generators/litestack/install/templates/database.yml +5 -1
- data/lib/litestack/liteboard/liteboard.rb +172 -35
- data/lib/litestack/liteboard/views/index.erb +52 -20
- data/lib/litestack/liteboard/views/layout.erb +189 -38
- data/lib/litestack/liteboard/views/litecable.erb +118 -0
- data/lib/litestack/liteboard/views/litecache.erb +144 -0
- data/lib/litestack/liteboard/views/litedb.erb +168 -0
- data/lib/litestack/liteboard/views/litejob.erb +151 -0
- data/lib/litestack/litecable.rb +24 -34
- data/lib/litestack/litecable.sql.yml +1 -1
- data/lib/litestack/litecache.rb +6 -17
- data/lib/litestack/litedb.rb +11 -2
- data/lib/litestack/litemetric.rb +43 -66
- data/lib/litestack/litemetric.sql.yml +14 -12
- data/lib/litestack/litemetric_collector.sql.yml +4 -4
- data/lib/litestack/litequeue.rb +9 -20
- data/lib/litestack/litesupport.rb +41 -20
- data/lib/litestack/version.rb +1 -1
- data/lib/litestack.rb +1 -1
- metadata +9 -2
@@ -13,13 +13,13 @@ schema:
|
|
13
13
|
name TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
|
14
14
|
key TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
|
15
15
|
count INTEGER DEFAULT(0) NOT NULL ON CONFLICT REPLACE,
|
16
|
-
value
|
17
|
-
minimum
|
18
|
-
maximum
|
16
|
+
value REAL,
|
17
|
+
minimum REAL,
|
18
|
+
maximum REAL,
|
19
19
|
created_at INTEGER DEFAULT((unixepoch()/300*300)) NOT NULL,
|
20
20
|
resolution TEXT DEFAULT('minute') NOT NULL,
|
21
21
|
PRIMARY KEY(resolution, created_at, topic, name, key)
|
22
|
-
);
|
22
|
+
) STRICT;
|
23
23
|
|
24
24
|
create_topic_index_on_events: CREATE INDEX events_topic_index ON events (resolution, created_at, topic) WHERE name = '___';
|
25
25
|
create_event_index_on_events: CREATE INDEX events_event_index ON events (resolution, created_at , topic, name) WHERE key = '___';
|
@@ -226,7 +226,7 @@ stmts:
|
|
226
226
|
FROM events
|
227
227
|
WHERE topic = ?1 AND name = ?2 AND resolution = ?3
|
228
228
|
AND created_at <= unixepoch()
|
229
|
-
AND created_at >= unixepoch()
|
229
|
+
AND created_at >= unixepoch() - ?6
|
230
230
|
AND key != '___'
|
231
231
|
AND iif(length(?5) > 0, rowid IN (SELECT rowid FROM events_search WHERE key LIKE ?5), TRUE)
|
232
232
|
GROUP BY key
|
@@ -251,7 +251,7 @@ stmts:
|
|
251
251
|
FROM events
|
252
252
|
WHERE topic = ?1 AND name = ?2 AND resolution = ?3
|
253
253
|
AND created_at <= unixepoch()
|
254
|
-
AND created_at >= unixepoch()
|
254
|
+
AND created_at >= unixepoch() - ?6
|
255
255
|
AND key != '___'
|
256
256
|
AND iif(length(?5) > 0, rowid IN (SELECT rowid FROM events_search WHERE key LIKE ?5), TRUE)
|
257
257
|
GROUP BY key
|
@@ -272,8 +272,8 @@ stmts:
|
|
272
272
|
SELECT
|
273
273
|
datetime(ts.slot, 'unixepoch') AS rtime,
|
274
274
|
ts.slot AS unixtime,
|
275
|
-
|
276
|
-
|
275
|
+
sum(events.count) AS rcount,
|
276
|
+
avg(events.value/events.count) AS ravg
|
277
277
|
FROM (
|
278
278
|
WITH RECURSIVE timeslot(x) AS (
|
279
279
|
SELECT (unixepoch()/(?1))*(?1)
|
@@ -294,8 +294,9 @@ stmts:
|
|
294
294
|
SELECT
|
295
295
|
datetime(ts.slot, 'unixepoch') AS rtime,
|
296
296
|
ts.slot AS unixtime,
|
297
|
-
|
298
|
-
|
297
|
+
events.count AS rcount,
|
298
|
+
events.value / events.count AS ravg,
|
299
|
+
events.value AS rtotal
|
299
300
|
FROM (
|
300
301
|
WITH RECURSIVE timeslot(x) AS (
|
301
302
|
SELECT (unixepoch()/(?1))*(?1)
|
@@ -317,8 +318,9 @@ stmts:
|
|
317
318
|
SELECT
|
318
319
|
datetime(ts.slot, 'unixepoch') AS rtime,
|
319
320
|
ts.slot AS unixtime,
|
320
|
-
|
321
|
-
|
321
|
+
events.count AS rcount,
|
322
|
+
events.value / events.count AS ravg,
|
323
|
+
events.value AS rtotal
|
322
324
|
FROM (
|
323
325
|
WITH RECURSIVE timeslot(x) AS (
|
324
326
|
SELECT (unixepoch()/(?1))*(?1)
|
@@ -7,13 +7,13 @@ schema:
|
|
7
7
|
name TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
|
8
8
|
key TEXT DEFAULT('___') NOT NULL ON CONFLICT REPLACE,
|
9
9
|
count INTEGER DEFAULT(0) NOT NULL ON CONFLICT REPLACE,
|
10
|
-
value
|
11
|
-
minimum
|
12
|
-
maximum
|
10
|
+
value REAL,
|
11
|
+
minimum REAL,
|
12
|
+
maximum REAL,
|
13
13
|
created_at INTEGER DEFAULT((unixepoch()/300*300)) NOT NULL ON CONFLICT REPLACE,
|
14
14
|
resolution TEXT DEFAULT('minute') NOT NULL,
|
15
15
|
PRIMARY KEY(resolution, created_at, topic, name, key)
|
16
|
-
);
|
16
|
+
) STRICT;
|
17
17
|
|
18
18
|
stmts:
|
19
19
|
|
data/lib/litestack/litequeue.rb
CHANGED
@@ -78,12 +78,12 @@ class Litequeue
|
|
78
78
|
|
79
79
|
# deletes all the entries in all queues, or if a queue name is given, deletes all entries in that specific queue
|
80
80
|
def clear(queue=nil)
|
81
|
-
run_sql("DELETE FROM queue WHERE iif(
|
81
|
+
run_sql("DELETE FROM queue WHERE iif(?1 IS NOT NULL, name = ?1, TRUE)", queue)
|
82
82
|
end
|
83
83
|
|
84
84
|
# returns a count of entries in all queues, or if a queue name is given, reutrns the count of entries in that queue
|
85
85
|
def count(queue=nil)
|
86
|
-
run_sql("SELECT count(*) FROM queue WHERE iif(
|
86
|
+
run_sql("SELECT count(*) FROM queue WHERE iif(?1 IS NOT NULL, name = ?1, TRUE)", queue)[0][0]
|
87
87
|
end
|
88
88
|
|
89
89
|
# return the size of the queue file on disk
|
@@ -116,27 +116,16 @@ class Litequeue
|
|
116
116
|
private
|
117
117
|
|
118
118
|
def create_connection
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
obj.each{|k, s| conn.execute(s)}
|
127
|
-
conn.user_version = v
|
119
|
+
super("#{__dir__}/litequeue.sql.yml") do |conn|
|
120
|
+
conn.wal_autocheckpoint = 10000
|
121
|
+
# check if there is an old database and convert entries to the new format
|
122
|
+
if conn.get_first_value("select count(*) from sqlite_master where name = '_ul_queue_'") == 1
|
123
|
+
conn.transaction(:immediate) do
|
124
|
+
conn.execute("INSERT INTO queue(fire_at, name, value, created_at) SELECT fire_at, queue, value, created_at FROM _ul_queue_")
|
125
|
+
conn.execute("DROP TABLE _ul_queue_")
|
128
126
|
end
|
129
127
|
end
|
130
|
-
end
|
131
|
-
sql["stmts"].each { |k, v| conn.stmts[k.to_sym] = conn.prepare(v) }
|
132
|
-
# check if there is an old database and convert entries to the new format
|
133
|
-
if conn.get_first_value("select count(*) from sqlite_master where name = '_ul_queue_'") == 1
|
134
|
-
conn.transaction(:immediate) do
|
135
|
-
conn.execute("INSERT INTO queue(fire_at, name, value, created_at) SELECT fire_at, queue, value, created_at FROM _ul_queue_")
|
136
|
-
conn.execute("DROP TABLE _ul_queue_")
|
137
|
-
end
|
138
128
|
end
|
139
|
-
conn
|
140
129
|
end
|
141
130
|
|
142
131
|
end
|
@@ -23,7 +23,7 @@ module Litesupport
|
|
23
23
|
elsif ENV["RACK_ENV"]
|
24
24
|
ENV["RACK_ENV"]
|
25
25
|
elsif ENV["APP_ENV"]
|
26
|
-
ENV["
|
26
|
+
ENV["APP_ENV"]
|
27
27
|
else
|
28
28
|
"development"
|
29
29
|
end
|
@@ -99,8 +99,8 @@ module Litesupport
|
|
99
99
|
@@mutex ||= Mutex.new
|
100
100
|
end
|
101
101
|
|
102
|
-
# bold assumption, we will only synchronize threaded code
|
103
|
-
#
|
102
|
+
# bold assumption, we will only synchronize threaded code!
|
103
|
+
# If some code explicitly wants to synchronize a fiber
|
104
104
|
# they must send (true) as a parameter to this method
|
105
105
|
# else it is a no-op for fibers
|
106
106
|
def self.synchronize(fiber_sync = false, &block)
|
@@ -162,21 +162,6 @@ module Litesupport
|
|
162
162
|
|
163
163
|
end
|
164
164
|
|
165
|
-
module Forkable
|
166
|
-
|
167
|
-
def _fork(*args)
|
168
|
-
ppid = Process.pid
|
169
|
-
result = super
|
170
|
-
if Process.pid != ppid
|
171
|
-
# trigger a restart of all connections owned by Litesupport::Pool
|
172
|
-
end
|
173
|
-
result
|
174
|
-
end
|
175
|
-
|
176
|
-
end
|
177
|
-
|
178
|
-
#::Process.singleton_class.prepend(::Litesupport::Forkable)
|
179
|
-
|
180
165
|
class Pool
|
181
166
|
|
182
167
|
def initialize(count, &block)
|
@@ -333,13 +318,18 @@ module Litesupport
|
|
333
318
|
def run_method(method, *args)
|
334
319
|
@conn.acquire{|q| q.send(method, *args)}
|
335
320
|
end
|
321
|
+
|
322
|
+
def run_stmt_method(stmt, method, *args)
|
323
|
+
@conn.acquire{|q| q.stmts[stmt].send(method, *args)}
|
324
|
+
end
|
325
|
+
|
336
326
|
|
337
327
|
def create_pooled_connection(count = 1)
|
338
328
|
Litesupport::Pool.new(1){create_connection}
|
339
329
|
end
|
340
330
|
|
341
331
|
# common db object options
|
342
|
-
def create_connection
|
332
|
+
def create_connection(path_to_sql_file = nil)
|
343
333
|
conn = SQLite3::Database.new(@options[:path])
|
344
334
|
conn.busy_handler{ Litesupport.switch || sleep(rand * 0.002) }
|
345
335
|
conn.journal_mode = "WAL"
|
@@ -349,9 +339,40 @@ module Litesupport
|
|
349
339
|
class << conn
|
350
340
|
attr_reader :stmts
|
351
341
|
end
|
342
|
+
yield conn if block_given?
|
343
|
+
# use the <client>.sql.yml file to define the schema and compile prepared statements
|
344
|
+
unless path_to_sql_file.nil?
|
345
|
+
sql = YAML.load_file(path_to_sql_file)
|
346
|
+
version = conn.get_first_value("PRAGMA user_version")
|
347
|
+
sql["schema"].each_pair do |v, obj|
|
348
|
+
if v > version
|
349
|
+
conn.transaction do
|
350
|
+
obj.each do |k, s|
|
351
|
+
begin
|
352
|
+
conn.execute(s)
|
353
|
+
rescue Exception => e
|
354
|
+
STDERR.puts "Error parsing #{k}"
|
355
|
+
STDERR.puts s
|
356
|
+
raise e
|
357
|
+
end
|
358
|
+
end
|
359
|
+
conn.user_version = v
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
sql["stmts"].each do |k, v|
|
364
|
+
begin
|
365
|
+
conn.stmts[k.to_sym] = conn.prepare(v)
|
366
|
+
rescue Exception => e
|
367
|
+
STDERR.puts "Error parsing #{k}"
|
368
|
+
STDERR.puts v
|
369
|
+
raise e
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
352
373
|
conn
|
353
374
|
end
|
354
|
-
|
375
|
+
|
355
376
|
end
|
356
377
|
|
357
378
|
end
|
data/lib/litestack/version.rb
CHANGED
data/lib/litestack.rb
CHANGED
@@ -16,7 +16,7 @@ require_relative "./railties/rails/commands/dbconsole" if defined? Rails && defi
|
|
16
16
|
require_relative "./active_support/cache/litecache" if defined? ActiveSupport
|
17
17
|
require_relative "./active_job/queue_adapters/litejob_adapter" if defined? ActiveJob
|
18
18
|
require_relative "./action_cable/subscription_adapter/litecable" if defined? ActionCable
|
19
|
-
require_relative "./litestack/railtie" if defined? Rails
|
19
|
+
require_relative "./litestack/railtie" if defined? Rails::Railtie
|
20
20
|
|
21
21
|
module Litestack
|
22
22
|
class NotImplementedError < Exception; end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: litestack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohamed Hassan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -109,12 +109,15 @@ files:
|
|
109
109
|
- README.md
|
110
110
|
- Rakefile
|
111
111
|
- WHYLITESTACK.md
|
112
|
+
- assets/event_page.png
|
113
|
+
- assets/index_page.png
|
112
114
|
- assets/litecable_logo_teal.png
|
113
115
|
- assets/litecache_logo_teal.png
|
114
116
|
- assets/litedb_logo_teal.png
|
115
117
|
- assets/litejob_logo_teal.png
|
116
118
|
- assets/litestack_logo_teal.png
|
117
119
|
- assets/litestack_logo_teal_large.png
|
120
|
+
- assets/topic_page.png
|
118
121
|
- bench/bench.rb
|
119
122
|
- bench/bench_cache_rails.rb
|
120
123
|
- bench/bench_cache_raw.rb
|
@@ -138,6 +141,10 @@ files:
|
|
138
141
|
- lib/litestack/liteboard/views/event.erb
|
139
142
|
- lib/litestack/liteboard/views/index.erb
|
140
143
|
- lib/litestack/liteboard/views/layout.erb
|
144
|
+
- lib/litestack/liteboard/views/litecable.erb
|
145
|
+
- lib/litestack/liteboard/views/litecache.erb
|
146
|
+
- lib/litestack/liteboard/views/litedb.erb
|
147
|
+
- lib/litestack/liteboard/views/litejob.erb
|
141
148
|
- lib/litestack/liteboard/views/topic.erb
|
142
149
|
- lib/litestack/litecable.rb
|
143
150
|
- lib/litestack/litecable.sql.yml
|