breathing 0.0.7 → 0.0.8
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/breathing.gemspec +2 -2
- data/lib/breathing/excel.rb +0 -1
- data/lib/breathing/installer.rb +14 -19
- data/lib/breathing/trigger.rb +49 -45
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61e525b923beadee13acfa8b5dc2708b88a3d4e4add63ea910d4ee3fd67d42e4
|
4
|
+
data.tar.gz: 4ab65c2f8a026145dc121641922204bcd373f3ef1f379ced10b6575f1229e0a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c41a580a29c80ffeae3318a71153a6c6004a6a5f17bd02db91ecf3dbb8687dba7dd36318f5d3abbe4c86912a4103b4592aa9f6f4da446187deee072eaf84bccb
|
7
|
+
data.tar.gz: 5ffc9e9e41a1fa92ed44503b2df61dd6306fb2acff8ca390fc024eaa9468a1f65953d1de3c982e7d5a6e1b18f17a950f2c76075156a7af960ff8d84323d5c124
|
data/breathing.gemspec
CHANGED
@@ -2,7 +2,7 @@ $:.push File.expand_path('lib', __dir__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'breathing'
|
5
|
-
s.version = '0.0.
|
5
|
+
s.version = '0.0.8'
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ['Akira Kusumoto']
|
8
8
|
s.email = ['akirakusumo10@gmail.com']
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
s.add_runtime_dependency 'thor'
|
22
22
|
|
23
|
-
s.add_dependency 'activerecord', ['>=
|
23
|
+
s.add_dependency 'activerecord', ['>= 6.0.0']
|
24
24
|
s.add_dependency 'hairtrigger'
|
25
25
|
s.add_dependency 'mysql2'
|
26
26
|
s.add_dependency 'pg'
|
data/lib/breathing/excel.rb
CHANGED
@@ -40,7 +40,6 @@ module Breathing
|
|
40
40
|
header_color = 'ddedf3' # blue
|
41
41
|
row.data_attributes.keys.each.with_index do |header_column, column_index|
|
42
42
|
cell = sheet.add_cell(0, column_index, header_column)
|
43
|
-
cell.change_font_bold(true)
|
44
43
|
cell.change_fill(header_color)
|
45
44
|
|
46
45
|
column_widths << header_column.size
|
data/lib/breathing/installer.rb
CHANGED
@@ -8,9 +8,9 @@ module Breathing
|
|
8
8
|
|
9
9
|
class Installer
|
10
10
|
def install
|
11
|
-
raise Breathing::UnsupportedError, "Version MySQL 5.6 is not supported." unless
|
11
|
+
raise Breathing::UnsupportedError, "Version MySQL 5.6 is not supported." unless database_supported_version?
|
12
12
|
|
13
|
-
create_log_table
|
13
|
+
create_log_table
|
14
14
|
|
15
15
|
models.each do |model|
|
16
16
|
column_names = model.columns.map(&:name)
|
@@ -21,14 +21,13 @@ module Breathing
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def uninstall
|
24
|
-
drop_log_table
|
25
|
-
|
24
|
+
drop_log_table
|
26
25
|
models.each { |model| Breathing::Trigger.new(model, log_table_name).drop }
|
27
26
|
end
|
28
27
|
|
29
28
|
private
|
30
29
|
|
31
|
-
def
|
30
|
+
def database_supported_version?
|
32
31
|
connection = ActiveRecord::Base.connection
|
33
32
|
connection.adapter_name == "PostgreSQL" || (connection.adapter_name == 'Mysql2' && connection.raw_connection.info[:version].to_f >= 5.7)
|
34
33
|
end
|
@@ -39,26 +38,22 @@ module Breathing
|
|
39
38
|
|
40
39
|
def create_log_table(table_name: log_table_name)
|
41
40
|
ActiveRecord::Schema.define version: 0 do
|
42
|
-
create_table table_name,
|
43
|
-
t.
|
44
|
-
t.string
|
45
|
-
t.string
|
46
|
-
t.
|
47
|
-
t.json
|
48
|
-
t.
|
41
|
+
create_table table_name, if_not_exists: true do |t|
|
42
|
+
t.datetime :created_at, null: false, index: true
|
43
|
+
t.string :action, null: false
|
44
|
+
t.string :table_name, null: false
|
45
|
+
t.string :transaction_id, null: false
|
46
|
+
t.json :before_data, null: false
|
47
|
+
t.json :after_data, null: false
|
48
|
+
|
49
49
|
t.index %w[table_name transaction_id]
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
def drop_log_table
|
55
|
-
|
56
|
-
|
57
|
-
ActiveRecord::Base.connection.execute(sql)
|
58
|
-
end
|
59
|
-
|
60
|
-
def log_table_exists?
|
61
|
-
ActiveRecord::Base.connection.table_exists?(log_table_name)
|
55
|
+
puts "DROP TABLE #{log_table_name}"
|
56
|
+
ActiveRecord::Base.connection.drop_table(log_table_name, if_exists: true)
|
62
57
|
end
|
63
58
|
|
64
59
|
def models
|
data/lib/breathing/trigger.rb
CHANGED
@@ -11,59 +11,25 @@ module Breathing
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def create
|
14
|
-
|
15
|
-
|
16
|
-
unless exists?(trigger_name)
|
17
|
-
puts "CREATE TRIGGER #{trigger_name}"
|
14
|
+
exists_trigger_names = ActiveRecord::Base.connection.triggers.keys
|
18
15
|
|
19
|
-
|
20
|
-
|
21
|
-
INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
|
22
|
-
VALUES ('INSERT', '#{model.table_name}', NEW.id,
|
23
|
-
'{}',
|
24
|
-
#{row_to_json(model.columns, 'NEW')},
|
25
|
-
CURRENT_TIMESTAMP);
|
26
|
-
SQL
|
27
|
-
end
|
28
|
-
end
|
16
|
+
trigger_name = "#{log_table_name}_insert_#{model.table_name}"
|
17
|
+
create_insert_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
|
29
18
|
|
30
19
|
trigger_name = "#{log_table_name}_update_#{model.table_name}"
|
31
|
-
|
32
|
-
puts "CREATE TRIGGER #{trigger_name}"
|
33
|
-
|
34
|
-
ActiveRecord::Base.connection.create_trigger(trigger_name).on(model.table_name).before(:update).of(:updated_at) do
|
35
|
-
<<-SQL
|
36
|
-
INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
|
37
|
-
VALUES ('UPDATE', '#{model.table_name}', NEW.id,
|
38
|
-
#{row_to_json(model.columns, 'OLD')},
|
39
|
-
#{row_to_json(model.columns, 'NEW')},
|
40
|
-
CURRENT_TIMESTAMP);
|
41
|
-
SQL
|
42
|
-
end
|
43
|
-
end
|
20
|
+
create_update_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
|
44
21
|
|
45
22
|
trigger_name = "#{log_table_name}_delete_#{model.table_name}"
|
46
|
-
|
47
|
-
puts "CREATE TRIGGER #{trigger_name}"
|
48
|
-
ActiveRecord::Base.connection.create_trigger(trigger_name).on(model.table_name).after(:delete) do
|
49
|
-
<<-SQL
|
50
|
-
INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
|
51
|
-
VALUES ('DELETE', '#{model.table_name}', OLD.id,
|
52
|
-
#{row_to_json(model.columns, 'OLD')},
|
53
|
-
'{}',
|
54
|
-
CURRENT_TIMESTAMP);
|
55
|
-
SQL
|
56
|
-
end
|
57
|
-
end
|
23
|
+
create_delete_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
|
58
24
|
end
|
59
25
|
|
60
26
|
def drop
|
61
|
-
%w[insert update delete].
|
62
|
-
trigger_name = "#{log_table_name}_#{action}_#{model.table_name}"
|
27
|
+
trigger_names = %w[insert update delete].map { |action| "#{log_table_name}_#{action}_#{model.table_name}" }
|
63
28
|
|
29
|
+
trigger_names.each do |trigger_name|
|
64
30
|
begin
|
65
31
|
sql = "DROP TRIGGER IF EXISTS #{trigger_name}"
|
66
|
-
if
|
32
|
+
if postgresql?
|
67
33
|
sql << " ON #{model.table_name} CASCADE;"
|
68
34
|
sql << " DROP FUNCTION IF EXISTS #{trigger_name} CASCADE;"
|
69
35
|
end
|
@@ -77,12 +43,50 @@ module Breathing
|
|
77
43
|
|
78
44
|
private
|
79
45
|
|
80
|
-
def
|
81
|
-
ActiveRecord::Base.connection.
|
46
|
+
def postgresql?
|
47
|
+
ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_trigger(name)
|
51
|
+
puts "CREATE TRIGGER #{name}"
|
52
|
+
ActiveRecord::Base.connection.create_trigger(name) # hairtrigger gem
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_insert_trigger(trigger_name, model)
|
56
|
+
create_trigger(trigger_name).on(model.table_name).after(:insert) do
|
57
|
+
<<-SQL
|
58
|
+
INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
|
59
|
+
VALUES (CURRENT_TIMESTAMP, 'INSERT', '#{model.table_name}', NEW.id,
|
60
|
+
'{}',
|
61
|
+
#{row_to_json(model.columns, 'NEW')});
|
62
|
+
SQL
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_update_trigger(trigger_name, model)
|
67
|
+
create_trigger(trigger_name).on(model.table_name).before(:update).of(:updated_at) do
|
68
|
+
<<-SQL
|
69
|
+
INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
|
70
|
+
VALUES (CURRENT_TIMESTAMP, 'UPDATE', '#{model.table_name}', NEW.id,
|
71
|
+
#{row_to_json(model.columns, 'OLD')},
|
72
|
+
#{row_to_json(model.columns, 'NEW')});
|
73
|
+
SQL
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_delete_trigger(trigger_name, model)
|
78
|
+
create_trigger(trigger_name).on(model.table_name).after(:delete) do
|
79
|
+
<<-SQL
|
80
|
+
INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
|
81
|
+
VALUES (CURRENT_TIMESTAMP, 'DELETE', '#{model.table_name}', OLD.id,
|
82
|
+
#{row_to_json(model.columns, 'OLD')},
|
83
|
+
'{}');
|
84
|
+
SQL
|
85
|
+
end
|
82
86
|
end
|
83
87
|
|
84
88
|
def row_to_json(columns, state)
|
85
|
-
if
|
89
|
+
if postgresql?
|
86
90
|
"row_to_json(#{state}.*)"
|
87
91
|
else
|
88
92
|
json_object_values = columns.each.with_object([]) do |column, array|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: breathing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akira Kusumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 6.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 6.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: hairtrigger
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|