logidze 0.11.0 → 1.2.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 +79 -4
- data/LICENSE.txt +1 -1
- data/README.md +305 -102
- data/lib/generators/logidze/fx_helper.rb +17 -0
- data/lib/generators/logidze/inject_sql.rb +18 -0
- data/lib/generators/logidze/install/USAGE +6 -1
- data/lib/generators/logidze/install/functions/logidze_capture_exception.sql +23 -0
- data/lib/generators/logidze/install/functions/logidze_compact_history.sql +38 -0
- data/lib/generators/logidze/install/functions/logidze_filter_keys.sql +27 -0
- data/lib/generators/logidze/install/functions/logidze_logger.sql +203 -0
- data/lib/generators/logidze/install/functions/logidze_snapshot.sql +33 -0
- data/lib/generators/logidze/install/functions/logidze_version.sql +21 -0
- data/lib/generators/logidze/install/install_generator.rb +43 -1
- data/lib/generators/logidze/install/templates/hstore.rb.erb +1 -1
- data/lib/generators/logidze/install/templates/migration.rb.erb +19 -232
- data/lib/generators/logidze/install/templates/migration_fx.rb.erb +41 -0
- data/lib/generators/logidze/model/model_generator.rb +53 -13
- data/lib/generators/logidze/model/templates/migration.rb.erb +57 -36
- data/lib/generators/logidze/model/triggers/logidze.sql +6 -0
- data/lib/logidze.rb +37 -14
- data/lib/logidze/engine.rb +9 -0
- data/lib/logidze/has_logidze.rb +1 -1
- data/lib/logidze/history.rb +2 -11
- data/lib/logidze/ignore_log_data.rb +1 -3
- data/lib/logidze/meta.rb +43 -16
- data/lib/logidze/model.rb +51 -44
- data/lib/logidze/utils/check_pending.rb +57 -0
- data/lib/logidze/utils/function_definitions.rb +49 -0
- data/lib/logidze/utils/pending_migration_error.rb +25 -0
- data/lib/logidze/version.rb +1 -1
- metadata +69 -77
- data/.gitattributes +0 -3
- data/.github/ISSUE_TEMPLATE.md +0 -20
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -29
- data/.gitignore +0 -40
- data/.rubocop.yml +0 -55
- data/.travis.yml +0 -42
- data/Gemfile +0 -15
- data/Rakefile +0 -28
- data/assets/pg_log_data_chart.png +0 -0
- data/bench/performance/README.md +0 -109
- data/bench/performance/diff_bench.rb +0 -38
- data/bench/performance/insert_bench.rb +0 -22
- data/bench/performance/memory_profile.rb +0 -56
- data/bench/performance/setup.rb +0 -315
- data/bench/performance/update_bench.rb +0 -38
- data/bench/triggers/Makefile +0 -56
- data/bench/triggers/Readme.md +0 -58
- data/bench/triggers/bench.sql +0 -6
- data/bench/triggers/hstore_trigger_setup.sql +0 -38
- data/bench/triggers/jsonb_minus_2_setup.sql +0 -47
- data/bench/triggers/jsonb_minus_setup.sql +0 -49
- data/bench/triggers/keys2_trigger_setup.sql +0 -44
- data/bench/triggers/keys_trigger_setup.sql +0 -50
- data/bin/console +0 -8
- data/bin/setup +0 -9
- data/gemfiles/rails42.gemfile +0 -6
- data/gemfiles/rails5.gemfile +0 -6
- data/gemfiles/rails52.gemfile +0 -6
- data/gemfiles/rails6.gemfile +0 -6
- data/gemfiles/railsmaster.gemfile +0 -7
- data/lib/logidze/ignore_log_data/association.rb +0 -11
- data/lib/logidze/ignore_log_data/ignored_columns.rb +0 -46
- data/lib/logidze/migration.rb +0 -20
- data/logidze.gemspec +0 -41
@@ -1,246 +1,33 @@
|
|
1
|
-
class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::
|
2
|
-
require 'logidze/migration'
|
3
|
-
include Logidze::Migration
|
4
|
-
|
1
|
+
class <%= @migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
5
2
|
def up
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
BEGIN
|
10
|
-
EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET logidze.disabled=' || quote_literal('');
|
11
|
-
EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET logidze.meta=' || quote_literal('');
|
12
|
-
END;
|
13
|
-
$$
|
14
|
-
LANGUAGE plpgsql;
|
15
|
-
SQL
|
16
|
-
end
|
17
|
-
|
18
|
-
<% if update? %>
|
19
|
-
execute <<-SQL
|
3
|
+
<%- if update? -%>
|
4
|
+
# Drop legacy functions (<1.0)
|
5
|
+
execute <<~SQL
|
20
6
|
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb);
|
21
7
|
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb);
|
22
8
|
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb, text[]);
|
23
9
|
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb, text[]);
|
10
|
+
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb, timestamp with time zone, text[]);
|
11
|
+
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb, text, text[]);
|
12
|
+
DROP FUNCTION IF EXISTS logidze_exclude_keys(jsonb, VARIADIC text[]);
|
13
|
+
DROP FUNCTION IF EXISTS logidze_compact_history(jsonb);
|
24
14
|
SQL
|
25
|
-
<% end %>
|
26
|
-
|
27
|
-
execute <<-SQL
|
28
|
-
CREATE OR REPLACE FUNCTION logidze_version(v bigint, data jsonb, ts timestamp with time zone, blacklist text[] DEFAULT '{}') RETURNS jsonb AS $body$
|
29
|
-
DECLARE
|
30
|
-
buf jsonb;
|
31
|
-
BEGIN
|
32
|
-
buf := jsonb_build_object(
|
33
|
-
'ts',
|
34
|
-
(extract(epoch from ts) * 1000)::bigint,
|
35
|
-
'v',
|
36
|
-
v,
|
37
|
-
'c',
|
38
|
-
logidze_exclude_keys(data, VARIADIC array_append(blacklist, 'log_data'))
|
39
|
-
);
|
40
|
-
IF coalesce(#{current_setting('logidze.meta')}, '') <> '' THEN
|
41
|
-
buf := jsonb_set(buf, ARRAY['m'], current_setting('logidze.meta')::jsonb);
|
42
|
-
END IF;
|
43
|
-
RETURN buf;
|
44
|
-
END;
|
45
|
-
$body$
|
46
|
-
LANGUAGE plpgsql;
|
47
|
-
|
48
|
-
CREATE OR REPLACE FUNCTION logidze_snapshot(item jsonb, ts_column text, blacklist text[] DEFAULT '{}') RETURNS jsonb AS $body$
|
49
|
-
DECLARE
|
50
|
-
ts timestamp with time zone;
|
51
|
-
BEGIN
|
52
|
-
IF ts_column IS NULL THEN
|
53
|
-
ts := statement_timestamp();
|
54
|
-
ELSE
|
55
|
-
ts := coalesce((item->>ts_column)::timestamp with time zone, statement_timestamp());
|
56
|
-
END IF;
|
57
|
-
return json_build_object(
|
58
|
-
'v', 1,
|
59
|
-
'h', jsonb_build_array(
|
60
|
-
logidze_version(1, item, ts, blacklist)
|
61
|
-
)
|
62
|
-
);
|
63
|
-
END;
|
64
|
-
$body$
|
65
|
-
LANGUAGE plpgsql;
|
66
|
-
|
67
|
-
CREATE OR REPLACE FUNCTION logidze_exclude_keys(obj jsonb, VARIADIC keys text[]) RETURNS jsonb AS $body$
|
68
|
-
DECLARE
|
69
|
-
res jsonb;
|
70
|
-
key text;
|
71
|
-
BEGIN
|
72
|
-
res := obj;
|
73
|
-
FOREACH key IN ARRAY keys
|
74
|
-
LOOP
|
75
|
-
res := res - key;
|
76
|
-
END LOOP;
|
77
|
-
RETURN res;
|
78
|
-
END;
|
79
|
-
$body$
|
80
|
-
LANGUAGE plpgsql;
|
81
|
-
|
82
|
-
CREATE OR REPLACE FUNCTION logidze_compact_history(log_data jsonb) RETURNS jsonb AS $body$
|
83
|
-
DECLARE
|
84
|
-
merged jsonb;
|
85
|
-
BEGIN
|
86
|
-
merged := jsonb_build_object(
|
87
|
-
'ts',
|
88
|
-
log_data#>'{h,1,ts}',
|
89
|
-
'v',
|
90
|
-
log_data#>'{h,1,v}',
|
91
|
-
'c',
|
92
|
-
(log_data#>'{h,0,c}') || (log_data#>'{h,1,c}')
|
93
|
-
);
|
94
|
-
|
95
|
-
IF (log_data#>'{h,1}' ? 'm') THEN
|
96
|
-
merged := jsonb_set(merged, ARRAY['m'], log_data#>'{h,1,m}');
|
97
|
-
END IF;
|
98
|
-
|
99
|
-
return jsonb_set(
|
100
|
-
log_data,
|
101
|
-
'{h}',
|
102
|
-
jsonb_set(
|
103
|
-
log_data->'h',
|
104
|
-
'{1}',
|
105
|
-
merged
|
106
|
-
) - 0
|
107
|
-
);
|
108
|
-
END;
|
109
|
-
$body$
|
110
|
-
LANGUAGE plpgsql;
|
111
|
-
|
112
|
-
CREATE OR REPLACE FUNCTION logidze_logger() RETURNS TRIGGER AS $body$
|
113
|
-
DECLARE
|
114
|
-
changes jsonb;
|
115
|
-
version jsonb;
|
116
|
-
snapshot jsonb;
|
117
|
-
new_v integer;
|
118
|
-
size integer;
|
119
|
-
history_limit integer;
|
120
|
-
debounce_time integer;
|
121
|
-
current_version integer;
|
122
|
-
merged jsonb;
|
123
|
-
iterator integer;
|
124
|
-
item record;
|
125
|
-
columns_blacklist text[];
|
126
|
-
ts timestamp with time zone;
|
127
|
-
ts_column text;
|
128
|
-
BEGIN
|
129
|
-
ts_column := NULLIF(TG_ARGV[1], 'null');
|
130
|
-
columns_blacklist := COALESCE(NULLIF(TG_ARGV[2], 'null'), '{}');
|
131
|
-
|
132
|
-
IF TG_OP = 'INSERT' THEN
|
133
|
-
snapshot = logidze_snapshot(to_jsonb(NEW.*), ts_column, columns_blacklist);
|
134
|
-
|
135
|
-
IF snapshot#>>'{h, -1, c}' != '{}' THEN
|
136
|
-
NEW.log_data := snapshot;
|
137
|
-
END IF;
|
138
|
-
|
139
|
-
ELSIF TG_OP = 'UPDATE' THEN
|
140
|
-
|
141
|
-
IF OLD.log_data is NULL OR OLD.log_data = '{}'::jsonb THEN
|
142
|
-
snapshot = logidze_snapshot(to_jsonb(NEW.*), ts_column, columns_blacklist);
|
143
|
-
IF snapshot#>>'{h, -1, c}' != '{}' THEN
|
144
|
-
NEW.log_data := snapshot;
|
145
|
-
END IF;
|
146
|
-
RETURN NEW;
|
147
|
-
END IF;
|
148
|
-
|
149
|
-
history_limit := NULLIF(TG_ARGV[0], 'null');
|
150
|
-
debounce_time := NULLIF(TG_ARGV[3], 'null');
|
151
|
-
|
152
|
-
current_version := (NEW.log_data->>'v')::int;
|
153
|
-
|
154
|
-
IF ts_column IS NULL THEN
|
155
|
-
ts := statement_timestamp();
|
156
|
-
ELSE
|
157
|
-
ts := (to_jsonb(NEW.*)->>ts_column)::timestamp with time zone;
|
158
|
-
IF ts IS NULL OR ts = (to_jsonb(OLD.*)->>ts_column)::timestamp with time zone THEN
|
159
|
-
ts := statement_timestamp();
|
160
|
-
END IF;
|
161
|
-
END IF;
|
162
|
-
|
163
|
-
IF NEW = OLD THEN
|
164
|
-
RETURN NEW;
|
165
|
-
END IF;
|
166
|
-
|
167
|
-
IF current_version < (NEW.log_data#>>'{h,-1,v}')::int THEN
|
168
|
-
iterator := 0;
|
169
|
-
FOR item in SELECT * FROM jsonb_array_elements(NEW.log_data->'h')
|
170
|
-
LOOP
|
171
|
-
IF (item.value->>'v')::int > current_version THEN
|
172
|
-
NEW.log_data := jsonb_set(
|
173
|
-
NEW.log_data,
|
174
|
-
'{h}',
|
175
|
-
(NEW.log_data->'h') - iterator
|
176
|
-
);
|
177
|
-
END IF;
|
178
|
-
iterator := iterator + 1;
|
179
|
-
END LOOP;
|
180
|
-
END IF;
|
181
|
-
|
182
|
-
changes := hstore_to_jsonb_loose(
|
183
|
-
hstore(NEW.*) - hstore(OLD.*)
|
184
|
-
);
|
185
|
-
|
186
|
-
new_v := (NEW.log_data#>>'{h,-1,v}')::int + 1;
|
187
|
-
|
188
|
-
size := jsonb_array_length(NEW.log_data->'h');
|
189
|
-
version := logidze_version(new_v, changes, ts, columns_blacklist);
|
190
|
-
|
191
|
-
IF version->>'c' = '{}' THEN
|
192
|
-
RETURN NEW;
|
193
|
-
END IF;
|
194
|
-
|
195
|
-
IF (
|
196
|
-
debounce_time IS NOT NULL AND
|
197
|
-
(version->>'ts')::bigint - (NEW.log_data#>'{h,-1,ts}')::text::bigint <= debounce_time
|
198
|
-
) THEN
|
199
|
-
-- merge new version with the previous one
|
200
|
-
new_v := (NEW.log_data#>>'{h,-1,v}')::int;
|
201
|
-
version := logidze_version(new_v, (NEW.log_data#>'{h,-1,c}')::jsonb || changes, ts, columns_blacklist);
|
202
|
-
-- remove the previous version from log
|
203
|
-
NEW.log_data := jsonb_set(
|
204
|
-
NEW.log_data,
|
205
|
-
'{h}',
|
206
|
-
(NEW.log_data->'h') - (size - 1)
|
207
|
-
);
|
208
|
-
END IF;
|
209
|
-
|
210
|
-
NEW.log_data := jsonb_set(
|
211
|
-
NEW.log_data,
|
212
|
-
ARRAY['h', size::text],
|
213
|
-
version,
|
214
|
-
true
|
215
|
-
);
|
216
|
-
|
217
|
-
NEW.log_data := jsonb_set(
|
218
|
-
NEW.log_data,
|
219
|
-
'{v}',
|
220
|
-
to_jsonb(new_v)
|
221
|
-
);
|
222
|
-
|
223
|
-
IF history_limit IS NOT NULL AND history_limit = size THEN
|
224
|
-
NEW.log_data := logidze_compact_history(NEW.log_data);
|
225
|
-
END IF;
|
226
|
-
END IF;
|
227
15
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
16
|
+
<%- end -%>
|
17
|
+
execute <<~SQL
|
18
|
+
<%- function_definitions.each do |f| -%>
|
19
|
+
<%= inject_sql("#{f.name}.sql", indent: 6) %>
|
20
|
+
<%- end -%>
|
232
21
|
SQL
|
233
22
|
end
|
234
23
|
|
235
24
|
def down
|
236
|
-
|
237
|
-
execute
|
238
|
-
|
239
|
-
DROP FUNCTION
|
240
|
-
|
241
|
-
DROP FUNCTION logidze_snapshot(jsonb, text, text[]) CASCADE;
|
242
|
-
DROP FUNCTION logidze_logger() CASCADE;
|
25
|
+
<%- unless update? -%>
|
26
|
+
execute <<~SQL
|
27
|
+
<%- function_definitions.each do |f| -%>
|
28
|
+
DROP FUNCTION IF EXISTS <%= f.name %>(<%= f.signature %>) CASCADE;
|
29
|
+
<%- end -%>
|
243
30
|
SQL
|
244
|
-
|
31
|
+
<%- end -%>
|
245
32
|
end
|
246
33
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class <%= @migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
|
+
def change
|
3
|
+
<%- if update? -%>
|
4
|
+
reversible do |dir|
|
5
|
+
dir.up do
|
6
|
+
# Drop legacy functions (<1.0)
|
7
|
+
execute <<~SQL
|
8
|
+
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb);
|
9
|
+
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb);
|
10
|
+
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb, text[]);
|
11
|
+
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb, text[]);
|
12
|
+
DROP FUNCTION IF EXISTS logidze_version(bigint, jsonb, timestamp with time zone, text[]);
|
13
|
+
DROP FUNCTION IF EXISTS logidze_snapshot(jsonb, text, text[]);
|
14
|
+
DROP FUNCTION IF EXISTS logidze_exclude_keys(jsonb, VARIADIC text[]);
|
15
|
+
DROP FUNCTION IF EXISTS logidze_compact_history(jsonb);
|
16
|
+
SQL
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
<%- end -%>
|
21
|
+
<%- function_definitions.each do |f| -%>
|
22
|
+
<%- previous_version = previous_version_for(f.name) -%>
|
23
|
+
<%- if previous_version -%>
|
24
|
+
<%- if previous_version != f.version -%>
|
25
|
+
update_function :<%= f.name %>, version: <%= f.version %>, revert_to_version: <%= previous_version %>
|
26
|
+
<%- end -%>
|
27
|
+
<%- else -%>
|
28
|
+
reversible do |dir|
|
29
|
+
dir.up do
|
30
|
+
create_function :<%= f.name %>, version: <%= f.version %>
|
31
|
+
end
|
32
|
+
|
33
|
+
dir.down do
|
34
|
+
execute "DROP FUNCTION IF EXISTS <%= f.name %>(<%= f.signature %>) CASCADE"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
<%- end -%>
|
39
|
+
<%- end -%>
|
40
|
+
end
|
41
|
+
end
|
@@ -2,11 +2,19 @@
|
|
2
2
|
|
3
3
|
require "rails/generators"
|
4
4
|
require "rails/generators/active_record/migration/migration_generator"
|
5
|
+
require_relative "../inject_sql"
|
6
|
+
require_relative "../fx_helper"
|
7
|
+
|
8
|
+
using RubyNext
|
5
9
|
|
6
10
|
module Logidze
|
7
11
|
module Generators
|
8
12
|
class ModelGenerator < ::ActiveRecord::Generators::Base # :nodoc:
|
13
|
+
include InjectSql
|
14
|
+
include FxHelper
|
15
|
+
|
9
16
|
source_root File.expand_path("templates", __dir__)
|
17
|
+
source_paths << File.expand_path("triggers", __dir__)
|
10
18
|
|
11
19
|
class_option :limit, type: :numeric, optional: true, desc: "Specify history size limit"
|
12
20
|
|
@@ -21,23 +29,31 @@ module Logidze
|
|
21
29
|
|
22
30
|
class_option :path, type: :string, optional: true, desc: "Specify path to the model file"
|
23
31
|
|
24
|
-
class_option :
|
25
|
-
class_option :
|
32
|
+
class_option :except, type: :array, optional: true
|
33
|
+
class_option :only, type: :array, optional: true
|
26
34
|
|
27
35
|
class_option :timestamp_column, type: :string, optional: true,
|
28
36
|
desc: "Specify timestamp column"
|
29
37
|
|
38
|
+
class_option :name, type: :string, optional: true, desc: "Migration name"
|
39
|
+
|
30
40
|
class_option :update, type: :boolean, optional: true,
|
31
41
|
desc: "Define whether this is an update migration"
|
32
42
|
|
33
43
|
def generate_migration
|
34
|
-
if options[:
|
35
|
-
warn "Use only one: --
|
44
|
+
if options[:except] && options[:only]
|
45
|
+
warn "Use only one: --only or --except"
|
36
46
|
exit(1)
|
37
47
|
end
|
38
48
|
migration_template "migration.rb.erb", "db/migrate/#{migration_file_name}"
|
39
49
|
end
|
40
50
|
|
51
|
+
def generate_fx_trigger
|
52
|
+
return unless fx?
|
53
|
+
|
54
|
+
template "logidze.sql", "db/triggers/logidze_on_#{table_name}_v#{next_version.to_s.rjust(2, "0")}.sql"
|
55
|
+
end
|
56
|
+
|
41
57
|
def inject_logidze_to_model
|
42
58
|
return if update?
|
43
59
|
|
@@ -48,6 +64,8 @@ module Logidze
|
|
48
64
|
|
49
65
|
no_tasks do
|
50
66
|
def migration_name
|
67
|
+
return options[:name] if options[:name].present?
|
68
|
+
|
51
69
|
if update?
|
52
70
|
"update_logidze_for_#{plural_table_name}"
|
53
71
|
else
|
@@ -75,14 +93,13 @@ module Logidze
|
|
75
93
|
options[:update]
|
76
94
|
end
|
77
95
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
else
|
82
|
-
class_name.constantize.column_names - options[:whitelist]
|
83
|
-
end
|
96
|
+
def filtered_columns
|
97
|
+
format_pgsql_array(options[:only] || options[:except])
|
98
|
+
end
|
84
99
|
|
85
|
-
|
100
|
+
def include_columns
|
101
|
+
return unless options[:only] || options[:except]
|
102
|
+
options[:only].present?
|
86
103
|
end
|
87
104
|
|
88
105
|
def timestamp_column
|
@@ -96,12 +113,35 @@ module Logidze
|
|
96
113
|
options[:debounce_time]
|
97
114
|
end
|
98
115
|
|
116
|
+
def previous_version
|
117
|
+
@previous_version ||= all_triggers.filter_map { |path| Regexp.last_match[1].to_i if path =~ %r{logidze_on_#{table_name}_v(\d+).sql} }.max
|
118
|
+
end
|
119
|
+
|
120
|
+
def next_version
|
121
|
+
previous_version&.next || 1
|
122
|
+
end
|
123
|
+
|
124
|
+
def all_triggers
|
125
|
+
@all_triggers ||=
|
126
|
+
begin
|
127
|
+
res = nil
|
128
|
+
in_root do
|
129
|
+
res = if File.directory?("db/triggers")
|
130
|
+
Dir.entries("db/triggers")
|
131
|
+
else
|
132
|
+
[]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
res
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
99
139
|
def logidze_logger_parameters
|
100
|
-
format_pgsql_args(limit, timestamp_column,
|
140
|
+
format_pgsql_args(limit, timestamp_column, filtered_columns, include_columns, debounce_time)
|
101
141
|
end
|
102
142
|
|
103
143
|
def logidze_snapshot_parameters
|
104
|
-
format_pgsql_args("to_jsonb(t)", timestamp_column,
|
144
|
+
format_pgsql_args("to_jsonb(t)", timestamp_column, filtered_columns, include_columns)
|
105
145
|
end
|
106
146
|
|
107
147
|
def format_pgsql_array(ruby_array)
|
@@ -1,43 +1,64 @@
|
|
1
|
-
class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
def up
|
6
|
-
<% if update? %>
|
7
|
-
execute "DROP TRIGGER logidze_on_<%= table_name %> on <%= table_name %>;"
|
8
|
-
<% elsif !only_trigger? %>
|
1
|
+
class <%= @migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
|
+
def change
|
3
|
+
<%- unless update? || only_trigger? -%>
|
9
4
|
add_column :<%= table_name %>, :log_data, :jsonb
|
10
|
-
|
5
|
+
<%- end -%>
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
<%- if fx? -%>
|
8
|
+
<%- if previous_version -%>
|
9
|
+
update_trigger :logidze_on_<%= table_name %>, on: :<%= table_name %>, version: <%= next_version %>, revert_to_version: <%= previous_version %>
|
10
|
+
<%- else -%>
|
11
|
+
reversible do |dir|
|
12
|
+
dir.up do
|
13
|
+
<%- if update? -%>
|
14
|
+
# Drop legacy trigger if any (<1.0)
|
15
|
+
execute "DROP TRIGGER IF EXISTS logidze_on_<%= table_name %> on <%= table_name %>;"
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
<%- end -%>
|
18
|
+
create_trigger :logidze_on_<%= table_name %>, on: :<%= table_name %>
|
19
|
+
end
|
20
|
+
|
21
|
+
dir.down do
|
22
|
+
execute "DROP TRIGGER IF EXISTS logidze_on_<%= table_name %> on <%= table_name %>;"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
<%- end -%>
|
26
|
+
<%- else -%>
|
27
|
+
reversible do |dir|
|
28
|
+
dir.up do
|
29
|
+
<%- if update? -%>
|
30
|
+
execute "DROP TRIGGER IF EXISTS logidze_on_<%= table_name %> on <%= table_name %>;"
|
31
|
+
|
32
|
+
<%- end -%>
|
33
|
+
execute <<~SQL
|
34
|
+
<%= inject_sql("logidze.sql", indent: 10) %>
|
35
|
+
SQL
|
36
|
+
end
|
26
37
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
dir.down do
|
39
|
+
<%- if update? -%>
|
40
|
+
# NOTE: We have no idea on how to revert the migration
|
41
|
+
# ('cause we don't know the previous trigger params),
|
42
|
+
# but you can do that on your own.
|
43
|
+
#
|
44
|
+
# Uncomment this line if you want to raise an error.
|
45
|
+
# raise ActiveRecord::IrreversibleMigration
|
46
|
+
<%- else -%>
|
47
|
+
execute "DROP TRIGGER IF EXISTS logidze_on_<%= table_name %> on <%= table_name %>;"
|
48
|
+
<%- end -%>
|
49
|
+
end
|
50
|
+
end
|
51
|
+
<%- end -%>
|
52
|
+
<%- if backfill? -%>
|
37
53
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
54
|
+
reversible do |dir|
|
55
|
+
dir.up do
|
56
|
+
execute <<~SQL
|
57
|
+
UPDATE <%= table_name %> as t
|
58
|
+
SET log_data = logidze_snapshot(<%= logidze_snapshot_parameters %>);
|
59
|
+
SQL
|
60
|
+
end
|
61
|
+
end
|
62
|
+
<%- end -%>
|
42
63
|
end
|
43
64
|
end
|