pgtrigger 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 69d91b5eccbc5a5ff31f816b10487d23ad475ed0
4
- data.tar.gz: d4d24a6f3cc99497eb1e9e8bef4a21f01a68e956
3
+ metadata.gz: 9a6a196d78d94e5029eff17448fa0c30378168af
4
+ data.tar.gz: cd8bff0580bc33893b9fc9fdee0990b4e0482b07
5
5
  SHA512:
6
- metadata.gz: f2db1dfc61a3088e41f0d0eea0c0f53ba916900e0a4750b674c39ebad2dc007822837c6fb61c540e56718b3effd4feac23ec2ef8316659a3d2c75a345ff35641
7
- data.tar.gz: 301c5228860337cffe2591725173eb58578671a332323d9e0f29c86eef71cc620ab3e06e454e92be376e37cb1f5c8f606917edde8c2d1285fc21d99a0f364392
6
+ metadata.gz: a707b1ffdd3383ad6d9fa3b780fdce7f05ddd3681bea2a3421163607aab91d2615db58ed62b330aef3c6a0cd37b049b149ac7048a4036a16a4d6d0a0aed4a84e
7
+ data.tar.gz: 04faca13c437e3ea95e010b67564cb951dc5e3073dcbd229bf8d780e9a9b43c203d2b6d314c09fd806be69abefca8743a3cd6495de256aeacfbe742fb95e4d61
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+
14
+ /pgtrigger-*.gem
data/README.md CHANGED
@@ -15,7 +15,7 @@ gem 'pgtrigger'
15
15
 
16
16
  And then execute:
17
17
 
18
- $ bundle
18
+ $ bundle install
19
19
 
20
20
  Or install it yourself as:
21
21
 
