@@ -13,6 +13,11 @@ def initialize(type = nil)
13
13
14
14
DAY = 24 * 60 * 60
15
15
16
+ MAX_VALUE = {
17
+ 'integer' => 2_147_483_647 ,
18
+ 'bigint' => 9_223_372_036_854_775_807
19
+ } . freeze
20
+
16
21
def initialize ( logger : nil , models : nil , days_count : 60 , signalizer : nil )
17
22
@logger = logger || ActiveRecord ::Base . logger
18
23
@models = models || ActiveRecord ::Base . descendants
@@ -25,16 +30,17 @@ def analyse!
25
30
model = models . first
26
31
pk = model . columns . select { |c | c . name == model . primary_key } . first
27
32
next if model . last . nil?
28
- if overflow_soon? ( pk , model )
29
- signalize ( table , model . last . public_send ( pk . name ) , max_value ( pk . sql_type ) )
33
+ max = MAX_VALUE . fetch ( pk . sql_type ) { |type | raise UnsupportedType , type }
34
+ if overflow_soon? ( max , model )
35
+ signalize ( table , model . last . public_send ( pk . name ) , max )
30
36
end
31
37
end
32
38
end
33
39
34
40
private
35
41
36
- def overflow_soon? ( pk , model )
37
- ( max_value ( pk . sql_type ) - model . last . id ) / avg ( model ) <= @days_count
42
+ def overflow_soon? ( max , model )
43
+ ( max - model . last . id ) / avg ( model ) <= @days_count
38
44
end
39
45
40
46
def avg ( model )
@@ -47,17 +53,6 @@ def avg(model)
47
53
week_records . reduce ( :+ ) / week_records . keep_if { |v | v > 0 } . size
48
54
end
49
55
50
- def max_value ( type )
51
- case type
52
- when 'integer'
53
- 2_147_483_647
54
- when 'bigint'
55
- 9_223_372_036_854_775_807
56
- else
57
- raise UnsupportedType , type
58
- end
59
- end
60
-
61
56
def signalize ( table , current_value , max_value )
62
57
if current_value == max_value
63
58
msg = "Primary key in table #{ table } overflowed! #{ current_value } from #{ max_value } "
0 commit comments