hairtrigger 0.2.14 → 0.2.15
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 +7 -0
- data/lib/hair_trigger/builder.rb +4 -4
- data/lib/hair_trigger/schema_dumper.rb +22 -17
- data/lib/hair_trigger/version.rb +1 -1
- data/spec/builder_spec.rb +4 -0
- metadata +18 -26
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 626460677ceaa19be59baad0532d142bb45ba072
|
4
|
+
data.tar.gz: d2beebf4d2531400d04fa6ed545bebb2f849598a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c3b9cfbee129c14b01d6cfa4d00b3e9ac8ea9a2fe9f20dcc1199c38e7ef8b7f92cbe2e0dd9148c0975f273b8870c80c25de28181754e888118cfd593a0617d86
|
7
|
+
data.tar.gz: 9213b2f59bae5879c013db5194105cbffd93e2cebcdb77f0089a2cda69a09d965da320d08f3457dc1debae8107ab958e9928726d3345f3f22d1c4f355102cd86
|
data/lib/hair_trigger/builder.rb
CHANGED
@@ -403,7 +403,7 @@ module HairTrigger
|
|
403
403
|
when :sqlite, :mysql
|
404
404
|
"DROP TRIGGER IF EXISTS #{prepared_name};\n"
|
405
405
|
when :postgresql, :postgis
|
406
|
-
"DROP TRIGGER IF EXISTS #{prepared_name} ON #{options[:table]};\nDROP FUNCTION IF EXISTS #{prepared_name}();\n"
|
406
|
+
"DROP TRIGGER IF EXISTS #{prepared_name} ON #{adapter.quote_table_name(options[:table])};\nDROP FUNCTION IF EXISTS #{adapter.quote_table_name(prepared_name)}();\n"
|
407
407
|
else
|
408
408
|
raise GenerationError, "don't know how to drop #{adapter_name} triggers yet"
|
409
409
|
end
|
@@ -434,7 +434,7 @@ END;
|
|
434
434
|
else
|
435
435
|
security = options[:security] if options[:security] && options[:security] != :invoker
|
436
436
|
sql << <<-SQL
|
437
|
-
CREATE FUNCTION #{prepared_name}()
|
437
|
+
CREATE FUNCTION #{adapter.quote_table_name(prepared_name)}()
|
438
438
|
RETURNS TRIGGER AS $$#{declarations}
|
439
439
|
BEGIN
|
440
440
|
SQL
|
@@ -460,11 +460,11 @@ END;
|
|
460
460
|
$$ LANGUAGE plpgsql#{security ? " SECURITY #{security.to_s.upcase}" : ""};
|
461
461
|
SQL
|
462
462
|
|
463
|
-
trigger_action = "#{prepared_name}()"
|
463
|
+
trigger_action = "#{adapter.quote_table_name(prepared_name)}()"
|
464
464
|
end
|
465
465
|
|
466
466
|
[sql, <<-SQL]
|
467
|
-
CREATE TRIGGER #{prepared_name} #{options[:timing]} #{options[:events].join(" OR ")} #{of_clause}ON
|
467
|
+
CREATE TRIGGER #{prepared_name} #{options[:timing]} #{options[:events].join(" OR ")} #{of_clause}ON #{adapter.quote_table_name(options[:table])}
|
468
468
|
FOR EACH #{options[:for_each]}#{prepared_where && db_version >= 90000 ? " WHEN (" + prepared_where + ')': ''} EXECUTE PROCEDURE #{trigger_action};
|
469
469
|
SQL
|
470
470
|
end
|
@@ -23,7 +23,11 @@ module HairTrigger
|
|
23
23
|
definitions = []
|
24
24
|
builder.generate.each do |statement|
|
25
25
|
if statement =~ /\ACREATE(.*TRIGGER| FUNCTION) ([^ \n]+)/
|
26
|
-
|
26
|
+
# poor man's unquote
|
27
|
+
type = ($1 == ' FUNCTION' ? :function : :trigger)
|
28
|
+
name = $2.gsub('"', '')
|
29
|
+
|
30
|
+
definitions << [name, statement, type]
|
27
31
|
end
|
28
32
|
end
|
29
33
|
{:builder => builder, :definitions => definitions}
|
@@ -63,23 +67,24 @@ module HairTrigger
|
|
63
67
|
@adapter_name = @connection.adapter_name.downcase.to_sym
|
64
68
|
|
65
69
|
return definition unless @adapter_name == :postgresql
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
rescue
|
70
|
+
# because postgres does not preserve the original CREATE TRIGGER/
|
71
|
+
# FUNCTION statements, its decompiled reconstruction will not match
|
72
|
+
# ours. we work around it by creating our generated trigger/function,
|
73
|
+
# asking postgres for its definition, and then rolling back.
|
74
|
+
@connection.transaction(requires_new: true) do
|
75
|
+
chars = ('a'..'z').to_a + ('0'..'9').to_a + ['_']
|
76
|
+
test_name = '_hair_trigger_test_' + (0..43).map{ chars[(rand * chars.size).to_i] }.join
|
77
|
+
# take of the parens for gsubbing, since this version might be quoted
|
78
|
+
name = name[0..-3] if type == :function
|
79
|
+
@connection.execute(definition.sub(name, test_name))
|
80
|
+
# now add them back
|
81
|
+
if type == :function
|
82
|
+
test_name << '()'
|
83
|
+
name << '()'
|
82
84
|
end
|
85
|
+
definition = @connection.triggers(:only => [test_name], :simple_check => true).values.first
|
86
|
+
definition.sub!(test_name, name)
|
87
|
+
raise ActiveRecord::Rollback
|
83
88
|
end
|
84
89
|
definition
|
85
90
|
end
|
data/lib/hair_trigger/version.rb
CHANGED
data/spec/builder_spec.rb
CHANGED
metadata
CHANGED
@@ -1,62 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hairtrigger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.15
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jon Jensen
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-
|
11
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activerecord
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '2.3'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '2.3'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: ruby_parser
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '3.5'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '3.5'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: ruby2ruby
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- - ~>
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '2.0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '2.0'
|
62
55
|
description: allows you to declare database triggers in ruby in your models, and then
|
@@ -67,8 +60,9 @@ extensions: []
|
|
67
60
|
extra_rdoc_files: []
|
68
61
|
files:
|
69
62
|
- LICENSE.txt
|
70
|
-
- Rakefile
|
71
63
|
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- lib/hair_trigger.rb
|
72
66
|
- lib/hair_trigger/adapter.rb
|
73
67
|
- lib/hair_trigger/base.rb
|
74
68
|
- lib/hair_trigger/builder.rb
|
@@ -77,17 +71,16 @@ files:
|
|
77
71
|
- lib/hair_trigger/railtie.rb
|
78
72
|
- lib/hair_trigger/schema_dumper.rb
|
79
73
|
- lib/hair_trigger/version.rb
|
80
|
-
- lib/hair_trigger.rb
|
81
74
|
- lib/hairtrigger.rb
|
82
75
|
- lib/tasks/hair_trigger.rake
|
83
76
|
- spec/adapter_spec.rb
|
84
77
|
- spec/builder_spec.rb
|
85
|
-
- spec/migrations/20110331212003_initial_tables.rb
|
86
|
-
- spec/migrations/20110331212631_user_trigger.rb
|
87
|
-
- spec/migrations/20110417185102_manual_user_trigger.rb
|
88
78
|
- spec/migrations-pre-3.1/20110331212003_initial_tables.rb
|
89
79
|
- spec/migrations-pre-3.1/20110331212631_user_trigger.rb
|
90
80
|
- spec/migrations-pre-3.1/20110417185102_manual_user_trigger.rb
|
81
|
+
- spec/migrations/20110331212003_initial_tables.rb
|
82
|
+
- spec/migrations/20110331212631_user_trigger.rb
|
83
|
+
- spec/migrations/20110417185102_manual_user_trigger.rb
|
91
84
|
- spec/migrations_spec.rb
|
92
85
|
- spec/models/group.rb
|
93
86
|
- spec/models/user.rb
|
@@ -96,27 +89,26 @@ files:
|
|
96
89
|
homepage: http://github.com/jenseng/hair_trigger
|
97
90
|
licenses:
|
98
91
|
- MIT
|
92
|
+
metadata: {}
|
99
93
|
post_install_message:
|
100
94
|
rdoc_options: []
|
101
95
|
require_paths:
|
102
96
|
- lib
|
103
97
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
-
none: false
|
105
98
|
requirements:
|
106
|
-
- -
|
99
|
+
- - ">="
|
107
100
|
- !ruby/object:Gem::Version
|
108
101
|
version: 1.8.7
|
109
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
103
|
requirements:
|
112
|
-
- -
|
104
|
+
- - ">="
|
113
105
|
- !ruby/object:Gem::Version
|
114
106
|
version: 1.3.5
|
115
107
|
requirements: []
|
116
108
|
rubyforge_project:
|
117
|
-
rubygems_version:
|
109
|
+
rubygems_version: 2.2.2
|
118
110
|
signing_key:
|
119
|
-
specification_version:
|
111
|
+
specification_version: 4
|
120
112
|
summary: easy database triggers for active record
|
121
113
|
test_files: []
|
122
114
|
has_rdoc:
|