activerecord-postgresql-extensions 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile
CHANGED
@@ -28,9 +28,14 @@ module ActiveRecord
|
|
28
28
|
|
29
29
|
module ConnectionAdapters
|
30
30
|
class PostgreSQLAdapter
|
31
|
+
# :call-seq:
|
32
|
+
# create_function(name, arguments, returns, language, options = {}, &block)
|
33
|
+
# create_function(name, arguments, returns, language, body, options = {})
|
34
|
+
# create_function(name, returns, language, options = {}, &block)
|
35
|
+
#
|
31
36
|
# Creates a PostgreSQL function/stored procedure.
|
32
37
|
#
|
33
|
-
# +
|
38
|
+
# +arguments+ is a simple String that you can use to represent the
|
34
39
|
# function arguments.
|
35
40
|
#
|
36
41
|
# +returns+ is the return type for the function.
|
@@ -44,7 +49,8 @@ module ActiveRecord
|
|
44
49
|
# C, this will be an Array containing two items: the object file
|
45
50
|
# the function is found in and the link symbol for the function.
|
46
51
|
# In all other cases, this argument will be a String containing
|
47
|
-
# the actual function code.
|
52
|
+
# the actual function code. You can also provide either a block that
|
53
|
+
# returns the function body as a String or a :body option.
|
48
54
|
#
|
49
55
|
# ==== Options
|
50
56
|
#
|
@@ -83,6 +89,8 @@ module ActiveRecord
|
|
83
89
|
# with the parameters as keys and the values to set as values.
|
84
90
|
# When using a Hash, the value <tt>:from_current</tt> can be
|
85
91
|
# used to specify the actual <tt>FROM CURRENT</tt> clause.
|
92
|
+
# * <tt>:body</tt> - allows you to set a function body when the arguments
|
93
|
+
# to <tt>create_function</tt> are ambiguous.
|
86
94
|
#
|
87
95
|
# You should definitely check out the PostgreSQL documentation
|
88
96
|
# on creating stored procedures, because it can get pretty
|
@@ -112,10 +120,25 @@ module ActiveRecord
|
|
112
120
|
# # LANGUAGE "sql"
|
113
121
|
# # IMMUTABLE
|
114
122
|
# # SET "search_path" FROM CURRENT;
|
115
|
-
def create_function(name,
|
123
|
+
def create_function(name, *args)
|
116
124
|
options = args.extract_options!
|
117
125
|
|
118
|
-
|
126
|
+
raise ArgumentError.new("Expected 3-6 arguments") unless args.length.between?(2, 4)
|
127
|
+
raise ArgumentError.new("Ambiguous arguments: can't specify a function body as an argument without any function arguments. Hint: Use a :body option.") if args.length <= 3 && !block_given? && !options.key?(:body)
|
128
|
+
|
129
|
+
arguments, returns, language = if args.length >= 3
|
130
|
+
args.shift(3)
|
131
|
+
else
|
132
|
+
[ nil ] + args.shift(2)
|
133
|
+
end
|
134
|
+
|
135
|
+
body = if options.key?(:body)
|
136
|
+
if block_given? || args.first.present?
|
137
|
+
raise ArgumentError.new("Can't have both a :body option as well as a block or body argument in create_function")
|
138
|
+
end
|
139
|
+
|
140
|
+
options[:body].to_s
|
141
|
+
elsif args.first.present?
|
119
142
|
if block_given?
|
120
143
|
raise ArgumentError.new("Can't have both a function body argument as well as a block in create_function")
|
121
144
|
end
|
@@ -135,27 +158,50 @@ module ActiveRecord
|
|
135
158
|
# * <tt>:if_exists</tt> - adds an <tt>IF EXISTS</tt> clause.
|
136
159
|
# * <tt>:cascade</tt> - cascades the operation on to any objects
|
137
160
|
# referring to the function.
|
138
|
-
def drop_function(name, args
|
161
|
+
def drop_function(name, *args)
|
162
|
+
raise ArgumentError.new("Expected 2-3 arguments") unless args.length.between?(1, 2)
|
163
|
+
|
164
|
+
options = args.extract_options!
|
165
|
+
arguments = args.first
|
166
|
+
|
139
167
|
sql = 'DROP FUNCTION '
|
140
168
|
sql << 'IF EXISTS ' if options[:if_exists]
|
141
|
-
sql << "#{quote_function(name)}(#{
|
169
|
+
sql << "#{quote_function(name)}(#{arguments})"
|
142
170
|
sql << ' CASCADE' if options[:cascade]
|
143
171
|
execute "#{sql};"
|
144
172
|
end
|
145
173
|
|
146
174
|
# Renames a function.
|
147
|
-
def rename_function(name, args
|
148
|
-
|
175
|
+
def rename_function(name, *args)
|
176
|
+
raise ArgumentError.new("Expected 2-3 arguments") unless args.length.between?(1, 2)
|
177
|
+
|
178
|
+
options = args.extract_options!
|
179
|
+
rename_to = args.pop
|
180
|
+
arguments = args.pop
|
181
|
+
|
182
|
+
execute PostgreSQLFunctionAlterer.new(self, name, arguments, :rename_to => rename_to).to_s
|
149
183
|
end
|
150
184
|
|
151
185
|
# Changes the function's owner.
|
152
|
-
def alter_function_owner(name, args
|
153
|
-
|
186
|
+
def alter_function_owner(name, *args)
|
187
|
+
raise ArgumentError.new("Expected 2-3 arguments") unless args.length.between?(1, 2)
|
188
|
+
|
189
|
+
options = args.extract_options!
|
190
|
+
owner_to = args.pop
|
191
|
+
arguments = args.pop
|
192
|
+
|
193
|
+
execute PostgreSQLFunctionAlterer.new(self, name, arguments, :owner_to => owner_to).to_s
|
154
194
|
end
|
155
195
|
|
156
196
|
# Changes the function's schema.
|
157
|
-
def alter_function_schema(name, args
|
158
|
-
|
197
|
+
def alter_function_schema(name, *args)
|
198
|
+
raise ArgumentError.new("Expected 2-3 arguments") unless args.length.between?(1, 2)
|
199
|
+
|
200
|
+
options = args.extract_options!
|
201
|
+
set_schema = args.pop
|
202
|
+
arguments = args.pop
|
203
|
+
|
204
|
+
execute PostgreSQLFunctionAlterer.new(self, name, arguments, :set_schema => set_schema).to_s
|
159
205
|
end
|
160
206
|
|
161
207
|
# Alters a function. There's a ton of stuff you can do here, and
|
@@ -187,8 +233,12 @@ module ActiveRecord
|
|
187
233
|
# #
|
188
234
|
# # ALTER FUNCTION "my_function"(integer) OWNER TO "jdoe";
|
189
235
|
# # ALTER FUNCTION "my_function"(integer) RENAME TO "another_function";
|
190
|
-
def alter_function(name, args
|
191
|
-
|
236
|
+
def alter_function(name, *args)
|
237
|
+
raise ArgumentError.new("Expected 2-3 arguments") unless args.length.between?(0, 2)
|
238
|
+
|
239
|
+
options = args.extract_options!
|
240
|
+
arguments = args.pop
|
241
|
+
alterer = PostgreSQLFunctionAlterer.new(self, name, arguments, options)
|
192
242
|
|
193
243
|
if block_given?
|
194
244
|
yield alterer
|
data/test/functions_tests.rb
CHANGED
@@ -46,6 +46,49 @@ class FunctionsTests < PostgreSQLExtensionsTestCase
|
|
46
46
|
assert_equal(expected, statements)
|
47
47
|
end
|
48
48
|
|
49
|
+
def test_create_function_with_empty_arguments
|
50
|
+
ARBC.create_function(:test, :integer, :sql) do
|
51
|
+
"select 10;"
|
52
|
+
end
|
53
|
+
|
54
|
+
ARBC.create_function(:test, :integer, :sql, {
|
55
|
+
:force => true,
|
56
|
+
:delimiter => '$__$',
|
57
|
+
:behavior => :immutable,
|
58
|
+
:on_null_input => :strict,
|
59
|
+
:cost => 1,
|
60
|
+
:rows => 10,
|
61
|
+
:set => {
|
62
|
+
'TIME ZONE' => 'America/Halifax'
|
63
|
+
}
|
64
|
+
}) do
|
65
|
+
"return 10;"
|
66
|
+
end
|
67
|
+
|
68
|
+
expected = []
|
69
|
+
|
70
|
+
expected << strip_heredoc(<<-SQL)
|
71
|
+
CREATE FUNCTION "test"() RETURNS integer AS $$
|
72
|
+
select 10;
|
73
|
+
$$
|
74
|
+
LANGUAGE "sql";
|
75
|
+
SQL
|
76
|
+
|
77
|
+
expected << strip_heredoc(<<-SQL)
|
78
|
+
CREATE OR REPLACE FUNCTION "test"() RETURNS integer AS $__$
|
79
|
+
return 10;
|
80
|
+
$__$
|
81
|
+
LANGUAGE "sql"
|
82
|
+
IMMUTABLE
|
83
|
+
STRICT
|
84
|
+
COST 1
|
85
|
+
ROWS 10
|
86
|
+
SET TIME ZONE "America/Halifax";
|
87
|
+
SQL
|
88
|
+
|
89
|
+
assert_equal(expected, statements)
|
90
|
+
end
|
91
|
+
|
49
92
|
def test_create_function_with_body_argument
|
50
93
|
ARBC.create_function(:test, :integer, :integer, :sql, "select 10;")
|
51
94
|
|
@@ -85,6 +128,50 @@ class FunctionsTests < PostgreSQLExtensionsTestCase
|
|
85
128
|
assert_equal(expected, statements)
|
86
129
|
end
|
87
130
|
|
131
|
+
def test_create_function_with_body_argument_and_empty_arguments
|
132
|
+
assert_raises(ArgumentError) do
|
133
|
+
ARBC.create_function(:test, :integer, :sql, "select 10;")
|
134
|
+
end
|
135
|
+
|
136
|
+
assert_raises(ArgumentError) do
|
137
|
+
ARBC.create_function(:test, :integer, :sql, "select 10;", {
|
138
|
+
:force => true
|
139
|
+
})
|
140
|
+
end
|
141
|
+
|
142
|
+
assert_raises(ArgumentError) do
|
143
|
+
ARBC.create_function(:test, :integer, :sql, {
|
144
|
+
:body => "select 20"
|
145
|
+
}) do
|
146
|
+
"select 30"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
ARBC.create_function(:test, :integer, :sql, :body => "select 20;")
|
151
|
+
ARBC.create_function(:test, :integer, :sql, {
|
152
|
+
:body => "select 20;",
|
153
|
+
:force => true
|
154
|
+
})
|
155
|
+
|
156
|
+
expected = []
|
157
|
+
|
158
|
+
expected << strip_heredoc(<<-SQL)
|
159
|
+
CREATE FUNCTION "test"() RETURNS integer AS $$
|
160
|
+
select 20;
|
161
|
+
$$
|
162
|
+
LANGUAGE "sql";
|
163
|
+
SQL
|
164
|
+
|
165
|
+
expected << strip_heredoc(<<-SQL)
|
166
|
+
CREATE OR REPLACE FUNCTION "test"() RETURNS integer AS $$
|
167
|
+
select 20;
|
168
|
+
$$
|
169
|
+
LANGUAGE "sql";
|
170
|
+
SQL
|
171
|
+
|
172
|
+
assert_equal(expected, statements)
|
173
|
+
end
|
174
|
+
|
88
175
|
def test_drop_function
|
89
176
|
ARBC.drop_function(:test, :integer)
|
90
177
|
ARBC.drop_function(:test, :integer, :if_exists => true, :cascade => true)
|
@@ -97,31 +184,39 @@ class FunctionsTests < PostgreSQLExtensionsTestCase
|
|
97
184
|
|
98
185
|
def test_rename_function
|
99
186
|
ARBC.rename_function(:test, 'integer, text', :foo)
|
187
|
+
ARBC.rename_function(:test, :foo)
|
100
188
|
|
101
189
|
assert_equal([
|
102
|
-
%{ALTER FUNCTION "test"(integer, text) RENAME TO "foo";}
|
190
|
+
%{ALTER FUNCTION "test"(integer, text) RENAME TO "foo";},
|
191
|
+
%{ALTER FUNCTION "test"() RENAME TO "foo";}
|
103
192
|
], statements)
|
104
193
|
end
|
105
194
|
|
106
195
|
def test_alter_function_owner
|
107
196
|
ARBC.alter_function_owner(:test, 'integer, text', :admin)
|
197
|
+
ARBC.alter_function_owner(:test, :admin)
|
108
198
|
|
109
199
|
assert_equal([
|
110
|
-
%{ALTER FUNCTION "test"(integer, text) OWNER TO "admin";}
|
200
|
+
%{ALTER FUNCTION "test"(integer, text) OWNER TO "admin";},
|
201
|
+
%{ALTER FUNCTION "test"() OWNER TO "admin";}
|
111
202
|
], statements)
|
112
203
|
end
|
113
204
|
|
114
205
|
def test_alter_function_schema
|
115
206
|
ARBC.alter_function_schema(:test, 'integer, text', :geospatial)
|
207
|
+
ARBC.alter_function_schema(:test, :geospatial)
|
116
208
|
|
117
209
|
assert_equal([
|
118
|
-
%{ALTER FUNCTION "test"(integer, text) SET SCHEMA "geospatial";}
|
210
|
+
%{ALTER FUNCTION "test"(integer, text) SET SCHEMA "geospatial";},
|
211
|
+
%{ALTER FUNCTION "test"() SET SCHEMA "geospatial";}
|
119
212
|
], statements)
|
120
213
|
end
|
121
214
|
|
122
215
|
def test_alter_function
|
123
216
|
ARBC.alter_function('my_function', 'integer', :rename_to => 'another_function')
|
217
|
+
ARBC.alter_function('my_function', :rename_to => 'another_function')
|
124
218
|
ARBC.alter_function('another_function', 'integer', :owner_to => 'jdoe')
|
219
|
+
ARBC.alter_function('another_function', :owner_to => 'jdoe')
|
125
220
|
ARBC.alter_function('my_function', 'integer') do |f|
|
126
221
|
f.rename_to 'another_function'
|
127
222
|
f.owner_to 'jdoe'
|
@@ -137,9 +232,15 @@ class FunctionsTests < PostgreSQLExtensionsTestCase
|
|
137
232
|
f.reset %w{ debug_assertions trace_notify }
|
138
233
|
end
|
139
234
|
|
235
|
+
ARBC.alter_function('my_function') do |f|
|
236
|
+
f.rename_to 'another_function'
|
237
|
+
end
|
238
|
+
|
140
239
|
expected = [
|
141
240
|
%{ALTER FUNCTION "my_function"(integer) RENAME TO "another_function";},
|
142
|
-
%{ALTER FUNCTION "
|
241
|
+
%{ALTER FUNCTION "my_function"() RENAME TO "another_function";},
|
242
|
+
%{ALTER FUNCTION "another_function"(integer) OWNER TO "jdoe";},
|
243
|
+
%{ALTER FUNCTION "another_function"() OWNER TO "jdoe";}
|
143
244
|
]
|
144
245
|
|
145
246
|
expected << strip_heredoc(<<-SQL)
|
@@ -155,6 +256,8 @@ class FunctionsTests < PostgreSQLExtensionsTestCase
|
|
155
256
|
ALTER FUNCTION "another_function"(integer) RESET "debug_assertions" RESET "trace_notify";
|
156
257
|
SQL
|
157
258
|
|
259
|
+
expected << %{ALTER FUNCTION "my_function"() RENAME TO "another_function";}
|
260
|
+
|
158
261
|
assert_equal(expected, statements)
|
159
262
|
end
|
160
263
|
end
|
metadata
CHANGED
@@ -1,29 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgresql-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease:
|
5
|
+
version: 0.5.0
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- J Smith
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-11-25 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
type: :runtime
|
15
|
-
prerelease: false
|
16
15
|
name: activerecord
|
17
|
-
|
16
|
+
type: :runtime
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '2.3'
|
22
|
-
|
22
|
+
none: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - ! '>='
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '2.3'
|
28
|
+
none: false
|
29
|
+
prerelease: false
|
27
30
|
description: A whole bunch of extensions the ActiveRecord PostgreSQL adapter.
|
28
31
|
email: code@zoocasa.com
|
29
32
|
executables: []
|
@@ -89,8 +92,8 @@ files:
|
|
89
92
|
- test/vacuum_tests.rb
|
90
93
|
- test/views_tests.rb
|
91
94
|
homepage: http://github.com/zoocasa/activerecord-postgresql-extensions
|
92
|
-
licenses:
|
93
|
-
|
95
|
+
licenses:
|
96
|
+
- MIT
|
94
97
|
post_install_message:
|
95
98
|
rdoc_options: []
|
96
99
|
require_paths:
|
@@ -99,17 +102,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
102
|
requirements:
|
100
103
|
- - ! '>='
|
101
104
|
- !ruby/object:Gem::Version
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
hash: 1506709517929414109
|
102
108
|
version: '0'
|
109
|
+
none: false
|
103
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
111
|
requirements:
|
105
112
|
- - ! '>='
|
106
113
|
- !ruby/object:Gem::Version
|
107
114
|
version: '0'
|
115
|
+
none: false
|
108
116
|
requirements: []
|
109
117
|
rubyforge_project:
|
110
|
-
rubygems_version:
|
118
|
+
rubygems_version: 1.8.23
|
111
119
|
signing_key:
|
112
|
-
specification_version:
|
120
|
+
specification_version: 3
|
113
121
|
summary: A whole bunch of extensions the ActiveRecord PostgreSQL adapter.
|
114
122
|
test_files:
|
115
123
|
- test/adapter_extensions_tests.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
OGY1YjMzZWU1ZmNjN2VmZDU5ODQyM2Q0ZDg3N2JjNjkwZTFkMTkwYQ==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZGMxNWRjNjEwNzVhZjU1MzMxYTQ4ZTk0NWU2MjljYzViMDM5YzdjNQ==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NWRkMmZiNWViMzE4ZjBhNDEzOWFlNGJkOTIxZjg1MjljM2IyOWVmM2QzODA2
|
10
|
-
OGQzOWY2YjRhY2UzMzE5MzBlN2YxYzM3MjZkMTUzYzc4NDM3Zjc3NzliZWZm
|
11
|
-
MTc5NDU2NGE2MjY2YjUxYzhiYTI5MTVlNmZiNDFjMmZkOWFlM2U=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YjQyYWU2ZDM3MjQ0NmFhNDVmOWI3N2U0MWZkZDM5MTRiNTRhZmFlM2M4N2Jj
|
14
|
-
YjdkZTUyODk5ZmFlYmJhNzVhMjdjZDc5YjdmY2QyODMxZmY2ZmIwZTBiNmE5
|
15
|
-
YmZkMjE4NmZhNjAzNWI4MjIwOThkNjYzMzg3ZjQyMTQ1ODQ3NTE=
|