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 +4 -4
- data/.gitignore +2 -0
- data/README.md +7 -4
- data/lib/pgtrigger/active_record/migration.rb +6 -1
- data/lib/pgtrigger/active_record/schema_dumper.rb +35 -8
- data/lib/pgtrigger/version.rb +1 -1
- metadata +2 -3
- data/pgtrigger-0.1.1.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a6a196d78d94e5029eff17448fa0c30378168af
|
4
|
+
data.tar.gz: cd8bff0580bc33893b9fc9fdee0990b4e0482b07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a707b1ffdd3383ad6d9fa3b780fdce7f05ddd3681bea2a3421163607aab91d2615db58ed62b330aef3c6a0cd37b049b149ac7048a4036a16a4d6d0a0aed4a84e
|
7
|
+
data.tar.gz: 04faca13c437e3ea95e010b67564cb951dc5e3073dcbd229bf8d780e9a9b43c203d2b6d314c09fd806be69abefca8743a3cd6495de256aeacfbe742fb95e4d61
|
data/.gitignore
CHANGED
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
|
-
|
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
|
-
|
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}\", #{
|
35
|
+
triggers << "\tcreate_trigger \"#{table_name}\", \"#{trigger_name}\", #{event_manipulation} #{declare} do\n"
|
30
36
|
triggers << "<<-TRIGGERBODY\n"
|
31
|
-
triggers << parse_trigger_body(
|
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
|
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
|
-
|
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(
|
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
|
data/lib/pgtrigger/version.rb
CHANGED
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.
|
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-
|
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:
|
data/pgtrigger-0.1.1.gem
DELETED
Binary file
|