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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.md +305 -102
  5. data/lib/generators/logidze/fx_helper.rb +17 -0
  6. data/lib/generators/logidze/inject_sql.rb +18 -0
  7. data/lib/generators/logidze/install/USAGE +6 -1
  8. data/lib/generators/logidze/install/functions/logidze_capture_exception.sql +23 -0
  9. data/lib/generators/logidze/install/functions/logidze_compact_history.sql +38 -0
  10. data/lib/generators/logidze/install/functions/logidze_filter_keys.sql +27 -0
  11. data/lib/generators/logidze/install/functions/logidze_logger.sql +203 -0
  12. data/lib/generators/logidze/install/functions/logidze_snapshot.sql +33 -0
  13. data/lib/generators/logidze/install/functions/logidze_version.sql +21 -0
  14. data/lib/generators/logidze/install/install_generator.rb +43 -1
  15. data/lib/generators/logidze/install/templates/hstore.rb.erb +1 -1
  16. data/lib/generators/logidze/install/templates/migration.rb.erb +19 -232
  17. data/lib/generators/logidze/install/templates/migration_fx.rb.erb +41 -0
  18. data/lib/generators/logidze/model/model_generator.rb +53 -13
  19. data/lib/generators/logidze/model/templates/migration.rb.erb +57 -36
  20. data/lib/generators/logidze/model/triggers/logidze.sql +6 -0
  21. data/lib/logidze.rb +37 -14
  22. data/lib/logidze/engine.rb +9 -0
  23. data/lib/logidze/has_logidze.rb +1 -1
  24. data/lib/logidze/history.rb +2 -11
  25. data/lib/logidze/ignore_log_data.rb +1 -3
  26. data/lib/logidze/meta.rb +43 -16
  27. data/lib/logidze/model.rb +51 -44
  28. data/lib/logidze/utils/check_pending.rb +57 -0
  29. data/lib/logidze/utils/function_definitions.rb +49 -0
  30. data/lib/logidze/utils/pending_migration_error.rb +25 -0
  31. data/lib/logidze/version.rb +1 -1
  32. metadata +69 -77
  33. data/.gitattributes +0 -3
  34. data/.github/ISSUE_TEMPLATE.md +0 -20
  35. data/.github/PULL_REQUEST_TEMPLATE.md +0 -29
  36. data/.gitignore +0 -40
  37. data/.rubocop.yml +0 -55
  38. data/.travis.yml +0 -42
  39. data/Gemfile +0 -15
  40. data/Rakefile +0 -28
  41. data/assets/pg_log_data_chart.png +0 -0
  42. data/bench/performance/README.md +0 -109
  43. data/bench/performance/diff_bench.rb +0 -38
  44. data/bench/performance/insert_bench.rb +0 -22
  45. data/bench/performance/memory_profile.rb +0 -56
  46. data/bench/performance/setup.rb +0 -315
  47. data/bench/performance/update_bench.rb +0 -38
  48. data/bench/triggers/Makefile +0 -56
  49. data/bench/triggers/Readme.md +0 -58
  50. data/bench/triggers/bench.sql +0 -6
  51. data/bench/triggers/hstore_trigger_setup.sql +0 -38
  52. data/bench/triggers/jsonb_minus_2_setup.sql +0 -47
  53. data/bench/triggers/jsonb_minus_setup.sql +0 -49
  54. data/bench/triggers/keys2_trigger_setup.sql +0 -44
  55. data/bench/triggers/keys_trigger_setup.sql +0 -50
  56. data/bin/console +0 -8
  57. data/bin/setup +0 -9
  58. data/gemfiles/rails42.gemfile +0 -6
  59. data/gemfiles/rails5.gemfile +0 -6
  60. data/gemfiles/rails52.gemfile +0 -6
  61. data/gemfiles/rails6.gemfile +0 -6
  62. data/gemfiles/railsmaster.gemfile +0 -7
  63. data/lib/logidze/ignore_log_data/association.rb +0 -11
  64. data/lib/logidze/ignore_log_data/ignored_columns.rb +0 -46
  65. data/lib/logidze/migration.rb +0 -20
  66. data/logidze.gemspec +0 -41
@@ -1,4 +1,4 @@
1
- class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VERSION::MAJOR < 5 ? '' : '[5.0]' %>
1
+ class <%= @migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def change
3
3
  enable_extension :hstore
4
4
  end
@@ -1,246 +1,33 @@
1
- class <%= @migration_class_name %> < ActiveRecord::Migration<%= ActiveRecord::VERSION::MAJOR < 5 ? '' : '[5.0]' %>
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
- unless current_setting_missing_supported?
7
- execute <<-SQL
8
- DO $$
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
- return NEW;
229
- END;
230
- $body$
231
- LANGUAGE plpgsql;
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
- <% unless update? %>
237
- execute <<-SQL
238
- DROP FUNCTION logidze_version(bigint, jsonb, timestamp with time zone, text[]) CASCADE;
239
- DROP FUNCTION logidze_exclude_keys(jsonb, text[]) CASCADE;
240
- DROP FUNCTION logidze_compact_history(jsonb) CASCADE;
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
- <% end %>
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 :blacklist, type: :array, optional: true
25
- class_option :whitelist, type: :array, optional: true
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[:blacklist] && options[:whitelist]
35
- warn "Use only one: --whitelist or --blacklist"
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 columns_blacklist
79
- array = if !options[:whitelist]
80
- options[:blacklist]
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
- format_pgsql_array(array)
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, columns_blacklist, debounce_time)
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, columns_blacklist)
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::VERSION::MAJOR < 5 ? '' : '[5.0]' %>
2
- require 'logidze/migration'
3
- include Logidze::Migration
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
- <% end %>
5
+ <%- end -%>
11
6
 
12
- execute <<-SQL
13
- CREATE TRIGGER logidze_on_<%= table_name %>
14
- BEFORE UPDATE OR INSERT ON <%= table_name %> FOR EACH ROW
15
- WHEN (coalesce(#{current_setting('logidze.disabled')}, '') <> 'on')
16
- EXECUTE PROCEDURE logidze_logger(<%= logidze_logger_parameters %>);
17
- SQL
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
- <% if backfill? %>
20
- execute <<-SQL
21
- UPDATE <%= table_name %> as t
22
- SET log_data = logidze_snapshot(<%= logidze_snapshot_parameters %>);
23
- SQL
24
- <% end %>
25
- end
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
- def down
28
- <% if update? %>
29
- # NOTE: We have no idea on how to revert the migration
30
- # ('cause we don't know the previous trigger params),
31
- # but you can do that on your own.
32
- #
33
- # Uncomment this line if you want to raise an error.
34
- # raise ActiveRecord::IrreversibleMigration
35
- <% else %>
36
- execute "DROP TRIGGER IF EXISTS logidze_on_<%= table_name %> on <%= table_name %>;"
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
- <% if !only_trigger? %>
39
- remove_column :<%= table_name %>, :log_data
40
- <% end %>
41
- <% end %>
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