@@ -28,9 +28,11 @@ Create a migration like this
28
28
  ```ruby
29
29
  class AddTriggerToSomeTable < ActiveRecord::Migration[5.1]
30
30
  def up
31
- create_trigger(:table_name, :increase_order, before: [:insert]) do
31
+ create_trigger(:table_name, :increase_order, before: [:insert, :update], declare: {var_1: "text := 'test'", var_2: :integer}) do
32
32
  <<-TRIGGERSQL
33
- NEW."order" = (
33
+ var_2 := -1
34
+
35
+ NEW."order" := (
34
36
  SELECT COALESCE(MAX("order"), 0) +1
35
37
  FROM table_name
36
38
  );
@@ -48,8 +50,9 @@ end
48
50
 
49
51
  The create_trigger method, the first and second parameters are about table and name of trigger respectively.
50
52
  The third params can be hashes ```before:``` or ```after:```, passing string or array to indicate what event this trigger it will be executed.
53
+ The param ```declare:``` is used to declare variables
51
54
 
52
- Yet is necessary to specify the down method, otherwise the trigger cannot be removed when execute migration rollback.
55
+ **NOTE:** Yet is necessary to specify the down method, otherwise the trigger cannot be removed when execute migration rollback.
53
56
 
54
57
  ## Development
55
58
 
@@ -1,16 +1,21 @@
1
1
  module ActiveRecord
2
2
  class Migration
3
- def create_trigger(table_name, trigger_name, after: nil, before: nil)
3
+ def create_trigger(table_name, trigger_name, after: nil, before: nil, declare: nil)
4
4
  raise "Not defined after or before for create_trigger" unless after || before
5
5
  raise "Define only on after or before" if after && before
6
6
 
7
7
  trigger_name = Pgtrigger::Utils.build_trigger_name(table_name, trigger_name)
8
8
 
9
+ if declare
10
+ declare = "DECLARE \n\t\t#{declare.map{|var| var.to_a.join(" ")}.join(";\n\t\t")};"
11
+ end
12
+
9
13
  execute(<<-TRIGGERSQL
10
14
  CREATE OR REPLACE FUNCTION #{trigger_name}_func()
11
15
  RETURNS trigger
12
16
  LANGUAGE plpgsql
13
17
  AS $function$
18
+ #{declare}
14
19
  BEGIN
15
20
  #{yield}
16
21
  END;
@@ -23,12 +23,18 @@ module ActiveRecord
23
23
  table_name = trigger["event_object_table"]
24
24
  trigger_name = trigger["trigger_name"].gsub("_#{table_name}_trigger", '')
25
25
 
26
- after_or_before = "#{trigger['action_timing'].downcase}: \"#{trigger['event_manipulation']}\""
26
+ event_manipulation = discovery_event(trigger['trigger_name']).to_json
27
+ event_manipulation = "#{trigger['action_timing'].downcase}: #{event_manipulation}"
28
+
29
+ procedure = discovery_trigger_method(table_name, trigger_name)
30
+
31
+ declare = parse_trigger_declarations(procedure["definition"])
32
+ declare = ", declare: #{declare}" if declare
27
33
 
28
34
  triggers << "\n"
29
- triggers << "\tcreate_trigger \"#{table_name}\", \"#{trigger_name}\", #{after_or_before} do\n"
35
+ triggers << "\tcreate_trigger \"#{table_name}\", \"#{trigger_name}\", #{event_manipulation} #{declare} do\n"
30
36
  triggers << "<<-TRIGGERBODY\n"
31
- triggers << parse_trigger_body(table_name, trigger_name)
37
+ triggers << parse_trigger_body(procedure["definition"])
32
38
  triggers << "\nTRIGGERBODY\n"
33
39
  triggers << "\tend # create_trigger"
34
40
  triggers << "\n"
@@ -39,19 +45,40 @@ module ActiveRecord
39
45
 
40
46
  def discovery_triggers
41
47
  sql = <<-DETECTTRIGGER
42
- SELECT * FROM information_schema.triggers
48
+ SELECT DISTINCT trigger_name, event_object_table, action_timing
49
+ FROM information_schema.triggers
43
50
  WHERE trigger_schema = current_schema();
44
51
  DETECTTRIGGER
45
- result = @connection.execute(sql)
52
+
53
+ @connection.execute(sql)
54
+ end
55
+
56
+ def discovery_event(trigger_name)
57
+ sql = <<-DETECTTRIGGER
58
+ SELECT DISTINCT event_manipulation
59
+ FROM information_schema.triggers
60
+ WHERE trigger_schema = current_schema()
61
+ AND trigger_name = '#{trigger_name}'
62
+ DETECTTRIGGER
63
+
64
+ @connection.execute(sql).pluck("event_manipulation")
46
65
  end
47
66
 
48
- def parse_trigger_body(table_name, trigger_name)
49
- procedure = discovery_trigger_method(table_name, trigger_name)
50
- definition = procedure["definition"]
67
+ def parse_trigger_body(definition)
51
68
  procedure_body = definition[definition.index("BEGIN")+5..definition.size]
52
69
  procedure_body[0..procedure_body.rindex("END") -1].strip
53
70
  end
54
71
 
72
+ def parse_trigger_declarations(definition)
73
+ declare = definition[definition.index("DECLARE")+7..definition.size]
74
+ declare = declare[0, declare.index("BEGIN")].strip.split(";")
75
+ declare = declare.map{ |variable|
76
+ var = variable.strip
77
+ var = var.split(" ")
78
+ { var.shift => var.join(" ") }
79
+ }
80
+ end
81
+
55
82
  def discovery_trigger_method(table_name, trigger_name)
56
83
  sql = <<-DISCOVERYTRIGGERMETHOD
57
84
  SELECT
@@ -1,3 +1,3 @@
1
1
  module Pgtrigger
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgtrigger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Alencar
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-01 00:00:00.000000000 Z
11
+ date: 2018-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,7 +73,6 @@ files:
73
73
  - lib/pgtrigger/active_record/migration.rb
74
74
  - lib/pgtrigger/active_record/schema_dumper.rb
75
75
  - lib/pgtrigger/version.rb
76
- - pgtrigger-0.1.1.gem
77
76
  - pgtrigger.gemspec
78
77
  homepage: https://github.com/alencarandre/pgtrigger
79
78
  licenses:
Binary file